@zhin.js/game-kit 2.0.0 → 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.
Files changed (139) hide show
  1. package/README.md +73 -16
  2. package/lib/base-session-service.d.ts +54 -0
  3. package/lib/base-session-service.d.ts.map +1 -0
  4. package/lib/base-session-service.js +139 -0
  5. package/lib/base-session-service.js.map +1 -0
  6. package/lib/board-sender.d.ts +6 -7
  7. package/lib/board-sender.d.ts.map +1 -1
  8. package/lib/board-sender.js.map +1 -1
  9. package/lib/choice-keyboard.d.ts +3 -1
  10. package/lib/choice-keyboard.d.ts.map +1 -1
  11. package/lib/choice-keyboard.js +4 -2
  12. package/lib/choice-keyboard.js.map +1 -1
  13. package/lib/command-alias.d.ts +3 -1
  14. package/lib/command-alias.d.ts.map +1 -1
  15. package/lib/command-alias.js.map +1 -1
  16. package/lib/command-message.d.ts +4 -1
  17. package/lib/command-message.d.ts.map +1 -1
  18. package/lib/command-message.js +0 -6
  19. package/lib/command-message.js.map +1 -1
  20. package/lib/define-game-plugin.d.ts +32 -0
  21. package/lib/define-game-plugin.d.ts.map +1 -0
  22. package/lib/define-game-plugin.js +87 -0
  23. package/lib/define-game-plugin.js.map +1 -0
  24. package/lib/deterministic-random.d.ts +16 -0
  25. package/lib/deterministic-random.d.ts.map +1 -0
  26. package/lib/deterministic-random.js +68 -0
  27. package/lib/deterministic-random.js.map +1 -0
  28. package/lib/game-action-alias.d.ts +7 -0
  29. package/lib/game-action-alias.d.ts.map +1 -1
  30. package/lib/game-action-alias.js +25 -0
  31. package/lib/game-action-alias.js.map +1 -1
  32. package/lib/game-events.d.ts +53 -0
  33. package/lib/game-events.d.ts.map +1 -0
  34. package/lib/game-events.js +26 -0
  35. package/lib/game-events.js.map +1 -0
  36. package/lib/game-interactive.d.ts +0 -22
  37. package/lib/game-interactive.d.ts.map +1 -1
  38. package/lib/game-interactive.js +1 -57
  39. package/lib/game-interactive.js.map +1 -1
  40. package/lib/game-records.d.ts +8 -3
  41. package/lib/game-records.d.ts.map +1 -1
  42. package/lib/game-records.js +27 -62
  43. package/lib/game-records.js.map +1 -1
  44. package/lib/game-session.d.ts +0 -59
  45. package/lib/game-session.d.ts.map +1 -1
  46. package/lib/game-session.js +2 -30
  47. package/lib/game-session.js.map +1 -1
  48. package/lib/grid-keyboard.d.ts.map +1 -1
  49. package/lib/grid-keyboard.js +2 -1
  50. package/lib/grid-keyboard.js.map +1 -1
  51. package/lib/index.d.ts +6 -9
  52. package/lib/index.d.ts.map +1 -1
  53. package/lib/index.js +6 -9
  54. package/lib/index.js.map +1 -1
  55. package/lib/memory-db.d.ts +6 -0
  56. package/lib/memory-db.d.ts.map +1 -1
  57. package/lib/memory-db.js +14 -2
  58. package/lib/memory-db.js.map +1 -1
  59. package/lib/runtime-hub.d.ts +0 -4
  60. package/lib/runtime-hub.d.ts.map +1 -1
  61. package/lib/runtime-hub.js +8 -0
  62. package/lib/runtime-hub.js.map +1 -1
  63. package/lib/session-coordinator.d.ts +27 -0
  64. package/lib/session-coordinator.d.ts.map +1 -0
  65. package/lib/session-coordinator.js +57 -0
  66. package/lib/session-coordinator.js.map +1 -0
  67. package/lib/versioned-session-service.d.ts +48 -0
  68. package/lib/versioned-session-service.d.ts.map +1 -0
  69. package/lib/versioned-session-service.js +116 -0
  70. package/lib/versioned-session-service.js.map +1 -0
  71. package/package.json +8 -7
  72. package/src/base-session-service.ts +210 -0
  73. package/src/board-sender.ts +6 -7
  74. package/src/choice-keyboard.ts +3 -1
  75. package/src/command-alias.ts +3 -1
  76. package/src/command-message.ts +9 -1
  77. package/src/define-game-plugin.ts +162 -0
  78. package/src/deterministic-random.ts +81 -0
  79. package/src/game-action-alias.ts +33 -0
  80. package/src/game-events.ts +75 -0
  81. package/src/game-interactive.ts +1 -80
  82. package/src/game-records.ts +30 -77
  83. package/src/game-session.ts +2 -84
  84. package/src/grid-keyboard.ts +2 -1
  85. package/src/index.ts +6 -9
  86. package/src/memory-db.ts +19 -2
  87. package/src/runtime-hub.ts +5 -0
  88. package/src/session-coordinator.ts +74 -0
  89. package/src/versioned-session-service.ts +162 -0
  90. package/lib/command-help.d.ts +0 -19
  91. package/lib/command-help.d.ts.map +0 -1
  92. package/lib/command-help.js +0 -91
  93. package/lib/command-help.js.map +0 -1
  94. package/lib/game-commands.d.ts +0 -3
  95. package/lib/game-commands.d.ts.map +0 -1
  96. package/lib/game-commands.js +0 -5
  97. package/lib/game-commands.js.map +0 -1
  98. package/lib/game-hub-feature.d.ts +0 -58
  99. package/lib/game-hub-feature.d.ts.map +0 -1
  100. package/lib/game-hub-feature.js +0 -102
  101. package/lib/game-hub-feature.js.map +0 -1
  102. package/lib/game-hub-flow.d.ts +0 -9
  103. package/lib/game-hub-flow.d.ts.map +0 -1
  104. package/lib/game-hub-flow.js +0 -90
  105. package/lib/game-hub-flow.js.map +0 -1
  106. package/lib/game-hub-menu-context.d.ts +0 -25
  107. package/lib/game-hub-menu-context.d.ts.map +0 -1
  108. package/lib/game-hub-menu-context.js +0 -64
  109. package/lib/game-hub-menu-context.js.map +0 -1
  110. package/lib/game-hub-menu.d.ts +0 -37
  111. package/lib/game-hub-menu.d.ts.map +0 -1
  112. package/lib/game-hub-menu.js +0 -162
  113. package/lib/game-hub-menu.js.map +0 -1
  114. package/lib/game-hub-mount.d.ts +0 -9
  115. package/lib/game-hub-mount.d.ts.map +0 -1
  116. package/lib/game-hub-mount.js +0 -108
  117. package/lib/game-hub-mount.js.map +0 -1
  118. package/lib/game-middleware.d.ts +0 -6
  119. package/lib/game-middleware.d.ts.map +0 -1
  120. package/lib/game-middleware.js +0 -9
  121. package/lib/game-middleware.js.map +0 -1
  122. package/lib/game-onboarding.d.ts +0 -8
  123. package/lib/game-onboarding.d.ts.map +0 -1
  124. package/lib/game-onboarding.js +0 -66
  125. package/lib/game-onboarding.js.map +0 -1
  126. package/lib/help-card.d.ts +0 -12
  127. package/lib/help-card.d.ts.map +0 -1
  128. package/lib/help-card.js +0 -129
  129. package/lib/help-card.js.map +0 -1
  130. package/src/command-help.ts +0 -117
  131. package/src/game-commands.ts +0 -4
  132. package/src/game-hub-feature.ts +0 -154
  133. package/src/game-hub-flow.ts +0 -114
  134. package/src/game-hub-menu-context.ts +0 -94
  135. package/src/game-hub-menu.ts +0 -223
  136. package/src/game-hub-mount.ts +0 -172
  137. package/src/game-middleware.ts +0 -14
  138. package/src/game-onboarding.ts +0 -69
  139. package/src/help-card.ts +0 -188
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Serializable xorshift32 generator for replayable game simulations.
3
+ * Security-sensitive randomness must continue using secureRandomInt.
4
+ */
5
+ export declare class DeterministicRandom {
6
+ #private;
7
+ private constructor();
8
+ static fromSeed(seed: string | number): DeterministicRandom;
9
+ static fromState(state: number): DeterministicRandom;
10
+ get state(): number;
11
+ nextUint32(): number;
12
+ int(maxExclusive: number): number;
13
+ intInclusive(min: number, max: number): number;
14
+ item<T>(items: readonly T[]): T;
15
+ }
16
+ //# sourceMappingURL=deterministic-random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deterministic-random.d.ts","sourceRoot":"","sources":["../src/deterministic-random.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,qBAAa,mBAAmB;;IAG9B,OAAO;IAIP,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,mBAAmB;IAM3D,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB;IAIpD,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,UAAU,IAAI,MAAM;IASpB,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAgBjC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAO9C,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC;CAMhC"}
@@ -0,0 +1,68 @@
1
+ const UINT32_RANGE = 0x1_0000_0000;
2
+ const ZERO_STATE_FALLBACK = 0x6d2b79f5;
3
+ /**
4
+ * Serializable xorshift32 generator for replayable game simulations.
5
+ * Security-sensitive randomness must continue using secureRandomInt.
6
+ */
7
+ export class DeterministicRandom {
8
+ #state;
9
+ constructor(state) {
10
+ this.#state = normalizeState(state);
11
+ }
12
+ static fromSeed(seed) {
13
+ return new DeterministicRandom(typeof seed === 'number' ? seed : hashSeed(seed));
14
+ }
15
+ static fromState(state) {
16
+ return new DeterministicRandom(state);
17
+ }
18
+ get state() {
19
+ return this.#state;
20
+ }
21
+ nextUint32() {
22
+ let value = this.#state;
23
+ value ^= value << 13;
24
+ value ^= value >>> 17;
25
+ value ^= value << 5;
26
+ this.#state = value >>> 0;
27
+ return this.#state;
28
+ }
29
+ int(maxExclusive) {
30
+ if (!Number.isSafeInteger(maxExclusive)
31
+ || maxExclusive <= 0
32
+ || maxExclusive > UINT32_RANGE) {
33
+ throw new RangeError('maxExclusive must be an integer between 1 and 2^32');
34
+ }
35
+ const limit = Math.floor(UINT32_RANGE / maxExclusive) * maxExclusive;
36
+ let value;
37
+ do {
38
+ value = this.nextUint32();
39
+ } while (value >= limit);
40
+ return value % maxExclusive;
41
+ }
42
+ intInclusive(min, max) {
43
+ if (!Number.isSafeInteger(min) || !Number.isSafeInteger(max) || max < min) {
44
+ throw new RangeError('invalid inclusive random range');
45
+ }
46
+ return min + this.int(max - min + 1);
47
+ }
48
+ item(items) {
49
+ if (items.length === 0) {
50
+ throw new RangeError('cannot choose from an empty array');
51
+ }
52
+ return items[this.int(items.length)];
53
+ }
54
+ }
55
+ function normalizeState(state) {
56
+ if (!Number.isFinite(state))
57
+ throw new RangeError('state must be finite');
58
+ return (state >>> 0) || ZERO_STATE_FALLBACK;
59
+ }
60
+ function hashSeed(seed) {
61
+ let hash = 0x811c9dc5;
62
+ for (let index = 0; index < seed.length; index += 1) {
63
+ hash ^= seed.charCodeAt(index);
64
+ hash = Math.imul(hash, 0x01000193);
65
+ }
66
+ return hash >>> 0;
67
+ }
68
+ //# sourceMappingURL=deterministic-random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deterministic-random.js","sourceRoot":"","sources":["../src/deterministic-random.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,15 @@
1
1
  export declare function normalizeTttAction(raw: string): string;
