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]);