@zhin.js/game-kit 2.0.1 → 2.0.2
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/README.md +73 -16
- package/lib/base-session-service.d.ts +54 -0
- package/lib/base-session-service.d.ts.map +1 -0
- package/lib/base-session-service.js +139 -0
- package/lib/base-session-service.js.map +1 -0
- package/lib/command-alias.d.ts +3 -1
- package/lib/command-alias.d.ts.map +1 -1
- package/lib/command-alias.js.map +1 -1
- package/lib/command-message.d.ts +3 -0
- package/lib/command-message.d.ts.map +1 -1
- package/lib/command-message.js +0 -6
- package/lib/command-message.js.map +1 -1
- package/lib/define-game-plugin.d.ts +32 -0
- package/lib/define-game-plugin.d.ts.map +1 -0
- package/lib/define-game-plugin.js +87 -0
- package/lib/define-game-plugin.js.map +1 -0
- package/lib/deterministic-random.d.ts +16 -0
- package/lib/deterministic-random.d.ts.map +1 -0
- package/lib/deterministic-random.js +68 -0
- package/lib/deterministic-random.js.map +1 -0
- package/lib/game-events.d.ts +53 -0
- package/lib/game-events.d.ts.map +1 -0
- package/lib/game-events.js +26 -0
- package/lib/game-events.js.map +1 -0
- package/lib/game-interactive.d.ts +0 -22
- package/lib/game-interactive.d.ts.map +1 -1
- package/lib/game-interactive.js +1 -57
- package/lib/game-interactive.js.map +1 -1
- package/lib/game-records.d.ts +0 -1
- package/lib/game-records.d.ts.map +1 -1
- package/lib/game-records.js +0 -60
- package/lib/game-records.js.map +1 -1
- package/lib/game-session.d.ts +0 -59
- package/lib/game-session.d.ts.map +1 -1
- package/lib/game-session.js +0 -29
- package/lib/game-session.js.map +1 -1
- package/lib/index.d.ts +6 -9
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -9
- package/lib/index.js.map +1 -1
- package/lib/memory-db.d.ts +6 -0
- package/lib/memory-db.d.ts.map +1 -1
- package/lib/memory-db.js +8 -0
- package/lib/memory-db.js.map +1 -1
- package/lib/session-coordinator.d.ts +27 -0
- package/lib/session-coordinator.d.ts.map +1 -0
- package/lib/session-coordinator.js +57 -0
- package/lib/session-coordinator.js.map +1 -0
- package/lib/versioned-session-service.d.ts +48 -0
- package/lib/versioned-session-service.d.ts.map +1 -0
- package/lib/versioned-session-service.js +116 -0
- package/lib/versioned-session-service.js.map +1 -0
- package/package.json +7 -6
- package/src/base-session-service.ts +210 -0
- package/src/command-alias.ts +3 -1
- package/src/command-message.ts +4 -0
- package/src/define-game-plugin.ts +162 -0
- package/src/deterministic-random.ts +81 -0
- package/src/game-events.ts +75 -0
- package/src/game-interactive.ts +1 -80
- package/src/game-records.ts +0 -73
- package/src/game-session.ts +0 -83
- package/src/index.ts +6 -9
- package/src/memory-db.ts +12 -0
- package/src/session-coordinator.ts +74 -0
- package/src/versioned-session-service.ts +162 -0
- package/lib/command-help.d.ts +0 -19
- package/lib/command-help.d.ts.map +0 -1
- package/lib/command-help.js +0 -91
- package/lib/command-help.js.map +0 -1
- package/lib/game-commands.d.ts +0 -3
- package/lib/game-commands.d.ts.map +0 -1
- package/lib/game-commands.js +0 -5
- package/lib/game-commands.js.map +0 -1
- package/lib/game-hub-feature.d.ts +0 -58
- package/lib/game-hub-feature.d.ts.map +0 -1
- package/lib/game-hub-feature.js +0 -102
- package/lib/game-hub-feature.js.map +0 -1
- package/lib/game-hub-flow.d.ts +0 -9
- package/lib/game-hub-flow.d.ts.map +0 -1
- package/lib/game-hub-flow.js +0 -90
- package/lib/game-hub-flow.js.map +0 -1
- package/lib/game-hub-menu-context.d.ts +0 -25
- package/lib/game-hub-menu-context.d.ts.map +0 -1
- package/lib/game-hub-menu-context.js +0 -64
- package/lib/game-hub-menu-context.js.map +0 -1
- package/lib/game-hub-menu.d.ts +0 -37
- package/lib/game-hub-menu.d.ts.map +0 -1
- package/lib/game-hub-menu.js +0 -162
- package/lib/game-hub-menu.js.map +0 -1
- package/lib/game-hub-mount.d.ts +0 -13
- package/lib/game-hub-mount.d.ts.map +0 -1
- package/lib/game-hub-mount.js +0 -89
- package/lib/game-hub-mount.js.map +0 -1
- package/lib/game-middleware.d.ts +0 -6
- package/lib/game-middleware.d.ts.map +0 -1
- package/lib/game-middleware.js +0 -9
- package/lib/game-middleware.js.map +0 -1
- package/lib/game-onboarding.d.ts +0 -8
- package/lib/game-onboarding.d.ts.map +0 -1
- package/lib/game-onboarding.js +0 -67
- package/lib/game-onboarding.js.map +0 -1
- package/lib/help-card.d.ts +0 -12
- package/lib/help-card.d.ts.map +0 -1
- package/lib/help-card.js +0 -129
- package/lib/help-card.js.map +0 -1
- package/src/command-help.ts +0 -117
- package/src/game-commands.ts +0 -4
- package/src/game-hub-feature.ts +0 -154
- package/src/game-hub-flow.ts +0 -114
- package/src/game-hub-menu-context.ts +0 -94
- package/src/game-hub-menu.ts +0 -223
- package/src/game-hub-mount.ts +0 -147
- package/src/game-middleware.ts +0 -14
- package/src/game-onboarding.ts +0 -71
- package/src/help-card.ts +0 -188
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface GameEventSession {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly channel_key: string;
|
|
4
|
+
readonly status: string;
|
|
5
|
+
readonly updated_at: number;
|
|
6
|
+
readonly adapter?: string;
|
|
7
|
+
readonly endpoint?: string;
|
|
8
|
+
readonly channel_type?: string;
|
|
9
|
+
readonly channel_id?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface GameOutcome {
|
|
12
|
+
readonly userId: string;
|
|
13
|
+
readonly userName?: string;
|
|
14
|
+
readonly result: 'won' | 'lost' | 'draw' | 'aborted';
|
|
15
|
+
readonly score?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface GameEventMap {
|
|
18
|
+
'game:start': {
|
|
19
|
+
readonly gameId: string;
|
|
20
|
+
readonly session: GameEventSession;
|
|
21
|
+
};
|
|
22
|
+
'game:end': {
|
|
23
|
+
readonly gameId: string;
|
|
24
|
+
readonly session: GameEventSession;
|
|
25
|
+
readonly previousStatus: string;
|
|
26
|
+
readonly outcomes: readonly GameOutcome[];
|
|
27
|
+
};
|
|
28
|
+
'turn:change': {
|
|
29
|
+
readonly gameId: string;
|
|
30
|
+
readonly session: GameEventSession;
|
|
31
|
+
readonly previousTurn: unknown;
|
|
32
|
+
readonly turn: unknown;
|
|
33
|
+
};
|
|
34
|
+
'session:timeout': {
|
|
35
|
+
readonly gameId: string;
|
|
36
|
+
readonly session: GameEventSession;
|
|
37
|
+
readonly idleMs: number;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export type GameEventName = keyof GameEventMap;
|
|
41
|
+
export type GameEventListener<K extends GameEventName> = (event: GameEventMap[K]) => void | Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Small async pub/sub used by game modules. Listener failures are isolated so a
|
|
44
|
+
* notification adapter cannot roll back an already committed session update.
|
|
45
|
+
*/
|
|
46
|
+
export declare class GameEventBus {
|
|
47
|
+
#private;
|
|
48
|
+
on<K extends GameEventName>(name: K, listener: GameEventListener<K>): () => void;
|
|
49
|
+
emit<K extends GameEventName>(name: K, event: GameEventMap[K]): Promise<void>;
|
|
50
|
+
clear(): void;
|
|
51
|
+
}
|
|
52
|
+
export declare const gameEvents: GameEventBus;
|
|
53
|
+
//# sourceMappingURL=game-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-events.d.ts","sourceRoot":"","sources":["../src/game-events.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE;QACZ,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;KACpC,CAAC;IACF,UAAU,EAAE;QACV,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;KAC3C,CAAC;IACF,aAAa,EAAE;QACb,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;QAC/B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,iBAAiB,EAAE;QACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC;AAC/C,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,aAAa,IAAI,CACvD,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;GAGG;AACH,qBAAa,YAAY;;IAGvB,EAAE,CAAC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAU1E,IAAI,CAAC,CAAC,SAAS,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnF,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,UAAU,cAAqB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small async pub/sub used by game modules. Listener failures are isolated so a
|
|
3
|
+
* notification adapter cannot roll back an already committed session update.
|
|
4
|
+
*/
|
|
5
|
+
export class GameEventBus {
|
|
6
|
+
#listeners = new Map();
|
|
7
|
+
on(name, listener) {
|
|
8
|
+
const listeners = this.#listeners.get(name) ?? new Set();
|
|
9
|
+
listeners.add(listener);
|
|
10
|
+
this.#listeners.set(name, listeners);
|
|
11
|
+
return () => {
|
|
12
|
+
listeners.delete(listener);
|
|
13
|
+
if (listeners.size === 0)
|
|
14
|
+
this.#listeners.delete(name);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async emit(name, event) {
|
|
18
|
+
const listeners = [...(this.#listeners.get(name) ?? [])];
|
|
19
|
+
await Promise.allSettled(listeners.map((listener) => listener(event)));
|
|
20
|
+
}
|
|
21
|
+
clear() {
|
|
22
|
+
this.#listeners.clear();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export const gameEvents = new GameEventBus();
|
|
26
|
+
//# sourceMappingURL=game-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game-events.js","sourceRoot":"","sources":["../src/game-events.ts"],"names":[],"mappings":"AA+CA;;;GAGG;AACH,MAAM,OAAO,YAAY;IACd,UAAU,GAAG,IAAI,GAAG,EAAwD,CAAC;IAEtF,EAAE,CAA0B,IAAO,EAAE,QAA8B;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QACzD,SAAS,CAAC,GAAG,CAAC,QAA4C,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,MAAM,CAAC,QAA4C,CAAC,CAAC;YAC/D,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAA0B,IAAO,EAAE,KAAsB;QACjE,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -1,25 +1,3 @@
|
|
|
1
|
-
import { type Message } from '@zhin.js/core';
|
|
2
|
-
export declare const GAME_RESTART_CHOICE_IDS: Set<string>;
|
|
3
|
-
export declare function isRestartChoice(choiceId: string): boolean;
|
|
4
1
|
/** 从 QQ 指令预填 / 数字 fallback 解析游戏 payload */
|
|
5
2
|
export declare function resolveGameTextPayload(raw: string, map?: Record<string, string>): string | undefined;
|
|
6
|
-
export interface GameSessionRef {
|
|
7
|
-
id: string;
|
|
8
|
-
channel_key: string;
|
|
9
|
-
}
|
|
10
|
-
export interface ResolveGameChoiceOptions {
|
|
11
|
-
message: Message;
|
|
12
|
-
gamePrefix: string;
|
|
13
|
-
validChoiceIds: readonly string[];
|
|
14
|
-
getById: (sessionId: string) => Promise<GameSessionRef | null>;
|
|
15
|
-
getActiveForUser: (channel: string, userId: string) => Promise<GameSessionRef | null>;
|
|
16
|
-
getByBoardMessageId?: (messageId: string) => Promise<GameSessionRef | null>;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* 解析按钮/选项回调:优先 payload;终局「再来一局」允许已结束 session。
|
|
20
|
-
*/
|
|
21
|
-
export declare function resolveGameChoice(opts: ResolveGameChoiceOptions): Promise<{
|
|
22
|
-
sessionId: string;
|
|
23
|
-
choiceId: string;
|
|
24
|
-
} | null>;
|
|
25
3
|
//# sourceMappingURL=game-interactive.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-interactive.d.ts","sourceRoot":"","sources":["../src/game-interactive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"game-interactive.d.ts","sourceRoot":"","sources":["../src/game-interactive.ts"],"names":[],"mappings":"AAEA,2CAA2C;AAC3C,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,MAAM,GAAG,SAAS,CAEpB"}
|
package/lib/game-interactive.js
CHANGED
|
@@ -1,62 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { channelKey } from './board-sender.js';
|
|
3
|
-
import { parseChoicePayload } from './choice-keyboard.js';
|
|
4
|
-
export const GAME_RESTART_CHOICE_IDS = new Set([
|
|
5
|
-
'restart',
|
|
6
|
-
'restart_char',
|
|
7
|
-
'restart_idiom',
|
|
8
|
-
'restart_bot',
|
|
9
|
-
]);
|
|
10
|
-
export function isRestartChoice(choiceId) {
|
|
11
|
-
return GAME_RESTART_CHOICE_IDS.has(choiceId) || choiceId.startsWith('restart_');
|
|
12
|
-
}
|
|
1
|
+
import { resolvePayloadFromText } from '@zhin.js/core';
|
|
13
2
|
/** 从 QQ 指令预填 / 数字 fallback 解析游戏 payload */
|
|
14
3
|
export function resolveGameTextPayload(raw, map) {
|
|
15
4
|
return resolvePayloadFromText(raw, map);
|
|
16
5
|
}
|
|
17
|
-
/**
|
|
18
|
-
* 解析按钮/选项回调:优先 payload;终局「再来一局」允许已结束 session。
|
|
19
|
-
*/
|
|
20
|
-
export async function resolveGameChoice(opts) {
|
|
21
|
-
const action = getActionFromMessage(opts.message);
|
|
22
|
-
if (!action)
|
|
23
|
-
return null;
|
|
24
|
-
const ch = channelKey(opts.message);
|
|
25
|
-
const userId = opts.message.$sender.id;
|
|
26
|
-
const fromPayload = parseChoicePayload(action.payload, opts.gamePrefix);
|
|
27
|
-
if (fromPayload && opts.validChoiceIds.includes(fromPayload.choiceId)) {
|
|
28
|
-
const session = await opts.getById(fromPayload.sessionId);
|
|
29
|
-
if (session?.channel_key === ch) {
|
|
30
|
-
return { sessionId: fromPayload.sessionId, choiceId: fromPayload.choiceId };
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
const choiceId = action.id || action.payload;
|
|
34
|
-
if (!choiceId || !opts.validChoiceIds.includes(choiceId))
|
|
35
|
-
return null;
|
|
36
|
-
if (isRestartChoice(choiceId)) {
|
|
37
|
-
if (fromPayload) {
|
|
38
|
-
const session = await opts.getById(fromPayload.sessionId);
|
|
39
|
-
if (session?.channel_key === ch) {
|
|
40
|
-
return { sessionId: fromPayload.sessionId, choiceId };
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
if (action.sourceMessageId && opts.getByBoardMessageId) {
|
|
44
|
-
const byBoard = await opts.getByBoardMessageId(action.sourceMessageId);
|
|
45
|
-
if (byBoard && byBoard.channel_key === ch) {
|
|
46
|
-
return { sessionId: byBoard.id, choiceId };
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
const active = await opts.getActiveForUser(ch, userId);
|
|
50
|
-
if (active)
|
|
51
|
-
return { sessionId: active.id, choiceId };
|
|
52
|
-
return null;
|
|
53
|
-
}
|
|
54
|
-
const session = (await opts.getActiveForUser(ch, userId))
|
|
55
|
-
?? (action.sourceMessageId && opts.getByBoardMessageId
|
|
56
|
-
? await opts.getByBoardMessageId(action.sourceMessageId)
|
|
57
|
-
: null);
|
|
58
|
-
if (!session || session.channel_key !== ch)
|
|
59
|
-
return null;
|
|
60
|
-
return { sessionId: session.id, choiceId };
|
|
61
|
-
}
|
|
62
6
|
//# sourceMappingURL=game-interactive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-interactive.js","sourceRoot":"","sources":["../src/game-interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"game-interactive.js","sourceRoot":"","sources":["../src/game-interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD,2CAA2C;AAC3C,MAAM,UAAU,sBAAsB,CACpC,GAAW,EACX,GAA4B;IAE5B,OAAO,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC"}
|
package/lib/game-records.d.ts
CHANGED
|
@@ -52,7 +52,6 @@ export interface LeaderboardEntry {
|
|
|
52
52
|
games: number;
|
|
53
53
|
}
|
|
54
54
|
export declare function getGameLeaderboard(gameId: string, channelKeyFilter: string, limit?: number): Promise<LeaderboardEntry[]>;
|
|
55
|
-
export declare function mountGameRecordCommands(root: Plugin): () => void;
|
|
56
55
|
/** 测试专用 */
|
|
57
56
|
export declare function resetGameRecordsForTests(): void;
|
|
58
57
|
//# sourceMappingURL=game-records.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-records.d.ts","sourceRoot":"","sources":["../src/game-records.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"game-records.d.ts","sourceRoot":"","sources":["../src/game-records.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,MAAM,EACX,KAAK,MAAM,EAEZ,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGzE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEnE,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,MAAM;QACd,YAAY,EAAE;YACZ,EAAE,EAAE,MAAM,CAAC;YACX,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;YAClB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,EAAE,gBAAgB,CAAC;YACzB,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;KACH;CACF;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAwBnD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAOjE;AAQD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAW7D;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAEvE;AAaD,uFAAuF;AACvF,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAc3E;AAMD,mCAAmC;AACnC,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,EACxB,KAAK,SAAI,GACR,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,aAAa,EAAE,CAAC,CA4B1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,KAAK,SAAK,GACT,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2B7B;AAED,WAAW;AACX,wBAAgB,wBAAwB,IAAI,IAAI,CAM/C"}
|
package/lib/game-records.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { MessageCommand, } from '@zhin.js/core';
|
|
2
1
|
import { channelKey } from './board-sender.js';
|
|
3
|
-
import { getRegisteredGame, getRegisteredGames } from './game-hub-feature.js';
|
|
4
2
|
import { createHostGameDb } from './memory-db.js';
|
|
5
3
|
import { generateCompactId } from './random.js';
|
|
6
4
|
let legacyDb = null;
|
|
@@ -165,64 +163,6 @@ export async function getGameLeaderboard(gameId, channelKeyFilter, limit = 10) {
|
|
|
165
163
|
.sort((a, b) => b.wins - a.wins || b.totalScore - a.totalScore)
|
|
166
164
|
.slice(0, limit);
|
|
167
165
|
}
|
|
168
|
-
function gameTitle(gameId) {
|
|
169
|
-
const g = getRegisteredGame(gameId);
|
|
170
|
-
return g ? `${g.icon} ${g.title}` : gameId;
|
|
171
|
-
}
|
|
172
|
-
function formatUserStats(stats) {
|
|
173
|
-
if (!stats.length)
|
|
174
|
-
return '暂无战绩记录,快去 `/游戏` 开一局吧!';
|
|
175
|
-
const lines = stats.map((s) => {
|
|
176
|
-
const title = gameTitle(s.gameId);
|
|
177
|
-
return `• ${title}:${s.wins} 胜 ${s.losses} 负${s.draws ? ` ${s.draws} 平` : ''}(${s.games} 局,得分 ${s.totalScore})`;
|
|
178
|
-
});
|
|
179
|
-
return ['📊 **你的战绩**', '', ...lines].join('\n');
|
|
180
|
-
}
|
|
181
|
-
function formatLeaderboard(gameId, entries) {
|
|
182
|
-
const title = gameTitle(gameId);
|
|
183
|
-
if (!entries.length) {
|
|
184
|
-
return `${title} 在本群暂无排行,发送 \`/游戏\` 开始第一局!`;
|
|
185
|
-
}
|
|
186
|
-
const lines = entries.map((e, i) => `${i + 1}. ${e.userName} — ${e.wins} 胜 / ${e.games} 局(得分 ${e.totalScore})`);
|
|
187
|
-
return [`🏆 **${title} 本群排行**`, '', ...lines].join('\n');
|
|
188
|
-
}
|
|
189
|
-
export function mountGameRecordCommands(root) {
|
|
190
|
-
const disposers = [];
|
|
191
|
-
disposers.push(root.addCommand(new MessageCommand('/战绩')
|
|
192
|
-
.desc('查看本人在本群的游戏战绩')
|
|
193
|
-
.action(async (message) => {
|
|
194
|
-
const stats = await getUserGameStats(message.$sender.id, channelKey(message));
|
|
195
|
-
return formatUserStats(stats);
|
|
196
|
-
})), root.addCommand(new MessageCommand('/排行')
|
|
197
|
-
.desc('查看本群某游戏排行榜')
|
|
198
|
-
.action(async (message, ...args) => {
|
|
199
|
-
const query = args.join(' ').trim();
|
|
200
|
-
const games = getRegisteredGames();
|
|
201
|
-
if (!games.length)
|
|
202
|
-
return '暂无已注册游戏。';
|
|
203
|
-
const firstGame = games[0];
|
|
204
|
-
if (!firstGame)
|
|
205
|
-
return '暂无已注册游戏。';
|
|
206
|
-
let gameId = firstGame.id;
|
|
207
|
-
if (query) {
|
|
208
|
-
const hit = games.find((g) => g.id === query
|
|
209
|
-
|| g.title.includes(query)
|
|
210
|
-
|| g.commandPrefix.includes(query)
|
|
211
|
-
|| g.aliases?.some((a) => a.includes(query)));
|
|
212
|
-
if (!hit) {
|
|
213
|
-
const names = games.map((g) => g.title).join('、');
|
|
214
|
-
return `未找到游戏「${query}」。可选:${names}`;
|
|
215
|
-
}
|
|
216
|
-
gameId = hit.id;
|
|
217
|
-
}
|
|
218
|
-
const board = await getGameLeaderboard(gameId, channelKey(message));
|
|
219
|
-
return formatLeaderboard(gameId, board);
|
|
220
|
-
})));
|
|
221
|
-
return () => {
|
|
222
|
-
for (const d of disposers)
|
|
223
|
-
d();
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
166
|
/** 测试专用 */
|
|
227
167
|
export function resetGameRecordsForTests() {
|
|
228
168
|
legacyDb = null;
|
package/lib/game-records.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-records.js","sourceRoot":"","sources":["../src/game-records.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"game-records.js","sourceRoot":"","sources":["../src/game-records.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAyB,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAsBhD,IAAI,QAAQ,GAAwB,IAAI,CAAC;AACzC,IAAI,aAAa,GAAG,IAAI,OAAO,EAAwC,CAAC;AACxE,MAAM,iBAAiB,GAGlB,EAAE,CAAC;AAER,gEAAgE;AAChE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;AACtD,0EAA0E;AAC1E,IAAI,kBAAkB,GAAwB,IAAI,CAAC;AAEnD,SAAS,cAAc;IACrB,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,IAAI,QAAQ,CAAC;AAC/E,CAAC;AAED,6CAA6C;AAC7C,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,MAAM,EAAE,GAAG,kBAAkB,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACzB,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,GAAG,EAAE;QACV,IAAI,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAAsB;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC3D,OAAO,KAAsD,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAc;IACrD,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE;QACjC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;QACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1C,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACxC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;QACzC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;QACtC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,SAA0B;IAC/D,QAAQ,GAAG,SAAS,CAAC,EAAkB,CAAC;AAC1C,CAAC;AAED,MAAM,uBAAuB,GAA4B;IACvD,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;IACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IAC1C,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;IACxC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE;IACzC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;IACtC,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE;CAC5C,CAAC;AAOF;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA4B;IAC7D,IAAI,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;QACrD,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,cAAc,CAAC,CAA4B,CAAC;QAC/E,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IACD,kBAAkB,GAAG,QAAQ,CAAC;IAC9B,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvD,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrC,OAAO,GAAG,EAAE;QACV,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,KAAK,IAAI,CAAC;YAAE,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,mCAAmC;AACnC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAwB,EACxB,MAAc,EACd,MAAwB,EACxB,KAAK,GAAG,CAAC;IAET,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,OAAO;IAChB,MAAM,GAAG,GAAkB;QACzB,EAAE,EAAE,QAAQ,EAAE;QACd,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC;QAChC,OAAO,EAAE,MAAM;QACf,MAAM;QACN,KAAK;QACL,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;KACvB,CAAC;IACF,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAc,EACd,gBAAyB;IAEzB,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,MAAM,KAAK,GAAG,gBAAgB;QAC5B,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE;QACpD,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG;gBACL,MAAM,EAAE,GAAG,CAAC,OAAO;gBACnB,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,CAAC;gBACR,UAAU,EAAE,CAAC;gBACb,KAAK,EAAE,CAAC;aACT,CAAC;YACF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC;QAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;aACjC,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;aACzC,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,gBAAwB,EACxB,KAAK,GAAG,EAAE;IAEV,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;QAC5C,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,gBAAgB;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IACnD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,MAAM,EAAE,GAAG,CAAC,OAAO;gBACnB,QAAQ,EAAE,GAAG,CAAC,SAAS;gBACvB,IAAI,EAAE,CAAC;gBACP,UAAU,EAAE,CAAC;gBACb,KAAK,EAAE,CAAC;aACT,CAAC;YACF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC,KAAK,CAAC;QAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;YAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;SACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;SAC9D,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,WAAW;AACX,MAAM,UAAU,wBAAwB;IACtC,QAAQ,GAAG,IAAI,CAAC;IAChB,aAAa,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5B,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,kBAAkB,GAAG,IAAI,CAAC;AAC5B,CAAC"}
|
package/lib/game-session.d.ts
CHANGED
|
@@ -1,64 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 通用游戏会话接口
|
|
3
|
-
* 定义回合制游戏的基础会话结构
|
|
4
|
-
*/
|
|
5
|
-
import type { Message } from '@zhin.js/core';
|
|
6
|
-
/** 会话状态 */
|
|
7
|
-
export type GameStatus = 'active' | 'won' | 'draw' | 'aborted';
|
|
8
|
-
/** 通用游戏会话接口 */
|
|
9
|
-
export interface GameSession {
|
|
10
|
-
/** 会话 ID */
|
|
11
|
-
id: string;
|
|
12
|
-
/** 适配器名称 */
|
|
13
|
-
adapter: string;
|
|
14
|
-
/** Endpoint 名称 */
|
|
15
|
-
endpoint: string;
|
|
16
|
-
/** 频道类型 */
|
|
17
|
-
channel_type: 'private' | 'group' | 'channel';
|
|
18
|
-
/** 频道 ID */
|
|
19
|
-
channel_id: string;
|
|
20
|
-
/** 频道唯一键 */
|
|
21
|
-
channel_key: string;
|
|
22
|
-
/** 棋盘消息 ID(用于编辑) */
|
|
23
|
-
board_message_id: string;
|
|
24
|
-
/** 当前状态 */
|
|
25
|
-
status: GameStatus;
|
|
26
|
-
/** 更新时间戳 */
|
|
27
|
-
updated_at: number;
|
|
28
|
-
/** 创建时间戳 */
|
|
29
|
-
created_at: number;
|
|
30
|
-
}
|
|
31
|
-
/** 回合制游戏会话(2 人对战) */
|
|
32
|
-
export interface TurnBasedSession extends GameSession {
|
|
33
|
-
/** 玩家 1 ID */
|
|
34
|
-
player_1: string;
|
|
35
|
-
/** 玩家 2 ID */
|
|
36
|
-
player_2: string;
|
|
37
|
-
/** 玩家 1 显示名 */
|
|
38
|
-
player_1_name: string;
|
|
39
|
-
/** 玩家 2 显示名 */
|
|
40
|
-
player_2_name: string;
|
|
41
|
-
/** 当前回合(1 或 2) */
|
|
42
|
-
turn: 1 | 2;
|
|
43
|
-
/** 胜者(0=无,1=玩家1,2=玩家2) */
|
|
44
|
-
winner: 0 | 1 | 2;
|
|
45
|
-
/** 步数 */
|
|
46
|
-
move_count: number;
|
|
47
|
-
}
|
|
48
1
|
/** 生成会话 ID */
|
|
49
2
|
export declare function generateSessionId(): string;
|
|
50
|
-
/** 获取当前回合玩家 ID */
|
|
51
|
-
export declare function currentPlayerId(session: TurnBasedSession): string;
|
|
52
|
-
/** 判断用户是否为本局玩家 */
|
|
53
|
-
export declare function isPlayer(session: TurnBasedSession, userId: string): boolean;
|
|
54
|
-
/** 判断是否轮到该用户 */
|
|
55
|
-
export declare function isPlayerTurn(session: TurnBasedSession, userId: string): boolean;
|
|
56
|
-
/** 获取玩家编号(1 或 2),非玩家返回 null */
|
|
57
|
-
export declare function playerNumber(session: TurnBasedSession, userId: string): 1 | 2 | null;
|
|
58
|
-
/** 切换回合 */
|
|
59
|
-
export declare function nextTurn(current: 1 | 2): 1 | 2;
|
|
60
|
-
/** 从 Message 提取发送者显示名 */
|
|
61
|
-
export declare function senderDisplayName(message: Message): string;
|
|
62
3
|
/** 比对出站 board_message_id 与平台回调 messageId(含 composite id) */
|
|
63
4
|
export declare function boardMessageMatches(stored: string, messageId: string): boolean;
|
|
64
5
|
//# sourceMappingURL=game-session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-session.d.ts","sourceRoot":"","sources":["../src/game-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"game-session.d.ts","sourceRoot":"","sources":["../src/game-session.ts"],"names":[],"mappings":"AAEA,cAAc;AACd,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAM9E"}
|
package/lib/game-session.js
CHANGED
|
@@ -3,35 +3,6 @@ import { generateCompactId } from './random.js';
|
|
|
3
3
|
export function generateSessionId() {
|
|
4
4
|
return generateCompactId('s');
|
|
5
5
|
}
|
|
6
|
-
/** 获取当前回合玩家 ID */
|
|
7
|
-
export function currentPlayerId(session) {
|
|
8
|
-
return session.turn === 1 ? session.player_1 : session.player_2;
|
|
9
|
-
}
|
|
10
|
-
/** 判断用户是否为本局玩家 */
|
|
11
|
-
export function isPlayer(session, userId) {
|
|
12
|
-
return session.player_1 === userId || session.player_2 === userId;
|
|
13
|
-
}
|
|
14
|
-
/** 判断是否轮到该用户 */
|
|
15
|
-
export function isPlayerTurn(session, userId) {
|
|
16
|
-
return currentPlayerId(session) === userId;
|
|
17
|
-
}
|
|
18
|
-
/** 获取玩家编号(1 或 2),非玩家返回 null */
|
|
19
|
-
export function playerNumber(session, userId) {
|
|
20
|
-
if (session.player_1 === userId)
|
|
21
|
-
return 1;
|
|
22
|
-
if (session.player_2 === userId)
|
|
23
|
-
return 2;
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
/** 切换回合 */
|
|
27
|
-
export function nextTurn(current) {
|
|
28
|
-
return current === 1 ? 2 : 1;
|
|
29
|
-
}
|
|
30
|
-
/** 从 Message 提取发送者显示名 */
|
|
31
|
-
export function senderDisplayName(message) {
|
|
32
|
-
const name = message.$sender.name?.trim();
|
|
33
|
-
return name || message.$sender.id;
|
|
34
|
-
}
|
|
35
6
|
/** 比对出站 board_message_id 与平台回调 messageId(含 composite id) */
|
|
36
7
|
export function boardMessageMatches(stored, messageId) {
|
|
37
8
|
if (!stored || !messageId)
|
package/lib/game-session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game-session.js","sourceRoot":"","sources":["../src/game-session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"game-session.js","sourceRoot":"","sources":["../src/game-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,cAAc;AACd,MAAM,UAAU,iBAAiB;IAC/B,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,SAAiB;IACnE,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACrC,mDAAmD;IACnD,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC"}
|
package/lib/index.d.ts
CHANGED
|
@@ -7,19 +7,16 @@ export * from './grid-keyboard.js';
|
|
|
7
7
|
export * from './choice-keyboard.js';
|
|
8
8
|
export * from './board-sender.js';
|
|
9
9
|
export * from './game-session.js';
|
|
10
|
-
export * from './
|
|
11
|
-
export * from './
|
|
12
|
-
export * from './
|
|
13
|
-
export * from './game-
|
|
14
|
-
export * from './
|
|
15
|
-
export * from './game-
|
|
10
|
+
export * from './base-session-service.js';
|
|
11
|
+
export * from './versioned-session-service.js';
|
|
12
|
+
export * from './deterministic-random.js';
|
|
13
|
+
export * from './game-events.js';
|
|
14
|
+
export * from './session-coordinator.js';
|
|
15
|
+
export * from './define-game-plugin.js';
|
|
16
16
|
export * from './game-action-alias.js';
|
|
17
|
-
export * from './game-commands.js';
|
|
18
17
|
export * from './game-interactive.js';
|
|
19
18
|
export * from './interaction-profiles.js';
|
|
20
19
|
export * from './game-records.js';
|
|
21
|
-
export * from './game-onboarding.js';
|
|
22
|
-
export * from './command-help.js';
|
|
23
20
|
export * from './command-message.js';
|
|
24
21
|
export * from './memory-db.js';
|
|
25
22
|
export * from './send-content-text.js';
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -7,19 +7,16 @@ export * from './grid-keyboard.js';
|
|
|
7
7
|
export * from './choice-keyboard.js';
|
|
8
8
|
export * from './board-sender.js';
|
|
9
9
|
export * from './game-session.js';
|
|
10
|
-
export * from './
|
|
11
|
-
export * from './
|
|
12
|
-
export * from './
|
|
13
|
-
export * from './game-
|
|
14
|
-
export * from './
|
|
15
|
-
export * from './game-
|
|
10
|
+
export * from './base-session-service.js';
|
|
11
|
+
export * from './versioned-session-service.js';
|
|
12
|
+
export * from './deterministic-random.js';
|
|
13
|
+
export * from './game-events.js';
|
|
14
|
+
export * from './session-coordinator.js';
|
|
15
|
+
export * from './define-game-plugin.js';
|
|
16
16
|
export * from './game-action-alias.js';
|
|
17
|
-
export * from './game-commands.js';
|
|
18
17
|
export * from './game-interactive.js';
|
|
19
18
|
export * from './interaction-profiles.js';
|
|
20
19
|
export * from './game-records.js';
|
|
21
|
-
export * from './game-onboarding.js';
|
|
22
|
-
export * from './command-help.js';
|
|
23
20
|
export * from './command-message.js';
|
|
24
21
|
export * from './memory-db.js';
|
|
25
22
|
export * from './send-content-text.js';
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC"}
|
package/lib/memory-db.d.ts
CHANGED
|
@@ -17,6 +17,12 @@ export interface InMemoryGameDb {
|
|
|
17
17
|
}
|
|
18
18
|
/** Create an in-memory db with the given model table names. */
|
|
19
19
|
export declare function createInMemoryGameDb(tableNames: readonly string[]): InMemoryGameDb;
|
|
20
|
+
/**
|
|
21
|
+
* Typed boundary used by game tests and standalone embedders. The database
|
|
22
|
+
* implementation is deliberately structural so game packages keep their
|
|
23
|
+
* precise model types without each package recreating the same adapter.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createMemoryGameServices<TDatabase, TServices>(tableNames: readonly string[], factory: (database: TDatabase) => TServices): TServices;
|
|
20
26
|
/** Minimal DatabaseHost model surface (structural typing; no plugin-runtime dep). */
|
|
21
27
|
export interface HostGameModelSource {
|
|
22
28
|
select(): {
|
package/lib/memory-db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-db.d.ts","sourceRoot":"","sources":["../src/memory-db.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAA;KAAE,CAAC;CAClE;AA4CD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAUlF;AAED,qFAAqF;AACrF,MAAM,WAAW,mBAAmB;IAClC,MAAM,IAAI;QAER,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;KAC/E,CAAC;IACF,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,IAAI;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IACtE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACtC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACzD,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAA;KAAE,CAAC;CAChE;AA+BD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,cAAc,CAUhB"}
|
|
1
|
+
{"version":3,"file":"memory-db.d.ts","sourceRoot":"","sources":["../src/memory-db.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnC,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzD,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAA;KAAE,CAAC;CAClE;AA4CD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAUlF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAC3D,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,SAAS,GAC1C,SAAS,CAEX;AAED,qFAAqF;AACrF,MAAM,WAAW,mBAAmB;IAClC,MAAM,IAAI;QAER,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;KAC/E,CAAC;IACF,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,IAAI;QAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IACtE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACtC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACzD,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAA;KAAE,CAAC;CAChE;AA+BD,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,cAAc,CAUhB"}
|
package/lib/memory-db.js
CHANGED
|
@@ -51,6 +51,14 @@ export function createInMemoryGameDb(tableNames) {
|
|
|
51
51
|
},
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Typed boundary used by game tests and standalone embedders. The database
|
|
56
|
+
* implementation is deliberately structural so game packages keep their
|
|
57
|
+
* precise model types without each package recreating the same adapter.
|
|
58
|
+
*/
|
|
59
|
+
export function createMemoryGameServices(tableNames, factory) {
|
|
60
|
+
return factory(createInMemoryGameDb(tableNames));
|
|
61
|
+
}
|
|
54
62
|
function wrapHostModel(model) {
|
|
55
63
|
return {
|
|
56
64
|
findAll: async (q = {}) => {
|
package/lib/memory-db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../src/memory-db.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../src/memory-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface ActiveGameSession {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly channel_key: string;
|
|
4
|
+
}
|
|
5
|
+
export interface GameSessionProvider {
|
|
6
|
+
readonly gameId: string;
|
|
7
|
+
getActiveForUser(channelKey: string, userId: string): Promise<ActiveGameSession | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare class GameSessionConflictError extends Error {
|
|
10
|
+
readonly requestedGameId: string;
|
|
11
|
+
readonly activeGameId: string;
|
|
12
|
+
readonly sessionId: string;
|
|
13
|
+
readonly userId: string;
|
|
14
|
+
constructor(requestedGameId: string, activeGameId: string, sessionId: string, userId: string);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Cross-game active-session index. Registrations form per-game stacks so HMR
|
|
18
|
+
* can install a new generation before disposing the old one without a gap.
|
|
19
|
+
*/
|
|
20
|
+
export declare class GameSessionCoordinator {
|
|
21
|
+
#private;
|
|
22
|
+
register(provider: GameSessionProvider): () => void;
|
|
23
|
+
assertAvailable(requestedGameId: string, channelKey: string, userIds: readonly string[]): Promise<void>;
|
|
24
|
+
clear(): void;
|
|
25
|
+
}
|
|
26
|
+
export declare const gameSessionCoordinator: GameSessionCoordinator;
|
|
27
|
+
//# sourceMappingURL=session-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-coordinator.d.ts","sourceRoot":"","sources":["../src/session-coordinator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;CACzF;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAE/C,QAAQ,CAAC,eAAe,EAAE,MAAM;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAHd,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM;CAQ1B;AAED;;;GAGG;AACH,qBAAa,sBAAsB;;IAGjC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAa7C,eAAe,CACnB,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC;IAmBhB,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,sBAAsB,wBAA+B,CAAC"}
|