@zhin.js/plugin-word-riddle 1.0.0

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 (60) hide show
  1. package/README.md +20 -0
  2. package/lib/commands.d.ts +6 -0
  3. package/lib/commands.d.ts.map +1 -0
  4. package/lib/commands.js +94 -0
  5. package/lib/commands.js.map +1 -0
  6. package/lib/data/char-riddles.json +1 -0
  7. package/lib/data/riddles.d.ts +3 -0
  8. package/lib/data/riddles.d.ts.map +1 -0
  9. package/lib/data/riddles.js +2 -0
  10. package/lib/data/riddles.js.map +1 -0
  11. package/lib/engine.d.ts +9 -0
  12. package/lib/engine.d.ts.map +1 -0
  13. package/lib/engine.js +20 -0
  14. package/lib/engine.js.map +1 -0
  15. package/lib/game-flow.d.ts +12 -0
  16. package/lib/game-flow.d.ts.map +1 -0
  17. package/lib/game-flow.js +141 -0
  18. package/lib/game-flow.js.map +1 -0
  19. package/lib/hub-register.d.ts +5 -0
  20. package/lib/hub-register.d.ts.map +1 -0
  21. package/lib/hub-register.js +32 -0
  22. package/lib/hub-register.js.map +1 -0
  23. package/lib/index.d.ts +2 -0
  24. package/lib/index.d.ts.map +1 -0
  25. package/lib/index.js +26 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/models.d.ts +31 -0
  28. package/lib/models.d.ts.map +1 -0
  29. package/lib/models.js +25 -0
  30. package/lib/models.js.map +1 -0
  31. package/lib/riddle-command.d.ts +5 -0
  32. package/lib/riddle-command.d.ts.map +1 -0
  33. package/lib/riddle-command.js +56 -0
  34. package/lib/riddle-command.js.map +1 -0
  35. package/lib/riddle-provider.d.ts +21 -0
  36. package/lib/riddle-provider.d.ts.map +1 -0
  37. package/lib/riddle-provider.js +80 -0
  38. package/lib/riddle-provider.js.map +1 -0
  39. package/lib/session-service.d.ts +20 -0
  40. package/lib/session-service.d.ts.map +1 -0
  41. package/lib/session-service.js +108 -0
  42. package/lib/session-service.js.map +1 -0
  43. package/lib/view.d.ts +6 -0
  44. package/lib/view.d.ts.map +1 -0
  45. package/lib/view.js +50 -0
  46. package/lib/view.js.map +1 -0
  47. package/package.json +39 -0
  48. package/plugin.yml +2 -0
  49. package/src/commands.ts +112 -0
  50. package/src/data/char-riddles.json +1 -0
  51. package/src/data/riddles.ts +8 -0
  52. package/src/engine.ts +30 -0
  53. package/src/game-flow.ts +196 -0
  54. package/src/hub-register.ts +34 -0
  55. package/src/index.ts +32 -0
  56. package/src/models.ts +57 -0
  57. package/src/riddle-command.ts +66 -0
  58. package/src/riddle-provider.ts +105 -0
  59. package/src/session-service.ts +113 -0
  60. package/src/view.ts +60 -0
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # @zhin.js/plugin-word-riddle
2
+
3
+ 字谜 + 猜成语。每局随机 **10** 题,支持提示、跳过与连击计分。
4
+
5
+ ## 词库来源
6
+
7
+ | 模式 | 来源 | 规模 |
8
+ |------|------|------|
9
+ | 字谜 | [riddle_demo](https://github.com/ytygxfmgzx/riddle_demo) CSV(构建为 `char-riddles.json`) | ~2.8 万 |
10
+ | 猜成语 | npm [`chinese-idiom-chengyu`](https://www.npmjs.com/package/chinese-idiom-chengyu)(MIT) | ~2.9 万 |
11
+
12
+ 字谜数据在 `pnpm build` 时由 `scripts/build-char-riddles.mjs` 生成;本地可缓存 `data/riddles.csv` 避免重复下载。
13
+
14
+ ## 命令
15
+
16
+ - `猜谜` / `猜谜 开始` — 字谜模式
17
+ - `猜谜 成语` — 猜成语模式
18
+ - `猜谜 继续` — 刷新界面
19
+
20
+ 需启用 `database` 配置以持久化对局。
@@ -0,0 +1,6 @@
1
+ import { type Plugin } from 'zhin.js';
2
+ import type { SessionService } from './session-service.js';
3
+ export declare function registerCommands(plugin: Plugin, getServices: () => SessionService | null): void;
4
+ export declare function registerInteractive(plugin: Plugin, getServices: () => SessionService | null): void;
5
+ export declare function registerTextMiddleware(plugin: Plugin, getServices: () => SessionService | null): void;
6
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAUrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAoB3D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAG/F;AA4BD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAUlG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAsCrG"}
@@ -0,0 +1,94 @@
1
+ import { MessageCommand, getActionFromMessage } from 'zhin.js';
2
+ import { buildChoiceFallbackMap, channelKey, normalizeRiddleAction, parseChoicePayload, registerGameTextMiddleware, } from '@zhin.js/game-shared';
3
+ import { handleChoice, processAnswerText, RIDDLE_PREFIX } from './game-flow.js';
4
+ import { runRiddleCommand } from './riddle-command.js';
5
+ function registerPattern(plugin, pattern, desc, getServices) {
6
+ plugin.addCommand(new MessageCommand(pattern)
7
+ .desc(desc)
8
+ .action(async (message, result) => {
9
+ const services = getServices();
10
+ if (!services)
11
+ return '猜谜需要启用 database 配置。';
12
+ const raw = result.params.action ?? '';
13
+ return runRiddleCommand(plugin, services, message, normalizeRiddleAction(raw));
14
+ }));
15
+ }
16
+ export function registerCommands(plugin, getServices) {
17
+ registerPattern(plugin, 'riddle [action:word]', '猜谜(riddle)', getServices);
18
+ registerPattern(plugin, '猜谜 [action:word]', '猜谜(中文)', getServices);
19
+ }
20
+ async function resolveChoice(message, services) {
21
+ const action = getActionFromMessage(message);
22
+ if (!action)
23
+ return null;
24
+ const parsed = parseChoicePayload(action.payload, RIDDLE_PREFIX);
25
+ if (parsed)
26
+ return { sessionId: parsed.sessionId, choiceId: parsed.choiceId };
27
+ const choiceId = action.id || action.payload;
28
+ if (!choiceId)
29
+ return null;
30
+ const ch = channelKey(message);
31
+ const session = await services.getActiveForUser(ch, message.$sender.id)
32
+ ?? (action.sourceMessageId
33
+ ? await services.getActiveByBoardMessageId(action.sourceMessageId)
34
+ : null);
35
+ if (!session || session.channel_key !== ch)
36
+ return null;
37
+ const valid = ['hint', 'skip', 'quit', 'restart_char', 'restart_idiom'];
38
+ if (!valid.includes(choiceId))
39
+ return null;
40
+ return { sessionId: session.id, choiceId };
41
+ }
42
+ export function registerInteractive(plugin, getServices) {
43
+ plugin.registerInteractiveHandler(`${RIDDLE_PREFIX}:`, async (message) => {
44
+ const services = getServices();
45
+ if (!services)
46
+ return false;
47
+ const choice = await resolveChoice(message, services);
48
+ if (!choice)
49
+ return false;
50
+ const err = await handleChoice(plugin, services, message, choice.sessionId, choice.choiceId);
51
+ if (typeof err === 'string')
52
+ await message.$reply?.(err);
53
+ return true;
54
+ });
55
+ }
56
+ export function registerTextMiddleware(plugin, getServices) {
57
+ registerGameTextMiddleware(plugin, async (message, next) => {
58
+ const services = getServices();
59
+ if (!services)
60
+ return next();
61
+ const action = getActionFromMessage(message);
62
+ if (action?.payload.startsWith(`${RIDDLE_PREFIX}:`))
63
+ return next();
64
+ const ch = channelKey(message);
65
+ const session = await services.getActiveForUser(ch, message.$sender.id);
66
+ if (!session)
67
+ return next();
68
+ const raw = message.$raw?.trim() ?? '';
69
+ if (!raw)
70
+ return next();
71
+ const n = /^(\d+)$/.exec(raw);
72
+ if (n && session.status === 'active') {
73
+ const map = buildChoiceFallbackMap(RIDDLE_PREFIX, session.id, [
74
+ { id: 'hint', label: '提示' },
75
+ { id: 'skip', label: '跳过' },
76
+ { id: 'quit', label: '结束' },
77
+ ]);
78
+ const payload = map[n[1]];
79
+ const parsed = payload ? parseChoicePayload(payload, RIDDLE_PREFIX) : null;
80
+ if (parsed?.sessionId === session.id) {
81
+ const err = await handleChoice(plugin, services, message, session.id, parsed.choiceId);
82
+ if (typeof err === 'string')
83
+ await message.$reply?.(err);
84
+ return;
85
+ }
86
+ }
87
+ if (/^[\u4e00-\u9fff]{1,8}$/.test(raw)) {
88
+ await processAnswerText(plugin, services, message, raw);
89
+ return;
90
+ }
91
+ return next();
92
+ }, 'word-riddle:text');
93
+ }
94
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}