@zaofan/dsh-qqbot 0.9.6 → 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/README.md +400 -344
- package/README_EN.md +313 -281
- package/client/qqbot-settings.js +431 -10
- package/dist/channel-tools.d.ts +1 -1
- package/dist/channel-tools.d.ts.map +1 -1
- package/dist/channel-tools.js +166 -15
- package/dist/channel-tools.js.map +1 -1
- package/dist/commands/approve.d.ts +17 -0
- package/dist/commands/approve.d.ts.map +1 -0
- package/dist/commands/approve.js +24 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/botplay.d.ts +15 -0
- package/dist/commands/botplay.d.ts.map +1 -0
- package/dist/commands/botplay.js +34 -0
- package/dist/commands/botplay.js.map +1 -0
- package/dist/commands/exit.d.ts +7 -0
- package/dist/commands/exit.d.ts.map +1 -0
- package/dist/commands/exit.js +85 -0
- package/dist/commands/exit.js.map +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +14 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/outmode.d.ts +7 -3
- package/dist/commands/outmode.d.ts.map +1 -1
- package/dist/commands/outmode.js +19 -9
- package/dist/commands/outmode.js.map +1 -1
- package/dist/commands/permission.d.ts +18 -0
- package/dist/commands/permission.d.ts.map +1 -0
- package/dist/commands/permission.js +43 -0
- package/dist/commands/permission.js.map +1 -0
- package/dist/commands/session.d.ts +5 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +51 -5
- package/dist/commands/session.js.map +1 -1
- package/dist/config.d.ts +73 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +89 -0
- package/dist/config.js.map +1 -1
- package/dist/features/approval-switch.d.ts +22 -0
- package/dist/features/approval-switch.d.ts.map +1 -0
- package/dist/features/approval-switch.js +10 -0
- package/dist/features/approval-switch.js.map +1 -0
- package/dist/features/botplay.d.ts +141 -0
- package/dist/features/botplay.d.ts.map +1 -0
- package/dist/features/botplay.js +558 -0
- package/dist/features/botplay.js.map +1 -0
- package/dist/features/extension-store.d.ts +27 -0
- package/dist/features/extension-store.d.ts.map +1 -0
- package/dist/features/extension-store.js +152 -0
- package/dist/features/extension-store.js.map +1 -0
- package/dist/features/group-hub.d.ts +40 -0
- package/dist/features/group-hub.d.ts.map +1 -0
- package/dist/features/group-hub.js +174 -0
- package/dist/features/group-hub.js.map +1 -0
- package/dist/features/group-join-request.d.ts.map +1 -1
- package/dist/features/group-join-request.js +35 -33
- package/dist/features/group-join-request.js.map +1 -1
- package/dist/features/qq-approval.d.ts.map +1 -1
- package/dist/features/qq-approval.js +3 -1
- package/dist/features/qq-approval.js.map +1 -1
- package/dist/features/scheduler.d.ts.map +1 -1
- package/dist/features/scheduler.js +2 -1
- package/dist/features/scheduler.js.map +1 -1
- package/dist/gateway/bootstrap.d.ts.map +1 -1
- package/dist/gateway/bootstrap.js +91 -11
- package/dist/gateway/bootstrap.js.map +1 -1
- package/dist/gateway/data-root.d.ts +15 -0
- package/dist/gateway/data-root.d.ts.map +1 -0
- package/dist/gateway/data-root.js +59 -0
- package/dist/gateway/data-root.js.map +1 -0
- package/dist/gateway/debounce.d.ts.map +1 -1
- package/dist/gateway/debounce.js +3 -2
- package/dist/gateway/debounce.js.map +1 -1
- package/dist/gateway/middleware-setup.d.ts +1 -1
- package/dist/gateway/middleware-setup.d.ts.map +1 -1
- package/dist/gateway/middleware-setup.js +42 -14
- package/dist/gateway/middleware-setup.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/attachment.d.ts.map +1 -1
- package/dist/middleware/attachment.js +2 -1
- package/dist/middleware/attachment.js.map +1 -1
- package/dist/middleware/media-history.d.ts +2 -0
- package/dist/middleware/media-history.d.ts.map +1 -1
- package/dist/middleware/media-history.js +6 -1
- package/dist/middleware/media-history.js.map +1 -1
- package/dist/middleware/sticker-capture.d.ts.map +1 -1
- package/dist/middleware/sticker-capture.js +2 -2
- package/dist/middleware/sticker-capture.js.map +1 -1
- package/dist/model/model-resolver.d.ts +12 -0
- package/dist/model/model-resolver.d.ts.map +1 -1
- package/dist/model/model-resolver.js +24 -0
- package/dist/model/model-resolver.js.map +1 -1
- package/dist/model/prefs-store.d.ts +16 -0
- package/dist/model/prefs-store.d.ts.map +1 -1
- package/dist/model/prefs-store.js +48 -0
- package/dist/model/prefs-store.js.map +1 -1
- package/dist/session/session-manager.d.ts +41 -2
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +185 -21
- package/dist/session/session-manager.js.map +1 -1
- package/dist/transport/attachment.d.ts.map +1 -1
- package/dist/transport/attachment.js +2 -1
- package/dist/transport/attachment.js.map +1 -1
- package/dist/transport/inbound.d.ts.map +1 -1
- package/dist/transport/inbound.js +9 -1
- package/dist/transport/inbound.js.map +1 -1
- package/package.json +1 -1
- package/settings-host.js +177 -52
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
import { readGroupMembers, readLedger } from './chat-ledger.js';
|
|
2
|
+
/** 按钮回调数据前缀 + 编码: bp:<cardId>:<buttonId>(button_data 是回调唯一凭证) */
|
|
3
|
+
const BTN_PREFIX = 'bp:';
|
|
4
|
+
/** 默认 append 记录文本模板(事件级 llmEffect.contextText 留空时用它) */
|
|
5
|
+
function defaultContextText(eventName, buttonLabel) {
|
|
6
|
+
return `[互动事件·${eventName}] bot 发送了互动卡片, 用户点击了「${buttonLabel}」`;
|
|
7
|
+
}
|
|
8
|
+
/** 按模板渲染: 支持 {name}(事件名) {label}(按钮文字) 占位; 末尾自动附加点击人身份(尽力带昵称) */
|
|
9
|
+
function renderContext(tpl, eventName, buttonLabel, clicker) {
|
|
10
|
+
let base = tpl && tpl.trim() ? String(tpl) : defaultContextText(eventName, buttonLabel);
|
|
11
|
+
base = base.replace(/\{name\}/g, eventName).replace(/\{label\}/g, buttonLabel);
|
|
12
|
+
// 点击人信息: 模板未显式包含时统一补一行(保证 AI 知道"谁点了")
|
|
13
|
+
if (clicker && base.indexOf(clicker) < 0) {
|
|
14
|
+
base += `\n(点击人: ${clicker})`;
|
|
15
|
+
}
|
|
16
|
+
return base;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 构造事件卡片 keyboard(官方 msg_type=2 + keyboard)。
|
|
20
|
+
* QQ 限制: rows ≤5 行 × 5 按钮/行; 默认每行1个(竖排, 字宽不截断),
|
|
21
|
+
* 事件 buttonsPerRow(1~5)可设每行多个(Phase2)。
|
|
22
|
+
* permission: 按事件 perm 决定 —— all→type2所有人 / triggerer→type0 指定触发者 /
|
|
23
|
+
* owner→type0 主人白名单 / users→type0 指定 openid。
|
|
24
|
+
* 按钮 action.type 按 botAction 区分(Phase2):
|
|
25
|
+
* reply_text/callback/command → 1 回调按钮(点击回后台, data=bp:card:btn)
|
|
26
|
+
* jump_url → 0 跳转按钮(data=http(s) 链接, 点击直接跳不走回调)
|
|
27
|
+
*/
|
|
28
|
+
export function botplayKeyboard(cardId, buttons, perm, ownerIds, triggererId, buttonsPerRow = 1) {
|
|
29
|
+
const perRow = Math.max(1, Math.min(5, Math.round(buttonsPerRow) || 1));
|
|
30
|
+
const shown = buttons.slice(0, 5 * perRow); // QQ 上限 5行×每行按钮数
|
|
31
|
+
let permission;
|
|
32
|
+
const specify = [];
|
|
33
|
+
if (perm.type === 'triggerer' && triggererId)
|
|
34
|
+
specify.push(triggererId);
|
|
35
|
+
else if (perm.type === 'owner')
|
|
36
|
+
specify.push(...ownerIds);
|
|
37
|
+
else if (perm.type === 'users')
|
|
38
|
+
specify.push(...(perm.userIds ?? []));
|
|
39
|
+
permission = specify.length > 0 ? { type: 0, specify_user_ids: specify } : { type: 2 };
|
|
40
|
+
const mk = (b) => {
|
|
41
|
+
const isJump = (b.botAction?.type ?? 'reply_text') === 'jump_url';
|
|
42
|
+
const url = String(b.botAction?.url ?? '').trim();
|
|
43
|
+
const data = isJump
|
|
44
|
+
? (url || 'https://example.com') // type=0 跳转: data 放链接
|
|
45
|
+
: `${BTN_PREFIX}${cardId}:${b.id}`; // type=1 回调: 编码 card::btn
|
|
46
|
+
return {
|
|
47
|
+
id: `${BTN_PREFIX}${cardId}:${b.id}`,
|
|
48
|
+
render_data: {
|
|
49
|
+
label: String(b.label ?? '').slice(0, 20),
|
|
50
|
+
visited_label: String(b.visitedLabel || b.label || '').slice(0, 20),
|
|
51
|
+
style: b.style === 0 ? 0 : 1,
|
|
52
|
+
},
|
|
53
|
+
action: {
|
|
54
|
+
type: isJump ? 0 : 1, // 0跳转 1回调
|
|
55
|
+
permission,
|
|
56
|
+
data,
|
|
57
|
+
unsupport_tips: '请在支持的客户端点击按钮',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
const rows = [];
|
|
62
|
+
for (let i = 0; i < shown.length; i += perRow) {
|
|
63
|
+
rows.push({ buttons: shown.slice(i, i + perRow).map(mk) });
|
|
64
|
+
}
|
|
65
|
+
return { content: { rows } };
|
|
66
|
+
}
|
|
67
|
+
/** 从 interaction button_data 解析 cardId + buttonId; 非 botplay 按钮返回 null */
|
|
68
|
+
export function parseBotplayButton(data) {
|
|
69
|
+
if (!data || !data.startsWith(BTN_PREFIX))
|
|
70
|
+
return null;
|
|
71
|
+
const rest = data.slice(BTN_PREFIX.length);
|
|
72
|
+
const idx = rest.indexOf(':');
|
|
73
|
+
if (idx <= 0 || idx >= rest.length - 1)
|
|
74
|
+
return null;
|
|
75
|
+
return { cardId: rest.slice(0, idx), buttonId: rest.slice(idx + 1) };
|
|
76
|
+
}
|
|
77
|
+
// ── 事件目录页(Phase2, 2026-09-08): /botplay 无参出翻页卡片, 点事件名直接触发 ──
|
|
78
|
+
// 编码: bpc:<page>:<key> —— key=事件id(触发该事件) | prev(上一页) | next(下一页) | close(关闭/忽略)
|
|
79
|
+
const CAT_PREFIX = 'bpc:';
|
|
80
|
+
/** 目录卡每行事件按钮数(QQ 每行上限5) */
|
|
81
|
+
const CAT_COLS = 2;
|
|
82
|
+
/** 每页事件数 = 事件最多4行×2列, 第5行留给翻页导航(QQ 行上限5) */
|
|
83
|
+
const CAT_PER_PAGE = 8;
|
|
84
|
+
export function parseCatalogButton(data) {
|
|
85
|
+
if (!data || !data.startsWith(CAT_PREFIX))
|
|
86
|
+
return null;
|
|
87
|
+
const rest = data.slice(CAT_PREFIX.length);
|
|
88
|
+
const idx = rest.indexOf(':');
|
|
89
|
+
if (idx <= 0 || idx >= rest.length - 1)
|
|
90
|
+
return null;
|
|
91
|
+
const page = Number(rest.slice(0, idx));
|
|
92
|
+
if (!Number.isFinite(page) || page < 0)
|
|
93
|
+
return null;
|
|
94
|
+
return { page, key: rest.slice(idx + 1) };
|
|
95
|
+
}
|
|
96
|
+
/** 目录页总数(0=无事件) */
|
|
97
|
+
function catalogPages(events) {
|
|
98
|
+
return Math.max(1, Math.ceil(events.length / CAT_PER_PAGE));
|
|
99
|
+
}
|
|
100
|
+
/** 构造事件目录卡 keyboard: 事件按钮(每行2个, 点击即触发) + 上一页/下一页 */
|
|
101
|
+
function catalogKeyboard(page, events) {
|
|
102
|
+
const pages = catalogPages(events);
|
|
103
|
+
const safePage = Math.min(page, pages - 1);
|
|
104
|
+
const start = safePage * CAT_PER_PAGE;
|
|
105
|
+
const pageEvents = events.slice(start, start + CAT_PER_PAGE);
|
|
106
|
+
const btn = (label, key, style) => ({
|
|
107
|
+
id: `${CAT_PREFIX}${safePage}:${key}`,
|
|
108
|
+
render_data: { label: String(label).slice(0, 20), visited_label: String(label).slice(0, 20), style },
|
|
109
|
+
action: {
|
|
110
|
+
type: 1,
|
|
111
|
+
permission: { type: 2 },
|
|
112
|
+
data: `${CAT_PREFIX}${safePage}:${key}`,
|
|
113
|
+
unsupport_tips: '请在支持的客户端点击',
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
const rows = [];
|
|
117
|
+
// 事件按钮: 每行 CAT_COLS 个(最多4行, 第5行留给翻页导航 → 合计≤5行)
|
|
118
|
+
const maxRows = 4;
|
|
119
|
+
for (let i = 0; i < pageEvents.length && rows.length < maxRows; i += CAT_COLS) {
|
|
120
|
+
rows.push({ buttons: pageEvents.slice(i, i + CAT_COLS).map((ev) => btn(`🎮${ev.name}`, ev.id, 1)) });
|
|
121
|
+
}
|
|
122
|
+
// 翻页行: 上一页 + 页码 + 下一页
|
|
123
|
+
const navBtns = [];
|
|
124
|
+
if (safePage > 0)
|
|
125
|
+
navBtns.push(btn('◀ 上一页', 'prev', 0));
|
|
126
|
+
if (safePage < pages - 1)
|
|
127
|
+
navBtns.push(btn('下一页 ▶', 'next', 0));
|
|
128
|
+
if (navBtns.length > 0)
|
|
129
|
+
rows.push({ buttons: navBtns });
|
|
130
|
+
return { content: { rows } };
|
|
131
|
+
}
|
|
132
|
+
export class BotplayController {
|
|
133
|
+
manager;
|
|
134
|
+
sender;
|
|
135
|
+
logger;
|
|
136
|
+
eventsGetter;
|
|
137
|
+
ownersGetter;
|
|
138
|
+
ledgerDataDirGetter;
|
|
139
|
+
cards = new Map();
|
|
140
|
+
constructor(manager, sender, logger,
|
|
141
|
+
/** live 事件配置 getter(config.botplayEvents, 每次现读支持热更) */
|
|
142
|
+
eventsGetter,
|
|
143
|
+
/** 主人 openid 白名单 getter(config.groupAdmin.owners; perm=owner 用) */
|
|
144
|
+
ownersGetter,
|
|
145
|
+
/** 台账 dataDir getter(表情包目录; 点击人昵称反查, 与 dock 禁言面板同源) */
|
|
146
|
+
ledgerDataDirGetter) {
|
|
147
|
+
this.manager = manager;
|
|
148
|
+
this.sender = sender;
|
|
149
|
+
this.logger = logger;
|
|
150
|
+
this.eventsGetter = eventsGetter;
|
|
151
|
+
this.ownersGetter = ownersGetter;
|
|
152
|
+
this.ledgerDataDirGetter = ledgerDataDirGetter;
|
|
153
|
+
}
|
|
154
|
+
/** 指令型按钮执行器(bootstrap 注入: 执行斜杠命令并返回文本) */
|
|
155
|
+
commandExecutor;
|
|
156
|
+
setCommandExecutor(fn) {
|
|
157
|
+
this.commandExecutor = fn;
|
|
158
|
+
}
|
|
159
|
+
/** 列出所有事件(公开, dock/命令共用) */
|
|
160
|
+
listEvents() {
|
|
161
|
+
return Array.isArray(this.eventsGetter()) ? this.eventsGetter() : [];
|
|
162
|
+
}
|
|
163
|
+
/** 按事件 id 精确查(live 现读) */
|
|
164
|
+
findEvent(eventId) {
|
|
165
|
+
return this.listEvents().find((e) => e.id === eventId);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* 触发发卡(/botplay 事件名)。定位会话用命令上下文所在 scope/peerId,
|
|
169
|
+
* 归属人 = 触发者本人 openid(group=c2c 同 senderId)。
|
|
170
|
+
*/
|
|
171
|
+
async trigger(target, eventId, triggererId) {
|
|
172
|
+
const ev = this.findEvent(eventId);
|
|
173
|
+
if (!ev)
|
|
174
|
+
return { ok: false, msg: `事件不存在: ${eventId}(发 /botplay 查看列表)` };
|
|
175
|
+
if (!Array.isArray(ev.buttons) || ev.buttons.length === 0) {
|
|
176
|
+
return { ok: false, msg: `事件「${ev.name}」没有配置按钮` };
|
|
177
|
+
}
|
|
178
|
+
const expireSec = Math.max(30, Number(ev.expireSec ?? 600) || 600);
|
|
179
|
+
const maxClicks = Math.max(0, Number(ev.maxClicks ?? 0) || 0);
|
|
180
|
+
const cardId = Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
|
|
181
|
+
const perm = ev.perm ?? { type: 'all' };
|
|
182
|
+
const ownerIds = this.ownersGetter();
|
|
183
|
+
this.cards.set(cardId, {
|
|
184
|
+
cardId,
|
|
185
|
+
eventId: ev.id,
|
|
186
|
+
eventName: ev.name,
|
|
187
|
+
buttons: JSON.parse(JSON.stringify(ev.buttons)),
|
|
188
|
+
perm: JSON.parse(JSON.stringify(perm)),
|
|
189
|
+
triggererId: perm.type === 'triggerer' ? triggererId : undefined,
|
|
190
|
+
remainClicks: maxClicks > 0 ? maxClicks : 0,
|
|
191
|
+
expireAt: Date.now() + expireSec * 1000,
|
|
192
|
+
});
|
|
193
|
+
const kb = botplayKeyboard(cardId, ev.buttons, perm, ownerIds, triggererId, Number(ev.buttonsPerRow ?? 1) || 1);
|
|
194
|
+
const prompt = [
|
|
195
|
+
`## 🎮 ${ev.name}`,
|
|
196
|
+
'',
|
|
197
|
+
'点下方按钮完成互动 👇',
|
|
198
|
+
'',
|
|
199
|
+
`⏱ 本卡片 ${expireSec} 秒内有效。`,
|
|
200
|
+
].join('\n');
|
|
201
|
+
try {
|
|
202
|
+
await this.sender.sendMarkdownWithKeyboard(target, prompt, kb);
|
|
203
|
+
this.logger.info(`[botplay] 发卡 ok event=${ev.id} card=${cardId} target=${target.scope}:${target.targetId} perm=${perm.type}`);
|
|
204
|
+
return { ok: true, msg: `已发出「${ev.name}」互动卡片 🎮` };
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
this.logger.warn(`[botplay] 发卡失败 event=${ev.id}: ${err instanceof Error ? err.message : String(err)}`);
|
|
208
|
+
this.cards.delete(cardId);
|
|
209
|
+
return { ok: false, msg: `发卡失败: ${err instanceof Error ? err.message : String(err)}(可能未开通卡片权限)` };
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** 发送事件目录卡(/botplay 无参 或 目录卡翻页; 点事件名按钮 → handleInteraction 直接触发) */
|
|
213
|
+
async sendCatalog(target, page = 0) {
|
|
214
|
+
const events = this.listEvents();
|
|
215
|
+
if (events.length === 0)
|
|
216
|
+
return { ok: false, msg: '🎮 还没有装配任何互动事件——到 dock「🎮 互动事件」装配保存后即可。' };
|
|
217
|
+
const pages = catalogPages(events);
|
|
218
|
+
const safePage = Math.max(0, Math.min(page, pages - 1));
|
|
219
|
+
const kb = catalogKeyboard(safePage, events);
|
|
220
|
+
const prompt = [
|
|
221
|
+
'### 🎮 互动事件',
|
|
222
|
+
'',
|
|
223
|
+
`共 ${events.length} 个 · 第 ${safePage + 1}/${pages} 页`,
|
|
224
|
+
'',
|
|
225
|
+
'点下方事件名直接触发 👇',
|
|
226
|
+
].join('\n');
|
|
227
|
+
try {
|
|
228
|
+
await this.sender.sendMarkdownWithKeyboard(target, prompt, kb);
|
|
229
|
+
this.logger.info(`[botplay] 目录卡 page=${safePage + 1}/${pages}(共${events.length}) target=${target.scope}:${target.targetId}`);
|
|
230
|
+
return { ok: true, msg: '' }; // 目录卡已发, 不追加文本
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
return { ok: false, msg: `目录卡发送失败: ${err instanceof Error ? err.message : String(err)}` };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* interaction 回调结算(bootstrap interaction 分发转发; type=11 消息按钮)。
|
|
238
|
+
* 流程: 解析 bp:<cardId>:<buttonId> → 查卡(过期/点满) → 查事件配置(live)
|
|
239
|
+
* → 校验按钮存在与点击人权限 → 执行 botAction → 按 llmEffect.mode append/唤醒。
|
|
240
|
+
* @returns true = 已被 botplay 消费(调用方无需其它处理)
|
|
241
|
+
*/
|
|
242
|
+
async handleInteraction(event, replyTarget) {
|
|
243
|
+
const e = event;
|
|
244
|
+
if (e?.data?.type !== 11)
|
|
245
|
+
return false;
|
|
246
|
+
// 目录卡按钮(Phase2): bpc:<page>:<key> —— key=事件id直接触发 / prev|next 翻页
|
|
247
|
+
const cat = parseCatalogButton(e.data.resolved?.button_data);
|
|
248
|
+
if (cat) {
|
|
249
|
+
const presserId = e.group_member_openid ?? e.user_openid ?? '';
|
|
250
|
+
if (cat.key === 'prev') {
|
|
251
|
+
await this.sendCatalog(replyTarget, cat.page - 1);
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
if (cat.key === 'next') {
|
|
255
|
+
await this.sendCatalog(replyTarget, cat.page + 1);
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
// 事件 id → 直接触发发卡(点击者本人为 triggerer, 权限由事件 perm 决定)
|
|
259
|
+
const ev = this.findEvent(cat.key);
|
|
260
|
+
if (!ev) {
|
|
261
|
+
await this.safeReply(replyTarget, '该事件已被删除, 请刷新目录~');
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
await this.trigger(replyTarget, ev.id, presserId);
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
const parsed = parseBotplayButton(e.data.resolved?.button_data);
|
|
268
|
+
if (!parsed)
|
|
269
|
+
return false;
|
|
270
|
+
const card = this.cards.get(parsed.cardId);
|
|
271
|
+
if (!card) {
|
|
272
|
+
// 卡不存在(重启后内存清空/已失效) → 提示重发
|
|
273
|
+
await this.safeReply(replyTarget, '这张互动卡片已失效, 请重新发 /botplay 触发~');
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
// 过期校验
|
|
277
|
+
if (Date.now() > card.expireAt) {
|
|
278
|
+
this.cards.delete(parsed.cardId);
|
|
279
|
+
await this.safeReply(replyTarget, '这张互动卡片已超时失效, 请重新发 /botplay~');
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
// 事件仍存在才受理(删除后旧卡失效提示重配); 按钮/权限/名称一律走【发卡时快照】,
|
|
283
|
+
// 配置热改不会让已发卡"漂移"(Phase2 版本化语义)。
|
|
284
|
+
const ev = this.findEvent(card.eventId);
|
|
285
|
+
if (!ev) {
|
|
286
|
+
this.cards.delete(parsed.cardId);
|
|
287
|
+
await this.safeReply(replyTarget, '该互动事件已被删除, 请让管理员重新配置~');
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
const btn = card.buttons.find((b) => b.id === parsed.buttonId);
|
|
291
|
+
if (!btn) {
|
|
292
|
+
await this.safeReply(replyTarget, '按钮配置已更新, 请重新触发这张卡片~');
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
// 点击人权限校验(与发卡 permission 双保险; 按快照 perm, 群看 member_openid, c2c 看 user_openid)
|
|
296
|
+
const presser = e.group_member_openid ?? e.user_openid ?? '';
|
|
297
|
+
const allowed = this.checkPerm(card.perm, card, presser);
|
|
298
|
+
if (!allowed) {
|
|
299
|
+
await this.safeReply(replyTarget, '这个按钮只有指定的人能点哦~');
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
// 连点防刷: maxClicks>0 时扣减, 点满失效
|
|
303
|
+
if (card.remainClicks > 0) {
|
|
304
|
+
card.remainClicks -= 1;
|
|
305
|
+
if (card.remainClicks <= 0) {
|
|
306
|
+
this.cards.delete(parsed.cardId);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// ① bot(非LLM)行为(按快照)
|
|
310
|
+
const actionType = btn.botAction?.type ?? 'reply_text';
|
|
311
|
+
if (actionType === 'reply_text') {
|
|
312
|
+
const text = String(btn.botAction?.text ?? '').trim();
|
|
313
|
+
if (text) {
|
|
314
|
+
try {
|
|
315
|
+
await this.sender.sendMarkdown(replyTarget, text);
|
|
316
|
+
}
|
|
317
|
+
catch (err) {
|
|
318
|
+
this.logger.warn(`[botplay] reply_text 失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
else if (actionType === 'jump_url') {
|
|
323
|
+
// jump_url 是官方 type=0 跳转按钮 → 点击时客户端直接跳, 不会走到回调;
|
|
324
|
+
// 若仍收到回调(降级/不可跳)则提示用户直接点链接。
|
|
325
|
+
const url = String(btn.botAction?.url ?? '').trim();
|
|
326
|
+
await this.safeReply(replyTarget, url ? `跳转按钮: ${url}(如未自动跳转请手动打开)` : '该按钮是跳转按钮, 请在支持跳转的客户端点击');
|
|
327
|
+
}
|
|
328
|
+
else if (actionType === 'command') {
|
|
329
|
+
// command 指令型(Phase2): 点击 → host 直接执行斜杠命令(不经 AI 文本)。
|
|
330
|
+
// 命令名存 botAction.text(不带 /); 由 bootstrap 注入的 executor 执行并把结果发回。
|
|
331
|
+
const cmdName = String(btn.botAction?.text ?? '').trim().replace(/^\//, '');
|
|
332
|
+
if (cmdName && this.commandExecutor) {
|
|
333
|
+
try {
|
|
334
|
+
const text = await this.commandExecutor(cmdName, replyTarget);
|
|
335
|
+
if (text && text.trim())
|
|
336
|
+
await this.safeReply(replyTarget, text);
|
|
337
|
+
}
|
|
338
|
+
catch (err) {
|
|
339
|
+
this.logger.warn(`[botplay] command 执行失败 ${cmdName}: ${err instanceof Error ? err.message : String(err)}`);
|
|
340
|
+
await this.safeReply(replyTarget, `指令执行失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
await this.safeReply(replyTarget, cmdName ? '指令执行器未就绪, 请稍后再试~' : '这个按钮没配置要执行的命令');
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// callback=仅结算, 无 bot 回复
|
|
348
|
+
// ② LLM 影响三档(按快照; 注入文本带点击人身份: 昵称(openid), 台账/会话历史反查)
|
|
349
|
+
const mode = btn.llmEffect?.mode ?? 'no_append';
|
|
350
|
+
if (mode !== 'no_append') {
|
|
351
|
+
const clicker = this.clickerLabel(replyTarget, presser);
|
|
352
|
+
const text = renderContext(btn.llmEffect?.contextText, card.eventName, btn.label ?? '', clicker);
|
|
353
|
+
await this.applyEffect(mode, replyTarget, text, presser);
|
|
354
|
+
}
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* 点击人可读标签(与 dock 禁言面板/审批同源的昵称反查):
|
|
359
|
+
* ①群成员台账 group-members.jsonl(gid:mid → name, 由 chat-ledger 中间件持续记录)
|
|
360
|
+
* ②私聊台账 known-chats.jsonl(c2c:id → name)
|
|
361
|
+
* ③会话最近 user/message 消息壳 [昵称 (openid)] 兜底
|
|
362
|
+
* ④全 miss 回落 openid。
|
|
363
|
+
*/
|
|
364
|
+
clickerLabel(target, presser) {
|
|
365
|
+
if (!presser)
|
|
366
|
+
return '未知用户';
|
|
367
|
+
// ① 台账(host 侧与 dock 禁言同源: dataDir=表情包目录, 同 group-members.jsonl)
|
|
368
|
+
try {
|
|
369
|
+
const dataDir = this.ledgerDataDirGetter();
|
|
370
|
+
if (dataDir) {
|
|
371
|
+
if (target.scope === 'group') {
|
|
372
|
+
const members = readGroupMembers(dataDir, target.targetId);
|
|
373
|
+
const hit = members.find((m) => m.mid === presser);
|
|
374
|
+
if (hit && hit.name)
|
|
375
|
+
return `${hit.name}(${presser.slice(0, 8)}…)`;
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
const chats = readLedger(dataDir);
|
|
379
|
+
const hit = chats.filter((c) => c.scope === 'c2c' && c.id === presser).sort((a, b) => b.ts - a.ts)[0];
|
|
380
|
+
if (hit && hit.name)
|
|
381
|
+
return `${hit.name}(${presser.slice(0, 8)}…)`;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch { /* 台账读取失败, 走下一步 */ }
|
|
386
|
+
// ③ 会话消息壳兜底
|
|
387
|
+
const record = this.manager.findByPeer(target.scope, target.targetId);
|
|
388
|
+
try {
|
|
389
|
+
const evs = record?.agent?.session?.events;
|
|
390
|
+
if (Array.isArray(evs)) {
|
|
391
|
+
const from = Math.max(0, evs.length - 80);
|
|
392
|
+
for (let i = evs.length - 1; i >= from; i--) {
|
|
393
|
+
const ev = evs[i];
|
|
394
|
+
if (!ev || ev.type !== 'user/message')
|
|
395
|
+
continue;
|
|
396
|
+
const data = ev.data && typeof ev.data === 'object' ? ev.data : ev;
|
|
397
|
+
const src = data.source;
|
|
398
|
+
if (src && src.kind === 'plugin')
|
|
399
|
+
continue;
|
|
400
|
+
const content = Array.isArray(data.content) ? data.content : [];
|
|
401
|
+
const text = content.map((b) => (b?.text ?? '')).join('\n');
|
|
402
|
+
if (!text)
|
|
403
|
+
continue;
|
|
404
|
+
// 壳格式: [昵称 (openid32)] 正文 (inbound.ts buildUserMessage)
|
|
405
|
+
const idx = text.indexOf(`(${presser})`);
|
|
406
|
+
if (idx > 1) {
|
|
407
|
+
const head = text.slice(0, idx).replace(/^\[+/, '').trim();
|
|
408
|
+
if (head && !head.includes(presser))
|
|
409
|
+
return `${head}(${presser.slice(0, 8)}…)`;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
catch { /* 解析失败回落 */ }
|
|
415
|
+
return presser;
|
|
416
|
+
}
|
|
417
|
+
/** 权限判定: all 放行 / triggerer=触发者本人 / owner=主人白名单 / users=指定 openid */
|
|
418
|
+
checkPerm(perm, card, presser) {
|
|
419
|
+
if (perm.type === 'all')
|
|
420
|
+
return true;
|
|
421
|
+
if (!presser)
|
|
422
|
+
return false; // 无人身份不给点
|
|
423
|
+
if (perm.type === 'triggerer')
|
|
424
|
+
return !!card.triggererId && presser === card.triggererId;
|
|
425
|
+
if (perm.type === 'owner')
|
|
426
|
+
return this.ownersGetter().includes(presser);
|
|
427
|
+
if (perm.type === 'users')
|
|
428
|
+
return (perm.userIds ?? []).includes(presser);
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* append 三档落点: 往该 peer 的会话写上下文/唤醒 AI。
|
|
433
|
+
* ⚠️ 会话不在内存(重启后未恢复/被 idle 回收)→ getOrCreate 恢复/重建(不触发回合),
|
|
434
|
+
* 保证 append/injectToPeer 有 record 可挂 —— 这是"点击没反应"的常见根因。
|
|
435
|
+
*/
|
|
436
|
+
async applyEffect(mode, target, text, presser) {
|
|
437
|
+
let record = this.manager.findByPeer(target.scope, target.targetId);
|
|
438
|
+
if (!record) {
|
|
439
|
+
try {
|
|
440
|
+
record = await this.manager.getOrCreate(target.scope, target.targetId, presser || 'unknown', target);
|
|
441
|
+
this.logger.info(`[botplay] 会话不在, 已 getOrCreate 恢复 ${target.scope}:${target.targetId}`);
|
|
442
|
+
}
|
|
443
|
+
catch (err) {
|
|
444
|
+
this.logger.warn(`[botplay] getOrCreate 失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
if (mode === 'append_silent') {
|
|
449
|
+
// 记录不唤醒: 复用 group-hub safeAppendUserMessage 姿势 —— 先等回合空闲再 session.append 只落上下文
|
|
450
|
+
// 🔒 硬约束(主人定 2026-09-09): LLM 回合进行中严禁 append(拆散 tool_calls 坏记录)
|
|
451
|
+
const a = record.agent;
|
|
452
|
+
const sess = a?.session;
|
|
453
|
+
if (!sess || typeof sess.append !== 'function')
|
|
454
|
+
return;
|
|
455
|
+
try {
|
|
456
|
+
// 等回合结束(空闲立即返回; 活跃时宿主等 turn/end; 超时 60s 放弃, 不硬塞坏记录)
|
|
457
|
+
if (typeof a.whenIdle === 'function') {
|
|
458
|
+
try {
|
|
459
|
+
await Promise.race([a.whenIdle(), new Promise((r) => setTimeout(r, 60_000))]);
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
const { createUserMessage } = await import('@deepseek-ai/dsh-llm');
|
|
466
|
+
const msg = createUserMessage({ content: [{ type: 'text', text }], source: { kind: 'user' } });
|
|
467
|
+
sess.append('user/message', msg, { surfaceOp: 'append' });
|
|
468
|
+
this.logger.info(`[botplay] append_silent ok ${target.scope}:${target.targetId}`);
|
|
469
|
+
}
|
|
470
|
+
catch (err) {
|
|
471
|
+
this.logger.warn(`[botplay] append_silent 失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
472
|
+
}
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
// append_wake: 记录 + 唤醒 AI(走 injectToPeer followup, AI 开回合自然回应)
|
|
476
|
+
try {
|
|
477
|
+
const ok = await this.manager.injectToPeer(target.scope, target.targetId, text);
|
|
478
|
+
this.logger.info(`[botplay] append_wake ${ok ? 'ok' : 'miss'} ${target.scope}:${target.targetId}`);
|
|
479
|
+
}
|
|
480
|
+
catch (err) {
|
|
481
|
+
this.logger.warn(`[botplay] append_wake 失败: ${err instanceof Error ? err.message : String(err)}`);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
async safeReply(target, text) {
|
|
485
|
+
try {
|
|
486
|
+
await this.sender.sendMarkdown(target, text);
|
|
487
|
+
}
|
|
488
|
+
catch { /* 回复失败不致命 */ }
|
|
489
|
+
}
|
|
490
|
+
/** 清理全部活动卡(dispose 用) */
|
|
491
|
+
clear() {
|
|
492
|
+
this.cards.clear();
|
|
493
|
+
}
|
|
494
|
+
/** 扫掉过期卡(Phase2: 定期/触发时调用, 防内存积压) */
|
|
495
|
+
sweepExpired() {
|
|
496
|
+
const now = Date.now();
|
|
497
|
+
let n = 0;
|
|
498
|
+
for (const [id, c] of this.cards) {
|
|
499
|
+
if (now > c.expireAt) {
|
|
500
|
+
this.cards.delete(id);
|
|
501
|
+
n += 1;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
if (n > 0)
|
|
505
|
+
this.logger.info(`[botplay] 清理过期卡 ${n} 张(剩 ${this.cards.size})`);
|
|
506
|
+
return n;
|
|
507
|
+
}
|
|
508
|
+
/** 活动卡数量(诊断用) */
|
|
509
|
+
get cardCount() {
|
|
510
|
+
return this.cards.size;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
// ── 按实例(ns)注册表 + 命令/触发共用入口(仿 outbound-mode-switch / qq-approval) ──
|
|
514
|
+
const botplayControllers = new Map();
|
|
515
|
+
export function registerBotplayController(ns, c) {
|
|
516
|
+
if (c)
|
|
517
|
+
botplayControllers.set(ns, c);
|
|
518
|
+
else
|
|
519
|
+
botplayControllers.delete(ns);
|
|
520
|
+
}
|
|
521
|
+
let triggerImpl;
|
|
522
|
+
export function setBotplayTriggerImpl(fn) {
|
|
523
|
+
triggerImpl = fn;
|
|
524
|
+
}
|
|
525
|
+
export async function triggerBotplay(target, eventId, triggererId) {
|
|
526
|
+
if (!triggerImpl)
|
|
527
|
+
return { ok: false, msg: 'botplay 未就绪(插件未启动)' };
|
|
528
|
+
return triggerImpl(target, eventId, triggererId);
|
|
529
|
+
}
|
|
530
|
+
let catalogImpl;
|
|
531
|
+
export function setBotplayCatalogImpl(fn) {
|
|
532
|
+
catalogImpl = fn;
|
|
533
|
+
}
|
|
534
|
+
export async function botplayCatalog(target, page = 0) {
|
|
535
|
+
if (!catalogImpl)
|
|
536
|
+
return { ok: false, msg: 'botplay 未就绪(插件未启动)' };
|
|
537
|
+
return catalogImpl(target, page);
|
|
538
|
+
}
|
|
539
|
+
/** 取某 ns 的事件列表(dock 装配器读; settings value 里其实已有, 此出口备用) */
|
|
540
|
+
export function listBotplayEventsAny() {
|
|
541
|
+
const out = [];
|
|
542
|
+
for (const [ns, c] of botplayControllers) {
|
|
543
|
+
for (const e of c.listEvents())
|
|
544
|
+
out.push({ ns, ...e });
|
|
545
|
+
}
|
|
546
|
+
return out;
|
|
547
|
+
}
|
|
548
|
+
/** 会话定位 → ReplyTarget(命令层用; senderId 即触发者) */
|
|
549
|
+
export function resolveCommandTarget(cmdCtx) {
|
|
550
|
+
const msg = cmdCtx.message ?? {};
|
|
551
|
+
const isGroup = msg.kind === 'group';
|
|
552
|
+
const peerId = isGroup ? (msg.groupOpenid ?? msg.senderId ?? '') : (msg.senderId ?? '');
|
|
553
|
+
return {
|
|
554
|
+
target: { scope: isGroup ? 'group' : 'c2c', targetId: peerId, msgId: msg.messageId },
|
|
555
|
+
triggererId: msg.senderId ?? '',
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=botplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"botplay.js","sourceRoot":"","sources":["../../src/features/botplay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { SlashCommand } from '@tencent-connect/qqbot-nodejs';
|
|
2
|
+
import type { Logger } from '../types.js';
|
|
3
|
+
/** 扩展命令目录名(相对 cwd) */
|
|
4
|
+
export declare const EXT_COMMANDS_SUBDIR: string;
|
|
5
|
+
/** 扩展工具目录名(相对 cwd) */
|
|
6
|
+
export declare const EXT_TOOLS_SUBDIR: string;
|
|
7
|
+
/**
|
|
8
|
+
* 扫描并加载扩展命令目录下的全部命令。
|
|
9
|
+
* fail-soft: 单个文件坏/抛错只记日志, 不影响其它扩展与插件本体。
|
|
10
|
+
*/
|
|
11
|
+
export declare function loadExtensionCommands(cwd: string | undefined, logger: Logger): Promise<SlashCommand[]>;
|
|
12
|
+
/** 扩展目录路径(cwd 不存在时 undefined; dock/工具展示用) */
|
|
13
|
+
export declare function extensionCommandsDir(cwd: string | undefined): string;
|
|
14
|
+
/** 扩展工具目录路径(dock/工具展示用) */
|
|
15
|
+
export declare function extensionToolsDir(cwd: string | undefined): string;
|
|
16
|
+
/** 归一化后的扩展工具定义 */
|
|
17
|
+
export interface ExtensionToolDef {
|
|
18
|
+
file: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
inputSchema: Record<string, unknown>;
|
|
22
|
+
/** 执行体: 参数 schema 由调用方校验, run 直接收已校验 args + env */
|
|
23
|
+
run: (args: Record<string, unknown>, env: Record<string, unknown>) => Promise<unknown> | unknown;
|
|
24
|
+
}
|
|
25
|
+
/** 扫描并加载扩展工具目录(P4.2; 由 channel-tools 在注册时调用) */
|
|
26
|
+
export declare function loadExtensionTools(cwd: string | undefined, logger: Logger): Promise<ExtensionToolDef[]>;
|
|
27
|
+
//# sourceMappingURL=extension-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-store.d.ts","sourceRoot":"","sources":["../../src/features/extension-store.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,sBAAsB;AACtB,eAAO,MAAM,mBAAmB,QAAwC,CAAC;AACzE,sBAAsB;AACtB,eAAO,MAAM,gBAAgB,QAAqC,CAAC;AAyCnE;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA0B5G;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,2BAA2B;AAC3B,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjE;AAcD,kBAAkB;AAClB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,mDAAmD;IACnD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAClG;AA8BD,gDAAgD;AAChD,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwB7G"}
|