@yyyu-star/arcade-kit 0.16.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +20 -1
- package/dist/chat-words.d.ts +7 -0
- package/dist/chat-words.d.ts.map +1 -0
- package/dist/chat-words.js +15 -0
- package/dist/chat-words.js.map +1 -0
- package/dist/chat.d.ts +30 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +124 -0
- package/dist/chat.js.map +1 -0
- package/dist/client.d.ts +36 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +49 -0
- package/dist/client.js.map +1 -1
- package/dist/game.d.ts +7 -0
- package/dist/game.d.ts.map +1 -1
- package/dist/game.js +1 -0
- package/dist/game.js.map +1 -1
- package/dist/protocol.d.ts +35 -1
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +6 -0
- package/dist/protocol.js.map +1 -1
- package/dist/room.d.ts +23 -0
- package/dist/room.d.ts.map +1 -1
- package/dist/room.js +66 -3
- package/dist/room.js.map +1 -1
- package/dist/table-fun.d.ts +63 -3
- package/dist/table-fun.d.ts.map +1 -1
- package/dist/table-fun.js +209 -11
- package/dist/table-fun.js.map +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +5 -2
- package/dist/worker.js.map +1 -1
- package/package.json +5 -1
- package/src/chat-words.ts +14 -0
- package/src/chat.ts +131 -0
- package/src/client.ts +64 -3
- package/src/game.ts +11 -0
- package/src/protocol.ts +33 -1
- package/src/room.ts +76 -4
- package/src/table-fun.ts +220 -12
- package/src/worker.ts +5 -2
package/dist/game.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game.js","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAiD,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"game.js","sourceRoot":"","sources":["../src/game.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAiD,MAAM,eAAe,CAAC;AA2KhG;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAmC,IAA6B,EAAE,KAAQ;IACrG,MAAM,IAAI,GAAa;QACrB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAClI,IAAI,EAAE;YACJ,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,iBAAiB;YAC3B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF;QACD,qCAAqC;QACrC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/D,CAAC;IACF,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,GAAG,GAAkB;YACzB,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,gBAAgB;YACnB,gBAAgB,EAAE,CAAC;YACnB,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,EAAE;YAC/B,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;YAC5B,sBAAsB;YACtB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;QACF,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -99,7 +99,15 @@ export interface EmoteMsg {
|
|
|
99
99
|
/** 冲着哪个座位(0.7.0,可选):扔道具、点名嘲讽。得是有人的别的座位,不然回 bad_target;不带就和 0.6.0 一样 */
|
|
100
100
|
to?: number;
|
|
101
101
|
}
|
|
102
|
-
|
|
102
|
+
/**
|
|
103
|
+
* 好友房聊天(0.18.0,docs/chat.md):自由文字,一条 ≤ 30 个字(chat.ts 的 CHAT_MAX)。只有入座的人能发、游戏开了(RoomGame.chat)才收;
|
|
104
|
+
* 房间过一遍 checkChat(导流整条拒发、脏话打码)、按座位限速,然后只转发,不进状态、不写存储、不进快照。被拒回 error(见 CHAT_ERRORS)
|
|
105
|
+
*/
|
|
106
|
+
export interface ChatMsg {
|
|
107
|
+
t: 'chat';
|
|
108
|
+
text: string;
|
|
109
|
+
}
|
|
110
|
+
export type UpMsg<A = unknown> = SitMsg | LeaveMsg | StartMsg | ActMsg<A> | EmoteMsg | ChatMsg;
|
|
103
111
|
export type SeatKind = 'empty' | 'human' | 'ai';
|
|
104
112
|
/** 座位的公开信息:谁坐着、是真人还是电脑、在不在线、是不是电脑在代打。 */
|
|
105
113
|
export interface SeatInfo {
|
|
@@ -183,6 +191,15 @@ export interface WelcomeMsg<V = unknown> {
|
|
|
183
191
|
ms: number;
|
|
184
192
|
burst: number;
|
|
185
193
|
};
|
|
194
|
+
/**
|
|
195
|
+
* 聊天的节奏和字数(0.18.0,游戏开了聊天才带):同一个座位两条至少隔 ms 毫秒、一分钟最多 perMin 条,一条最多 max 个字。
|
|
196
|
+
* RoomClient 按它在本地先挡一遍(按钮置灰、倒计时),不靠被拒
|
|
197
|
+
*/
|
|
198
|
+
chat?: {
|
|
199
|
+
ms: number;
|
|
200
|
+
perMin: number;
|
|
201
|
+
max: number;
|
|
202
|
+
};
|
|
186
203
|
}
|
|
187
204
|
/** 每一步之后的状态。ack 只发给做这一步的那条连接:对应它的 moveId。 */
|
|
188
205
|
export interface StateMsg<V = unknown> {
|
|
@@ -230,5 +247,22 @@ export interface EmotedMsg {
|
|
|
230
247
|
* bad_target(0.7.0)带的 to 不是有人的别的座位
|
|
231
248
|
*/
|
|
232
249
|
export declare const EMOTE_ERRORS: readonly ['no_emotes', 'bad_emote', 'not_seated', 'room_over', 'emote_too_fast', 'bad_target'];
|
|
250
|
+
/**
|
|
251
|
+
* 有人说了一句(0.18.0):seat 是房间的座位号,text 是过滤、打码以后的字,masked 表示打过码。
|
|
252
|
+
* 只发给连接时带了 chat=1 的连接(新版 RoomClient 传了 onChat 才带;旧页面不认识这条消息,不发给它),含发的人自己。
|
|
253
|
+
* 和短语一样不在 DownMsg 里,RoomClient 交给 onChat;不带 seq,断线时错过的不补发
|
|
254
|
+
*/
|
|
255
|
+
export interface ChattedMsg {
|
|
256
|
+
t: 'chat';
|
|
257
|
+
seat: number;
|
|
258
|
+
text: string;
|
|
259
|
+
masked?: true;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* 聊天被拒时 error 的 code(0.18.0,只回发的人):chat_off 这个游戏没开聊天;not_seated 没入座;room_over 房间打完了;
|
|
263
|
+
* chat_empty 去掉空白后是空的;chat_too_long 超过 30 个字;chat_too_fast 这个座位太快了(两条间隔、每分钟条数);
|
|
264
|
+
* chat_blocked 像链接、号码、微信 QQ 号(chat.ts 的 blockReason)
|
|
265
|
+
*/
|
|
266
|
+
export declare const CHAT_ERRORS: readonly ['chat_off', 'not_seated', 'room_over', 'chat_empty', 'chat_too_long', 'chat_too_fast', 'chat_blocked'];
|
|
233
267
|
export type DownMsg<V = unknown> = WelcomeMsg<V> | StateMsg<V> | ErrorMsg;
|
|
234
268
|
//# sourceMappingURL=protocol.d.ts.map
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,qBAAqB;AACrB,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,eAAO,MAAM,IAAI,SAAS,CAAC;AAC3B,eAAO,MAAM,IAAI,SAAS,CAAC;AAE3B,sBAAsB;AACtB,eAAO,MAAM,YAAY,QAAe,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,KAAK;IAChB,qBAAqB;aACrB,MAAM,EAAE,IAAI;IACZ,iBAAiB;aACjB,MAAM,EAAE,IAAI;IACZ,uCAAuC;aACvC,QAAQ,EAAE,IAAI;IACd,+BAA+B;aAC/B,UAAU,EAAE,IAAI;IAChB,yBAAyB;aACzB,QAAQ,EAAE,IAAI;IACd,6DAA6D;aAC7D,IAAI,EAAE,IAAI;IACV,uBAAuB;aACvB,MAAM,EAAE,IAAI;IACZ,iBAAiB;aACjB,MAAM,EAAE,IAAI;IACZ,gCAAgC;aAChC,YAAY,EAAE,IAAI;IAClB,gDAAgD;aAChD,SAAS,EAAE,IAAI;IACf,gDAAgD;aAChD,IAAI,EAAE,IAAI;IACV,2BAA2B;aAC3B,YAAY,EAAE,IAAI;IAClB,gBAAgB;aAChB,SAAS,EAAE,IAAI;CACP,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,YAAY;aACvB,KAAK,EAAE,OAAO;CACN,CAAC;AAEX;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,aAAa,GAAG,aAAa,CAAC;AAEtH,eAAe;AACf,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAID,mCAAmC;AACnC,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,KAAK,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;CACd;AACD,6BAA6B;AAC7B,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,OAAO,CAAC;CACZ;AACD,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,OAAO,CAAC;IACX,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AACD;;;;GAIG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,OAAO;IACjC,CAAC,EAAE,KAAK,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,CAAC;CACX;AACD;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,OAAO,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,uEAAuE;IACvE,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AACD,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
CHANGED
|
@@ -62,4 +62,10 @@ export function isFinalClose(code) {
|
|
|
62
62
|
* bad_target(0.7.0)带的 to 不是有人的别的座位
|
|
63
63
|
*/
|
|
64
64
|
export const EMOTE_ERRORS = ['no_emotes', 'bad_emote', 'not_seated', 'room_over', 'emote_too_fast', 'bad_target'];
|
|
65
|
+
/**
|
|
66
|
+
* 聊天被拒时 error 的 code(0.18.0,只回发的人):chat_off 这个游戏没开聊天;not_seated 没入座;room_over 房间打完了;
|
|
67
|
+
* chat_empty 去掉空白后是空的;chat_too_long 超过 30 个字;chat_too_fast 这个座位太快了(两条间隔、每分钟条数);
|
|
68
|
+
* chat_blocked 像链接、号码、微信 QQ 号(chat.ts 的 blockReason)
|
|
69
|
+
*/
|
|
70
|
+
export const CHAT_ERRORS = ['chat_off', 'not_seated', 'room_over', 'chat_empty', 'chat_too_long', 'chat_too_fast', 'chat_blocked'];
|
|
65
71
|
//# sourceMappingURL=protocol.js.map
|
package/dist/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,qBAAqB;AACrB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC;AAC3B,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC;AAE3B,sBAAsB;AACtB,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,qBAAqB;IACrB,MAAM,EAAE,IAAI;IACZ,iBAAiB;IACjB,MAAM,EAAE,IAAI;IACZ,uCAAuC;IACvC,QAAQ,EAAE,IAAI;IACd,+BAA+B;IAC/B,UAAU,EAAE,IAAI;IAChB,yBAAyB;IACzB,QAAQ,EAAE,IAAI;IACd,6DAA6D;IAC7D,IAAI,EAAE,IAAI;IACV,uBAAuB;IACvB,MAAM,EAAE,IAAI;IACZ,iBAAiB;IACjB,MAAM,EAAE,IAAI;IACZ,gCAAgC;IAChC,YAAY,EAAE,IAAI;IAClB,gDAAgD;IAChD,SAAS,EAAE,IAAI;IACf,gDAAgD;IAChD,IAAI,EAAE,IAAI;IACV,2BAA2B;IAC3B,YAAY,EAAE,IAAI;IAClB,gBAAgB;IAChB,SAAS,EAAE,IAAI;CACP,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,OAAO;CACN,CAAC;AAaX,eAAe;AACf,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC;AACzF,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,qBAAqB;AACrB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC;AAC3B,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC;AAE3B,sBAAsB;AACtB,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,qBAAqB;IACrB,MAAM,EAAE,IAAI;IACZ,iBAAiB;IACjB,MAAM,EAAE,IAAI;IACZ,uCAAuC;IACvC,QAAQ,EAAE,IAAI;IACd,+BAA+B;IAC/B,UAAU,EAAE,IAAI;IAChB,yBAAyB;IACzB,QAAQ,EAAE,IAAI;IACd,6DAA6D;IAC7D,IAAI,EAAE,IAAI;IACV,uBAAuB;IACvB,MAAM,EAAE,IAAI;IACZ,iBAAiB;IACjB,MAAM,EAAE,IAAI;IACZ,gCAAgC;IAChC,YAAY,EAAE,IAAI;IAClB,gDAAgD;IAChD,SAAS,EAAE,IAAI;IACf,gDAAgD;IAChD,IAAI,EAAE,IAAI;IACV,2BAA2B;IAC3B,YAAY,EAAE,IAAI;IAClB,gBAAgB;IAChB,SAAS,EAAE,IAAI;CACP,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,OAAO;CACN,CAAC;AAaX,eAAe;AACf,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC;AACzF,CAAC;AAqLD;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,CAAU,CAAC;AAc3H;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,CAAU,CAAC"}
|
package/dist/room.d.ts
CHANGED
|
@@ -66,6 +66,12 @@ export interface RoomLimits {
|
|
|
66
66
|
*/
|
|
67
67
|
emoteMs: number;
|
|
68
68
|
emoteBurst: number;
|
|
69
|
+
/**
|
|
70
|
+
* 聊天的节奏(0.18.0,RoomGame.chat):同一个座位两条至少隔 chatMs、滚动一分钟最多 chatPerMin 条,超了回 chat_too_fast、不转发、不占数。
|
|
71
|
+
* 和短语一样是代码里的默认值,KIT_QUOTA 里写了 chatMs / chatPerMin 就以那里为准。chatMs 为 0 不限间隔,chatPerMin 为 0 不限条数
|
|
72
|
+
*/
|
|
73
|
+
chatMs: number;
|
|
74
|
+
chatPerMin: number;
|
|
69
75
|
/**
|
|
70
76
|
* 写了多少行报一次计量(0.2.0)。计量每报一次自己写 1 行,200 就是多花 0.5%;
|
|
71
77
|
* 太大的话计量知道得晚,满了以后房间还会多写最多这么多行才收场
|
|
@@ -141,6 +147,9 @@ export declare abstract class GameRoom<S, A, V, Env = unknown, O = unknown, E ex
|
|
|
141
147
|
/** 每个座位快捷短语的令牌桶(内存里;被驱逐就重置成满的,驱逐前至少空闲了一阵,本来也该满了) */
|
|
142
148
|
private readonly emoteBuckets;
|
|
143
149
|
private emoteRateCache;
|
|
150
|
+
/** 每个座位最近一分钟里发出去的聊天的时间(内存里,被驱逐就清空,和短语的桶一样) */
|
|
151
|
+
private readonly chatTimes;
|
|
152
|
+
private chatRateCache;
|
|
144
153
|
/** 这一步写了几行(sql 的 rowsWritten + setAlarm、关房各 1);测试断言 ≤ 2 */
|
|
145
154
|
private writes;
|
|
146
155
|
/** 每个入口结束时记下来,给测试看 */
|
|
@@ -231,6 +240,13 @@ export declare abstract class GameRoom<S, A, V, Env = unknown, O = unknown, E ex
|
|
|
231
240
|
* to(0.7.0,可选):冲着哪个座位发(扔道具、点名嘲讽)。得是有人(真人或电脑)的别的座位,不然回 bad_target;被拒的不算这个座位的一句
|
|
232
241
|
*/
|
|
233
242
|
private emote;
|
|
243
|
+
/**
|
|
244
|
+
* 聊天(0.18.0,docs/chat.md):校验、过滤、按座位限速,然后只转发给带了 chat=1 的连接;不写存储、不改 seq、不进快照,房间关了就没了。
|
|
245
|
+
* 入站已经在 onMessage 里记过。被拒的不占这个座位的条数。真人说的话不交给规则、onStep、onEmote(公平:电脑不读真人说的话)
|
|
246
|
+
*/
|
|
247
|
+
private chat;
|
|
248
|
+
private chatRate;
|
|
249
|
+
private takeChat;
|
|
234
250
|
/** 快捷短语的节奏:KIT_QUOTA 里写了就用那里的,没写用 RoomLimits(只算一次) */
|
|
235
251
|
private emoteRate;
|
|
236
252
|
private takeEmote;
|
|
@@ -386,4 +402,11 @@ export interface EmoteRate {
|
|
|
386
402
|
}
|
|
387
403
|
/** KIT_QUOTA(对象或 JSON 字符串)里的 emoteMs / emoteBurst 覆盖默认值;不合格的忽略。burst 至少 1 */
|
|
388
404
|
export declare function emoteRateOf(raw: unknown, base: EmoteRate): EmoteRate;
|
|
405
|
+
/** 聊天的节奏(0.18.0):两条至少隔 ms 毫秒,一分钟最多 perMin 条 */
|
|
406
|
+
export interface ChatRate {
|
|
407
|
+
ms: number;
|
|
408
|
+
perMin: number;
|
|
409
|
+
}
|
|
410
|
+
/** KIT_QUOTA(对象或 JSON 字符串)里的 chatMs / chatPerMin 覆盖默认值;不合格的忽略 */
|
|
411
|
+
export declare function chatRateOf(raw: unknown, base: ChatRate): ChatRate;
|
|
389
412
|
//# sourceMappingURL=room.d.ts.map
|
package/dist/room.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"room.d.ts","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
|
package/dist/room.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* 计量说今天快满了(busy)就不进新人;说满了(stop)就在这一段打完(RoomGame.breakPoint)时收场。
|
|
18
18
|
*/
|
|
19
19
|
import { DurableObject } from 'cloudflare:workers';
|
|
20
|
+
import { CHAT_MAX, checkChat } from './chat.js';
|
|
20
21
|
import { KIT_HOST, LIMITED_HEADER, MISS_HEADER, meterStub, parseIdentity } from './internal.js';
|
|
21
22
|
import { ENTROPY_WORDS } from './rng.js';
|
|
22
23
|
import { CLOSE, CLOSE_REASON, PING, PONG, PROTOCOL_VERSION, ROOM_CODE_RE, } from './protocol.js';
|
|
@@ -40,6 +41,8 @@ export const DEFAULT_LIMITS = {
|
|
|
40
41
|
minClientVersion: 0,
|
|
41
42
|
emoteMs: 1000,
|
|
42
43
|
emoteBurst: 3,
|
|
44
|
+
chatMs: 3000,
|
|
45
|
+
chatPerMin: 10,
|
|
43
46
|
meterBatch: 200,
|
|
44
47
|
closingMs: 60 * 60_000,
|
|
45
48
|
};
|
|
@@ -148,6 +151,9 @@ export class GameRoom extends DurableObject {
|
|
|
148
151
|
/** 每个座位快捷短语的令牌桶(内存里;被驱逐就重置成满的,驱逐前至少空闲了一阵,本来也该满了) */
|
|
149
152
|
emoteBuckets = new Map();
|
|
150
153
|
emoteRateCache = null;
|
|
154
|
+
/** 每个座位最近一分钟里发出去的聊天的时间(内存里,被驱逐就清空,和短语的桶一样) */
|
|
155
|
+
chatTimes = new Map();
|
|
156
|
+
chatRateCache = null;
|
|
151
157
|
/** 这一步写了几行(sql 的 rowsWritten + setAlarm、关房各 1);测试断言 ≤ 2 */
|
|
152
158
|
writes = 0;
|
|
153
159
|
/** 每个入口结束时记下来,给测试看 */
|
|
@@ -230,7 +236,7 @@ export class GameRoom extends DurableObject {
|
|
|
230
236
|
const gate = await this.newcomerGate(me.userId);
|
|
231
237
|
if (gate !== null)
|
|
232
238
|
return this.refuse(gate);
|
|
233
|
-
return this.entry(() => this.join(me, url.searchParams.get('cv')));
|
|
239
|
+
return this.entry(() => this.join(me, url.searchParams.get('cv'), url.searchParams.get('chat') === '1'));
|
|
234
240
|
}
|
|
235
241
|
async webSocketMessage(ws, message) {
|
|
236
242
|
await this.entry(() => this.onMessage(ws, message));
|
|
@@ -468,7 +474,7 @@ export class GameRoom extends DurableObject {
|
|
|
468
474
|
return 'created';
|
|
469
475
|
}
|
|
470
476
|
/** 进房(含重连):接受、记座位、发快照,中间没有 await(4.5 续局的写法)。 */
|
|
471
|
-
join(me, rawCv) {
|
|
477
|
+
join(me, rawCv, chat = false) {
|
|
472
478
|
const pair = new WebSocketPair();
|
|
473
479
|
const [client, server] = [pair[0], pair[1]];
|
|
474
480
|
this.ctx.acceptWebSocket(server);
|
|
@@ -531,7 +537,7 @@ export class GameRoom extends DurableObject {
|
|
|
531
537
|
other.serializeAttachment(null);
|
|
532
538
|
other.close(CLOSE.replaced, 'replaced');
|
|
533
539
|
}
|
|
534
|
-
server.serializeAttachment({ userId: me.userId, name: me.name });
|
|
540
|
+
server.serializeAttachment({ userId: me.userId, name: me.name, ...(chat ? { chat: true } : {}) });
|
|
535
541
|
if (s && changed) {
|
|
536
542
|
// 托管被收回、而且正轮到他:这一手从现在重新算 30 秒。只是掉线没到托管就回来的,不重置(不然隔 29 秒重连一次就能一直拖着)
|
|
537
543
|
// 一组人时不重置:组的期限中途不改,和"组里有人出手不重新计时"一致
|
|
@@ -588,6 +594,8 @@ export class GameRoom extends DurableObject {
|
|
|
588
594
|
return this.act(ws, seat, msg.moveId, msg.baseSeq, msg.action);
|
|
589
595
|
case 'emote':
|
|
590
596
|
return this.emote(ws, seat, msg.id, msg.to);
|
|
597
|
+
case 'chat':
|
|
598
|
+
return this.chat(ws, seat, msg.text);
|
|
591
599
|
default:
|
|
592
600
|
return this.reject(ws, 'bad_message');
|
|
593
601
|
}
|
|
@@ -624,6 +632,45 @@ export class GameRoom extends DurableObject {
|
|
|
624
632
|
console.error('onEmote threw', st.code, e instanceof Error ? e.message : e);
|
|
625
633
|
}
|
|
626
634
|
}
|
|
635
|
+
/**
|
|
636
|
+
* 聊天(0.18.0,docs/chat.md):校验、过滤、按座位限速,然后只转发给带了 chat=1 的连接;不写存储、不改 seq、不进快照,房间关了就没了。
|
|
637
|
+
* 入站已经在 onMessage 里记过。被拒的不占这个座位的条数。真人说的话不交给规则、onStep、onEmote(公平:电脑不读真人说的话)
|
|
638
|
+
*/
|
|
639
|
+
chat(ws, seat, raw) {
|
|
640
|
+
const st = this.st;
|
|
641
|
+
if (this.game.chat !== true)
|
|
642
|
+
return this.reject(ws, 'chat_off');
|
|
643
|
+
if (seat === null)
|
|
644
|
+
return this.reject(ws, 'not_seated');
|
|
645
|
+
if (st.status === 'over')
|
|
646
|
+
return this.reject(ws, 'room_over');
|
|
647
|
+
const c = checkChat(raw, this.game.chatWords ?? []);
|
|
648
|
+
if (!c.ok)
|
|
649
|
+
return this.reject(ws, c.code);
|
|
650
|
+
if (!this.takeChat(seat))
|
|
651
|
+
return this.reject(ws, 'chat_too_fast');
|
|
652
|
+
const msg = { t: 'chat', seat, text: c.text, ...(c.masked ? { masked: true } : {}) };
|
|
653
|
+
for (const o of this.sockets())
|
|
654
|
+
if (attachmentOf(o)?.chat)
|
|
655
|
+
this.send(o, msg);
|
|
656
|
+
}
|
|
657
|
+
chatRate() {
|
|
658
|
+
this.chatRateCache ??= chatRateOf(this.env?.KIT_QUOTA, { ms: this.limits.chatMs, perMin: this.limits.chatPerMin });
|
|
659
|
+
return this.chatRateCache;
|
|
660
|
+
}
|
|
661
|
+
takeChat(seat) {
|
|
662
|
+
const { ms, perMin } = this.chatRate();
|
|
663
|
+
const now = Date.now();
|
|
664
|
+
const times = (this.chatTimes.get(seat) ?? []).filter((t) => now - t < 60_000);
|
|
665
|
+
this.chatTimes.set(seat, times);
|
|
666
|
+
const last = times[times.length - 1];
|
|
667
|
+
if (ms > 0 && last !== undefined && now - last < ms)
|
|
668
|
+
return false;
|
|
669
|
+
if (perMin > 0 && times.length >= perMin)
|
|
670
|
+
return false;
|
|
671
|
+
times.push(now);
|
|
672
|
+
return true;
|
|
673
|
+
}
|
|
627
674
|
/** 快捷短语的节奏:KIT_QUOTA 里写了就用那里的,没写用 RoomLimits(只算一次) */
|
|
628
675
|
emoteRate() {
|
|
629
676
|
this.emoteRateCache ??= emoteRateOf(this.env?.KIT_QUOTA, { ms: this.limits.emoteMs, burst: this.limits.emoteBurst });
|
|
@@ -1536,6 +1583,7 @@ export class GameRoom extends DurableObject {
|
|
|
1536
1583
|
now: Date.now(),
|
|
1537
1584
|
// 有短语的游戏告诉页面限速的节奏(0.7.0),RoomClient 按它排队,用户感觉不到限速
|
|
1538
1585
|
...(hasEmotes(this.game.emotes) ? { emote: this.emoteRate() } : {}),
|
|
1586
|
+
...(this.game.chat === true ? { chat: { ...this.chatRate(), max: CHAT_MAX } } : {}),
|
|
1539
1587
|
};
|
|
1540
1588
|
}
|
|
1541
1589
|
stateMsg(seat, bound, frames, ack, quiet = false) {
|
|
@@ -1656,4 +1704,19 @@ export function emoteRateOf(raw, base) {
|
|
|
1656
1704
|
const ok = (x) => typeof x === 'number' && Number.isInteger(x) && x >= 0;
|
|
1657
1705
|
return { ms: ok(q.emoteMs) ? q.emoteMs : base.ms, burst: Math.max(1, ok(q.emoteBurst) ? q.emoteBurst : base.burst) };
|
|
1658
1706
|
}
|
|
1707
|
+
/** KIT_QUOTA(对象或 JSON 字符串)里的 chatMs / chatPerMin 覆盖默认值;不合格的忽略 */
|
|
1708
|
+
export function chatRateOf(raw, base) {
|
|
1709
|
+
let v = raw;
|
|
1710
|
+
if (typeof raw === 'string') {
|
|
1711
|
+
try {
|
|
1712
|
+
v = JSON.parse(raw);
|
|
1713
|
+
}
|
|
1714
|
+
catch {
|
|
1715
|
+
v = null;
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
const q = v && typeof v === 'object' && !Array.isArray(v) ? v : {};
|
|
1719
|
+
const ok = (x) => typeof x === 'number' && Number.isInteger(x) && x >= 0;
|
|
1720
|
+
return { ms: ok(q.chatMs) ? q.chatMs : base.ms, perMin: ok(q.chatPerMin) ? q.chatPerMin : base.perMin };
|
|
1721
|
+
}
|
|
1659
1722
|
//# sourceMappingURL=room.js.map
|