2
+ export declare function isTttAction(action: string): boolean;
2
3
  export declare function normalizeAdvAction(raw: string): string;
4
+ export declare function isAdvAction(action: string): boolean;
3
5
  export declare function normalizeRpsAction(raw: string): string;
6
+ export declare function isRpsAction(action: string): boolean;
4
7
  export declare function normalizeGuessAction(raw: string): string;
8
+ export declare function isGuessAction(action: string): boolean;
5
9
  export declare function normalizeDiceAction(raw: string): string;
10
+ export declare function isDiceAction(action: string): boolean;
6
11
  export declare function normalizeChainAction(raw: string): string;
12
+ export declare function isChainAction(action: string): boolean;
13
+ export declare function isRiddleAction(action: string): boolean;
7
14
  export declare function normalizeRiddleAction(raw: string): string;
8
15
  //# sourceMappingURL=game-action-alias.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"game-action-alias.d.ts","sourceRoot":"","sources":["../src/game-action-alias.ts"],"names":[],"mappings":"AAsEA,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAkCD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD"}
1
+ {"version":3,"file":"game-action-alias.d.ts","sourceRoot":"","sources":["../src/game-action-alias.ts"],"names":[],"mappings":"AAsEA,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAOD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpD;AAkCD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD"}
@@ -66,18 +66,37 @@ function lookup(map, raw) {
66
66
  export function normalizeTttAction(raw) {
67
67
  return lookup(TTT_ACTIONS, raw);
68
68
  }
69
+ /** 判断 normalize*Action 的结果是否为已知 action(未知名应放行,避免劫持普通聊天) */
70
+ function isKnownAction(map, action) {
71
+ return Object.values(map).includes(action);
72
+ }
73
+ export function isTttAction(action) {
74
+ return isKnownAction(TTT_ACTIONS, action);
75
+ }
69
76
  export function normalizeAdvAction(raw) {
70
77
  return lookup(ADV_ACTIONS, raw);
71
78
  }
79
+ export function isAdvAction(action) {
80
+ return isKnownAction(ADV_ACTIONS, action);
81
+ }
72
82
  export function normalizeRpsAction(raw) {
73
83
  return lookup(RPS_ACTIONS, raw);
74
84
  }
85
+ export function isRpsAction(action) {
86
+ return isKnownAction(RPS_ACTIONS, action);
87
+ }
75
88
  export function normalizeGuessAction(raw) {
76
89
  return lookup(GUESS_ACTIONS, raw);
77
90
  }
91
+ export function isGuessAction(action) {
92
+ return isKnownAction(GUESS_ACTIONS, action);
93
+ }
78
94
  export function normalizeDiceAction(raw) {
79
95
  return lookup(DICE_ACTIONS, raw);
80
96
  }
97
+ export function isDiceAction(action) {
98
+ return isKnownAction(DICE_ACTIONS, action);
99
+ }
81
100
  const CHAIN_ACTIONS = {
82
101
  start: 'start_pinyin',
83
102
  start_pinyin: 'start_pinyin',
@@ -111,6 +130,12 @@ const RIDDLE_ACTIONS = {
111
130
  export function normalizeChainAction(raw) {
112
131
  return lookup(CHAIN_ACTIONS, raw);
113
132
  }
133
+ export function isChainAction(action) {
134
+ return isKnownAction(CHAIN_ACTIONS, action);
135
+ }
136
+ export function isRiddleAction(action) {
137
+ return isKnownAction(RIDDLE_ACTIONS, action);
138
+ }
114
139
  export function normalizeRiddleAction(raw) {
115
140
  return lookup(RIDDLE_ACTIONS, raw);
116
141
  }
@@ -1 +1 @@
1
- {"version":3,"file":"game-action-alias.js","sourceRoot":"","sources":["../src/game-action-alias.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game-action-alias.js","sourceRoot":"","sources":["../src/game-action-alias.ts"],"names":[],"mappings":"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"}
@@ -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":"AAAA,OAAO,EAAgD,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAK3F,eAAO,MAAM,uBAAuB,aAKlC,CAAC;AAEH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,2CAA2C;AAC3C,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,MAAM,GAAG,SAAS,CAEpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC/D,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACtF,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CAC7E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA4CzD"}
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"}
@@ -1,62 +1,6 @@
1
- import { getActionFromMessage, resolvePayloadFromText } from '@zhin.js/core';
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":"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"}
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"}
@@ -1,4 +1,5 @@
1
- import { type DatabaseFeature, type Message, type Models, type Plugin } from '@zhin.js/core';
1
+ import { type DatabaseFeature, type Models, type Plugin } from '@zhin.js/core';
2
+ import type { GameMessageLike } from './command-message.js';
2
3
  import { type HostGameDbSource } from './memory-db.js';
3
4
  export type GameRecordResult = 'won' | 'lost' | 'draw' | 'aborted';
4
5
  declare module '@zhin.js/core' {
@@ -16,6 +17,11 @@ declare module '@zhin.js/core' {
16
17
  }
17
18
  }
18
19
  export type GameRecordRow = Models['game_records'];
20
+ /**
21
+ * 由 registerRuntimeGame 在游戏注册时调用:把游戏绑定到当前插件刚通过 initGameRecordHost 注册的战绩库。
22
+ * 返回解绑函数(随游戏注销一并解绑)。
23
+ */
24
+ export declare function bindGameRecordDatabase(gameId: string): () => void;
19
25
  export declare function registerGameRecordModels(plugin: Plugin): void;
20
26
  export declare function initGameRecordDatabase(dbFeature: DatabaseFeature): void;
21
27
  /** Plugin Runtime DatabaseHost 的最小结构(与 @zhin.js/plugin-runtime 的 DatabaseHost 结构对齐) */
@@ -28,7 +34,7 @@ export interface GameRecordDatabaseHost extends HostGameDbSource {
28
34
  */
29
35
  export declare function initGameRecordHost(host: GameRecordDatabaseHost): () => void;
30
36
  /** 对局结束时写入战绩(database 未就绪时静默跳过) */
31
- export declare function recordGameOutcome(message: Message, gameId: string, result: GameRecordResult, score?: number): Promise<void>;
37
+ export declare function recordGameOutcome(message: GameMessageLike, gameId: string, result: GameRecordResult, score?: number): Promise<void>;
32
38
  export interface UserGameStats {
33
39
  gameId: string;
34
40
  wins: number;
@@ -46,7 +52,6 @@ export interface LeaderboardEntry {
46
52
  games: number;
47
53
  }
48
54
  export declare function getGameLeaderboard(gameId: string, channelKeyFilter: string, limit?: number): Promise<LeaderboardEntry[]>;
49
- export declare function mountGameRecordCommands(root: Plugin): () => void;
50
55
  /** 测试专用 */
51
56
  export declare function resetGameRecordsForTests(): void;
52
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,EAGL,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,MAAM,EAEZ,MAAM,eAAe,CAAC;AAGvB,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;AAoBnD,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,CAa3E;AAMD,mCAAmC;AACnC,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,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;AA2BD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CA4ChE;AAED,WAAW;AACX,wBAAgB,wBAAwB,IAAI,IAAI,CAI/C"}
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"}
@@ -1,14 +1,34 @@
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;
7
5
  let hostDatabases = new WeakMap();
8
6
  const hostRegistrations = [];
7
+ /** gameId → 该游戏插件 setup 时注册的战绩库(按插件作用域取库,避免多 Host 时全局最后注册者胜) */
8
+ const gameDatabases = new Map();
9
+ /** 最近一次 initGameRecordHost 注册的库;registerRuntimeGame 借此把游戏绑定到所属 Host 的库 */
10
+ let latestHostDatabase = null;
9
11
  function activeDatabase() {
10
12
  return hostRegistrations[hostRegistrations.length - 1]?.database ?? legacyDb;
11
13
  }
14
+ /** 按游戏作用域取库:优先该游戏插件注册时绑定的 Host 库,回退到全局活跃库 */
15
+ function databaseForGame(gameId) {
16
+ return gameDatabases.get(gameId) ?? activeDatabase();
17
+ }
18
+ /**
19
+ * 由 registerRuntimeGame 在游戏注册时调用:把游戏绑定到当前插件刚通过 initGameRecordHost 注册的战绩库。
20
+ * 返回解绑函数(随游戏注销一并解绑)。
21
+ */
22
+ export function bindGameRecordDatabase(gameId) {
23
+ const db = latestHostDatabase;
24
+ if (!db)
25
+ return () => { };
26
+ gameDatabases.set(gameId, db);
27
+ return () => {
28
+ if (gameDatabases.get(gameId) === db)
29
+ gameDatabases.delete(gameId);
30
+ };
31
+ }
12
32
  function getRecordModel(database) {
13
33
  const model = database.models.get('game_records');
14
34
  if (!model)
@@ -51,6 +71,7 @@ export function initGameRecordHost(host) {
51
71
  database = createHostGameDb(host, ['game_records']);
52
72
  hostDatabases.set(host, database);
53
73
  }
74
+ latestHostDatabase = database;
54
75
  const registration = Object.freeze({ host, database });
55
76
  hostRegistrations.push(registration);
56
77
  return () => {
@@ -64,7 +85,7 @@ function recordId() {
64
85
  }
65
86
  /** 对局结束时写入战绩(database 未就绪时静默跳过) */
66
87
  export async function recordGameOutcome(message, gameId, result, score = 0) {
67
- const db = activeDatabase();
88
+ const db = databaseForGame(gameId);
68
89
  if (!db)
69
90
  return;
70
91
  const row = {
@@ -113,7 +134,7 @@ export async function getUserGameStats(userId, channelKeyFilter) {
113
134
  return [...byGame.values()].sort((a, b) => b.wins - a.wins);
114
135
  }
115
136
  export async function getGameLeaderboard(gameId, channelKeyFilter, limit = 10) {
116
- const db = activeDatabase();
137
+ const db = databaseForGame(gameId);
117
138
  if (!db)
118
139
  return [];
119
140
  const rows = await getRecordModel(db).findAll({
@@ -142,68 +163,12 @@ export async function getGameLeaderboard(gameId, channelKeyFilter, limit = 10) {
142
163
  .sort((a, b) => b.wins - a.wins || b.totalScore - a.totalScore)
143
164
  .slice(0, limit);
144
165
  }
145
- function gameTitle(gameId) {
146
- const g = getRegisteredGame(gameId);
147
- return g ? `${g.icon} ${g.title}` : gameId;
148
- }
149
- function formatUserStats(stats) {
150
- if (!stats.length)
151
- return '暂无战绩记录,快去 `/游戏` 开一局吧!';
152
- const lines = stats.map((s) => {
153
- const title = gameTitle(s.gameId);
154
- return `• ${title}:${s.wins} 胜 ${s.losses} 负${s.draws ? ` ${s.draws} 平` : ''}(${s.games} 局,得分 ${s.totalScore})`;
155
- });
156
- return ['📊 **你的战绩**', '', ...lines].join('\n');
157
- }
158
- function formatLeaderboard(gameId, entries) {
159
- const title = gameTitle(gameId);
160
- if (!entries.length) {
161
- return `${title} 在本群暂无排行,发送 \`/游戏\` 开始第一局!`;
162
- }
163
- const lines = entries.map((e, i) => `${i + 1}. ${e.userName} — ${e.wins} 胜 / ${e.games} 局(得分 ${e.totalScore})`);
164
- return [`🏆 **${title} 本群排行**`, '', ...lines].join('\n');
165
- }
166
- export function mountGameRecordCommands(root) {
167
- const disposers = [];
168
- disposers.push(root.addCommand(new MessageCommand('/战绩')
169
- .desc('查看本人在本群的游戏战绩')
170
- .action(async (message) => {
171
- const stats = await getUserGameStats(message.$sender.id, channelKey(message));
172
- return formatUserStats(stats);
173
- })), root.addCommand(new MessageCommand('/排行')
174
- .desc('查看本群某游戏排行榜')
175
- .action(async (message, ...args) => {
176
- const query = args.join(' ').trim();
177
- const games = getRegisteredGames();
178
- if (!games.length)
179
- return '暂无已注册游戏。';
180
- const firstGame = games[0];
181
- if (!firstGame)
182
- return '暂无已注册游戏。';
183
- let gameId = firstGame.id;
184
- if (query) {
185
- const hit = games.find((g) => g.id === query
186
- || g.title.includes(query)
187
- || g.commandPrefix.includes(query)
188
- || g.aliases?.some((a) => a.includes(query)));
189
- if (!hit) {
190
- const names = games.map((g) => g.title).join('、');
191
- return `未找到游戏「${query}」。可选:${names}`;
192
- }
193
- gameId = hit.id;
194
- }
195
- const board = await getGameLeaderboard(gameId, channelKey(message));
196
- return formatLeaderboard(gameId, board);
197
- })));
198
- return () => {
199
- for (const d of disposers)
200
- d();
201
- };
202
- }
203
166
  /** 测试专用 */
204
167
  export function resetGameRecordsForTests() {
205
168
  legacyDb = null;
206
169
  hostDatabases = new WeakMap();
207
170
  hostRegistrations.splice(0);
171
+ gameDatabases.clear();
172
+ latestHostDatabase = null;
208
173
  }
209
174
  //# sourceMappingURL=game-records.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"game-records.js","sourceRoot":"","sources":["../src/game-records.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"game-records.js","sourceRoot":"","sources":["../src/game-records.ts"],"names":[],"mappings":"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"}