@zhin.js/plugin-tic-tac-toe 1.0.0 → 1.0.1
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/lib/board-view.d.ts +1 -0
- package/lib/board-view.d.ts.map +1 -1
- package/lib/board-view.js +5 -1
- package/lib/board-view.js.map +1 -1
- package/lib/commands.d.ts.map +1 -1
- package/lib/commands.js +51 -33
- package/lib/commands.js.map +1 -1
- package/lib/game-flow.d.ts +1 -0
- package/lib/game-flow.d.ts.map +1 -1
- package/lib/game-flow.js +39 -0
- package/lib/game-flow.js.map +1 -1
- package/lib/hub-register.js +1 -1
- package/lib/hub-register.js.map +1 -1
- package/lib/index.js +6 -6
- package/lib/index.js.map +1 -1
- package/lib/session-service.d.ts.map +1 -1
- package/lib/session-service.js +4 -12
- package/lib/session-service.js.map +1 -1
- package/package.json +4 -4
- package/src/board-view.ts +6 -1
- package/src/commands.ts +62 -34
- package/src/game-flow.ts +43 -0
- package/src/hub-register.ts +1 -1
- package/src/index.ts +6 -8
- package/src/session-service.ts +4 -9
package/lib/board-view.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export declare function buildBoardInteractive(options: {
|
|
|
12
12
|
terminal?: boolean;
|
|
13
13
|
omitAsciiBoard?: boolean;
|
|
14
14
|
highlight?: number[];
|
|
15
|
+
channelType?: string;
|
|
15
16
|
}): SendContent;
|
|
16
17
|
export declare function buildFallbackMap(sessionId: string, board: Board): Record<string, string>;
|
|
17
18
|
export declare function parseTttPayload(payload: string): {
|
package/lib/board-view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-view.d.ts","sourceRoot":"","sources":["../src/board-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAKL,UAAU,EAEX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,IAAI,EAIV,MAAM,aAAa,CAAC;AAErB,uBAAuB;AACvB,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,CAAC;AAwBtB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"board-view.d.ts","sourceRoot":"","sources":["../src/board-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAKL,UAAU,EAEX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,IAAI,EAIV,MAAM,aAAa,CAAC;AAErB,uBAAuB;AACvB,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,CAAC;AAwBtB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,WAAW,CAoBd;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAK3F;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI9D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE3C"}
|
package/lib/board-view.js
CHANGED
|
@@ -19,7 +19,7 @@ function renderTttAscii(cells, rows, cols, highlight) {
|
|
|
19
19
|
return asciiBoard(board, highlight);
|
|
20
20
|
}
|
|
21
21
|
export function buildBoardInteractive(options) {
|
|
22
|
-
const { sessionId, board, statusLine, terminal, omitAsciiBoard, highlight } = options;
|
|
22
|
+
const { sessionId, board, statusLine, terminal, omitAsciiBoard, highlight, channelType } = options;
|
|
23
23
|
return buildGridKeyboard({
|
|
24
24
|
gamePrefix: TTT_PREFIX,
|
|
25
25
|
sessionId,
|
|
@@ -32,6 +32,10 @@ export function buildBoardInteractive(options) {
|
|
|
32
32
|
renderAscii: renderTttAscii,
|
|
33
33
|
highlight,
|
|
34
34
|
fallbackHint: '落子:回复数字 1-9(仅空格)',
|
|
35
|
+
postChoices: terminal
|
|
36
|
+
? [{ id: 'restart', label: '🔄 再来一局', style: 'primary' }]
|
|
37
|
+
: undefined,
|
|
38
|
+
channelType,
|
|
35
39
|
});
|
|
36
40
|
}
|
|
37
41
|
export function buildFallbackMap(sessionId, board) {
|
package/lib/board-view.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-view.js","sourceRoot":"","sources":["../src/board-view.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,IAAI,aAAa,EAClC,UAAU,GAEX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,UAAU,EACV,SAAS,EAGT,KAAK,EACL,CAAC,GAEF,MAAM,aAAa,CAAC;AAErB,uBAAuB;AACvB,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC;AAEhC,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,6BAA6B;AAC7B,SAAS,YAAY,CAAC,KAAY,EAAE,SAAoB;IACtD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;QAC7C,QAAQ,EAAE,IAAI,KAAK,KAAK;QACxB,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;KAC/B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,mCAAmC;AACnC,SAAS,cAAc,CACrB,KAAuB,EACvB,IAAY,EACZ,IAAY,EACZ,SAAoB;IAEpB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,UAAU,CAAC,KAAc,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"board-view.js","sourceRoot":"","sources":["../src/board-view.ts"],"names":[],"mappings":"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"}
|
package/lib/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAarF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAsD5D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,eAAe,GAAG,IAAI,GACxC,IAAI,CAGN;AAyCD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAGnG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,CAqCpG"}
|
package/lib/commands.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { MessageCommand, getActionFromMessage } from 'zhin.js';
|
|
2
|
-
import { channelKey, normalizeTttAction } from '@zhin.js/game-shared';
|
|
3
|
-
import { buildFallbackMap } from './board-view.js';
|
|
2
|
+
import { channelKey, normalizeTttAction, parseChoicePayload, registerGameTextMiddleware, resolveGameChoice, resolveGameTextPayload, } from '@zhin.js/game-shared';
|
|
3
|
+
import { buildFallbackMap, TTT_PREFIX } from './board-view.js';
|
|
4
4
|
import { parseBoard } from './engine.js';
|
|
5
|
-
import { handleMove } from './game-flow.js';
|
|
5
|
+
import { handleMove, restartFromTerminal } from './game-flow.js';
|
|
6
6
|
import { runTttCommand } from './ttt-command.js';
|
|
7
7
|
function actionPayload(message) {
|
|
8
8
|
return getActionFromMessage(message)?.payload;
|
|
9
9
|
}
|
|
10
|
-
/** @deprecated 使用 game-shared parseChoicePayload;保留 ttt 专用解析 */
|
|
11
10
|
function parseTttPayload(payload) {
|
|
12
11
|
const m = /^ttt:([^:]+):(\d)$/.exec(payload);
|
|
13
12
|
if (!m)
|
|
@@ -21,13 +20,23 @@ function parseCellButtonId(id) {
|
|
|
21
20
|
const cell = Number(m[1]);
|
|
22
21
|
return cell >= 0 && cell <= 8 ? cell : null;
|
|
23
22
|
}
|
|
24
|
-
async function
|
|
23
|
+
async function resolveTttAction(message, services) {
|
|
24
|
+
const restart = await resolveGameChoice({
|
|
25
|
+
message,
|
|
26
|
+
gamePrefix: TTT_PREFIX,
|
|
27
|
+
validChoiceIds: ['restart'],
|
|
28
|
+
getById: (id) => services.session.getById(id),
|
|
29
|
+
getActiveForUser: (ch, uid) => services.session.getActiveForUser(ch, uid),
|
|
30
|
+
getByBoardMessageId: (mid) => services.session.getActiveByBoardMessageId(mid),
|
|
31
|
+
});
|
|
32
|
+
if (restart)
|
|
33
|
+
return { kind: 'restart', sessionId: restart.sessionId };
|
|
25
34
|
const action = getActionFromMessage(message);
|
|
26
35
|
if (!action)
|
|
27
36
|
return null;
|
|
28
37
|
const fromPayload = parseTttPayload(action.payload);
|
|
29
38
|
if (fromPayload)
|
|
30
|
-
return fromPayload;
|
|
39
|
+
return { kind: 'move', ...fromPayload };
|
|
31
40
|
const cell = parseCellButtonId(action.payload)
|
|
32
41
|
?? parseCellButtonId(action.id ?? '');
|
|
33
42
|
if (cell == null)
|
|
@@ -39,7 +48,11 @@ async function resolveTttMove(message, services) {
|
|
|
39
48
|
: null);
|
|
40
49
|
if (!session || session.channel_key !== ch)
|
|
41
50
|
return null;
|
|
42
|
-
return { sessionId: session.id, cell };
|
|
51
|
+
return { kind: 'move', sessionId: session.id, cell };
|
|
52
|
+
}
|
|
53
|
+
export function registerCommands(plugin, getServices) {
|
|
54
|
+
registerTttPattern(plugin, '/ttt [action:word]', '井字棋(ttt)', getServices);
|
|
55
|
+
registerTttPattern(plugin, '/井字棋 [action:word]', '井字棋(中文)', getServices);
|
|
43
56
|
}
|
|
44
57
|
function registerTttPattern(plugin, pattern, desc, getServices) {
|
|
45
58
|
plugin.addCommand(new MessageCommand(pattern)
|
|
@@ -49,22 +62,23 @@ function registerTttPattern(plugin, pattern, desc, getServices) {
|
|
|
49
62
|
if (!services)
|
|
50
63
|
return '井字棋需要启用 database 配置。';
|
|
51
64
|
const raw = result.params.action ?? '';
|
|
52
|
-
|
|
53
|
-
return runTttCommand(plugin, services, message, action);
|
|
65
|
+
return runTttCommand(plugin, services, message, normalizeTttAction(raw));
|
|
54
66
|
}));
|
|
55
67
|
}
|
|
56
|
-
export function registerCommands(plugin, getServices) {
|
|
57
|
-
registerTttPattern(plugin, 'ttt [action:word]', '井字棋(ttt)', getServices);
|
|
58
|
-
registerTttPattern(plugin, '井字棋 [action:word]', '井字棋(中文)', getServices);
|
|
59
|
-
}
|
|
60
68
|
async function handleTttAction(plugin, getServices, message) {
|
|
61
69
|
const services = getServices();
|
|
62
70
|
if (!services)
|
|
63
71
|
return false;
|
|
64
|
-
const
|
|
65
|
-
if (!
|
|
72
|
+
const action = await resolveTttAction(message, services);
|
|
73
|
+
if (!action)
|
|
66
74
|
return false;
|
|
67
|
-
|
|
75
|
+
if (action.kind === 'restart') {
|
|
76
|
+
const err = await restartFromTerminal(plugin, services, message, action.sessionId);
|
|
77
|
+
if (err)
|
|
78
|
+
await message.$reply?.(err);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
const err = await handleMove(plugin, services, message, action.sessionId, action.cell);
|
|
68
82
|
if (err)
|
|
69
83
|
await message.$reply?.(err);
|
|
70
84
|
return true;
|
|
@@ -74,38 +88,42 @@ export function registerInteractive(plugin, getServices) {
|
|
|
74
88
|
plugin.registerInteractiveHandler('c', (message) => handleTttAction(plugin, getServices, message));
|
|
75
89
|
}
|
|
76
90
|
export function registerTextFallback(plugin, getServices) {
|
|
77
|
-
plugin
|
|
91
|
+
registerGameTextMiddleware(plugin, async (message, next) => {
|
|
78
92
|
const services = getServices();
|
|
79
93
|
if (!services)
|
|
80
94
|
return next();
|
|
81
95
|
const inboundAction = actionPayload(message);
|
|
82
96
|
if (inboundAction?.startsWith('ttt:'))
|
|
83
97
|
return next();
|
|
98
|
+
const raw = message.$raw?.trim() ?? '';
|
|
84
99
|
const ch = channelKey(message);
|
|
100
|
+
const payloadFromText = resolveGameTextPayload(raw);
|
|
101
|
+
if (payloadFromText?.startsWith(`${TTT_PREFIX}:`)) {
|
|
102
|
+
const parsed = parseChoicePayload(payloadFromText, TTT_PREFIX);
|
|
103
|
+
if (parsed?.choiceId === 'restart') {
|
|
104
|
+
const session = await services.session.getById(parsed.sessionId);
|
|
105
|
+
if (session?.channel_key === ch) {
|
|
106
|
+
const err = await restartFromTerminal(plugin, services, message, parsed.sessionId);
|
|
107
|
+
if (err)
|
|
108
|
+
await message.$reply?.(err);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
85
113
|
const session = await services.session.getActiveForUser(ch, message.$sender.id);
|
|
86
114
|
if (!session)
|
|
87
115
|
return next();
|
|
88
|
-
const raw = message.$raw?.trim() ?? '';
|
|
89
116
|
let cell = null;
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const n = /^(\d)$/.exec(raw);
|
|
96
|
-
if (n) {
|
|
97
|
-
const map = buildFallbackMap(session.id, parseBoard(session.board));
|
|
98
|
-
const payload = map[n[1]];
|
|
99
|
-
const p = payload ? parseTttPayload(payload) : null;
|
|
100
|
-
if (p?.sessionId === session.id)
|
|
101
|
-
cell = p.cell;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
117
|
+
const map = buildFallbackMap(session.id, parseBoard(session.board));
|
|
118
|
+
const payloadText = resolveGameTextPayload(raw, map);
|
|
119
|
+
const p = payloadText ? parseTttPayload(payloadText) : null;
|
|
120
|
+
if (p?.sessionId === session.id)
|
|
121
|
+
cell = p.cell;
|
|
104
122
|
if (cell == null)
|
|
105
123
|
return next();
|
|
106
124
|
const err = await handleMove(plugin, services, message, session.id, cell);
|
|
107
125
|
if (err)
|
|
108
126
|
await message.$reply?.(err);
|
|
109
|
-
});
|
|
127
|
+
}, 'ttt:text');
|
|
110
128
|
}
|
|
111
129
|
//# sourceMappingURL=commands.js.map
|
package/lib/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,cAAc,EAAE,oBAAoB,EAAe,MAAM,SAAS,CAAC;AACrF,OAAO,
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/lib/game-flow.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type { SessionServices, TttPlayerRef } from './session-service.js';
|
|
|
5
5
|
export { BOT_ID };
|
|
6
6
|
export declare function isBotSession(session: TttSessionRow): boolean;
|
|
7
7
|
export declare function sendOrEditBoard(plugin: Plugin, services: SessionServices, message: Message<any>, session: TttSessionRow, statusLine: string, terminal?: boolean, highlight?: number[]): Promise<string>;
|
|
8
|
+
export declare function restartFromTerminal(plugin: Plugin, services: SessionServices, message: Message<any>, sessionId: string): Promise<string | null>;
|
|
8
9
|
export declare function handleMove(plugin: Plugin, services: SessionServices, message: Message<any>, sessionId: string, cell: number): Promise<string | null>;
|
|
9
10
|
export declare function startBotGame(plugin: Plugin, services: SessionServices, message: Message<any>): Promise<string>;
|
|
10
11
|
export declare function startPvpGame(plugin: Plugin, services: SessionServices, message: Message<any>, playerX: TttPlayerRef, playerO: TttPlayerRef): Promise<void>;
|
package/lib/game-flow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-flow.d.ts","sourceRoot":"","sources":["../src/game-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"game-flow.d.ts","sourceRoot":"","sources":["../src/game-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAejD,OAAO,EACL,MAAM,EAOP,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,EAAE,MAAM,EAAE,CAAC;AAElB,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAE5D;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EACrB,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,UAAQ,EAChB,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAUD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsFxB;AAqBD,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GACpB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
package/lib/game-flow.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { recordGameOutcome } from '@zhin.js/game-shared';
|
|
1
2
|
import { buildBoardInteractive } from './board-view.js';
|
|
2
3
|
import { applyMove, bestMove, checkWinner, isDraw, parseBoard, playerMark, validMove, X, O, cellLabel, } from './engine.js';
|
|
3
4
|
import { BOT_ID, formatPlayerWithMark, formatRosterLine, formatTurnStatus, formatWinHeadline, playerRefForMark, senderDisplayName, } from './player-label.js';
|
|
@@ -15,6 +16,7 @@ export async function sendOrEditBoard(plugin, services, message, session, status
|
|
|
15
16
|
terminal,
|
|
16
17
|
omitAsciiBoard: message.$adapter === 'qq',
|
|
17
18
|
highlight,
|
|
19
|
+
channelType: message.$channel.type,
|
|
18
20
|
});
|
|
19
21
|
const adapter = plugin.root.inject(message.$adapter);
|
|
20
22
|
if (session.board_message_id) {
|
|
@@ -37,6 +39,20 @@ export async function sendOrEditBoard(plugin, services, message, session, status
|
|
|
37
39
|
}
|
|
38
40
|
return msgId ?? '';
|
|
39
41
|
}
|
|
42
|
+
export async function restartFromTerminal(plugin, services, message, sessionId) {
|
|
43
|
+
const session = await services.session.getById(sessionId);
|
|
44
|
+
if (!session)
|
|
45
|
+
return '对局不存在。';
|
|
46
|
+
const mark = playerMark(message.$sender.id, {
|
|
47
|
+
playerX: session.player_x,
|
|
48
|
+
playerO: session.player_o,
|
|
49
|
+
});
|
|
50
|
+
if (!mark)
|
|
51
|
+
return '你不是本局玩家。';
|
|
52
|
+
await services.session.updateSession(session.id, { status: 'aborted', winner: 0 });
|
|
53
|
+
const hint = await startBotGame(plugin, services, message);
|
|
54
|
+
return hint.includes('已有') ? hint : null;
|
|
55
|
+
}
|
|
40
56
|
function turnCell(session) {
|
|
41
57
|
return session.turn === 1 ? X : O;
|
|
42
58
|
}
|
|
@@ -80,6 +96,29 @@ export async function handleMove(plugin, services, message, sessionId, cell) {
|
|
|
80
96
|
winner: win ? win.winner : 0,
|
|
81
97
|
});
|
|
82
98
|
const updated = (await services.session.getById(session.id));
|
|
99
|
+
if (win || draw) {
|
|
100
|
+
const humanId = isBotSession(updated)
|
|
101
|
+
? (updated.player_x === BOT_ID ? updated.player_o : updated.player_x)
|
|
102
|
+
: message.$sender.id;
|
|
103
|
+
const humanName = isBotSession(updated)
|
|
104
|
+
? (updated.player_x === BOT_ID ? updated.player_o_name : updated.player_x_name)
|
|
105
|
+
: String(message.$sender.name ?? message.$sender.id);
|
|
106
|
+
const humanMsg = {
|
|
107
|
+
...message,
|
|
108
|
+
$sender: { ...message.$sender, id: humanId, name: humanName },
|
|
109
|
+
};
|
|
110
|
+
if (win) {
|
|
111
|
+
const humanMark = playerMark(humanId, {
|
|
112
|
+
playerX: updated.player_x,
|
|
113
|
+
playerO: updated.player_o,
|
|
114
|
+
});
|
|
115
|
+
const humanWon = humanMark === win.winner;
|
|
116
|
+
void recordGameOutcome(humanMsg, 'ttt', humanWon ? 'won' : 'lost', humanWon ? 20 : 0);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
void recordGameOutcome(humanMsg, 'ttt', 'draw');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
83
122
|
if (win) {
|
|
84
123
|
const status = formatWinHeadline(updated, win.winner);
|
|
85
124
|
await sendOrEditBoard(plugin, services, message, updated, status, true, win.line);
|
package/lib/game-flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-flow.js","sourceRoot":"","sources":["../src/game-flow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"game-flow.js","sourceRoot":"","sources":["../src/game-flow.ts"],"names":[],"mappings":"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"}
|
package/lib/hub-register.js
CHANGED
package/lib/hub-register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-register.js","sourceRoot":"","sources":["../src/hub-register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG3D,MAAM,UAAU,cAAc,CAAC,WAAyC;IACtE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,YAAY,CAAC;QACzB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,gBAAgB;QAC7B,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"hub-register.js","sourceRoot":"","sources":["../src/hub-register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG3D,MAAM,UAAU,cAAc,CAAC,WAAyC;IACtE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,YAAY,CAAC;QACzB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,gBAAgB;QAC7B,aAAa,EAAE,MAAM;QACrB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,CAAC,KAAK,CAAC;QAChB,KAAK,EAAE;YACL,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;YACjD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE;YACjD,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;YACnD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;SACjC;QACD,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ;gBAAE,OAAO,sBAAsB,CAAC;YAC7C,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -9,29 +9,29 @@
|
|
|
9
9
|
* storage: ./data/zhin.db
|
|
10
10
|
* ```
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
12
|
+
import { formatCompact, usePlugin } from 'zhin.js';
|
|
13
13
|
import { registerModels } from './models.js';
|
|
14
14
|
import { createServices, resolveGameDatabase } from './session-service.js';
|
|
15
15
|
import { registerCommands, registerInteractive, registerTextFallback } from './commands.js';
|
|
16
16
|
import { registerTttHub } from './hub-register.js';
|
|
17
17
|
const plugin = usePlugin();
|
|
18
|
-
const { logger, useContext,
|
|
18
|
+
const { logger, useContext, addSchedule } = plugin;
|
|
19
19
|
registerModels(plugin);
|
|
20
20
|
let services = null;
|
|
21
21
|
useContext('database', (dbFeature) => {
|
|
22
22
|
services = createServices(resolveGameDatabase(dbFeature));
|
|
23
|
-
logger.
|
|
23
|
+
logger.debug(formatCompact({ 模块: '井字棋', 数据模型: '已就绪' }));
|
|
24
24
|
});
|
|
25
25
|
registerTttHub(() => services);
|
|
26
26
|
registerCommands(plugin, () => services);
|
|
27
27
|
registerInteractive(plugin, () => services);
|
|
28
28
|
registerTextFallback(plugin, () => services);
|
|
29
|
-
|
|
29
|
+
addSchedule({ kind: 'solar', cron: '0 */10 * * * *' }, async () => {
|
|
30
30
|
if (!services)
|
|
31
31
|
return;
|
|
32
32
|
const n = await services.session.abortStale(30 * 60 * 1000);
|
|
33
33
|
if (n > 0)
|
|
34
34
|
logger.debug(formatCompact({ 井字棋: '清理超时局', count: n }));
|
|
35
|
-
})
|
|
36
|
-
logger.
|
|
35
|
+
});
|
|
36
|
+
logger.debug(formatCompact({ 模块: '井字棋', 状态: '已加载' }));
|
|
37
37
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAwB,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAwB,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;AAEnD,cAAc,CAAC,MAAM,CAAC,CAAC;AAEvB,IAAI,QAAQ,GAA2B,IAAI,CAAC;AAE5C,UAAU,CAAC,UAAU,EAAE,CAAC,SAA0B,EAAE,EAAE;IACpD,QAAQ,GAAG,cAAc,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,cAAc,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;AAC/B,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;AACzC,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;AAC5C,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;AAE7C,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,KAAK,IAAI,EAAE;IAC9D,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-service.d.ts","sourceRoot":"","sources":["../src/session-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAgB,MAAM,SAAS,CAAC;AAExF,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAI5D,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAU/D,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,WAAW;IAEtC,IAAI,CACR,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAe3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQxD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKxC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC;IAgBvE,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAI9C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,WAAW;IAEtC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAQlE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAIlD,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAOtF,uDAAuD;IACjD,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"session-service.d.ts","sourceRoot":"","sources":["../src/session-service.ts"],"names":[],"mappings":"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"}
|
package/lib/session-service.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { channelKey } from '@zhin.js/game-shared';
|
|
1
|
+
import { channelKey, boardMessageMatches, generateCompactId } from '@zhin.js/game-shared';
|
|
2
2
|
function getModel(db, name) {
|
|
3
3
|
const model = db.models.get(name);
|
|
4
4
|
if (!model) {
|
|
@@ -59,7 +59,7 @@ export class QueueService {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
export function sessionId() {
|
|
62
|
-
return
|
|
62
|
+
return generateCompactId('s');
|
|
63
63
|
}
|
|
64
64
|
export class SessionService {
|
|
65
65
|
db;
|
|
@@ -88,17 +88,9 @@ export class SessionService {
|
|
|
88
88
|
async getActiveByBoardMessageId(messageId) {
|
|
89
89
|
if (!messageId)
|
|
90
90
|
return null;
|
|
91
|
-
const rows = await getModel(this.db, 'ttt_sessions').findAll({
|
|
91
|
+
const rows = await getModel(this.db, 'ttt_sessions').findAll({});
|
|
92
92
|
for (const row of rows) {
|
|
93
|
-
|
|
94
|
-
if (!stored)
|
|
95
|
-
continue;
|
|
96
|
-
if (stored === messageId)
|
|
97
|
-
return row;
|
|
98
|
-
if (stored.endsWith(`:${messageId}`))
|
|
99
|
-
return row;
|
|
100
|
-
const tail = stored.split(':').pop();
|
|
101
|
-
if (tail && messageId.endsWith(tail))
|
|
93
|
+
if (boardMessageMatches(row.board_message_id ?? '', messageId))
|
|
102
94
|
return row;
|
|
103
95
|
}
|
|
104
96
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-service.js","sourceRoot":"","sources":["../src/session-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-service.js","sourceRoot":"","sources":["../src/session-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/plugin-tic-tac-toe",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Zhin.js 跨平台井字棋 — 按钮/文本双模式,群聊排队与人机对战",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
],
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"peerDependencies": {
|
|
32
|
-
"zhin.js": "4.1.
|
|
32
|
+
"zhin.js": "4.1.2"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@zhin.js/game-shared": "1.0.
|
|
35
|
+
"@zhin.js/game-shared": "1.0.1"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"typescript": "^6.0.3",
|
|
39
|
-
"zhin.js": "4.1.
|
|
39
|
+
"zhin.js": "4.1.2"
|
|
40
40
|
},
|
|
41
41
|
"repository": {
|
|
42
42
|
"type": "git",
|
package/src/board-view.ts
CHANGED
|
@@ -52,8 +52,9 @@ export function buildBoardInteractive(options: {
|
|
|
52
52
|
terminal?: boolean;
|
|
53
53
|
omitAsciiBoard?: boolean;
|
|
54
54
|
highlight?: number[];
|
|
55
|
+
channelType?: string;
|
|
55
56
|
}): SendContent {
|
|
56
|
-
const { sessionId, board, statusLine, terminal, omitAsciiBoard, highlight } = options;
|
|
57
|
+
const { sessionId, board, statusLine, terminal, omitAsciiBoard, highlight, channelType } = options;
|
|
57
58
|
|
|
58
59
|
return buildGridKeyboard({
|
|
59
60
|
gamePrefix: TTT_PREFIX,
|
|
@@ -67,6 +68,10 @@ export function buildBoardInteractive(options: {
|
|
|
67
68
|
renderAscii: renderTttAscii,
|
|
68
69
|
highlight,
|
|
69
70
|
fallbackHint: '落子:回复数字 1-9(仅空格)',
|
|
71
|
+
postChoices: terminal
|
|
72
|
+
? [{ id: 'restart', label: '🔄 再来一局', style: 'primary' }]
|
|
73
|
+
: undefined,
|
|
74
|
+
channelType,
|
|
70
75
|
});
|
|
71
76
|
}
|
|
72
77
|
|
package/src/commands.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { Message, MessageCommand, getActionFromMessage, type Plugin } from 'zhin.js';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
channelKey,
|
|
4
|
+
normalizeTttAction,
|
|
5
|
+
parseChoicePayload,
|
|
6
|
+
registerGameTextMiddleware,
|
|
7
|
+
resolveGameChoice,
|
|
8
|
+
resolveGameTextPayload,
|
|
9
|
+
} from '@zhin.js/game-shared';
|
|
10
|
+
import { buildFallbackMap, TTT_PREFIX } from './board-view.js';
|
|
4
11
|
import { parseBoard } from './engine.js';
|
|
5
|
-
import { handleMove } from './game-flow.js';
|
|
12
|
+
import { handleMove, restartFromTerminal } from './game-flow.js';
|
|
6
13
|
import { runTttCommand } from './ttt-command.js';
|
|
7
14
|
import type { SessionServices } from './session-service.js';
|
|
8
15
|
|
|
@@ -10,7 +17,6 @@ function actionPayload(message: Message<any>): string | undefined {
|
|
|
10
17
|
return getActionFromMessage(message)?.payload;
|
|
11
18
|
}
|
|
12
19
|
|
|
13
|
-
/** @deprecated 使用 game-shared parseChoicePayload;保留 ttt 专用解析 */
|
|
14
20
|
function parseTttPayload(payload: string): { sessionId: string; cell: number } | null {
|
|
15
21
|
const m = /^ttt:([^:]+):(\d)$/.exec(payload);
|
|
16
22
|
if (!m) return null;
|
|
@@ -24,15 +30,25 @@ function parseCellButtonId(id: string): number | null {
|
|
|
24
30
|
return cell >= 0 && cell <= 8 ? cell : null;
|
|
25
31
|
}
|
|
26
32
|
|
|
27
|
-
async function
|
|
33
|
+
async function resolveTttAction(
|
|
28
34
|
message: Message<any>,
|
|
29
35
|
services: SessionServices,
|
|
30
|
-
): Promise<{ sessionId: string; cell: number } | null> {
|
|
36
|
+
): Promise<{ kind: 'move'; sessionId: string; cell: number } | { kind: 'restart'; sessionId: string } | null> {
|
|
37
|
+
const restart = await resolveGameChoice({
|
|
38
|
+
message,
|
|
39
|
+
gamePrefix: TTT_PREFIX,
|
|
40
|
+
validChoiceIds: ['restart'],
|
|
41
|
+
getById: (id) => services.session.getById(id),
|
|
42
|
+
getActiveForUser: (ch, uid) => services.session.getActiveForUser(ch, uid),
|
|
43
|
+
getByBoardMessageId: (mid) => services.session.getActiveByBoardMessageId(mid),
|
|
44
|
+
});
|
|
45
|
+
if (restart) return { kind: 'restart', sessionId: restart.sessionId };
|
|
46
|
+
|
|
31
47
|
const action = getActionFromMessage(message);
|
|
32
48
|
if (!action) return null;
|
|
33
49
|
|
|
34
50
|
const fromPayload = parseTttPayload(action.payload);
|
|
35
|
-
if (fromPayload) return fromPayload;
|
|
51
|
+
if (fromPayload) return { kind: 'move', ...fromPayload };
|
|
36
52
|
|
|
37
53
|
const cell =
|
|
38
54
|
parseCellButtonId(action.payload)
|
|
@@ -46,7 +62,15 @@ async function resolveTttMove(
|
|
|
46
62
|
? await services.session.getActiveByBoardMessageId(action.sourceMessageId)
|
|
47
63
|
: null);
|
|
48
64
|
if (!session || session.channel_key !== ch) return null;
|
|
49
|
-
return { sessionId: session.id, cell };
|
|
65
|
+
return { kind: 'move', sessionId: session.id, cell };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function registerCommands(
|
|
69
|
+
plugin: Plugin,
|
|
70
|
+
getServices: () => SessionServices | null,
|
|
71
|
+
): void {
|
|
72
|
+
registerTttPattern(plugin, '/ttt [action:word]', '井字棋(ttt)', getServices);
|
|
73
|
+
registerTttPattern(plugin, '/井字棋 [action:word]', '井字棋(中文)', getServices);
|
|
50
74
|
}
|
|
51
75
|
|
|
52
76
|
function registerTttPattern(
|
|
@@ -62,20 +86,11 @@ function registerTttPattern(
|
|
|
62
86
|
const services = getServices();
|
|
63
87
|
if (!services) return '井字棋需要启用 database 配置。';
|
|
64
88
|
const raw = (result.params.action as string | undefined) ?? '';
|
|
65
|
-
|
|
66
|
-
return runTttCommand(plugin, services, message, action);
|
|
89
|
+
return runTttCommand(plugin, services, message, normalizeTttAction(raw));
|
|
67
90
|
}),
|
|
68
91
|
);
|
|
69
92
|
}
|
|
70
93
|
|
|
71
|
-
export function registerCommands(
|
|
72
|
-
plugin: Plugin,
|
|
73
|
-
getServices: () => SessionServices | null,
|
|
74
|
-
): void {
|
|
75
|
-
registerTttPattern(plugin, 'ttt [action:word]', '井字棋(ttt)', getServices);
|
|
76
|
-
registerTttPattern(plugin, '井字棋 [action:word]', '井字棋(中文)', getServices);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
94
|
async function handleTttAction(
|
|
80
95
|
plugin: Plugin,
|
|
81
96
|
getServices: () => SessionServices | null,
|
|
@@ -83,9 +98,16 @@ async function handleTttAction(
|
|
|
83
98
|
): Promise<boolean> {
|
|
84
99
|
const services = getServices();
|
|
85
100
|
if (!services) return false;
|
|
86
|
-
const
|
|
87
|
-
if (!
|
|
88
|
-
|
|
101
|
+
const action = await resolveTttAction(message, services);
|
|
102
|
+
if (!action) return false;
|
|
103
|
+
|
|
104
|
+
if (action.kind === 'restart') {
|
|
105
|
+
const err = await restartFromTerminal(plugin, services, message, action.sessionId);
|
|
106
|
+
if (err) await message.$reply?.(err);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const err = await handleMove(plugin, services, message, action.sessionId, action.cell);
|
|
89
111
|
if (err) await message.$reply?.(err);
|
|
90
112
|
return true;
|
|
91
113
|
}
|
|
@@ -103,24 +125,30 @@ export function registerTextFallback(plugin: Plugin, getServices: () => SessionS
|
|
|
103
125
|
const inboundAction = actionPayload(message);
|
|
104
126
|
if (inboundAction?.startsWith('ttt:')) return next();
|
|
105
127
|
|
|
128
|
+
const raw = message.$raw?.trim() ?? '';
|
|
106
129
|
const ch = channelKey(message);
|
|
130
|
+
|
|
131
|
+
const payloadFromText = resolveGameTextPayload(raw);
|
|
132
|
+
if (payloadFromText?.startsWith(`${TTT_PREFIX}:`)) {
|
|
133
|
+
const parsed = parseChoicePayload(payloadFromText, TTT_PREFIX);
|
|
134
|
+
if (parsed?.choiceId === 'restart') {
|
|
135
|
+
const session = await services.session.getById(parsed.sessionId);
|
|
136
|
+
if (session?.channel_key === ch) {
|
|
137
|
+
const err = await restartFromTerminal(plugin, services, message, parsed.sessionId);
|
|
138
|
+
if (err) await message.$reply?.(err);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
107
144
|
const session = await services.session.getActiveForUser(ch, message.$sender.id);
|
|
108
145
|
if (!session) return next();
|
|
109
146
|
|
|
110
|
-
const raw = message.$raw?.trim() ?? '';
|
|
111
147
|
let cell: number | null = null;
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const n = /^(\d)$/.exec(raw);
|
|
117
|
-
if (n) {
|
|
118
|
-
const map = buildFallbackMap(session.id, parseBoard(session.board));
|
|
119
|
-
const payload = map[n[1]!];
|
|
120
|
-
const p = payload ? parseTttPayload(payload) : null;
|
|
121
|
-
if (p?.sessionId === session.id) cell = p.cell;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
148
|
+
const map = buildFallbackMap(session.id, parseBoard(session.board));
|
|
149
|
+
const payloadText = resolveGameTextPayload(raw, map);
|
|
150
|
+
const p = payloadText ? parseTttPayload(payloadText) : null;
|
|
151
|
+
if (p?.sessionId === session.id) cell = p.cell;
|
|
124
152
|
if (cell == null) return next();
|
|
125
153
|
|
|
126
154
|
const err = await handleMove(plugin, services, message, session.id, cell);
|
package/src/game-flow.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Adapter, Message, Plugin } from 'zhin.js';
|
|
2
|
+
import { recordGameOutcome } from '@zhin.js/game-shared';
|
|
2
3
|
import type { TttSessionRow } from './models.js';
|
|
3
4
|
import { buildBoardInteractive } from './board-view.js';
|
|
4
5
|
import {
|
|
@@ -49,6 +50,7 @@ export async function sendOrEditBoard(
|
|
|
49
50
|
terminal,
|
|
50
51
|
omitAsciiBoard: message.$adapter === 'qq',
|
|
51
52
|
highlight,
|
|
53
|
+
channelType: message.$channel.type,
|
|
52
54
|
});
|
|
53
55
|
|
|
54
56
|
const adapter = plugin.root.inject(message.$adapter) as Adapter;
|
|
@@ -75,6 +77,24 @@ export async function sendOrEditBoard(
|
|
|
75
77
|
return msgId ?? '';
|
|
76
78
|
}
|
|
77
79
|
|
|
80
|
+
export async function restartFromTerminal(
|
|
81
|
+
plugin: Plugin,
|
|
82
|
+
services: SessionServices,
|
|
83
|
+
message: Message<any>,
|
|
84
|
+
sessionId: string,
|
|
85
|
+
): Promise<string | null> {
|
|
86
|
+
const session = await services.session.getById(sessionId);
|
|
87
|
+
if (!session) return '对局不存在。';
|
|
88
|
+
const mark = playerMark(message.$sender.id, {
|
|
89
|
+
playerX: session.player_x,
|
|
90
|
+
playerO: session.player_o,
|
|
91
|
+
});
|
|
92
|
+
if (!mark) return '你不是本局玩家。';
|
|
93
|
+
await services.session.updateSession(session.id, { status: 'aborted', winner: 0 });
|
|
94
|
+
const hint = await startBotGame(plugin, services, message);
|
|
95
|
+
return hint.includes('已有') ? hint : null;
|
|
96
|
+
}
|
|
97
|
+
|
|
78
98
|
function turnCell(session: TttSessionRow): Cell {
|
|
79
99
|
return session.turn === 1 ? X : O;
|
|
80
100
|
}
|
|
@@ -132,6 +152,29 @@ export async function handleMove(
|
|
|
132
152
|
|
|
133
153
|
const updated = (await services.session.getById(session.id))!;
|
|
134
154
|
|
|
155
|
+
if (win || draw) {
|
|
156
|
+
const humanId = isBotSession(updated)
|
|
157
|
+
? (updated.player_x === BOT_ID ? updated.player_o : updated.player_x)
|
|
158
|
+
: message.$sender.id;
|
|
159
|
+
const humanName = isBotSession(updated)
|
|
160
|
+
? (updated.player_x === BOT_ID ? updated.player_o_name : updated.player_x_name)
|
|
161
|
+
: String(message.$sender.name ?? message.$sender.id);
|
|
162
|
+
const humanMsg = {
|
|
163
|
+
...message,
|
|
164
|
+
$sender: { ...message.$sender, id: humanId, name: humanName },
|
|
165
|
+
} as Message<any>;
|
|
166
|
+
if (win) {
|
|
167
|
+
const humanMark = playerMark(humanId, {
|
|
168
|
+
playerX: updated.player_x,
|
|
169
|
+
playerO: updated.player_o,
|
|
170
|
+
});
|
|
171
|
+
const humanWon = humanMark === win.winner;
|
|
172
|
+
void recordGameOutcome(humanMsg, 'ttt', humanWon ? 'won' : 'lost', humanWon ? 20 : 0);
|
|
173
|
+
} else {
|
|
174
|
+
void recordGameOutcome(humanMsg, 'ttt', 'draw');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
135
178
|
if (win) {
|
|
136
179
|
const status = formatWinHeadline(updated, win.winner);
|
|
137
180
|
await sendOrEditBoard(plugin, services, message, updated, status, true, win.line);
|
package/src/hub-register.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
* storage: ./data/zhin.db
|
|
10
10
|
* ```
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
12
|
+
import { formatCompact, usePlugin, type DatabaseFeature } from 'zhin.js';
|
|
13
13
|
import { registerModels } from './models.js';
|
|
14
14
|
import { createServices, resolveGameDatabase, type SessionServices } from './session-service.js';
|
|
15
15
|
import { registerCommands, registerInteractive, registerTextFallback } from './commands.js';
|
|
16
16
|
import { registerTttHub } from './hub-register.js';
|
|
17
17
|
|
|
18
18
|
const plugin = usePlugin();
|
|
19
|
-
const { logger, useContext,
|
|
19
|
+
const { logger, useContext, addSchedule } = plugin;
|
|
20
20
|
|
|
21
21
|
registerModels(plugin);
|
|
22
22
|
|
|
@@ -24,7 +24,7 @@ let services: SessionServices | null = null;
|
|
|
24
24
|
|
|
25
25
|
useContext('database', (dbFeature: DatabaseFeature) => {
|
|
26
26
|
services = createServices(resolveGameDatabase(dbFeature));
|
|
27
|
-
logger.
|
|
27
|
+
logger.debug(formatCompact({ 模块: '井字棋', 数据模型: '已就绪' }));
|
|
28
28
|
});
|
|
29
29
|
|
|
30
30
|
registerTttHub(() => services);
|
|
@@ -32,12 +32,10 @@ registerCommands(plugin, () => services);
|
|
|
32
32
|
registerInteractive(plugin, () => services);
|
|
33
33
|
registerTextFallback(plugin, () => services);
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
new Cron('0 */10 * * * *', async () => {
|
|
35
|
+
addSchedule({ kind: 'solar', cron: '0 */10 * * * *' }, async () => {
|
|
37
36
|
if (!services) return;
|
|
38
37
|
const n = await services.session.abortStale(30 * 60 * 1000);
|
|
39
38
|
if (n > 0) logger.debug(formatCompact({ 井字棋: '清理超时局', count: n }));
|
|
40
|
-
})
|
|
41
|
-
);
|
|
39
|
+
});
|
|
42
40
|
|
|
43
|
-
logger.
|
|
41
|
+
logger.debug(formatCompact({ 模块: '井字棋', 状态: '已加载' }));
|
package/src/session-service.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Database, DatabaseFeature, Message, Models, RelatedModel } from 'zhin.js';
|
|
2
|
-
import { channelKey } from '@zhin.js/game-shared';
|
|
2
|
+
import { channelKey, boardMessageMatches, generateCompactId } from '@zhin.js/game-shared';
|
|
3
3
|
import type { TttModelName, TttSessionRow } from './models.js';
|
|
4
4
|
|
|
5
5
|
/** 井字棋服务使用的数据库实例(Models 经 models.ts 模块增强) */
|
|
@@ -75,7 +75,7 @@ export class QueueService {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
export function sessionId(): string {
|
|
78
|
-
return
|
|
78
|
+
return generateCompactId('s');
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
export class SessionService {
|
|
@@ -103,14 +103,9 @@ export class SessionService {
|
|
|
103
103
|
/** 根据棋盘消息 ID 查找进行中的局(QQ 等 action 带 sourceMessageId) */
|
|
104
104
|
async getActiveByBoardMessageId(messageId: string): Promise<TttSessionRow | null> {
|
|
105
105
|
if (!messageId) return null;
|
|
106
|
-
const rows = await getModel(this.db, 'ttt_sessions').findAll({
|
|
106
|
+
const rows = await getModel(this.db, 'ttt_sessions').findAll({});
|
|
107
107
|
for (const row of rows) {
|
|
108
|
-
|
|
109
|
-
if (!stored) continue;
|
|
110
|
-
if (stored === messageId) return row;
|
|
111
|
-
if (stored.endsWith(`:${messageId}`)) return row;
|
|
112
|
-
const tail = stored.split(':').pop();
|
|
113
|
-
if (tail && messageId.endsWith(tail)) return row;
|
|
108
|
+
if (boardMessageMatches(row.board_message_id ?? '', messageId)) return row;
|
|
114
109
|
}
|
|
115
110
|
return null;
|
|
116
111
|
}
|