@zaofan/dsh-qqbot 1.11.3 → 1.11.5
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/docs/USER-GUIDE.md +71 -3
- package/docs/extension-contract.md +13 -0
- package/package.json +1 -1
package/docs/USER-GUIDE.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> [@zaofan/dsh-qqbot](../README.md) 的**详细文档**:配置项、内置命令、自定义扩展、群管理(含 🔨 锤子:禁言 / 踢人)、本地小模型、好感度系统、数据文件与日志、升级排障、架构与本地开发。
|
|
4
4
|
> 只想看"它能干什么 + 怎么装" → 回 **[README](../README.md)**。
|
|
5
5
|
|
|
6
|
-
**章节**:给AI的话 · 架构 · QQ 远程审批 · QQ 群管理(含 🔨 锤子:禁言 / 踢人)· 智能回复(本地小模型)· **好感度与熟识度** · 配置项 · 数据文件与日志 · 内置命令 ·
|
|
6
|
+
**章节**:给AI的话 · 架构 · QQ 远程审批 · QQ 群管理(含 🔨 锤子:禁言 / 踢人)· 智能回复(本地小模型)· **好感度与熟识度** · 配置项 · 数据文件与日志 · 内置命令 · 用户扩展(含自定义界面卡片)· 富媒体指令 · 核心模块 · 会话路由 · 升级与兼容 · 常见问题 · 设计原则 · 本地开发
|
|
7
7
|
|
|
8
8
|
> 📌 **版本**:本文对应插件 **v1.6.x**(含 1.6.2 → 1.6.5 的新功能与排障)。新增内容都标了版本与补充日期,便于你对照自己装的版本。
|
|
9
9
|
|
|
@@ -27,6 +27,10 @@
|
|
|
27
27
|
- **你可以自己写 markdown、自己写工具、自己写斜杠命令**(不用等人给你做功能):
|
|
28
28
|
- 卡片正文就是**你直接写的 markdown**(`#` 标题、加粗、``、代码块)——**本插件没有模板引擎,模板就是你**;要"带按钮的卡片"则走 botplay 事件或 dock 卡片编辑器(按钮回调须由 host 注册)。
|
|
29
29
|
- 工具/命令写在**账号数据目录**的 `.qqbot-extensions/{tools,commands}/`,**不在插件包内** → **升级/重装插件(换 node_modules)不会覆盖你的扩展**,扩展原样保留。
|
|
30
|
+
- **你还能给她做一个界面**(v1.11.0+):往 `.qqbot-extensions/ui/<目录>/` 放 `card.html`(+ 可选 `card.css`/`card.js`),
|
|
31
|
+
悬浮球里就多一个页签;放 `{PROFILE_ROOT}/.qqbot-extensions/ui/` 则是设置页的全局页签。
|
|
32
|
+
卡片跑在 Shadow DOM 里,拿到 `qqbotExt`(读写配置/静默注入/读写文本文件/调宿主服务/自己注册的路由)和 `shadowRoot`。
|
|
33
|
+
用户说"给我做个面板/工具界面"时,照契约现场写即可 —— 路径和规则详见下面「自定义界面卡片」一节。
|
|
30
34
|
- 工具 `run(args, env)` 的 `env` 里有 `sender` + `replyTarget`(内置 `send_media` 用的同一个发送器),**工具能自己发 markdown 卡/图/语音/文件**:所以「调接口取数据 → 拼卡片 → 发出去」一个工具就能闭环,不必绕回你。用户说"给我写个点歌工具"时,照契约现场写即可。
|
|
31
35
|
- 生效方式:工具发 `/tools-reload`(或调 `tools_reload`)即时生效;命令需重启宿主;**同名工具改内容会被注册表跳过 → 换名或重启**。
|
|
32
36
|
|
|
@@ -475,7 +479,7 @@ contextMemoMaxItems: 20 # 备忘条数上限(超出丢最旧,1~500)
|
|
|
475
479
|
|---|---|---|
|
|
476
480
|
| `qun-cookie.json` | **QQ 群管理「踢人」的登录凭据**(v1.6.2+,2026-10-04 补充)—— 面板和 AI **共用这一份** | ❌ 删了就得重新扫码登录(功能不会坏,只是要重登) |
|
|
477
481
|
| `表情包/` | 图库本体(图片文件 + `index.json`) | ❌ 删了图库就空了 |
|
|
478
|
-
| `.qqbot-extensions/` | 你自己写的扩展(自定义命令 /
|
|
482
|
+
| `.qqbot-extensions/` | 你自己写的扩展(自定义命令 / 工具 / 界面卡片) | ❌ 你的扩展就在这儿(升级插件不会动它) |
|
|
479
483
|
|
|
480
484
|
### 诊断日志(在 `~/.dsh/` 下,**可以放心删**)(v1.6.5,2026-10-04 补充)
|
|
481
485
|
|
|
@@ -539,8 +543,12 @@ contextMemoMaxItems: 20 # 备忘条数上限(超出丢最旧,1~500)
|
|
|
539
543
|
└── .qqbot-extensions/
|
|
540
544
|
├── commands/ # 自定义斜杠命令(重启后生效)
|
|
541
545
|
├── tools/ # 自定义 QQ 通道工具(AI 可调; 写完用 /tools-reload 或让 AI 调 tools_reload 热刷)
|
|
542
|
-
|
|
546
|
+
├── hooks/ # 启动钩子(插件启动时自动跑一次; 没人调用也跑; v1.8.9+)
|
|
547
|
+
└── ui/ # 自定义界面卡片(悬浮球页签; v1.11.0+)
|
|
543
548
|
```
|
|
549
|
+
|
|
550
|
+
**设置页那张卡不在这里** —— `slot=settings` 的卡片放 `{PROFILE_ROOT}/.qqbot-extensions/ui/`,
|
|
551
|
+
全局一份、所有机器人共用(详见下面「自定义界面卡片」)。
|
|
544
552
|
数据目录 = `dataRoot`(已配置, 例 `D:\my-projects\qqbot-data`)或账号 cwd(未配置时, 向后兼容)。
|
|
545
553
|
|
|
546
554
|
### 自定义斜杠命令: .qqbot-extensions/commands/xxx.mjs
|
|
@@ -822,6 +830,66 @@ if (finallyDone) {
|
|
|
822
830
|
8. 不确定的官方字段/事件/错误码去查 <https://bot.q.qq.com/wiki/develop/api-v2/>(按钮回调事件是 `interaction_create`)。
|
|
823
831
|
|
|
824
832
|
|
|
833
|
+
### 自定义界面卡片: 给面板/悬浮球加自己的窗口 (v1.11.0+)
|
|
834
|
+
|
|
835
|
+
> ⚠️ **别和「扩展设置页」搞混** —— 那是两套不同的东西:
|
|
836
|
+
> - **扩展设置页**(`qqbotSettingsPage`):扩展在 `.mjs` 里声明 `schema`,面板自动渲染出
|
|
837
|
+
> 开关/输入框表单,入口是扩展卡片上的 **⚙ 设置** 按钮。适合"填几个配置项"。
|
|
838
|
+
> - **界面卡片**(本节):独立的 `ui/<id>/card.html`,你写任意 HTML,入口是
|
|
839
|
+
> **设置页顶栏 / 悬浮球面板的页签**。适合"画一个真正的界面"。
|
|
840
|
+
>
|
|
841
|
+
> 两者可以并存:一个扩展既能用 schema 让用户填 API Key,也能给一张卡片展示运行状态。
|
|
842
|
+
|
|
843
|
+
不想只加命令和工具、还想**加个界面**?放三个文件进去,设置页顶栏或悬浮球里就多一个页签。
|
|
844
|
+
|
|
845
|
+
```
|
|
846
|
+
{PROFILE_ROOT}/.qqbot-extensions/ui/<目录>/ ← slot: settings(设置页,全局一份)
|
|
847
|
+
{dataRoot}/.qqbot-extensions/ui/<目录>/ ← slot: dock(悬浮球,每个机器人一份)
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
每个目录里放(都可不写,写什么加载什么):
|
|
851
|
+
|
|
852
|
+
```
|
|
853
|
+
card.html 必需(没有它这个扩展就不出现)
|
|
854
|
+
card.css 可选
|
|
855
|
+
card.js 可选
|
|
856
|
+
```
|
|
857
|
+
|
|
858
|
+
`card.html` 顶部注释声明元信息:
|
|
859
|
+
|
|
860
|
+
```html
|
|
861
|
+
<!-- qqbot-ui: { "id": "myui", "slot": "dock", "title": "我的面板", "order": 50 } -->
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
- `id` 可选,覆盖目录名。同一个扩展的两张卡(settings + dock)给相同的 id,就共用一份配置。
|
|
865
|
+
- `slot` 必填:`settings` 或 `dock`。
|
|
866
|
+
- `title` 页签文字;`order` 排序(小的在前)。
|
|
867
|
+
|
|
868
|
+
**卡片里能用的**(`card.js` 里有两个变量:`qqbotExt` 和 `shadowRoot`):
|
|
869
|
+
|
|
870
|
+
```js
|
|
871
|
+
qqbotExt.getConfig() / setConfig({...}) // 两级配置(profile 全局 / data 本实例)
|
|
872
|
+
qqbotExt.acct // 当前选中的账号
|
|
873
|
+
qqbotExt.store.load() / save(v) // 数据根下的 KV
|
|
874
|
+
qqbotExt.kernel.get('服务名') // 宿主服务
|
|
875
|
+
qqbotExt.cap('fs.read' | 'fs.write', 路径, 内容) // 读写本机文本文件(≤2MB)
|
|
876
|
+
qqbotExt.cap('appendSilent', 文本) // 往当前会话静默注入一条消息(不唤醒 AI)
|
|
877
|
+
qqbotExt.api('/你的路由') // 你在 hooks 里 registerRoute 的接口
|
|
878
|
+
qqbotExt.theme / isDark() / onThemeChange() // 主题
|
|
879
|
+
qqbotExt.dock.sid / peerId / context() / history(n) / lastAssistantText() // 仅 dock 卡
|
|
880
|
+
```
|
|
881
|
+
|
|
882
|
+
**颜色跟随宿主主题**:用 `--qqs-*` 变量(`var(--qqs-text, #1f2329)`),亮/暗自动切换。
|
|
883
|
+
|
|
884
|
+
**卡片跑在 Shadow DOM 里** —— 你的样式不会污染面板,崩了也只白自己那张卡;
|
|
885
|
+
代价是面板的 CSS/组件/DOM 也进不来,得自己写原生元素。
|
|
886
|
+
|
|
887
|
+
**示例**:插件自带 `examples/ext-ui/demo/`(settings + dock 两套),
|
|
888
|
+
插件启动时会**自动铺**到对应位置(只补不改,不会覆盖你改过的)。
|
|
889
|
+
|
|
890
|
+
> 完整 API、硬边界、扩展包怎么带界面:见
|
|
891
|
+
> [`docs/extension-contract.md`](extension-contract.md) §1 末尾「第六套:`ui/`」。
|
|
892
|
+
|
|
825
893
|
## 富媒体指令(AI 回复里写标记,自动变成真消息)
|
|
826
894
|
|
|
827
895
|
让 AI(或你替她)在回复正文里写以下标记,插件会自动拆出来发成真实的 QQ 消息,**标记本身不会显示**:
|
|
@@ -46,6 +46,19 @@
|
|
|
46
46
|
|
|
47
47
|
### 第六套:`ui/` —— 自定义界面卡片(2026-10-26 新增)
|
|
48
48
|
|
|
49
|
+
> ⚠️ **先分清两件事,别混**:
|
|
50
|
+
>
|
|
51
|
+
> | | `qqbotSettingsPage`(老,§2 末尾那个 schema) | `ui/` 卡片(本节的) |
|
|
52
|
+
> |---|---|---|
|
|
53
|
+
> | 写在哪 | 扩展 `.mjs` 里 `export const qqbotSettingsPage = { schema }` | 独立目录 `ui/<id>/card.html` |
|
|
54
|
+
> | 长什么样 | 面板按 schema **自动渲染表单**(开关/输入框/下拉) | 你写的**任意 HTML** |
|
|
55
|
+
> | 入口在哪 | 扩展卡片上的 **⚙ 设置** 按钮 → 弹窗 | **设置页顶栏** 或 **悬浮球面板**的页签 |
|
|
56
|
+
> | 数据怎么存 | 面板帮你存成 JSON,扩展里 `ctx.config` 读 | 自己管(`getConfig` / `store` / 自己写文件) |
|
|
57
|
+
> | 适合什么 | 几个配置项,越快越好 | 复杂界面(列表、按钮、图表、实时数据) |
|
|
58
|
+
>
|
|
59
|
+
> 简言之:**设置表单是"填空",UI 卡片是"画图"**。两者可以同时存在 ——
|
|
60
|
+
> 一个扩展既能声明 schema 让用户填 API Key,也能给一张卡片展示运行状态。
|
|
61
|
+
|
|
49
62
|
前五套是「代码模块」,`ui/` 是**静态资源**(html/css/js),由面板加载到 **Shadow DOM** 里跑。
|
|
50
63
|
它不参与 `import()`,所以放错位置只会被静默跳过,不会报错。
|
|
51
64
|
|