koishi-plugin-cchess 2.5.0 → 2.6.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 2.6.0 · 2026-10-02
2
+
3
+ 修复未启用 help 插件时发送 `cchess` 会让指令无限调用自己、Koishi 收不到任何消息的问题。主指令现在自带帮助:直接列出各子指令并给出开局与落子的提示,不再依赖 help 插件;带 `-h` 时仍由 help 插件接手。
4
+
1
5
  # 2.5.0 · 2026-09-26
2
6
 
3
7
  主指令在 help 列表里补回描述;去掉「.显示」显示模式指令,有图只发图、出图失败才退回文字;多轮输入不再追加计时说明。
package/README.md CHANGED
@@ -1,36 +1,57 @@
1
1
  # 中国象棋
2
2
 
3
- Koishi 中国象棋插件,支持玩家对战、皮卡鱼引擎对战和 FEN 局面导入。
3
+ Koishi 插件:中国象棋,支持悔棋、棋谱分享与皮卡鱼引擎对战
4
+
5
+ [![GitHub](https://img.shields.io/badge/GitHub-araea%2Fkoishi--plugin--cchess-181717?logo=github&logoColor=white)](https://github.com/araea/koishi-plugin-cchess)
6
+ [![npm](https://img.shields.io/npm/v/koishi-plugin-cchess?logo=npm&logoColor=white&color=CB3837)](https://www.npmjs.com/package/koishi-plugin-cchess)
4
7
 
5
8
  ## 安装
6
9
 
7
10
  ```sh
8
- yarn add koishi-plugin-cchess
11
+ npm i koishi-plugin-cchess
9
12
  ```
10
13
 
11
- 在 Koishi 中启用,并安装 `database` 与 `canvas` 服务。
14
+ 启用插件,并安装 `database` 与 `canvas` 服务。
15
+
16
+ ## 快速使用
12
17
 
13
- ## 指令
18
+ 发送 `cchess.开始` 入座,双方就位后自动开局;发送 `cchess.开始 人机` 直接挑战皮卡鱼。落子也可直接发送,如 `炮二平五` 或 `b2e2`。悔棋请求送出后,对方直接回复 `同意` 或 `拒绝` 即可表决。
14
19
 
15
20
  | 指令 | 说明 |
16
21
  | --- | --- |
22
+ | `cchess` | 查看指令列表 |
17
23
  | `cchess.开始 [红/黑] [人机]` | 入座开局,或挑战皮卡鱼 |
18
24
  | `cchess.开始 <FEN>` | 导入局面;随后发送 `cchess.开始` 开局 |
19
- | `cchess.落子 <着法>` | 按棋谱落子,如 `炮二平五` |
25
+ | `cchess.落子 <着法>` | 按棋谱落子,如 `炮二平五` 或 `b2e2` |
20
26
  | `cchess.悔棋 [同意/拒绝]` | 请求悔棋或表决 |
21
27
  | `cchess.认输` | 认输 |
22
28
  | `cchess.结束` | 结束当前对局 |
23
29
  | `cchess.战绩 [@某人/榜] [胜场/输场] [人数]` | 查询战绩或排行 |
24
30
  | `cchess.查看云库残局 [DTM/DTC]` | 查询云库残局统计 |
25
31
 
26
- 发送 `cchess.开始` 入座,双方就位后自动开局。发送 `cchess.开始 人机` 可直接挑战引擎。落子也可直接发送,如 `炮二平五` 或 `b2e2`。悔棋请求后,对手可直接回复 `同意` 或 `拒绝`。
32
+ ## 配置
33
+
34
+ | 配置项 | 类型 | 默认值 | 说明 |
35
+ | --- | --- | --- | --- |
36
+ | `boardSkin` | string | `象甲2023棋盘` | 棋盘皮肤 |
37
+ | `pieceSkin` | string | `象甲棋子` | 棋子皮肤 |
38
+ | `allowFreePieceMovementInHumanMachineMode` | boolean | `false` | 人机模式下允许所有人自由移动棋子 |
39
+ | `enableDirectInput` | boolean | `true` | 对局中直接发送棋谱或「同意」「拒绝」即可应答 |
40
+ | `defaultEngineThinkingDepth` | number | `10` | 引擎思考深度,范围 0–100;越高棋力越强、耗时越长 |
41
+ | `defaultMaxLeaderboardEntries` | number | `4` | 排行榜默认显示的人数 |
42
+ | `retractDelay` | number | `0` | 自动撤回延迟(秒),0 表示不撤回 |
43
+ | `imgScale` | number | `1` | 图片分辨率倍率,最小 1 |
44
+ | `imageType` | `png` / `jpeg` / `webp` | `png` | 发送的图片格式 |
45
+ | `isChessImageWithOutlineEnabled` | boolean | `true` | 给棋盘图片加坐标外框;关闭后出图更快 |
46
+ | `disableImages` | boolean | `false` | 全部改用文本,不发送棋盘图片 |
27
47
 
28
- ## 许可证
48
+ ## 限制 / 风险
29
49
 
30
- 可按 [Apache-2.0](LICENSE-APACHE) 或 [MIT](LICENSE-MIT) 使用。
50
+ 必须安装 `database` 与 `canvas` 服务才能运行。
31
51
 
32
- ## 显示与交互
52
+ 引擎思考深度过高会显著增加响应耗时;Node.js 不支持 SIMD,不建议设置过大。
33
53
 
34
- 有渲染图时只发图片,不再附带同内容的文字;图片生成失败时才退回文字。作品素材与感官测试的适用边界见 [设计系统](./DESIGN_SYSTEM.md)。
54
+ ## 链接
35
55
 
36
- 本次更新:主指令在 help 列表里补回描述;去掉「.显示」显示模式指令,有图只发图、出图失败才退回文字;多轮输入不再追加计时说明。
56
+ - [设计系统](DESIGN_SYSTEM.md)
57
+ - [MIT](LICENSE-MIT) / [Apache-2.0](LICENSE-APACHE)
package/lib/help.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { Session } from 'koishi';
2
+ export interface HelpEntry {
3
+ name: string;
4
+ description: string;
5
+ }
6
+ /**
7
+ * 主指令帮助的内容:从已注册的指令树现取标题与直接子指令,不依赖 help 插件,也不会和指令脱节。
8
+ * `order` 列出希望靠前的子指令(完整指令名),没列到的按注册顺序排在后面;排版交给各插件。
9
+ * 不要在动作里 `session.execute('… -h')` 转发:`-h` 由 help 插件提供,缺它指令会无限调用自己。
10
+ */
11
+ export declare function helpOf(session: Session, name: string, order?: string[]): {
12
+ title: string;
13
+ entries: HelpEntry[];
14
+ };
package/lib/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Context, Schema } from 'koishi';
2
2
  export declare const name = "cchess";
3
- export declare const usage = "## \u4F7F\u7528\n\n`cchess.\u5F00\u59CB` \u5373\u53EF\u5165\u5EA7\uFF0C\u53CC\u65B9\u5C31\u4F4D\u540E\u81EA\u52A8\u5F00\u5C40\uFF1B`cchess.\u5F00\u59CB \u4EBA\u673A` \u76F4\u63A5\u6311\u6218\u76AE\u5361\u9C7C\u3002\u7740\u6CD5\u53EF\u76F4\u63A5\u53D1\u9001\uFF0C\u4F8B\u5982 `\u70AE\u4E8C\u5E73\u4E94` \u6216 `b2e2`\uFF0C\u4E5F\u53EF\u4EE5\u5199\u6210 `cchess.\u843D\u5B50 \u70AE\u4E8C\u5E73\u4E94`\u3002\n\n\u6094\u68CB\u8BF7\u6C42\u9001\u51FA\u540E\uFF0C\u5BF9\u65B9\u65E0\u9700\u5E26\u6307\u4EE4\u524D\u7F00\uFF0C\u76F4\u63A5\u56DE\u590D `\u540C\u610F` \u6216 `\u62D2\u7EDD` \u5373\u53EF\u8868\u51B3\uFF1B\u8BF7\u6C42\u65B9\u53D1\u9001 `cchess.\u6094\u68CB \u62D2\u7EDD` \u53EF\u64A4\u4E0B\u8BF7\u6C42\u3002\n\n## \u6307\u4EE4\n\n| \u6307\u4EE4 | \u8BF4\u660E |\n| --- | --- |\n| `cchess.\u5F00\u59CB [\u7EA2/\u9ED1] [\u4EBA\u673A]` | \u5165\u5EA7\u5F00\u5C40\uFF0C\u6216\u76F4\u63A5\u6311\u6218\u76AE\u5361\u9C7C |\n| `cchess.\u5F00\u59CB <FEN>` | \u6446\u8C31\uFF0C\u5BFC\u5165\u5C40\u9762\u540E\u518D `cchess.\u5F00\u59CB` \u5373\u53EF |\n| `cchess.\u843D\u5B50 <\u7740\u6CD5>` | \u6309\u68CB\u8C31\u843D\u5B50\uFF0C\u5982 `\u70AE\u4E8C\u5E73\u4E94` |\n| `cchess.\u6094\u68CB [\u540C\u610F/\u62D2\u7EDD]` | \u8BF7\u6C42\u6094\u68CB\uFF0C\u4E5F\u53EF\u76F4\u63A5\u56DE\u590D\u540C\u610F\u6216\u62D2\u7EDD\u8868\u51B3 |\n| `cchess.\u8BA4\u8F93` | \u8BA4\u8F93\u5E76\u7ED3\u675F\u5BF9\u5C40 |\n| `cchess.\u7ED3\u675F` | \u7ED3\u675F\u6B63\u5728\u8FDB\u884C\u7684\u4E00\u5C40 |\n| `cchess.\u6218\u7EE9 [@\u67D0\u4EBA/\u699C] [\u80DC\u573A/\u8F93\u573A] [\u4EBA\u6570]` | \u67E5\u8BE2\u6218\u7EE9\u6216\u6392\u884C\u699C |\n| `cchess.\u67E5\u770B\u4E91\u5E93\u6B8B\u5C40 [DTM/DTC]` | \u67E5\u8BE2\u4E91\u5E93\u6B8B\u5C40\u7EDF\u8BA1 |";
3
+ export declare const usage = "## \u4F7F\u7528\n\n\u53D1\u9001 `cchess.\u5F00\u59CB` \u5165\u5EA7\uFF0C\u53CC\u65B9\u5C31\u4F4D\u540E\u81EA\u52A8\u5F00\u5C40\uFF1B\u53D1\u9001 `cchess.\u5F00\u59CB \u4EBA\u673A` \u53EF\u76F4\u63A5\u6311\u6218\u5F15\u64CE\u3002\u843D\u5B50\u4E5F\u53EF\u76F4\u63A5\u53D1\u9001\uFF0C\u5982 `\u70AE\u4E8C\u5E73\u4E94` \u6216 `b2e2`\u3002\n\n\u6094\u68CB\u8BF7\u6C42\u9001\u51FA\u540E\uFF0C\u5BF9\u65B9\u65E0\u9700\u5E26\u6307\u4EE4\u524D\u7F00\uFF0C\u76F4\u63A5\u56DE\u590D `\u540C\u610F` \u6216 `\u62D2\u7EDD` \u5373\u53EF\u8868\u51B3\uFF1B\u8BF7\u6C42\u65B9\u53D1\u9001 `cchess.\u6094\u68CB \u62D2\u7EDD` \u53EF\u64A4\u4E0B\u8BF7\u6C42\u3002\n\n## \u6307\u4EE4\n\n| \u6307\u4EE4 | \u8BF4\u660E |\n| --- | --- |\n| `cchess` | \u67E5\u770B\u6307\u4EE4\u5217\u8868 |\n| `cchess.\u5F00\u59CB [\u7EA2/\u9ED1] [\u4EBA\u673A]` | \u5165\u5EA7\u5F00\u5C40\uFF0C\u6216\u76F4\u63A5\u6311\u6218\u76AE\u5361\u9C7C |\n| `cchess.\u5F00\u59CB <FEN>` | \u5BFC\u5165\u5C40\u9762\uFF1B\u968F\u540E\u53D1\u9001 `cchess.\u5F00\u59CB` \u5F00\u5C40 |\n| `cchess.\u843D\u5B50 <\u7740\u6CD5>` | \u6309\u68CB\u8C31\u843D\u5B50\uFF0C\u5982 `\u70AE\u4E8C\u5E73\u4E94` |\n| `cchess.\u6094\u68CB [\u540C\u610F/\u62D2\u7EDD]` | \u8BF7\u6C42\u6094\u68CB\u6216\u8868\u51B3 |\n| `cchess.\u8BA4\u8F93` | \u8BA4\u8F93 |\n| `cchess.\u7ED3\u675F` | \u7ED3\u675F\u5F53\u524D\u5BF9\u5C40 |\n| `cchess.\u6218\u7EE9 [@\u67D0\u4EBA/\u699C] [\u80DC\u573A/\u8F93\u573A] [\u4EBA\u6570]` | \u67E5\u8BE2\u6218\u7EE9\u6216\u6392\u884C |\n| `cchess.\u67E5\u770B\u4E91\u5E93\u6B8B\u5C40 [DTM/DTC]` | \u67E5\u8BE2\u4E91\u5E93\u6B8B\u5C40\u7EDF\u8BA1 |";
4
4
  export declare const inject: string[];
5
5
  export interface Config {
6
6
  boardSkin: string;
package/lib/index.js CHANGED
@@ -69,6 +69,24 @@ async function directInputConflict(ctx, session) {
69
69
  }
70
70
  __name(directInputConflict, "directInputConflict");
71
71
 
72
+ // src/help.ts
73
+ function helpOf(session, name2, order = []) {
74
+ const describe = /* @__PURE__ */ __name((command) => session.text([`commands.${command}.description`, ""]), "describe");
75
+ const rank = /* @__PURE__ */ __name((command) => {
76
+ const i = order.indexOf(command);
77
+ return i < 0 ? order.length : i;
78
+ }, "rank");
79
+ const entries = [];
80
+ for (const child of session.app.$commander.get(name2)?.children ?? []) {
81
+ const { hidden } = child.config;
82
+ if (!child.match(session) || session.resolve(hidden)) continue;
83
+ entries.push({ name: child.name, description: describe(child.name) });
84
+ }
85
+ entries.sort((a, b) => rank(a.name) - rank(b.name));
86
+ return { title: describe(name2), entries };
87
+ }
88
+ __name(helpOf, "helpOf");
89
+
72
90
  // src/index.ts
73
91
  var import_koishi2 = require("koishi");
74
92
 
@@ -5171,7 +5189,7 @@ var fs = __toESM(require("fs"));
5171
5189
  var name = "cchess";
5172
5190
  var usage = `## 使用
5173
5191
 
5174
- \`cchess.开始\` 即可入座,双方就位后自动开局;\`cchess.开始 人机\` 直接挑战皮卡鱼。着法可直接发送,例如 \`炮二平五\` 或 \`b2e2\`,也可以写成 \`cchess.落子 炮二平五\`。
5192
+ 发送 \`cchess.开始\` 入座,双方就位后自动开局;发送 \`cchess.开始 人机\` 可直接挑战引擎。落子也可直接发送,如 \`炮二平五\` 或 \`b2e2\`。
5175
5193
 
5176
5194
  悔棋请求送出后,对方无需带指令前缀,直接回复 \`同意\` 或 \`拒绝\` 即可表决;请求方发送 \`cchess.悔棋 拒绝\` 可撤下请求。
5177
5195
 
@@ -5179,13 +5197,14 @@ var usage = `## 使用
5179
5197
 
5180
5198
  | 指令 | 说明 |
5181
5199
  | --- | --- |
5200
+ | \`cchess\` | 查看指令列表 |
5182
5201
  | \`cchess.开始 [红/黑] [人机]\` | 入座开局,或直接挑战皮卡鱼 |
5183
- | \`cchess.开始 <FEN>\` | 摆谱,导入局面后再 \`cchess.开始\` 即可 |
5202
+ | \`cchess.开始 <FEN>\` | 导入局面;随后发送 \`cchess.开始\` 开局 |
5184
5203
  | \`cchess.落子 <着法>\` | 按棋谱落子,如 \`炮二平五\` |
5185
- | \`cchess.悔棋 [同意/拒绝]\` | 请求悔棋,也可直接回复同意或拒绝表决 |
5186
- | \`cchess.认输\` | 认输并结束对局 |
5187
- | \`cchess.结束\` | 结束正在进行的一局 |
5188
- | \`cchess.战绩 [@某人/榜] [胜场/输场] [人数]\` | 查询战绩或排行榜 |
5204
+ | \`cchess.悔棋 [同意/拒绝]\` | 请求悔棋或表决 |
5205
+ | \`cchess.认输\` | 认输 |
5206
+ | \`cchess.结束\` | 结束当前对局 |
5207
+ | \`cchess.战绩 [@某人/榜] [胜场/输场] [人数]\` | 查询战绩或排行 |
5189
5208
  | \`cchess.查看云库残局 [DTM/DTC]\` | 查询云库残局统计 |`;
5190
5209
  var inject = ["database", "canvas"];
5191
5210
  var pieceSkins = ["棋弈无限图形棋子", "云库木制棋子", "刘炳森红黑牛角隶书棋子", "木制棋子", "本纹隶书棋子", "银灰将军体棋子", "棋弈无限红绿正棋子", "棋弈无限红绿棋子", "棋天大圣棋子", "棋者象棋棋子", "楷书玉石棋子", "水墨青瓷棋子", "牛皮纸华康金文棋子", "皮卡鱼棋子", "红蓝祥隶棋子", "红黑精典无阴影棋子", "红黑精典棋子", "行书玉石棋子", "象甲棋子", "金属棋子篆体棋子", "镌刻华彩棋子", "鹏飞红黑棋子", "鹏飞经典棋子", "鹏飞绿龙棋子", "龙腾四海棋子"];
@@ -5405,7 +5424,13 @@ function apply(ctx, config) {
5405
5424
  await handleMove(session, moveOperation);
5406
5425
  });
5407
5426
  ctx.command("cchess", "中国象棋 · 楚河汉界").action(async ({ session }) => {
5408
- await session.execute(`cchess -h`);
5427
+ const { title, entries } = helpOf(session, "cchess", ["开始", "落子", "悔棋", "认输", "结束", "战绩", "查看云库残局"].map((name2) => `cchess.${name2}`));
5428
+ return await sendMessage(session, panel({
5429
+ icon: "📋",
5430
+ title,
5431
+ body: entries.map(({ name: name2, description }) => field(name2, description)),
5432
+ tips: ["发送「cchess.开始」入座,「cchess.落子 炮二平五」落子"]
5433
+ }));
5409
5434
  });
5410
5435
  ctx.command("cchess.开始 [args:text]", "入座开局,或挑战皮卡鱼").usage("可选阵营「红」「黑」;参数含「人机」即与皮卡鱼对战,不带则入座等待对手;直接粘贴 FEN 串则按摆谱处理。").example("cchess.开始 红 人机").action(async ({ session }, args) => {
5411
5436
  const { username, channelId } = session;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-cchess",
3
- "description": "Koishi 中国象棋:支持玩家对战、皮卡鱼引擎和 FEN 局面导入。",
4
- "version": "2.5.0",
3
+ "description": "Koishi 插件:中国象棋,支持悔棋、棋谱分享与皮卡鱼引擎对战。",
4
+ "version": "2.6.0",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [