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