index.ts

  1import myzod, { Infer } from 'myzod';
  2
  3// See protocol.go.
  4
  5export type RoomResponse = Infer<typeof RoomResponse>;
  6export const RoomResponse = myzod.object({
  7    id: myzod.string().optional().nullable(),
  8    error: myzod.string().optional().nullable(),
  9});
 10
 11export type TimeResponse = Infer<typeof TimeResponse>;
 12export const TimeResponse = myzod.object({
 13    time: myzod.date(),
 14});
 15
 16export type WordPack = Infer<typeof WordPack>;
 17const WordPack = myzod.object({
 18    name: myzod.string(),
 19    words: myzod.array(myzod.string()),
 20});
 21
 22export type ClientNote = Infer<typeof ClientNote>;
 23export const ClientNote = myzod
 24    .object({
 25        version: myzod.number(),
 26    })
 27    .and(
 28        myzod.union([
 29            myzod.object({
 30                method: myzod.literal('newGame'),
 31                params: myzod.object({}),
 32            }),
 33            myzod.object({
 34                method: myzod.literal('endTurn'),
 35                params: myzod.object({}),
 36            }),
 37            myzod.object({
 38                method: myzod.literal('randomizeTeams'),
 39                params: myzod.object({}),
 40            }),
 41            myzod.object({
 42                method: myzod.literal('reveal'),
 43                params: myzod.object({ row: myzod.number(), col: myzod.number() }),
 44            }),
 45            myzod.object({
 46                method: myzod.literal('changeTeam'),
 47                params: myzod.object({ team: myzod.number() }),
 48            }),
 49            myzod.object({
 50                method: myzod.literal('changeNickname'),
 51                params: myzod.object({ nickname: myzod.string() }),
 52            }),
 53            myzod.object({
 54                method: myzod.literal('changeRole'),
 55                params: myzod.object({ spymaster: myzod.boolean() }),
 56            }),
 57            myzod.object({
 58                method: myzod.literal('changePack'),
 59                params: myzod.object({ num: myzod.number(), enable: myzod.boolean() }),
 60            }),
 61            myzod.object({
 62                method: myzod.literal('changeTurnMode'),
 63                params: myzod.object({ timed: myzod.boolean() }),
 64            }),
 65            myzod.object({
 66                method: myzod.literal('changeTurnTime'),
 67                params: myzod.object({ seconds: myzod.number() }),
 68            }),
 69            myzod.object({
 70                method: myzod.literal('addPacks'),
 71                params: myzod.object({
 72                    packs: myzod.array(WordPack),
 73                }),
 74            }),
 75            myzod.object({
 76                method: myzod.literal('removePack'),
 77                params: myzod.object({ num: myzod.number() }),
 78            }),
 79        ])
 80    );
 81
 82export type StateTile = Infer<typeof StateTile>;
 83const StateTile = myzod.object({
 84    word: myzod.string(),
 85    revealed: myzod.boolean(),
 86    view: myzod
 87        .object({
 88            team: myzod.number(),
 89            neutral: myzod.boolean(),
 90            bomb: myzod.boolean(),
 91        })
 92        .optional()
 93        .nullable(),
 94});
 95
 96export type StateBoard = Infer<typeof StateBoard>;
 97const StateBoard = myzod.array(myzod.array(StateTile));
 98
 99export type StatePlayer = Infer<typeof StatePlayer>;
100const StatePlayer = myzod.object({
101    playerID: myzod.string(),
102    nickname: myzod.string(),
103    spymaster: myzod.boolean(),
104});
105
106export type StateTeams = Infer<typeof StateTeams>;
107const StateTeams = myzod.array(myzod.array(StatePlayer));
108
109export type StateTimer = Infer<typeof StateTimer>;
110const StateTimer = myzod.object({
111    turnTime: myzod.number(),
112    turnEnd: myzod.date(),
113});
114
115export type State = Infer<typeof State>;
116export const State = myzod.object({
117    version: myzod.number(),
118    teams: StateTeams,
119    turn: myzod.number(),
120    winner: myzod.number().optional().nullable(),
121    board: StateBoard,
122    wordsLeft: myzod.array(myzod.number()),
123    lists: myzod.array(
124        myzod.object({
125            name: myzod.string(),
126            count: myzod.number(),
127            custom: myzod.boolean(),
128            enabled: myzod.boolean(),
129        })
130    ),
131    timer: StateTimer.optional().nullable(),
132});
133
134export type ServerNote = Infer<typeof ServerNote>;
135export const ServerNote = myzod.union([
136    myzod.object({
137        method: myzod.literal('state'),
138        params: State,
139    }),
140]);