types.ts
7.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
import { RoomDescription } from "../room/types";
import { UserData } from "../user/types";
export interface Message {
readonly type: string;
}
/**
* 클라 -> 서버 : 클라이언트에서 서버로 요청할 때 사용하는 메세지입니다. 요청 결과는 MessageResponse<undefined>입니다.
* 클라 -> 서버 -> T : 위와 동일하지만 요청 결과가 MessageResponse<T>입니다.
* 서버 -> 클라 : 서버에서 클라이언트로 전송되는 메세지입니다.
* 클라 <-> 서버 : 양방향으로 사용되는 메세지입니다.
*/
/**
* 서버에 Event를 보냈을 때 요청에 대한 결과를 전송받습니다.
* @param ok 요청의 성공 여부입니다.
* @param reason 요청 실패 사유입니다. 필요한 경우에만 포함됩니다.
* @param result 요청에 대한 결과 메세지입니다. 특정한 메세지에 대해 요청이 성공하였을 때만 포함됩니다.
*/
export interface MessageResponse<T> {
ok: boolean;
reason?: string;
result?: T;
}
/**
* 클라 -> 서버
* 로그인 정보를 서버에게 전송합니다.
*/
export class LoginMessage implements Message {
readonly type = MessageType.LOGIN;
constructor(public username: string) {}
}
/**
* 클라 -> 서버 -> RoomDescription[]
* 방 목록을 요청합니다.
*/
export class RoomListRequestMessage implements Message {
readonly type = MessageType.ROOM_LIST_REQUEST;
constructor() {}
}
/**
* 클라 -> 서버 -> RoomInfo
* 방에 접속합니다.
*/
export class RoomJoinMessage implements Message {
readonly type = MessageType.ROOM_JOIN;
constructor(public uuid: string) {}
}
/**
* 클라 -> 서버
* 방에서 나갑니다.
*/
export class RoomLeaveMessage implements Message {
readonly type = MessageType.ROOM_LEAVE;
constructor() {}
}
/**
* 클라 <- 서버
* 접속한 방에 새로운 유저가 들어오거나 나갈 때 전송됩니다.
* @param state 유저가 입장하면 added, 퇴장하면 removed 값을 가집니다.
* @param userdata 대상 유저입니다.
*/
export class RoomUserUpdateMessage implements Message {
readonly type = MessageType.ROOM_USER_UPDATE;
constructor(
public state: "added" | "updated" | "removed",
public userdata: UserData
) {}
}
/**
* 클라 <-> 서버
* 접속한 방에서 채팅을 보내거나 받을 때 사용됩니다. 자신이 보낸 채팅은 서버에 의해 수신되지 않습니다.
* @param message 메세지 내용입니다.
* @param sender 채팅을 보낸 유저의 username입니다. 채팅이 클라이언트로 수신 될 경우에만 값을 가집니다.
*/
export class RoomChatMessage implements Message {
readonly type = MessageType.ROOM_CHAT;
constructor(public message: string, public sender?: string) {}
}
/**
* 클라 <- 서버
* 라운드가 시작되었음을 알립니다.
* @param round 현재 라운드 넘버입니다. (1부터 시작)
* @param duration 초 단위의 라운드 시간입니다.
* @param roles 모든 방 접속 인원의 역할입니다.
*/
export class RoundStartMessage implements Message {
readonly type = MessageType.ROUND_START;
constructor(
public round: number,
public duration: number,
public roles: {
username: string;
role: "drawer" | "guesser" | "winner" | "spectator";
}[]
) {}
}
/**
* 클라 <- 서버
* 라운드 시작시에 오직 drawer에게만 전송되는 메세지로, drawer가 선택할 수 있는 단어들입니다.
*/
export class RoundWordSetMessage implements Message {
readonly type = MessageType.ROUND_WORD_SET;
constructor(public words: string[]) {}
}
/**
* 클라 -> 서버
* drawer가 단어를 선택하면 해당 메세지가 서버로 전송됩니다.
* @param word RoundWordSetMessage에서 수신받은 단어 중 drawer가 선택한 단어입니다.
*/
export class RoundChooseWordMessage implements Message {
readonly type = MessageType.ROUND_CHOOSE_WORD;
constructor(public word: string) {}
}
/**
* 클라 <- 서버
* drawer가 단어를 선택하였음을 알립니다.
* @param length 정답 단어의 길이입니다.
*/
export class RoundWordChosenMessage implements Message {
readonly type = MessageType.ROUND_WORD_CHOSEN;
constructor(public length: number) {}
}
/**
* 클라 <- 서버
* 서버가 클라이언트의 타이머를 동기화하기 위해 사용됩니다. 라운드가 시작하면 타이머는 초기화되며 기본 상태는 stopped입니다.
* @param state 타이머의 동작, 정지 여부입니다.
* @param time 타이머의 남은 시간입니다. 초 단위로 주어집니다.
*/
export class RoundTimerMessage implements Message {
readonly type = MessageType.ROUND_TIMER;
constructor(public state: "started" | "stopped", public time: number) {}
}
/**
* 클라 <- 서버
* 라운드가 종료되었음을 알립니다.
* @param answer 이번 라운드의 정답입니다.
*/
export class RoundFinishMessage implements Message {
readonly type = MessageType.ROUND_FINISH;
constructor(public answer: string) {}
}
/**
* 클라 <- 서버
* 플레이어의 역할이 바뀌었음을 알립니다.
* @param username 대상 유저의 username입니다.
* @param role 대상 유저의 새로운 역할입니다.
*/
export class RoundRoleMessage implements Message {
readonly type = MessageType.ROUND_ROLE;
constructor(
public username: string,
public role: "drawer" | "guesser" | "winner" | "spectator"
) {}
}
/**
* 클라 <- 서버
* 플레이어가 정답을 맞췄음을 알립니다.
* @param answer 이번 라운드의 정답입니다.
*/
export class AnswerAcceptedMessage implements Message {
readonly type = MessageType.ANSWER_ACCEPTED;
constructor(public answer: string) {}
}
/**
* 클라 <- 서버
* 게임이 종료되었음을 알립니다. 다시 준비 화면으로 돌아갑니다.
*/
export class GameFinishMessage implements Message {
readonly type = MessageType.GAME_FINISH;
constructor() {}
}
/**
* 클라 <-> 서버
* 브러시 설정을 동기화합니다. drawer는 메세지를 서버에 보내고, 나머지 플레이어들은 서버에서 수신받습니다.
* @param size 픽셀 단위의 브러시 지름입니다.
* @param color 6자리 소문자 16진수로 표현된 브러시 색상입니다.
* @param drawing 현재 브러시가 캔버스에 닿은 상태인지를 나타냅니다.
*/
export class PaintBrushMessage implements Message {
readonly type = MessageType.PAINT_BRUSH;
constructor(
public size: number,
public color: string,
public drawing: boolean
) {}
}
/**
* 클라 <-> 서버
* 브러시 위치를 동기화합니다. drawer는 메세지를 서버에 보내고, 나머지 플레이어들은 서버에서 수신받습니다.
* 왼쪽 하단이 원점입니다.
* @param x 픽셀 단위의 가로 위치입니다.
* @param y 픽셀 단위의 세로 위치입니다.
*/
export class PaintMoveMessage implements Message {
readonly type = MessageType.PAINT_MOVE;
constructor(public x: number, public y: number) {}
}
export class MessageType {
static readonly LOGIN = "login";
static readonly ROOM_LIST_REQUEST = "room_list_request";
static readonly ROOM_JOIN = "room_join";
static readonly ROOM_LEAVE = "room_leave";
static readonly ROOM_USER_UPDATE = "room_user_update";
static readonly ROOM_CHAT = "room_chat";
static readonly ROUND_START = "round_start";
static readonly ROUND_TIMER = "round_timer";
static readonly ROUND_FINISH = "round_finish";
static readonly ROUND_ROLE = "round_role";
static readonly ANSWER_ACCEPTED = "answer_accepted";
static readonly GAME_FINISH = "game_finish";
static readonly ROUND_WORD_SET = "round_word_set";
static readonly ROUND_CHOOSE_WORD = "round_choose_word";
static readonly ROUND_WORD_CHOSEN = "round_word_chosen";
static readonly PAINT_BRUSH = "paint_brush";
static readonly PAINT_MOVE = "paint_move";
}