@zhin.js/game-kit 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/lib/board-sender.d.ts +14 -0
- package/lib/board-sender.d.ts.map +1 -0
- package/lib/board-sender.js +7 -0
- package/lib/board-sender.js.map +1 -0
- package/lib/choice-keyboard.d.ts +44 -0
- package/lib/choice-keyboard.d.ts.map +1 -0
- package/lib/choice-keyboard.js +67 -0
- package/lib/choice-keyboard.js.map +1 -0
- package/lib/command-alias.d.ts +21 -0
- package/lib/command-alias.d.ts.map +1 -0
- package/lib/command-alias.js +22 -0
- package/lib/command-alias.js.map +1 -0
- package/lib/command-help.d.ts +19 -0
- package/lib/command-help.d.ts.map +1 -0
- package/lib/command-help.js +91 -0
- package/lib/command-help.js.map +1 -0
- package/lib/command-message.d.ts +25 -0
- package/lib/command-message.d.ts.map +1 -0
- package/lib/command-message.js +58 -0
- package/lib/command-message.js.map +1 -0
- package/lib/game-action-alias.d.ts +8 -0
- package/lib/game-action-alias.d.ts.map +1 -0
- package/lib/game-action-alias.js +117 -0
- package/lib/game-action-alias.js.map +1 -0
- package/lib/game-commands.d.ts +3 -0
- package/lib/game-commands.d.ts.map +1 -0
- package/lib/game-commands.js +5 -0
- package/lib/game-commands.js.map +1 -0
- package/lib/game-hub-feature.d.ts +58 -0
- package/lib/game-hub-feature.d.ts.map +1 -0
- package/lib/game-hub-feature.js +100 -0
- package/lib/game-hub-feature.js.map +1 -0
- package/lib/game-hub-flow.d.ts +9 -0
- package/lib/game-hub-flow.d.ts.map +1 -0
- package/lib/game-hub-flow.js +90 -0
- package/lib/game-hub-flow.js.map +1 -0
- package/lib/game-hub-menu-context.d.ts +25 -0
- package/lib/game-hub-menu-context.d.ts.map +1 -0
- package/lib/game-hub-menu-context.js +64 -0
- package/lib/game-hub-menu-context.js.map +1 -0
- package/lib/game-hub-menu.d.ts +37 -0
- package/lib/game-hub-menu.d.ts.map +1 -0
- package/lib/game-hub-menu.js +162 -0
- package/lib/game-hub-menu.js.map +1 -0
- package/lib/game-hub-mount.d.ts +9 -0
- package/lib/game-hub-mount.d.ts.map +1 -0
- package/lib/game-hub-mount.js +108 -0
- package/lib/game-hub-mount.js.map +1 -0
- package/lib/game-interactive.d.ts +25 -0
- package/lib/game-interactive.d.ts.map +1 -0
- package/lib/game-interactive.js +62 -0
- package/lib/game-interactive.js.map +1 -0
- package/lib/game-middleware.d.ts +6 -0
- package/lib/game-middleware.d.ts.map +1 -0
- package/lib/game-middleware.js +9 -0
- package/lib/game-middleware.js.map +1 -0
- package/lib/game-onboarding.d.ts +8 -0
- package/lib/game-onboarding.d.ts.map +1 -0
- package/lib/game-onboarding.js +66 -0
- package/lib/game-onboarding.js.map +1 -0
- package/lib/game-records.d.ts +52 -0
- package/lib/game-records.d.ts.map +1 -0
- package/lib/game-records.js +206 -0
- package/lib/game-records.js.map +1 -0
- package/lib/game-session.d.ts +64 -0
- package/lib/game-session.d.ts.map +1 -0
- package/lib/game-session.js +44 -0
- package/lib/game-session.js.map +1 -0
- package/lib/grid-keyboard.d.ts +67 -0
- package/lib/grid-keyboard.d.ts.map +1 -0
- package/lib/grid-keyboard.js +104 -0
- package/lib/grid-keyboard.js.map +1 -0
- package/lib/help-card.d.ts +12 -0
- package/lib/help-card.d.ts.map +1 -0
- package/lib/help-card.js +129 -0
- package/lib/help-card.js.map +1 -0
- package/lib/index.d.ts +29 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +29 -0
- package/lib/index.js.map +1 -0
- package/lib/interaction-profiles.d.ts +16 -0
- package/lib/interaction-profiles.d.ts.map +1 -0
- package/lib/interaction-profiles.js +35 -0
- package/lib/interaction-profiles.js.map +1 -0
- package/lib/memory-db.d.ts +41 -0
- package/lib/memory-db.d.ts.map +1 -0
- package/lib/memory-db.js +92 -0
- package/lib/memory-db.js.map +1 -0
- package/lib/random.d.ts +6 -0
- package/lib/random.d.ts.map +1 -0
- package/lib/random.js +29 -0
- package/lib/random.js.map +1 -0
- package/lib/runtime-hub.d.ts +28 -0
- package/lib/runtime-hub.d.ts.map +1 -0
- package/lib/runtime-hub.js +66 -0
- package/lib/runtime-hub.js.map +1 -0
- package/lib/send-content-text.d.ts +5 -0
- package/lib/send-content-text.d.ts.map +1 -0
- package/lib/send-content-text.js +24 -0
- package/lib/send-content-text.js.map +1 -0
- package/package.json +49 -0
- package/src/board-sender.ts +16 -0
- package/src/choice-keyboard.ts +117 -0
- package/src/command-alias.ts +45 -0
- package/src/command-help.ts +117 -0
- package/src/command-message.ts +76 -0
- package/src/game-action-alias.ts +129 -0
- package/src/game-commands.ts +4 -0
- package/src/game-hub-feature.ts +151 -0
- package/src/game-hub-flow.ts +114 -0
- package/src/game-hub-menu-context.ts +94 -0
- package/src/game-hub-menu.ts +223 -0
- package/src/game-hub-mount.ts +172 -0
- package/src/game-interactive.ts +88 -0
- package/src/game-middleware.ts +14 -0
- package/src/game-onboarding.ts +67 -0
- package/src/game-records.ts +287 -0
- package/src/game-session.ts +97 -0
- package/src/grid-keyboard.ts +180 -0
- package/src/help-card.ts +188 -0
- package/src/index.ts +29 -0
- package/src/interaction-profiles.ts +56 -0
- package/src/memory-db.ts +128 -0
- package/src/random.ts +32 -0
- package/src/runtime-hub.ts +86 -0
- package/src/send-content-text.ts +21 -0
package/lib/help-card.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Card, CardCanvas, CardHeader, DEFAULT_CARD_THEME, h, KvRow, Section, TopicItem, } from '@zhin.js/satori';
|
|
2
|
+
import { slashCommandPrefix } from './game-commands.js';
|
|
3
|
+
import { collectSupplementaryCommandHelp, formatHubOpenCommandLines, } from './command-help.js';
|
|
4
|
+
export const HELP_CARD_CANVAS = DEFAULT_CARD_THEME.canvas;
|
|
5
|
+
export const HELP_CARD_WIDTH = 560;
|
|
6
|
+
function cardShell(inner) {
|
|
7
|
+
return h(CardCanvas, {
|
|
8
|
+
width: HELP_CARD_WIDTH,
|
|
9
|
+
backgroundColor: HELP_CARD_CANVAS,
|
|
10
|
+
children: h(Card, { children: inner }),
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function gameTopicSummary(game) {
|
|
14
|
+
const quick = game.quickStart ?? '开始';
|
|
15
|
+
const cmd = `${slashCommandPrefix(game.commandPrefix.replace(/^\//, ''))} ${quick}`;
|
|
16
|
+
const alias = game.aliases?.length ? ` · ${game.aliases.join(' / ')}` : '';
|
|
17
|
+
return `${cmd}${alias} — ${game.description}`;
|
|
18
|
+
}
|
|
19
|
+
function commandTopicSummary(cmd) {
|
|
20
|
+
const [label = '', detail = ''] = cmd.helpInfo.desc;
|
|
21
|
+
return detail || label || cmd.pattern;
|
|
22
|
+
}
|
|
23
|
+
export function buildBotHelpHtml(input) {
|
|
24
|
+
const { games, commands, channelType } = input;
|
|
25
|
+
const hubLines = formatHubOpenCommandLines(commands);
|
|
26
|
+
const other = commands?.length
|
|
27
|
+
? collectSupplementaryCommandHelp(commands, games)
|
|
28
|
+
: [];
|
|
29
|
+
const parts = [];
|
|
30
|
+
parts.push(h(CardHeader, {
|
|
31
|
+
title: '游戏大厅',
|
|
32
|
+
subtitle: games.length
|
|
33
|
+
? `已注册 ${games.length} 款游戏 · 发送 /游戏 打开按钮大厅`
|
|
34
|
+
: '暂无已注册游戏',
|
|
35
|
+
badge: '🎮',
|
|
36
|
+
}));
|
|
37
|
+
if (hubLines.length) {
|
|
38
|
+
parts.push(h(Section, {
|
|
39
|
+
title: '入口',
|
|
40
|
+
children: hubLines.map((line) => {
|
|
41
|
+
const sep = line.indexOf(' — ');
|
|
42
|
+
const pattern = sep >= 0 ? line.slice(0, sep) : line;
|
|
43
|
+
const desc = sep >= 0 ? line.slice(sep + 3) : '';
|
|
44
|
+
return h(KvRow, { label: pattern, value: desc, labelWidth: 72 });
|
|
45
|
+
}),
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
if (games.length) {
|
|
49
|
+
parts.push(h(Section, {
|
|
50
|
+
title: '游戏列表',
|
|
51
|
+
children: games.map((g, i) => h(TopicItem, {
|
|
52
|
+
index: i + 1,
|
|
53
|
+
title: `${g.icon} ${g.title}`,
|
|
54
|
+
summary: gameTopicSummary(g),
|
|
55
|
+
})),
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
parts.push(h(Section, {
|
|
60
|
+
title: '提示',
|
|
61
|
+
children: h(TopicItem, {
|
|
62
|
+
index: 1,
|
|
63
|
+
title: '安装任意游戏插件',
|
|
64
|
+
summary: 'registerGame 后会自动挂载大厅命令',
|
|
65
|
+
}),
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
if (other.length) {
|
|
69
|
+
parts.push(h(Section, {
|
|
70
|
+
title: '其他命令',
|
|
71
|
+
children: other.map((cmd, i) => h(TopicItem, {
|
|
72
|
+
index: i + 1,
|
|
73
|
+
title: cmd.pattern,
|
|
74
|
+
summary: commandTopicSummary(cmd),
|
|
75
|
+
})),
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
if (channelType === 'group') {
|
|
79
|
+
parts.push(h(Section, {
|
|
80
|
+
title: 'QQ 群用法',
|
|
81
|
+
children: [
|
|
82
|
+
h(TopicItem, {
|
|
83
|
+
index: 1,
|
|
84
|
+
title: '公域群需 @ 机器人',
|
|
85
|
+
summary: '发送命令或直接点击消息按钮',
|
|
86
|
+
}),
|
|
87
|
+
h(TopicItem, {
|
|
88
|
+
index: 2,
|
|
89
|
+
title: '/游戏 打开大厅',
|
|
90
|
+
summary: '同群成员均可点击按钮参与',
|
|
91
|
+
}),
|
|
92
|
+
],
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
return cardShell(parts.join(''));
|
|
96
|
+
}
|
|
97
|
+
export function buildHubHelpHtml(games, commands) {
|
|
98
|
+
const hubLines = formatHubOpenCommandLines(commands);
|
|
99
|
+
const parts = [
|
|
100
|
+
h(CardHeader, {
|
|
101
|
+
title: '游戏大厅帮助',
|
|
102
|
+
subtitle: games.length ? `${games.length} 款游戏可选` : '暂无游戏',
|
|
103
|
+
badge: '🎮',
|
|
104
|
+
}),
|
|
105
|
+
];
|
|
106
|
+
if (hubLines.length) {
|
|
107
|
+
parts.push(h(Section, {
|
|
108
|
+
title: '入口',
|
|
109
|
+
children: hubLines.map((line) => {
|
|
110
|
+
const sep = line.indexOf(' — ');
|
|
111
|
+
const pattern = sep >= 0 ? line.slice(0, sep) : line;
|
|
112
|
+
const desc = sep >= 0 ? line.slice(sep + 3) : '';
|
|
113
|
+
return h(KvRow, { label: pattern, value: desc, labelWidth: 72 });
|
|
114
|
+
}),
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
if (games.length) {
|
|
118
|
+
parts.push(h(Section, {
|
|
119
|
+
title: '游戏',
|
|
120
|
+
children: games.map((g, i) => h(TopicItem, {
|
|
121
|
+
index: i + 1,
|
|
122
|
+
title: `${g.icon} ${g.title}`,
|
|
123
|
+
summary: gameTopicSummary(g),
|
|
124
|
+
})),
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
return cardShell(parts.join(''));
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=help-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-card.js","sourceRoot":"","sources":["../src/help-card.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zhin.js/game-kit - 通用游戏工具包
|
|
3
|
+
*
|
|
4
|
+
* 提供网格棋盘、会话管理、消息发送等通用抽象
|
|
5
|
+
*/
|
|
6
|
+
export * from './grid-keyboard.js';
|
|
7
|
+
export * from './choice-keyboard.js';
|
|
8
|
+
export * from './board-sender.js';
|
|
9
|
+
export * from './game-session.js';
|
|
10
|
+
export * from './game-hub-feature.js';
|
|
11
|
+
export * from './game-hub-menu.js';
|
|
12
|
+
export * from './game-hub-menu-context.js';
|
|
13
|
+
export * from './game-hub-flow.js';
|
|
14
|
+
export * from './game-hub-mount.js';
|
|
15
|
+
export * from './game-middleware.js';
|
|
16
|
+
export * from './game-action-alias.js';
|
|
17
|
+
export * from './game-commands.js';
|
|
18
|
+
export * from './game-interactive.js';
|
|
19
|
+
export * from './interaction-profiles.js';
|
|
20
|
+
export * from './game-records.js';
|
|
21
|
+
export * from './game-onboarding.js';
|
|
22
|
+
export * from './command-help.js';
|
|
23
|
+
export * from './command-message.js';
|
|
24
|
+
export * from './memory-db.js';
|
|
25
|
+
export * from './send-content-text.js';
|
|
26
|
+
export * from './runtime-hub.js';
|
|
27
|
+
export * from './command-alias.js';
|
|
28
|
+
export * from './random.js';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,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
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zhin.js/game-kit - 通用游戏工具包
|
|
3
|
+
*
|
|
4
|
+
* 提供网格棋盘、会话管理、消息发送等通用抽象
|
|
5
|
+
*/
|
|
6
|
+
export * from './grid-keyboard.js';
|
|
7
|
+
export * from './choice-keyboard.js';
|
|
8
|
+
export * from './board-sender.js';
|
|
9
|
+
export * from './game-session.js';
|
|
10
|
+
export * from './game-hub-feature.js';
|
|
11
|
+
export * from './game-hub-menu.js';
|
|
12
|
+
export * from './game-hub-menu-context.js';
|
|
13
|
+
export * from './game-hub-flow.js';
|
|
14
|
+
export * from './game-hub-mount.js';
|
|
15
|
+
export * from './game-middleware.js';
|
|
16
|
+
export * from './game-action-alias.js';
|
|
17
|
+
export * from './game-commands.js';
|
|
18
|
+
export * from './game-interactive.js';
|
|
19
|
+
export * from './interaction-profiles.js';
|
|
20
|
+
export * from './game-records.js';
|
|
21
|
+
export * from './game-onboarding.js';
|
|
22
|
+
export * from './command-help.js';
|
|
23
|
+
export * from './command-message.js';
|
|
24
|
+
export * from './memory-db.js';
|
|
25
|
+
export * from './send-content-text.js';
|
|
26
|
+
export * from './runtime-hub.js';
|
|
27
|
+
export * from './command-alias.js';
|
|
28
|
+
export * from './random.js';
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +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,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ButtonData } from '@zhin.js/core';
|
|
2
|
+
/** 交互模式预设:见 ADR 0022 / docs/essentials/interactive-segments.md */
|
|
3
|
+
export type InteractionProfile = 'menu' | 'gameplay' | 'terminal';
|
|
4
|
+
export interface ApplyInteractionProfileOptions {
|
|
5
|
+
profile: InteractionProfile;
|
|
6
|
+
/** 用于 terminal profile:私聊可 auto-enter */
|
|
7
|
+
channelType?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 按 profile 注入 button.mode(显式 mode 优先)。
|
|
11
|
+
* - menu / terminal → command
|
|
12
|
+
* - gameplay → callback
|
|
13
|
+
*/
|
|
14
|
+
export declare function applyInteractionProfile(btn: ButtonData, options: ApplyInteractionProfileOptions): ButtonData;
|
|
15
|
+
export declare function applyInteractionProfileToButtons(buttons: ButtonData[], options: ApplyInteractionProfileOptions): ButtonData[];
|
|
16
|
+
//# sourceMappingURL=interaction-profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-profiles.d.ts","sourceRoot":"","sources":["../src/interaction-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,UAAU,EAAyB,MAAM,eAAe,CAAC;AAE7F,kEAAkE;AAClE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAElE,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,kBAAkB,CAAC;IAC5B,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoBD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,8BAA8B,GACtC,UAAU,CAWZ;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,8BAA8B,GACtC,UAAU,EAAE,CAEd"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function defaultModeForProfile(profile, channelType) {
|
|
2
|
+
if (profile === 'gameplay')
|
|
3
|
+
return 'callback';
|
|
4
|
+
// 群/频道大厅为共享 UI,须 callback,否则仅 opener 有文本 fallback 上下文
|
|
5
|
+
if (profile === 'menu' && channelType && channelType !== 'private')
|
|
6
|
+
return 'callback';
|
|
7
|
+
return 'command';
|
|
8
|
+
}
|
|
9
|
+
function defaultCommandForProfile(profile, channelType) {
|
|
10
|
+
if (profile !== 'terminal')
|
|
11
|
+
return undefined;
|
|
12
|
+
return { enter: channelType === 'private' };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 按 profile 注入 button.mode(显式 mode 优先)。
|
|
16
|
+
* - menu / terminal → command
|
|
17
|
+
* - gameplay → callback
|
|
18
|
+
*/
|
|
19
|
+
export function applyInteractionProfile(btn, options) {
|
|
20
|
+
if (btn.mode != null)
|
|
21
|
+
return btn;
|
|
22
|
+
const mode = defaultModeForProfile(options.profile, options.channelType);
|
|
23
|
+
const commandDefaults = defaultCommandForProfile(options.profile, options.channelType);
|
|
24
|
+
return {
|
|
25
|
+
...btn,
|
|
26
|
+
mode,
|
|
27
|
+
command: commandDefaults
|
|
28
|
+
? { ...commandDefaults, ...btn.command }
|
|
29
|
+
: btn.command,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function applyInteractionProfileToButtons(buttons, options) {
|
|
33
|
+
return buttons.map((btn) => applyInteractionProfile(btn, options));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=interaction-profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction-profiles.js","sourceRoot":"","sources":["../src/interaction-profiles.ts"],"names":[],"mappings":"AAWA,SAAS,qBAAqB,CAC5B,OAA2B,EAC3B,WAAoB;IAEpB,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,UAAU,CAAC;IAC9C,sDAAsD;IACtD,IAAI,OAAO,KAAK,MAAM,IAAI,WAAW,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IACtF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,wBAAwB,CAC/B,OAA2B,EAC3B,WAAoB;IAEpB,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,GAAe,EACf,OAAuC;IAEvC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC;IACjC,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,wBAAwB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACvF,OAAO;QACL,GAAG,GAAG;QACN,IAAI;QACJ,OAAO,EAAE,eAAe;YACtB,CAAC,CAAC,EAAE,GAAG,eAAe,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE;YACxC,CAAC,CAAC,GAAG,CAAC,OAAO;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,OAAqB,EACrB,OAAuC;IAEvC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal in-memory models for game SessionService (findAll/findOne/create/updateWhere/deleteWhere).
|
|
3
|
+
* Slice-2 fallback while Plugin Runtime has no DatabaseFeature Resource path.
|
|
4
|
+
*/
|
|
5
|
+
type Row = Record<string, unknown>;
|
|
6
|
+
export interface InMemoryGameModel {
|
|
7
|
+
findAll: (q?: Record<string, unknown>) => Promise<Row[]>;
|
|
8
|
+
findOne: (q?: Record<string, unknown>) => Promise<Row | null>;
|
|
9
|
+
create: (row: Row) => Promise<Row>;
|
|
10
|
+
updateWhere: (where: Record<string, unknown>, patch: Row) => Promise<number>;
|
|
11
|
+
deleteWhere: (where: Record<string, unknown>) => Promise<number>;
|
|
12
|
+
}
|
|
13
|
+
export interface InMemoryGameDb {
|
|
14
|
+
models: {
|
|
15
|
+
get: (name: string) => InMemoryGameModel | undefined;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Create an in-memory db with the given model table names. */
|
|
19
|
+
export declare function createInMemoryGameDb(tableNames: readonly string[]): InMemoryGameDb;
|
|
20
|
+
/** Minimal DatabaseHost model surface (structural typing; no plugin-runtime dep). */
|
|
21
|
+
export interface HostGameModelSource {
|
|
22
|
+
select(): {
|
|
23
|
+
where(query: Record<string, unknown>): Promise<Record<string, unknown>[]>;
|
|
24
|
+
};
|
|
25
|
+
insert(row: Record<string, unknown>): Promise<unknown>;
|
|
26
|
+
delete(): {
|
|
27
|
+
where(query: Record<string, unknown>): Promise<unknown>;
|
|
28
|
+
};
|
|
29
|
+
update(patch: Record<string, unknown>): {
|
|
30
|
+
where(query: Record<string, unknown>): Promise<unknown>;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export interface HostGameDbSource {
|
|
34
|
+
models: {
|
|
35
|
+
get(name: string): HostGameModelSource | undefined;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Adapt DatabaseHost models to SessionService RelatedModel-style API. */
|
|
39
|
+
export declare function createHostGameDb(host: HostGameDbSource, tableNames: readonly string[]): InMemoryGameDb;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=memory-db.d.ts.map
|
|
@@ -0,0 +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;AAsCD,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAUlF;AAED,qFAAqF;AACrF,MAAM,WAAW,mBAAmB;IAClC,MAAM,IAAI;QACR,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;KAC3E,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
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal in-memory models for game SessionService (findAll/findOne/create/updateWhere/deleteWhere).
|
|
3
|
+
* Slice-2 fallback while Plugin Runtime has no DatabaseFeature Resource path.
|
|
4
|
+
*/
|
|
5
|
+
function createMemoryModel() {
|
|
6
|
+
const rows = [];
|
|
7
|
+
const match = (row, q) => Object.entries(q).every(([k, v]) => row[k] === v);
|
|
8
|
+
return {
|
|
9
|
+
findAll: async (q = {}) => rows.filter((row) => match(row, q)),
|
|
10
|
+
findOne: async (q = {}) => rows.find((row) => match(row, q)) ?? null,
|
|
11
|
+
create: async (row) => {
|
|
12
|
+
rows.push({ ...row });
|
|
13
|
+
return row;
|
|
14
|
+
},
|
|
15
|
+
updateWhere: async (where, patch) => {
|
|
16
|
+
let n = 0;
|
|
17
|
+
for (const row of rows) {
|
|
18
|
+
if (match(row, where)) {
|
|
19
|
+
Object.assign(row, patch);
|
|
20
|
+
n += 1;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return n;
|
|
24
|
+
},
|
|
25
|
+
deleteWhere: async (where) => {
|
|
26
|
+
let n = 0;
|
|
27
|
+
for (let i = rows.length - 1; i >= 0; i -= 1) {
|
|
28
|
+
if (match(rows[i], where)) {
|
|
29
|
+
rows.splice(i, 1);
|
|
30
|
+
n += 1;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return n;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Create an in-memory db with the given model table names. */
|
|
38
|
+
export function createInMemoryGameDb(tableNames) {
|
|
39
|
+
const models = new Map();
|
|
40
|
+
for (const name of tableNames) {
|
|
41
|
+
models.set(name, createMemoryModel());
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
models: {
|
|
45
|
+
get: (name) => models.get(name),
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function wrapHostModel(model) {
|
|
50
|
+
return {
|
|
51
|
+
findAll: async (q = {}) => {
|
|
52
|
+
const rows = await model.select().where(q);
|
|
53
|
+
return rows;
|
|
54
|
+
},
|
|
55
|
+
findOne: async (q = {}) => {
|
|
56
|
+
const rows = await model.select().where(q);
|
|
57
|
+
return rows[0] ?? null;
|
|
58
|
+
},
|
|
59
|
+
create: async (row) => {
|
|
60
|
+
await model.insert(row);
|
|
61
|
+
return row;
|
|
62
|
+
},
|
|
63
|
+
updateWhere: async (where, patch) => {
|
|
64
|
+
const matching = await model.select().where(where);
|
|
65
|
+
if (matching.length === 0)
|
|
66
|
+
return 0;
|
|
67
|
+
await model.update(patch).where(where);
|
|
68
|
+
return matching.length;
|
|
69
|
+
},
|
|
70
|
+
deleteWhere: async (where) => {
|
|
71
|
+
const matching = await model.select().where(where);
|
|
72
|
+
if (matching.length === 0)
|
|
73
|
+
return 0;
|
|
74
|
+
await model.delete().where(where);
|
|
75
|
+
return matching.length;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** Adapt DatabaseHost models to SessionService RelatedModel-style API. */
|
|
80
|
+
export function createHostGameDb(host, tableNames) {
|
|
81
|
+
return {
|
|
82
|
+
models: {
|
|
83
|
+
get: (name) => {
|
|
84
|
+
if (!tableNames.includes(name))
|
|
85
|
+
return undefined;
|
|
86
|
+
const raw = host.models.get(name);
|
|
87
|
+
return raw ? wrapHostModel(raw) : undefined;
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=memory-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../src/memory-db.ts"],"names":[],"mappings":"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"}
|
package/lib/random.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function secureRandomInt(maxExclusive: number): number;
|
|
2
|
+
export declare function secureRandomIntInclusive(min: number, max: number): number;
|
|
3
|
+
export declare function secureRandomItem<T>(items: readonly T[]): T;
|
|
4
|
+
export declare function secureShuffleInPlace<T>(items: T[]): T[];
|
|
5
|
+
export declare function generateCompactId(prefix: string): string;
|
|
6
|
+
//# sourceMappingURL=random.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../src/random.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKzE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAG1D;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAMvD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
package/lib/random.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { randomInt, randomUUID } from 'node:crypto';
|
|
2
|
+
export function secureRandomInt(maxExclusive) {
|
|
3
|
+
if (!Number.isSafeInteger(maxExclusive) || maxExclusive <= 0) {
|
|
4
|
+
throw new RangeError('maxExclusive must be a positive safe integer');
|
|
5
|
+
}
|
|
6
|
+
return randomInt(maxExclusive);
|
|
7
|
+
}
|
|
8
|
+
export function secureRandomIntInclusive(min, max) {
|
|
9
|
+
if (!Number.isSafeInteger(min) || !Number.isSafeInteger(max) || max < min) {
|
|
10
|
+
throw new RangeError('invalid inclusive random range');
|
|
11
|
+
}
|
|
12
|
+
return min + randomInt(max - min + 1);
|
|
13
|
+
}
|
|
14
|
+
export function secureRandomItem(items) {
|
|
15
|
+
if (items.length === 0)
|
|
16
|
+
throw new RangeError('cannot choose from an empty array');
|
|
17
|
+
return items[secureRandomInt(items.length)];
|
|
18
|
+
}
|
|
19
|
+
export function secureShuffleInPlace(items) {
|
|
20
|
+
for (let i = items.length - 1; i > 0; i--) {
|
|
21
|
+
const j = secureRandomInt(i + 1);
|
|
22
|
+
[items[i], items[j]] = [items[j], items[i]];
|
|
23
|
+
}
|
|
24
|
+
return items;
|
|
25
|
+
}
|
|
26
|
+
export function generateCompactId(prefix) {
|
|
27
|
+
return `${prefix}${Date.now().toString(36)}${randomUUID().replaceAll('-', '').slice(0, 8)}`;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=random.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../src/random.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,eAAe,CAAC,YAAoB;IAClD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,UAAU,CAAC,8CAA8C,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAW,EAAE,GAAW;IAC/D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QAC1E,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,GAAG,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAI,KAAmB;IACrD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAI,KAAU;IAChD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Runtime game hub — module-level registry (no legacy Feature / getPlugin).
|
|
3
|
+
* Games call `registerRuntimeGame` from `setup()`; hub plugin lists them.
|
|
4
|
+
*/
|
|
5
|
+
export interface RuntimeGameMenuAction {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly label: string;
|
|
8
|
+
}
|
|
9
|
+
export interface RuntimeRegisteredGame {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
readonly title: string;
|
|
12
|
+
readonly icon: string;
|
|
13
|
+
readonly description: string;
|
|
14
|
+
readonly commandPrefix: string;
|
|
15
|
+
readonly quickStart?: string;
|
|
16
|
+
readonly aliases?: readonly string[];
|
|
17
|
+
readonly menus?: readonly RuntimeGameMenuAction[];
|
|
18
|
+
}
|
|
19
|
+
export declare function registerRuntimeGame(game: RuntimeRegisteredGame): () => void;
|
|
20
|
+
export declare function getRuntimeGames(): readonly RuntimeRegisteredGame[];
|
|
21
|
+
export declare function getRuntimeGame(id: string): RuntimeRegisteredGame | undefined;
|
|
22
|
+
export declare function resetRuntimeGamesForTests(): void;
|
|
23
|
+
export declare function formatRuntimeGamesHelp(): string;
|
|
24
|
+
/** Default idle timeout for stale-session cron (30 minutes). */
|
|
25
|
+
export declare const DEFAULT_GAME_STALE_IDLE_MS: number;
|
|
26
|
+
/** Solar cron: every 10 minutes. */
|
|
27
|
+
export declare const DEFAULT_GAME_STALE_CRON = "0 */10 * * * *";
|
|
28
|
+
//# sourceMappingURL=runtime-hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-hub.d.ts","sourceRoot":"","sources":["../src/runtime-hub.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACnD;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,IAAI,CAY3E;AAED,wBAAgB,eAAe,IAAI,SAAS,qBAAqB,EAAE,CAKlE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAW5E;AAED,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAmB/C;AAED,gEAAgE;AAChE,eAAO,MAAM,0BAA0B,QAAiB,CAAC;AAEzD,oCAAoC;AACpC,eAAO,MAAM,uBAAuB,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const games = new Map();
|
|
2
|
+
export function registerRuntimeGame(game) {
|
|
3
|
+
const registered = Object.freeze({ ...game });
|
|
4
|
+
const registrations = games.get(game.id) ?? [];
|
|
5
|
+
registrations.push(registered);
|
|
6
|
+
games.set(game.id, registrations);
|
|
7
|
+
return () => {
|
|
8
|
+
const current = games.get(game.id);
|
|
9
|
+
if (!current)
|
|
10
|
+
return;
|
|
11
|
+
const index = current.lastIndexOf(registered);
|
|
12
|
+
if (index >= 0)
|
|
13
|
+
current.splice(index, 1);
|
|
14
|
+
if (current.length === 0)
|
|
15
|
+
games.delete(game.id);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function getRuntimeGames() {
|
|
19
|
+
const active = [...games.values()]
|
|
20
|
+
.map((registrations) => registrations[registrations.length - 1])
|
|
21
|
+
.filter((game) => Boolean(game));
|
|
22
|
+
return Object.freeze(active.sort((a, b) => a.id.localeCompare(b.id)));
|
|
23
|
+
}
|
|
24
|
+
export function getRuntimeGame(id) {
|
|
25
|
+
const directRegistrations = games.get(id);
|
|
26
|
+
const direct = directRegistrations?.[directRegistrations.length - 1];
|
|
27
|
+
if (direct)
|
|
28
|
+
return direct;
|
|
29
|
+
// 别名解析(如 bj、ttt、21点)
|
|
30
|
+
for (const registrations of games.values()) {
|
|
31
|
+
const game = registrations[registrations.length - 1];
|
|
32
|
+
if (!game)
|
|
33
|
+
continue;
|
|
34
|
+
if (game.aliases?.includes(id))
|
|
35
|
+
return game;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
export function resetRuntimeGamesForTests() {
|
|
40
|
+
games.clear();
|
|
41
|
+
}
|
|
42
|
+
export function formatRuntimeGamesHelp() {
|
|
43
|
+
const list = getRuntimeGames();
|
|
44
|
+
if (list.length === 0) {
|
|
45
|
+
return [
|
|
46
|
+
'🎮 游戏大厅',
|
|
47
|
+
'',
|
|
48
|
+
'暂无已加载的游戏插件。',
|
|
49
|
+
'安装并启用 `@zhin.js/plugin-guess-number` 等游戏包后重试。',
|
|
50
|
+
].join('\n');
|
|
51
|
+
}
|
|
52
|
+
const lines = ['🎮 游戏大厅', '', '已加载:'];
|
|
53
|
+
for (const g of list) {
|
|
54
|
+
const start = g.quickStart ? ` ${g.quickStart}` : '';
|
|
55
|
+
lines.push(`${g.icon} **${g.title}** — \`${g.commandPrefix}${start}\``);
|
|
56
|
+
lines.push(` ${g.description}`);
|
|
57
|
+
}
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push('发送对应命令开始;进行中可按各游戏说明直接回复。');
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
/** Default idle timeout for stale-session cron (30 minutes). */
|
|
63
|
+
export const DEFAULT_GAME_STALE_IDLE_MS = 30 * 60 * 1000;
|
|
64
|
+
/** Solar cron: every 10 minutes. */
|
|
65
|
+
export const DEFAULT_GAME_STALE_CRON = '0 */10 * * * *';
|
|
66
|
+
//# sourceMappingURL=runtime-hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-hub.js","sourceRoot":"","sources":["../src/runtime-hub.ts"],"names":[],"mappings":"AAoBA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmC,CAAC;AAEzD,MAAM,UAAU,mBAAmB,CAAC,IAA2B;IAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/C,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAClC,OAAO,GAAG,EAAE;QACV,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;SAC/B,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SAC/D,MAAM,CAAC,CAAC,IAAI,EAAiC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,MAAM,mBAAmB,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,qBAAqB;IACrB,KAAK,MAAM,aAAa,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,SAAS;YACT,EAAE;YACF,aAAa;YACb,+CAA+C;SAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,aAAa,GAAG,KAAK,IAAI,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEzD,oCAAoC;AACpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-content-text.d.ts","sourceRoot":"","sources":["../src/send-content-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAgBjE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract plain text from SendContent (skip buttons / keyboard) for text-only game paths.
|
|
3
|
+
*/
|
|
4
|
+
export function plainTextFromSendContent(content) {
|
|
5
|
+
if (content == null)
|
|
6
|
+
return '';
|
|
7
|
+
if (typeof content === 'string')
|
|
8
|
+
return content;
|
|
9
|
+
if (Array.isArray(content)) {
|
|
10
|
+
return content
|
|
11
|
+
.map(plainTextFromSendContent)
|
|
12
|
+
.filter((s) => s.length > 0)
|
|
13
|
+
.join('\n');
|
|
14
|
+
}
|
|
15
|
+
if (typeof content === 'object' && content !== null && 'type' in content) {
|
|
16
|
+
const seg = content;
|
|
17
|
+
if (seg.type === 'text')
|
|
18
|
+
return String(seg.data?.text ?? '');
|
|
19
|
+
// buttons / keyboard / other segments omitted in text-only mode
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=send-content-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send-content-text.js","sourceRoot":"","sources":["../src/send-content-text.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,IAAI,OAAO,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,wBAAwB,CAAC;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QACzE,MAAM,GAAG,GAAG,OAAwE,CAAC;QACrF,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7D,gEAAgE;QAChE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|