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            myzod.object({
 80                method: myzod.literal('changeHideBomb'),
 81                params: myzod.object({ hideBomb: myzod.boolean() }),
 82            }),
 83        ])
 84    );
 85
 86export type StateTile = Infer<typeof StateTile>;
 87const StateTile = myzod.object({
 88    word: myzod.string(),
 89    revealed: myzod.boolean(),
 90    view: myzod
 91        .object({
 92            team: myzod.number(),
 93            neutral: myzod.boolean(),
 94            bomb: myzod.boolean(),
 95        })
 96        .optional()
 97        .nullable(),
 98});
 99
100export type StateBoard = Infer<typeof StateBoard>;
101const StateBoard = myzod.array(myzod.array(StateTile));
102
103export type StatePlayer = Infer<typeof StatePlayer>;
104const StatePlayer = myzod.object({
105    playerID: myzod.string(),
106    nickname: myzod.string(),
107    spymaster: myzod.boolean(),
108});
109
110export type StateTeams = Infer<typeof StateTeams>;
111const StateTeams = myzod.array(myzod.array(StatePlayer));
112
113export type StateTimer = Infer<typeof StateTimer>;
114const StateTimer = myzod.object({
115    turnTime: myzod.number(),
116    turnEnd: myzod.date(),
117});
118
119export type State = Infer<typeof State>;
120export const State = myzod.object({
121    version: myzod.number(),
122    teams: StateTeams,
123    turn: myzod.number(),
124    winner: myzod.number().optional().nullable(),
125    board: StateBoard,
126    wordsLeft: myzod.array(myzod.number()),
127    lists: myzod.array(
128        myzod.object({
129            name: myzod.string(),
130            count: myzod.number(),
131            custom: myzod.boolean(),
132            enabled: myzod.boolean(),
133        })
134    ),
135    timer: StateTimer.optional().nullable(),
136    hideBomb: myzod.boolean(),
137});
138
139export type ServerNote = Infer<typeof ServerNote>;
140export const ServerNote = myzod.union([
141    myzod.object({
142        method: myzod.literal('state'),
143        params: State,
144    }),
145]);