koishi-plugin-cchess 2.4.1 → 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 +8 -0
- package/DESIGN_SYSTEM.md +8 -8
- package/README.md +32 -11
- package/lib/help.d.ts +14 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +35 -66
- package/lib/ux.d.ts +4 -22
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
# 2.6.0 · 2026-10-02
|
|
2
|
+
|
|
3
|
+
修复未启用 help 插件时发送 `cchess` 会让指令无限调用自己、Koishi 收不到任何消息的问题。主指令现在自带帮助:直接列出各子指令并给出开局与落子的提示,不再依赖 help 插件;带 `-h` 时仍由 help 插件接手。
|
|
4
|
+
|
|
5
|
+
# 2.5.0 · 2026-09-26
|
|
6
|
+
|
|
7
|
+
主指令在 help 列表里补回描述;去掉「.显示」显示模式指令,有图只发图、出图失败才退回文字;多轮输入不再追加计时说明。
|
|
8
|
+
|
|
1
9
|
# 2.4.0 · 2026-09-26
|
|
2
10
|
|
|
3
11
|
每次棋盘输出附带完整棋子坐标与轮次;个人文字模式;裸输入冲突保护。
|
package/DESIGN_SYSTEM.md
CHANGED
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
|
|
14
14
|
## 输出、交互与内容
|
|
15
15
|
|
|
16
|
-
1.
|
|
17
|
-
2.
|
|
16
|
+
1. 有渲染图时只发图片,不附同内容的文字,避免在群里重复刷屏;图片生成失败时才退回文字。插件不提供个人显示模式开关。
|
|
17
|
+
2. 每个插件的主指令都带描述,`help` 列表右侧不留空;主指令先于任何子指令注册(Koishi 会忽略已存在指令的描述)。文本回复不能把后续条目无提示地压掉;较长管理列表分页。
|
|
18
18
|
3. 裸输入必须符合词法、对局状态及参与条件。多个插件匹配时不执行,要求明确完整指令;完整指令继续可用。
|
|
19
19
|
4. 回复说明当前结果、未完成原因和可执行的下一步,不用管理员日志替代用户可用的反馈。退款、赔付与渲染失败不能伪装成功。
|
|
20
20
|
5. 破坏性清空需展示范围、不可撤销性和限时确认码。确认码限制到同一机器人、平台、用户与频道,使用后立即失效。
|
|
21
|
-
6.
|
|
21
|
+
6. 多轮输入等待 5 分钟,提问里写明可回复的内容与「取消」,不再追加计时说明。对局内的短窗口(如 21 点保险、投降)提供显式跳过,全员表态后立即进入下一阶段,而不是提供「延长」。
|
|
22
22
|
7. 货币发放先写入核对记录,入账结果不明确时保留待核对状态,不自动重发。管理员核对实际流水并按需人工补发后标记确认;确认操作自身不转账。
|
|
23
23
|
|
|
24
24
|
## 内容边界
|
|
@@ -44,7 +44,7 @@ node markdown-to-image-service/scripts/sync-design-system.mjs --check
|
|
|
44
44
|
|
|
45
45
|
官方色彩算法可在源仓库安装开发依赖后通过 `node scripts/build-material-colors.mjs` 重建,再同步消费者。
|
|
46
46
|
|
|
47
|
-
回归检查覆盖:24 个源色相的明暗角色对比度、奖牌前景、图表填充/轨道差异、浏览器/服务端 HCT
|
|
47
|
+
回归检查覆盖:24 个源色相的明暗角色对比度、奖牌前景、图表填充/轨道差异、浏览器/服务端 HCT 一致性、主指令描述、输入冲突、入账异常、清空确认和 Wordle 并发/渲染失败。工作区截图脚本为 `scripts/verify-rendering.ts`,需 Puppeteer Core 和可用 Chromium。
|
|
48
48
|
|
|
49
49
|
## 本轮改动对应关系
|
|
50
50
|
|
|
@@ -53,9 +53,9 @@ node markdown-to-image-service/scripts/sync-design-system.mjs --check
|
|
|
53
53
|
| 共享设计规范 | 官方 HCT、2025 动态颜色角色、共享字阶与间距、同步与哈希校验 |
|
|
54
54
|
| Markdown | M3 明暗主题;旧主题名按明暗迁移;代码高亮与 Mermaid 使用 M3 角色;长代码可换行 |
|
|
55
55
|
| message-counter / monetary-rank | M3 角色与共享图表字阶、HCT 头像配色、完整文字榜单;保留昵称截断 |
|
|
56
|
-
| Wordle | 替换复制的 NYT
|
|
57
|
-
| MCDLE |
|
|
56
|
+
| Wordle | 替换复制的 NYT 外观;状态符号与图例;明暗角色;异常释放并发锁;安全解析模式编号;裸词只在确定是猜测时回应 |
|
|
57
|
+
| MCDLE | 猜测按行排成一张表,方便逐项对照;单句页脚居中 |
|
|
58
58
|
| 2048 / ciyi | 数字与奖牌前景按实际对比度选色 |
|
|
59
|
-
| 斗牛 / 21 点 |
|
|
59
|
+
| 斗牛 / 21 点 | 付款核对记录、如实反馈退款失败、明确下注金额、可显式跳过的短窗口 |
|
|
60
60
|
| sentinel | 完整封印列表按每页 10 位展示 |
|
|
61
|
-
| 其余插件 |
|
|
61
|
+
| 其余插件 | 渲染失败退回文字、可取消输入与上下文反馈 |
|
package/README.md
CHANGED
|
@@ -1,36 +1,57 @@
|
|
|
1
1
|
# 中国象棋
|
|
2
2
|
|
|
3
|
-
Koishi
|
|
3
|
+
Koishi 插件:中国象棋,支持悔棋、棋谱分享与皮卡鱼引擎对战
|
|
4
|
+
|
|
5
|
+
[](https://github.com/araea/koishi-plugin-cchess)
|
|
6
|
+
[](https://www.npmjs.com/package/koishi-plugin-cchess)
|
|
4
7
|
|
|
5
8
|
## 安装
|
|
6
9
|
|
|
7
10
|
```sh
|
|
8
|
-
|
|
11
|
+
npm i koishi-plugin-cchess
|
|
9
12
|
```
|
|
10
13
|
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
+
必须安装 `database` 与 `canvas` 服务才能运行。
|
|
31
51
|
|
|
32
|
-
|
|
52
|
+
引擎思考深度过高会显著增加响应耗时;Node.js 不支持 SIMD,不建议设置过大。
|
|
33
53
|
|
|
34
|
-
|
|
54
|
+
## 链接
|
|
35
55
|
|
|
36
|
-
|
|
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` \
|
|
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
|
@@ -43,28 +43,9 @@ var import_koishi = require("koishi");
|
|
|
43
43
|
var KEY = Symbol.for("araea.koishi.ux.v1");
|
|
44
44
|
function state(ctx) {
|
|
45
45
|
const root = ctx.root;
|
|
46
|
-
return root[KEY] ??= {
|
|
46
|
+
return root[KEY] ??= { owners: /* @__PURE__ */ new Set() };
|
|
47
47
|
}
|
|
48
48
|
__name(state, "state");
|
|
49
|
-
var userKey = /* @__PURE__ */ __name((session) => `${session.platform}:${session.selfId}:${session.userId}`, "userKey");
|
|
50
|
-
function usePresentation(ctx, command) {
|
|
51
|
-
const shared = state(ctx);
|
|
52
|
-
ctx.command(`${command}.显示 [mode:string]`, "选择图文或文字输出").action(({ session }, mode) => {
|
|
53
|
-
if (!mode) return `当前:${shared.modes.get(userKey(session)) ? "文字" : "图文"}。发送「${command}.显示 文字」或「${command}.显示 图文」。设置对本机器人各插件生效,重启后恢复图文。`;
|
|
54
|
-
if (!["文字", "图文"].includes(mode)) return "请选择「文字」或「图文」。";
|
|
55
|
-
shared.modes.set(userKey(session), mode === "文字");
|
|
56
|
-
return `已切换为${mode}输出。`;
|
|
57
|
-
});
|
|
58
|
-
return {
|
|
59
|
-
textOnly: /* @__PURE__ */ __name((session) => shared.modes.get(userKey(session)) === true, "textOnly"),
|
|
60
|
-
/** 图文模式只给图片;图片缺失或用户选了文字模式时才退回文字。 */
|
|
61
|
-
present(session, image, text) {
|
|
62
|
-
if (!image || shared.modes.get(userKey(session))) return text;
|
|
63
|
-
return import_koishi.h.normalize(image);
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
__name(usePresentation, "usePresentation");
|
|
68
49
|
function registerDirectInput(ctx, name2, matches) {
|
|
69
50
|
const owner = { name: name2, matches };
|
|
70
51
|
state(ctx).owners.add(owner);
|
|
@@ -87,42 +68,24 @@ async function directInputConflict(ctx, session) {
|
|
|
87
68
|
return true;
|
|
88
69
|
}
|
|
89
70
|
__name(directInputConflict, "directInputConflict");
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
__name(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
if (isImage(element) || !element.children.length) return [element];
|
|
107
|
-
return [(0, import_koishi.h)(element.type, element.attrs, walk(element.children))];
|
|
108
|
-
}), "walk");
|
|
109
|
-
return walk(import_koishi.h.normalize(content));
|
|
110
|
-
}
|
|
111
|
-
__name(imagesOnly, "imagesOnly");
|
|
112
|
-
function withoutImages(content) {
|
|
113
|
-
const walk = /* @__PURE__ */ __name((elements) => elements.flatMap((element) => {
|
|
114
|
-
if (isImage(element)) return [];
|
|
115
|
-
if (isImageText(element)) return walk(element.children);
|
|
116
|
-
if (element.children.length) return [(0, import_koishi.h)(element.type, element.attrs, walk(element.children))];
|
|
117
|
-
return [element];
|
|
118
|
-
}), "walk");
|
|
119
|
-
return walk(import_koishi.h.normalize(content));
|
|
120
|
-
}
|
|
121
|
-
__name(withoutImages, "withoutImages");
|
|
122
|
-
function choosePresentation(content, textOnly) {
|
|
123
|
-
return textOnly ? withoutImages(content) : imagesOnly(content);
|
|
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 };
|
|
124
87
|
}
|
|
125
|
-
__name(
|
|
88
|
+
__name(helpOf, "helpOf");
|
|
126
89
|
|
|
127
90
|
// src/index.ts
|
|
128
91
|
var import_koishi2 = require("koishi");
|
|
@@ -5226,7 +5189,7 @@ var fs = __toESM(require("fs"));
|
|
|
5226
5189
|
var name = "cchess";
|
|
5227
5190
|
var usage = `## 使用
|
|
5228
5191
|
|
|
5229
|
-
\`cchess.开始\`
|
|
5192
|
+
发送 \`cchess.开始\` 入座,双方就位后自动开局;发送 \`cchess.开始 人机\` 可直接挑战引擎。落子也可直接发送,如 \`炮二平五\` 或 \`b2e2\`。
|
|
5230
5193
|
|
|
5231
5194
|
悔棋请求送出后,对方无需带指令前缀,直接回复 \`同意\` 或 \`拒绝\` 即可表决;请求方发送 \`cchess.悔棋 拒绝\` 可撤下请求。
|
|
5232
5195
|
|
|
@@ -5234,13 +5197,14 @@ var usage = `## 使用
|
|
|
5234
5197
|
|
|
5235
5198
|
| 指令 | 说明 |
|
|
5236
5199
|
| --- | --- |
|
|
5200
|
+
| \`cchess\` | 查看指令列表 |
|
|
5237
5201
|
| \`cchess.开始 [红/黑] [人机]\` | 入座开局,或直接挑战皮卡鱼 |
|
|
5238
|
-
| \`cchess.开始 <FEN>\` |
|
|
5202
|
+
| \`cchess.开始 <FEN>\` | 导入局面;随后发送 \`cchess.开始\` 开局 |
|
|
5239
5203
|
| \`cchess.落子 <着法>\` | 按棋谱落子,如 \`炮二平五\` |
|
|
5240
|
-
| \`cchess.悔棋 [同意/拒绝]\` |
|
|
5241
|
-
| \`cchess.认输\` |
|
|
5242
|
-
| \`cchess.结束\` |
|
|
5243
|
-
| \`cchess.战绩 [@某人/榜] [胜场/输场] [人数]\` |
|
|
5204
|
+
| \`cchess.悔棋 [同意/拒绝]\` | 请求悔棋或表决 |
|
|
5205
|
+
| \`cchess.认输\` | 认输 |
|
|
5206
|
+
| \`cchess.结束\` | 结束当前对局 |
|
|
5207
|
+
| \`cchess.战绩 [@某人/榜] [胜场/输场] [人数]\` | 查询战绩或排行 |
|
|
5244
5208
|
| \`cchess.查看云库残局 [DTM/DTC]\` | 查询云库残局统计 |`;
|
|
5245
5209
|
var inject = ["database", "canvas"];
|
|
5246
5210
|
var pieceSkins = ["棋弈无限图形棋子", "云库木制棋子", "刘炳森红黑牛角隶书棋子", "木制棋子", "本纹隶书棋子", "银灰将军体棋子", "棋弈无限红绿正棋子", "棋弈无限红绿棋子", "棋天大圣棋子", "棋者象棋棋子", "楷书玉石棋子", "水墨青瓷棋子", "牛皮纸华康金文棋子", "皮卡鱼棋子", "红蓝祥隶棋子", "红黑精典无阴影棋子", "红黑精典棋子", "行书玉石棋子", "象甲棋子", "金属棋子篆体棋子", "镌刻华彩棋子", "鹏飞红黑棋子", "鹏飞经典棋子", "鹏飞绿龙棋子", "龙腾四海棋子"];
|
|
@@ -5284,7 +5248,6 @@ function panel(options) {
|
|
|
5284
5248
|
}
|
|
5285
5249
|
__name(panel, "panel");
|
|
5286
5250
|
function apply(ctx, config) {
|
|
5287
|
-
const presentation = usePresentation(ctx, "cchess");
|
|
5288
5251
|
const logger = ctx.logger("cchess");
|
|
5289
5252
|
const engines = {};
|
|
5290
5253
|
const enginePromises = {};
|
|
@@ -5461,7 +5424,13 @@ function apply(ctx, config) {
|
|
|
5461
5424
|
await handleMove(session, moveOperation);
|
|
5462
5425
|
});
|
|
5463
5426
|
ctx.command("cchess", "中国象棋 · 楚河汉界").action(async ({ session }) => {
|
|
5464
|
-
|
|
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
|
+
}));
|
|
5465
5434
|
});
|
|
5466
5435
|
ctx.command("cchess.开始 [args:text]", "入座开局,或挑战皮卡鱼").usage("可选阵营「红」「黑」;参数含「人机」即与皮卡鱼对战,不带则入座等待对手;直接粘贴 FEN 串则按摆谱处理。").example("cchess.开始 红 人机").action(async ({ session }, args) => {
|
|
5467
5436
|
const { username, channelId } = session;
|
|
@@ -6004,7 +5973,7 @@ function apply(ctx, config) {
|
|
|
6004
5973
|
${pieces.join(";")}`;
|
|
6005
5974
|
if (config.disableImages) return text;
|
|
6006
5975
|
try {
|
|
6007
|
-
return import_koishi2.h.image(await drawChessBoard(channelId), imageMimeType).toString()
|
|
5976
|
+
return import_koishi2.h.image(await drawChessBoard(channelId), imageMimeType).toString();
|
|
6008
5977
|
} catch (error) {
|
|
6009
5978
|
logger.warn("棋盘图片生成失败:%s", error.message);
|
|
6010
5979
|
return text;
|
|
@@ -7292,8 +7261,8 @@ ${pieces.join(";")}`;
|
|
|
7292
7261
|
const sentMessages = {};
|
|
7293
7262
|
async function sendMessage(session, message) {
|
|
7294
7263
|
const { bot, channelId } = session;
|
|
7295
|
-
const [messageId] = await session.send(
|
|
7296
|
-
if (
|
|
7264
|
+
const [messageId] = await session.send(message);
|
|
7265
|
+
if (config.retractDelay === 0 || !messageId) return;
|
|
7297
7266
|
const previousMessageId = sentMessages[channelId];
|
|
7298
7267
|
sentMessages[channelId] = messageId;
|
|
7299
7268
|
if (!previousMessageId) return;
|
package/lib/ux.d.ts
CHANGED
|
@@ -3,29 +3,11 @@ type Owner = {
|
|
|
3
3
|
name: string;
|
|
4
4
|
matches: (session: Session) => boolean | Promise<boolean>;
|
|
5
5
|
};
|
|
6
|
-
/**
|
|
7
|
-
export declare function
|
|
8
|
-
textOnly: (session: Session) => boolean;
|
|
9
|
-
/** 图文模式只给图片;图片缺失或用户选了文字模式时才退回文字。 */
|
|
10
|
-
present(session: Session, image: h.Fragment | null | undefined, text: h.Fragment): h.Fragment;
|
|
11
|
-
};
|
|
6
|
+
/** 渲染图优先,只发图片;图片缺失时才退回等价文字。 */
|
|
7
|
+
export declare function present(image: h.Fragment | null | undefined, text: h.Fragment): h.Fragment;
|
|
12
8
|
/** Plugins register their active input grammar; overlapping messages are never executed. */
|
|
13
9
|
export declare function registerDirectInput(ctx: Context, name: string, matches: Owner['matches']): void;
|
|
14
10
|
export declare function directInputConflict(ctx: Context, session: Session): Promise<boolean>;
|
|
15
|
-
/**
|
|
16
|
-
export declare function promptInput(session: Session
|
|
17
|
-
export declare const IMAGE_FAILURE = "\u56FE\u7247\u6682\u65F6\u65E0\u6CD5\u751F\u6210\uFF0C\u5DF2\u4FDD\u7559\u6587\u5B57\u5185\u5BB9\u3002\u53EF\u4EE5\u7A0D\u540E\u91CD\u8BD5\uFF1B\u82E5\u6301\u7EED\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002";
|
|
18
|
-
/**
|
|
19
|
-
* 渲染图的等价文字。图文模式随图片一起丢掉、文字模式展开成正文,
|
|
20
|
-
* 因此它永远不会原样发到聊天平台。
|
|
21
|
-
*/
|
|
22
|
-
export declare const IMAGE_TEXT_TYPE = "ux-image-text";
|
|
23
|
-
export declare function imageText(text: h.Fragment): h;
|
|
24
|
-
/** 图文模式:保留图片与普通文字,去掉图片的等价文字。 */
|
|
25
|
-
export declare function imagesOnly(content: h.Fragment): h[];
|
|
26
|
-
/** 文字模式:去掉图片,把等价文字展开成普通文本。 */
|
|
27
|
-
export declare function withoutImages(content: h.Fragment): h[];
|
|
28
|
-
/** 发送前的统一选择:文字模式去掉图片,图文模式去掉等价文字。 */
|
|
29
|
-
export declare function choosePresentation(content: h.Fragment, textOnly: boolean): h[];
|
|
30
|
-
export declare function isTextOnly(ctx: Context, session: Session): boolean;
|
|
11
|
+
/** 等待下一句回复。提问本身已经写明了可回复的内容与「取消」,这里不再追加说明。 */
|
|
12
|
+
export declare function promptInput(session: Session): Promise<string | undefined>;
|
|
31
13
|
export {};
|
package/package.json
CHANGED