@zhin.js/game-kit 2.0.1 → 2.0.3

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 (116) 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/command-alias.d.ts +3 -1
  7. package/lib/command-alias.d.ts.map +1 -1
  8. package/lib/command-alias.js.map +1 -1
  9. package/lib/command-message.d.ts +3 -0
  10. package/lib/command-message.d.ts.map +1 -1
  11. package/lib/command-message.js +0 -6
  12. package/lib/command-message.js.map +1 -1
  13. package/lib/define-game-plugin.d.ts +32 -0
  14. package/lib/define-game-plugin.d.ts.map +1 -0
  15. package/lib/define-game-plugin.js +87 -0
  16. package/lib/define-game-plugin.js.map +1 -0
  17. package/lib/deterministic-random.d.ts +16 -0
  18. package/lib/deterministic-random.d.ts.map +1 -0
  19. package/lib/deterministic-random.js +68 -0
  20. package/lib/deterministic-random.js.map +1 -0
  21. package/lib/game-events.d.ts +53 -0
  22. package/lib/game-events.d.ts.map +1 -0
  23. package/lib/game-events.js +26 -0
  24. package/lib/game-events.js.map +1 -0
  25. package/lib/game-interactive.d.ts +0 -22
  26. package/lib/game-interactive.d.ts.map +1 -1
  27. package/lib/game-interactive.js +1 -57
  28. package/lib/game-interactive.js.map +1 -1
  29. package/lib/game-records.d.ts +0 -1
  30. package/lib/game-records.d.ts.map +1 -1
  31. package/lib/game-records.js +0 -60
  32. package/lib/game-records.js.map +1 -1
  33. package/lib/game-session.d.ts +0 -59
  34. package/lib/game-session.d.ts.map +1 -1
  35. package/lib/game-session.js +0 -29
  36. package/lib/game-session.js.map +1 -1
  37. package/lib/index.d.ts +6 -9
  38. package/lib/index.d.ts.map +1 -1
  39. package/lib/index.js +6 -9
  40. package/lib/index.js.map +1 -1
  41. package/lib/memory-db.d.ts +6 -0
  42. package/lib/memory-db.d.ts.map +1 -1
  43. package/lib/memory-db.js +8 -0
  44. package/lib/memory-db.js.map +1 -1
  45. package/lib/session-coordinator.d.ts +27 -0
  46. package/lib/session-coordinator.d.ts.map +1 -0
  47. package/lib/session-coordinator.js +57 -0
  48. package/lib/session-coordinator.js.map +1 -0
  49. package/lib/versioned-session-service.d.ts +48 -0
  50. package/lib/versioned-session-service.d.ts.map +1 -0
  51. package/lib/versioned-session-service.js +116 -0
  52. package/lib/versioned-session-service.js.map +1 -0
  53. package/package.json +7 -6
  54. package/src/base-session-service.ts +210 -0
  55. package/src/command-alias.ts +3 -1
  56. package/src/command-message.ts +4 -0
  57. package/src/define-game-plugin.ts +162 -0
  58. package/src/deterministic-random.ts +81 -0
  59. package/src/game-events.ts +75 -0
  60. package/src/game-interactive.ts +1 -80
  61. package/src/game-records.ts +0 -73
  62. package/src/game-session.ts +0 -83
  63. package/src/index.ts +6 -9
  64. package/src/memory-db.ts +12 -0
  65. package/src/session-coordinator.ts +74 -0
  66. package/src/versioned-session-service.ts +162 -0
  67. package/lib/command-help.d.ts +0 -19
  68. package/lib/command-help.d.ts.map +0 -1
  69. package/lib/command-help.js +0 -91
  70. package/lib/command-help.js.map +0 -1
  71. package/lib/game-commands.d.ts +0 -3
  72. package/lib/game-commands.d.ts.map +0 -1
  73. package/lib/game-commands.js +0 -5
  74. package/lib/game-commands.js.map +0 -1
  75. package/lib/game-hub-feature.d.ts +0 -58
  76. package/lib/game-hub-feature.d.ts.map +0 -1
  77. package/lib/game-hub-feature.js +0 -102
  78. package/lib/game-hub-feature.js.map +0 -1
  79. package/lib/game-hub-flow.d.ts +0 -9
  80. package/lib/game-hub-flow.d.ts.map +0 -1
  81. package/lib/game-hub-flow.js +0 -90
  82. package/lib/game-hub-flow.js.map +0 -1
  83. package/lib/game-hub-menu-context.d.ts +0 -25
  84. package/lib/game-hub-menu-context.d.ts.map +0 -1
  85. package/lib/game-hub-menu-context.js +0 -64
  86. package/lib/game-hub-menu-context.js.map +0 -1
  87. package/lib/game-hub-menu.d.ts +0 -37
  88. package/lib/game-hub-menu.d.ts.map +0 -1
  89. package/lib/game-hub-menu.js +0 -162
  90. package/lib/game-hub-menu.js.map +0 -1
  91. package/lib/game-hub-mount.d.ts +0 -13
  92. package/lib/game-hub-mount.d.ts.map +0 -1
  93. package/lib/game-hub-mount.js +0 -89
  94. package/lib/game-hub-mount.js.map +0 -1
  95. package/lib/game-middleware.d.ts +0 -6
  96. package/lib/game-middleware.d.ts.map +0 -1
  97. package/lib/game-middleware.js +0 -9
  98. package/lib/game-middleware.js.map +0 -1
  99. package/lib/game-onboarding.d.ts +0 -8
  100. package/lib/game-onboarding.d.ts.map +0 -1
  101. package/lib/game-onboarding.js +0 -67
  102. package/lib/game-onboarding.js.map +0 -1
  103. package/lib/help-card.d.ts +0 -12
  104. package/lib/help-card.d.ts.map +0 -1
  105. package/lib/help-card.js +0 -129
  106. package/lib/help-card.js.map +0 -1
  107. package/src/command-help.ts +0 -117
  108. package/src/game-commands.ts +0 -4
  109. package/src/game-hub-feature.ts +0 -154
  110. package/src/game-hub-flow.ts +0 -114
  111. package/src/game-hub-menu-context.ts +0 -94
  112. package/src/game-hub-menu.ts +0 -223
  113. package/src/game-hub-mount.ts +0 -147
  114. package/src/game-middleware.ts +0 -14
  115. package/src/game-onboarding.ts +0 -71
  116. package/src/help-card.ts +0 -188
@@ -1,64 +0,0 @@
1
- import { channelKey } from './board-sender.js';
2
- import { generateCompactId } from './random.js';
3
- const TTL_MS = 60 * 60 * 1000;
4
- const contexts = new Map();
5
- const lastMenus = new Map();
6
- /** 大厅 fallback 按频道共享,任意成员可回复数字或点按钮 */
7
- function hubMenuKey(message) {
8
- return channelKey(message);
9
- }
10
- export function createHubScope(message) {
11
- const scopeId = generateCompactId('h');
12
- contexts.set(scopeId, {
13
- channelKey: channelKey(message),
14
- openerId: message.$sender.id,
15
- message,
16
- expiresAt: Date.now() + TTL_MS,
17
- });
18
- pruneExpired();
19
- return scopeId;
20
- }
21
- export function rememberHubMenu(message, scopeId, choices) {
22
- lastMenus.set(hubMenuKey(message), {
23
- scopeId,
24
- choices,
25
- expiresAt: Date.now() + TTL_MS,
26
- });
27
- pruneExpired();
28
- }
29
- export function getLastHubMenu(message) {
30
- pruneExpired();
31
- const key = hubMenuKey(message);
32
- const last = lastMenus.get(key);
33
- if (!last || last.expiresAt < Date.now()) {
34
- lastMenus.delete(key);
35
- return null;
36
- }
37
- return last;
38
- }
39
- export function getHubContext(scopeId) {
40
- pruneExpired();
41
- const ctx = contexts.get(scopeId);
42
- if (!ctx || ctx.expiresAt < Date.now()) {
43
- contexts.delete(scopeId);
44
- return null;
45
- }
46
- return ctx;
47
- }
48
- function pruneExpired() {
49
- const now = Date.now();
50
- for (const [id, ctx] of contexts) {
51
- if (ctx.expiresAt < now)
52
- contexts.delete(id);
53
- }
54
- for (const [key, menu] of lastMenus) {
55
- if (menu.expiresAt < now)
56
- lastMenus.delete(key);
57
- }
58
- }
59
- /** 测试专用:清空菜单上下文 */
60
- export function resetHubMenuContextForTests() {
61
- contexts.clear();
62
- lastMenus.clear();
63
- }
64
- //# sourceMappingURL=game-hub-menu-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-hub-menu-context.js","sourceRoot":"","sources":["../src/game-hub-menu-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAsBhD,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;AACnD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;AAEjD,sCAAsC;AACtC,SAAS,UAAU,CAAC,OAAgB;IAClC,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE;QACpB,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC;QAC/B,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;QAC5B,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;KAC/B,CAAC,CAAC;IACH,YAAY,EAAE,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAgB,EAChB,OAAe,EACf,OAAwB;IAExB,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QACjC,OAAO;QACP,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;KAC/B,CAAC,CAAC;IACH,YAAY,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,YAAY,EAAE,CAAC;IACf,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACzC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,YAAY,EAAE,CAAC;IACf,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACvC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,SAAS,GAAG,GAAG;YAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG;YAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,2BAA2B;IACzC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,SAAS,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"}
@@ -1,37 +0,0 @@
1
- import { type SendContent } from '@zhin.js/core';
2
- import type { RegisteredGame } from './game-hub-feature.js';
3
- import { type CommandHelpSource } from './command-help.js';
4
- export declare const HUB_PREFIX = "hub";
5
- export declare function hubGameChoiceId(gameId: string): string;
6
- export declare function hubActionChoiceId(gameId: string, actionId: string): string;
7
- export declare function parseHubChoiceId(choiceId: string): {
8
- kind: 'game';
9
- gameId: string;
10
- } | {
11
- kind: 'action';
12
- gameId: string;
13
- actionId: string;
14
- } | {
15
- kind: 'back';
16
- } | null;
17
- export declare function buildMainHubMenu(scopeId: string, games: readonly RegisteredGame[], channelType: string): SendContent;
18
- export declare function buildGameHubMenu(scopeId: string, game: RegisteredGame, channelType: string): SendContent;
19
- /** 大厅主菜单:命令前缀提示 */
20
- export declare function formatCommandPrefixHint(games: readonly RegisteredGame[]): string;
21
- /** 游戏大厅帮助文案(随 registerGame 动态生成) */
22
- export declare function formatHubHelp(games: readonly RegisteredGame[], commands?: readonly CommandHelpSource[]): string;
23
- /** 顶层 /帮助:游戏大厅 + 已注册命令自动汇总 */
24
- export declare function formatBotHelp(games: readonly RegisteredGame[], options?: {
25
- channelType?: string;
26
- commands?: readonly CommandHelpSource[];
27
- }): string;
28
- /** 顶层 /帮助:HTML 卡片(QQ 等出站 policy 为 image 时渲染为 PNG;无 renderer 时回退文本) */
29
- export declare function buildBotHelpReply(games: readonly RegisteredGame[], options?: {
30
- channelType?: string;
31
- commands?: readonly CommandHelpSource[];
32
- }): SendContent;
33
- /** /游戏 帮助:大厅专用卡片 */
34
- export declare function buildHubHelpReply(games: readonly RegisteredGame[], commands?: readonly CommandHelpSource[]): SendContent;
35
- /** 无游戏时的提示 */
36
- export declare function formatHubEmptyMessage(): string;
37
- //# sourceMappingURL=game-hub-menu.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-hub-menu.d.ts","sourceRoot":"","sources":["../src/game-hub-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAI1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAQ3B,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAEd;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB,IAAI,CAcP;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,WAAW,EAAE,MAAM,GAClB,WAAW,CA4Bb;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,MAAM,GAClB,WAAW,CAyBb;AAED,mBAAmB;AACnB,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAKhF;AAED,oCAAoC;AACpC,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,GACtC,MAAM,CAsBR;AAED,8BAA8B;AAC9B,wBAAgB,aAAa,CAC3B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACzC,GACA,MAAM,CAoBR;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACzC,GACA,WAAW,CAab;AAED,oBAAoB;AACpB,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,GACtC,WAAW,CASb;AAED,cAAc;AACd,wBAAgB,qBAAqB,IAAI,MAAM,CAK9C"}
@@ -1,162 +0,0 @@
1
- import { segment } from '@zhin.js/core';
2
- import { buildChoiceKeyboard } from './choice-keyboard.js';
3
- import { slashCommandPrefix } from './game-commands.js';
4
- import { formatHubOpenCommandLines, formatSupplementaryCommandsHelp, } from './command-help.js';
5
- import { buildBotHelpHtml, buildHubHelpHtml, HELP_CARD_CANVAS, HELP_CARD_WIDTH, } from './help-card.js';
6
- export const HUB_PREFIX = 'hub';
7
- export function hubGameChoiceId(gameId) {
8
- return `g_${gameId}`;
9
- }
10
- export function hubActionChoiceId(gameId, actionId) {
11
- return `a_${gameId}_${actionId}`;
12
- }
13
- export function parseHubChoiceId(choiceId) {
14
- if (choiceId === 'back')
15
- return { kind: 'back' };
16
- if (choiceId.startsWith('g_'))
17
- return { kind: 'game', gameId: choiceId.slice(2) };
18
- if (choiceId.startsWith('a_')) {
19
- const rest = choiceId.slice(2);
20
- const sep = rest.indexOf('_');
21
- if (sep <= 0)
22
- return null;
23
- return {
24
- kind: 'action',
25
- gameId: rest.slice(0, sep),
26
- actionId: rest.slice(sep + 1),
27
- };
28
- }
29
- return null;
30
- }
31
- export function buildMainHubMenu(scopeId, games, channelType) {
32
- const cmdHint = formatCommandPrefixHint(games);
33
- const lines = [
34
- '🎮 **游戏大厅**',
35
- '',
36
- cmdHint,
37
- '',
38
- '_同频道均可浏览;开局后仅对局玩家可操作棋盘。_',
39
- '',
40
- ];
41
- for (const g of games) {
42
- lines.push(`• ${g.icon} **${g.title}** — ${g.description}`);
43
- }
44
- return buildChoiceKeyboard({
45
- gamePrefix: HUB_PREFIX,
46
- sessionId: scopeId,
47
- narrative: lines.join('\n'),
48
- choices: games.map((g) => ({
49
- id: hubGameChoiceId(g.id),
50
- label: `${g.icon} ${g.title}`,
51
- style: 'primary',
52
- })),
53
- buttonsPerRow: 2,
54
- fallbackHint: '回复数字进入对应游戏',
55
- interactionProfile: 'menu',
56
- channelType,
57
- });
58
- }
59
- export function buildGameHubMenu(scopeId, game, channelType) {
60
- const isGroup = channelType !== 'private';
61
- const menus = game.menus.filter((m) => {
62
- if (m.groupOnly && !isGroup)
63
- return false;
64
- if (m.privateOnly && isGroup)
65
- return false;
66
- return true;
67
- });
68
- return buildChoiceKeyboard({
69
- gamePrefix: HUB_PREFIX,
70
- sessionId: scopeId,
71
- narrative: `${game.icon} **${game.title}**\n\n${game.description}\n\n请选择:`,
72
- choices: [
73
- ...menus.map((m) => ({
74
- id: hubActionChoiceId(game.id, m.id),
75
- label: m.label,
76
- style: m.style,
77
- })),
78
- { id: 'back', label: '↩️ 返回大厅' },
79
- ],
80
- buttonsPerRow: 2,
81
- fallbackHint: '回复数字选择操作',
82
- interactionProfile: 'menu',
83
- channelType,
84
- });
85
- }
86
- /** 大厅主菜单:命令前缀提示 */
87
- export function formatCommandPrefixHint(games) {
88
- if (!games.length)
89
- return '暂无可用游戏。';
90
- const sample = games.slice(0, 5).map((g) => slashCommandPrefix(g.commandPrefix.replace(/^\//, '')));
91
- const tail = games.length > sample.length ? '等' : '';
92
- return `选择想玩的游戏(也可直接发送斜杠命令,如「${sample.join('」「')}」${tail}):`;
93
- }
94
- /** 游戏大厅帮助文案(随 registerGame 动态生成) */
95
- export function formatHubHelp(games, commands) {
96
- const lines = [
97
- '🎮 **游戏大厅**',
98
- '',
99
- ...formatHubOpenCommandLines(commands),
100
- ];
101
- if (!games.length) {
102
- lines.push('', '当前暂无已注册游戏。', '请安装任意游戏插件(registerGame 会自动挂载大厅)。');
103
- return lines.join('\n');
104
- }
105
- lines.push('', `当前已注册 **${games.length}** 款游戏:`, '');
106
- for (const g of games) {
107
- const quick = g.quickStart ?? '开始';
108
- const alias = g.aliases?.length ? ` · ${g.aliases.join(' / ')}` : '';
109
- lines.push(`• ${g.icon} **${g.title}**${alias}`);
110
- lines.push(` 命令:\`${slashCommandPrefix(g.commandPrefix.replace(/^\//, ''))} ${quick}\` — ${g.description}`);
111
- }
112
- return lines.join('\n');
113
- }
114
- /** 顶层 /帮助:游戏大厅 + 已注册命令自动汇总 */
115
- export function formatBotHelp(games, options) {
116
- const commands = options?.commands;
117
- const sections = [formatHubHelp(games, commands)];
118
- const other = commands?.length
119
- ? formatSupplementaryCommandsHelp(commands, games)
120
- : '';
121
- if (other) {
122
- sections.push('', '---', '', other);
123
- }
124
- if (options?.channelType === 'group') {
125
- sections.push('', '**QQ 群用法**', '• 公域群需 **@ 机器人** 后发送命令,或直接 **点击消息按钮**', '• 发送 `/游戏` 打开大厅,同群成员均可点击按钮');
126
- }
127
- return sections.join('\n');
128
- }
129
- /** 顶层 /帮助:HTML 卡片(QQ 等出站 policy 为 image 时渲染为 PNG;无 renderer 时回退文本) */
130
- export function buildBotHelpReply(games, options) {
131
- const text = formatBotHelp(games, options);
132
- return segment.html({
133
- html: buildBotHelpHtml({
134
- games,
135
- commands: options?.commands,
136
- channelType: options?.channelType,
137
- }),
138
- text,
139
- width: HELP_CARD_WIDTH,
140
- backgroundColor: HELP_CARD_CANVAS,
141
- fileName: 'bot-help.png',
142
- });
143
- }
144
- /** /游戏 帮助:大厅专用卡片 */
145
- export function buildHubHelpReply(games, commands) {
146
- const text = formatHubHelp(games, commands);
147
- return segment.html({
148
- html: buildHubHelpHtml(games, commands),
149
- text,
150
- width: HELP_CARD_WIDTH,
151
- backgroundColor: HELP_CARD_CANVAS,
152
- fileName: 'game-hub-help.png',
153
- });
154
- }
155
- /** 无游戏时的提示 */
156
- export function formatHubEmptyMessage() {
157
- return [
158
- '游戏大厅暂无可用游戏。',
159
- '请安装任意游戏插件;首个游戏 registerGame 时会自动挂载大厅命令。',
160
- ].join('');
161
- }
162
- //# sourceMappingURL=game-hub-menu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-hub-menu.js","sourceRoot":"","sources":["../src/game-hub-menu.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import { type Plugin } from '@zhin.js/core';
2
- /**
3
- * 在 root 上挂载「游戏 / game」大厅命令,返回 dispose 列表。
4
- *
5
- * @deprecated 仅 classic `GameHubFeature` / `bootstrapNode` 路径。
6
- * Plugin Runtime 请用 `@zhin.js/plugin-game-hub` 的 `commands/games/`(defineCommand)。
7
- * 勿在新代码调用;随 classic Feature 退役。
8
- */
9
- export declare function mountGameHubUi(root: Plugin): (() => void)[];
10
- export declare function isGameHubMounted(): boolean;
11
- export declare function markGameHubUiMounted(): void;
12
- export declare function resetGameHubMountForTests(): void;
13
- //# sourceMappingURL=game-hub-mount.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-hub-mount.d.ts","sourceRoot":"","sources":["../src/game-hub-mount.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,MAAM,EACZ,MAAM,eAAe,CAAC;AAsBvB;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAwF3D;AAcD,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -1,89 +0,0 @@
1
- import { MessageCommand, getActionFromMessage, } from '@zhin.js/core';
2
- import { formatHubEmptyMessage, buildBotHelpReply, buildHubHelpReply, HUB_PREFIX, } from './game-hub-menu.js';
3
- import { handleHubChoice, openMainMenu, parseHubPayload } from './game-hub-flow.js';
4
- import { getRegisteredGames } from './game-hub-feature.js';
5
- import { mountGameRecordCommands } from './game-records.js';
6
- import { mountFirstAtHintMiddleware } from './game-onboarding.js';
7
- import { filterHelpCommands } from './command-help.js';
8
- function resolveRegisteredCommands(root) {
9
- const commandService = root.inject('command');
10
- return commandService?.items ?? [];
11
- }
12
- async function resolveHelpCommands(root, message) {
13
- return filterHelpCommands(resolveRegisteredCommands(root), message, root);
14
- }
15
- /**
16
- * 在 root 上挂载「游戏 / game」大厅命令,返回 dispose 列表。
17
- *
18
- * @deprecated 仅 classic `GameHubFeature` / `bootstrapNode` 路径。
19
- * Plugin Runtime 请用 `@zhin.js/plugin-game-hub` 的 `commands/games/`(defineCommand)。
20
- * 勿在新代码调用;随 classic Feature 退役。
21
- */
22
- export function mountGameHubUi(root) {
23
- const disposers = [];
24
- const openHandler = async (message) => {
25
- const games = getRegisteredGames();
26
- if (!games.length) {
27
- return formatHubEmptyMessage();
28
- }
29
- const menu = openMainMenu(message);
30
- if (typeof menu === 'string')
31
- return menu;
32
- await message.$reply?.(menu);
33
- return undefined;
34
- };
35
- disposers.push(root.addCommand(new MessageCommand('/游戏')
36
- .desc('游戏大厅:选择游戏并开始')
37
- .action(openHandler)), root.addCommand(new MessageCommand('/game')
38
- .desc('Game lobby (English alias)')
39
- .action(openHandler)), root.addCommand(new MessageCommand('游戏')
40
- .desc('游戏大厅(无斜杠兼容)')
41
- .action(openHandler)), root.addCommand(new MessageCommand('game')
42
- .desc('Game lobby (legacy alias)')
43
- .action(openHandler)));
44
- disposers.push(root.addCommand(new MessageCommand('/游戏 帮助')
45
- .desc('游戏大厅帮助')
46
- .action(async (message) => buildHubHelpReply(getRegisteredGames(), await resolveHelpCommands(root, message)))), root.addCommand(new MessageCommand('/帮助')
47
- .desc('机器人帮助:游戏列表与 QQ 群用法')
48
- .action(async (message) => buildBotHelpReply(getRegisteredGames(), {
49
- channelType: message.$channel.type,
50
- commands: await resolveHelpCommands(root, message),
51
- }))), root.addCommand(new MessageCommand('/help')
52
- .desc('Bot help (English alias)')
53
- .action(async (message) => buildBotHelpReply(getRegisteredGames(), {
54
- channelType: message.$channel.type,
55
- commands: await resolveHelpCommands(root, message),
56
- }))), root.addCommand(new MessageCommand('帮助')
57
- .desc('帮助(无斜杠兼容)')
58
- .action(async (message) => buildBotHelpReply(getRegisteredGames(), {
59
- channelType: message.$channel.type,
60
- commands: await resolveHelpCommands(root, message),
61
- }))));
62
- disposers.push(mountGameRecordCommands(root));
63
- disposers.push(mountFirstAtHintMiddleware(root));
64
- // interactive 回跳由框架中央执行(`registerInteractiveHandler` 安装的根
65
- // 中间件):action 段、数字 fallback(中央存储的菜单映射)与 QQ 指令预填
66
- // 直出 payload 都路由到下面的 hub handler,不再自行解析文本。
67
- root.registerInteractiveHandler(`${HUB_PREFIX}:`, (message) => handleHubInteractive(root, message));
68
- return disposers;
69
- }
70
- async function handleHubInteractive(root, message) {
71
- const action = getActionFromMessage(message);
72
- if (!action)
73
- return false;
74
- const fromPayload = parseHubPayload(action.payload);
75
- if (!fromPayload)
76
- return false;
77
- return handleHubChoice(root, message, fromPayload.scopeId, fromPayload.choiceId);
78
- }
79
- let hubUiMounted = false;
80
- export function isGameHubMounted() {
81
- return hubUiMounted;
82
- }
83
- export function markGameHubUiMounted() {
84
- hubUiMounted = true;
85
- }
86
- export function resetGameHubMountForTests() {
87
- hubUiMounted = false;
88
- }
89
- //# sourceMappingURL=game-hub-mount.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-hub-mount.js","sourceRoot":"","sources":["../src/game-hub-mount.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import type { MessageMiddleware, Plugin, RegisteredAdapter } from '@zhin.js/core';
2
- /**
3
- * 在 root 插件上注册游戏文本中间件(入站管线只走 root.middleware)。
4
- */
5
- export declare function registerGameTextMiddleware(plugin: Plugin, middleware: MessageMiddleware<RegisteredAdapter>, name?: string): () => void;
6
- //# sourceMappingURL=game-middleware.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-middleware.d.ts","sourceRoot":"","sources":["../src/game-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElF;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,EAChD,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,IAAI,CAIZ"}
@@ -1,9 +0,0 @@
1
- /**
2
- * 在 root 插件上注册游戏文本中间件(入站管线只走 root.middleware)。
3
- */
4
- export function registerGameTextMiddleware(plugin, middleware, name) {
5
- const dispose = plugin.root.addMiddleware(middleware, name);
6
- plugin.onDispose(dispose);
7
- return dispose;
8
- }
9
- //# sourceMappingURL=game-middleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-middleware.js","sourceRoot":"","sources":["../src/game-middleware.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAc,EACd,UAAgD,EAChD,IAAa;IAEb,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -1,8 +0,0 @@
1
- import { type Plugin } from '@zhin.js/core';
2
- /**
3
- * 群聊首次 @ 且非命令时提示 /游戏 /帮助(每频道 24h 最多一次)
4
- */
5
- export declare function mountFirstAtHintMiddleware(root: Plugin): () => void;
6
- /** 测试专用 */
7
- export declare function resetOnboardingForTests(): void;
8
- //# sourceMappingURL=game-onboarding.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-onboarding.d.ts","sourceRoot":"","sources":["../src/game-onboarding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAyChF;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAoBnE;AAED,WAAW;AACX,wBAAgB,uBAAuB,IAAI,IAAI,CAG9C"}
@@ -1,67 +0,0 @@
1
- import { getActionFromMessage } from '@zhin.js/core';
2
- const hintedChannels = new Set();
3
- const TTL_MS = 24 * 60 * 60 * 1000;
4
- const channelHintAt = new Map();
5
- function channelHintKey(message) {
6
- return `${message.$adapter}-${message.$endpoint}-${message.$channel.type}:${message.$channel.id}`;
7
- }
8
- function pruneHintCache() {
9
- const now = Date.now();
10
- for (const [key, at] of channelHintAt) {
11
- if (now - at > TTL_MS) {
12
- channelHintAt.delete(key);
13
- hintedChannels.delete(key);
14
- }
15
- }
16
- }
17
- function messageMentionsBot(message) {
18
- const raw = message.$raw ?? '';
19
- if (/@(?:everyone|all)/i.test(raw))
20
- return false;
21
- const botId = message.$bot?.id;
22
- if (botId && raw.includes(String(botId)))
23
- return true;
24
- for (const item of message.$content ?? []) {
25
- if (typeof item === 'string')
26
- continue;
27
- if (item.type === 'at' && (!item.data.user_id || item.data.user_id === botId || item.data.user_id === 'all')) {
28
- if (item.data.user_id !== 'all')
29
- return true;
30
- }
31
- }
32
- return false;
33
- }
34
- function looksLikeCommand(raw) {
35
- const t = raw.trim();
36
- return t.startsWith('/') || /^(游戏|game|帮助|help|签到|stats)\b/i.test(t);
37
- }
38
- /**
39
- * 群聊首次 @ 且非命令时提示 /游戏 /帮助(每频道 24h 最多一次)
40
- */
41
- export function mountFirstAtHintMiddleware(root) {
42
- return root.addMiddleware(async (message, next) => {
43
- if (message.$channel.type !== 'group')
44
- return next();
45
- if (getActionFromMessage(message))
46
- return next();
47
- if (!messageMentionsBot(message))
48
- return next();
49
- const raw = message.$raw?.trim() ?? '';
50
- if (looksLikeCommand(raw))
51
- return next();
52
- pruneHintCache();
53
- const key = channelHintKey(message);
54
- if (hintedChannels.has(key))
55
- return next();
56
- hintedChannels.add(key);
57
- channelHintAt.set(key, Date.now());
58
- await message.$reply?.('发送「游戏」查看游戏列表,发送「帮助」查看可用命令');
59
- return next();
60
- });
61
- }
62
- /** 测试专用 */
63
- export function resetOnboardingForTests() {
64
- hintedChannels.clear();
65
- channelHintAt.clear();
66
- }
67
- //# sourceMappingURL=game-onboarding.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"game-onboarding.js","sourceRoot":"","sources":["../src/game-onboarding.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { RegisteredGame } from './game-hub-feature.js';
2
- import { type CommandHelpSource } from './command-help.js';
3
- export declare const HELP_CARD_CANVAS: "#d8dce3";
4
- export declare const HELP_CARD_WIDTH = 560;
5
- export interface BotHelpCardInput {
6
- games: readonly RegisteredGame[];
7
- commands?: readonly CommandHelpSource[];
8
- channelType?: string;
9
- }
10
- export declare function buildBotHelpHtml(input: BotHelpCardInput): string;
11
- export declare function buildHubHelpHtml(games: readonly RegisteredGame[], commands?: readonly CommandHelpSource[]): string;
12
- //# sourceMappingURL=help-card.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"help-card.d.ts","sourceRoot":"","sources":["../src/help-card.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,gBAAgB,WAA4B,CAAC;AAC1D,eAAO,MAAM,eAAe,MAAM,CAAC;AAsBnC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CA+FhE;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,QAAQ,CAAC,EAAE,SAAS,iBAAiB,EAAE,GACtC,MAAM,CAwCR"}