@zhin.js/adapter-qq 2.0.12 → 3.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +20 -4
  2. package/README.md +9 -9
  3. package/client/Dashboard.tsx +32 -32
  4. package/dist/index.js +1 -1
  5. package/lib/adapter.d.ts +10 -9
  6. package/lib/adapter.d.ts.map +1 -1
  7. package/lib/adapter.js +33 -32
  8. package/lib/adapter.js.map +1 -1
  9. package/lib/{bot.d.ts → endpoint.d.ts} +13 -8
  10. package/lib/endpoint.d.ts.map +1 -0
  11. package/lib/{bot.js → endpoint.js} +101 -35
  12. package/lib/endpoint.js.map +1 -0
  13. package/lib/gateway-config.d.ts +3 -3
  14. package/lib/gateway-config.d.ts.map +1 -1
  15. package/lib/gateway-config.js +2 -2
  16. package/lib/gateway-config.js.map +1 -1
  17. package/lib/group-at-normalize.d.ts +1 -1
  18. package/lib/group-at-normalize.d.ts.map +1 -1
  19. package/lib/group-at-normalize.js +8 -8
  20. package/lib/group-at-normalize.js.map +1 -1
  21. package/lib/index.d.ts +1 -1
  22. package/lib/index.d.ts.map +1 -1
  23. package/lib/index.js +124 -96
  24. package/lib/index.js.map +1 -1
  25. package/lib/platform-permit.d.ts +17 -0
  26. package/lib/platform-permit.d.ts.map +1 -0
  27. package/lib/platform-permit.js +47 -0
  28. package/lib/platform-permit.js.map +1 -0
  29. package/lib/sdk-version.d.ts +1 -1
  30. package/lib/sdk-version.js +1 -1
  31. package/lib/types.d.ts +4 -4
  32. package/lib/types.d.ts.map +1 -1
  33. package/package.json +13 -10
  34. package/skills/qq/PERMITS.md +25 -0
  35. package/skills/qq/SKILL.md +1 -1
  36. package/src/adapter.ts +27 -25
  37. package/src/{bot.ts → endpoint.ts} +116 -42
  38. package/src/gateway-config.ts +5 -5
  39. package/src/group-at-normalize.ts +8 -8
  40. package/src/index.ts +118 -85
  41. package/src/platform-permit.ts +62 -0
  42. package/src/sdk-version.ts +1 -1
  43. package/src/types.ts +5 -5
  44. package/lib/bot.d.ts.map +0 -1
  45. package/lib/bot.js.map +0 -1
package/src/index.ts CHANGED
@@ -6,6 +6,11 @@ import { usePlugin, type Plugin, type IGroupManagement, createGroupManagementToo
6
6
  import type { Router } from "@zhin.js/host-router";
7
7
  import { QQAdapter } from "./adapter.js";
8
8
  import { PageManager } from "@zhin.js/host-api";
9
+ import {
10
+ platformPermit,
11
+ qqGuildPermitResolver,
12
+ registerQqPlatformPermitChecker,
13
+ } from "./platform-permit.js";
9
14
 
10
15
  declare module "zhin.js" {
11
16
  namespace Plugin {
@@ -23,7 +28,7 @@ declare module "zhin.js" {
23
28
  }
24
29
 
25
30
  export * from "./types.js";
26
- export { QQBot } from "./bot.js";
31
+ export { QQEndpoint } from "./endpoint.js";
27
32
  export { QQAdapter } from "./adapter.js";
28
33
 
29
34
  const plugin = usePlugin();
@@ -32,7 +37,7 @@ const { provide, useContext } = plugin;
32
37
  useContext("router", (router: Router) => {
33
38
  provide({
34
39
  name: "qq",
35
- description: "QQ Official Bot Adapter",
40
+ description: "QQ Official Endpoint Adapter",
36
41
  mounted: async (p: Plugin) => {
37
42
  const adapter = new QQAdapter(p, router);
38
43
  await adapter.start();
@@ -45,11 +50,14 @@ useContext("router", (router: Router) => {
45
50
  });
46
51
 
47
52
  useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
53
+ const disposers: (() => void)[] = [];
54
+ disposers.push(registerQqPlatformPermitChecker());
48
55
  const groupTools = createGroupManagementTools(
49
56
  qq as unknown as IGroupManagement,
50
57
  'qq',
58
+ { permitResolver: qqGuildPermitResolver, registerChecker: false },
51
59
  );
52
- const disposers: (() => void)[] = groupTools.map(t => toolService.addTool(t, plugin.name));
60
+ disposers.push(...groupTools.map(t => toolService.addTool(t, plugin.name)));
53
61
 
54
62
  // 获取频道列表
55
63
  disposers.push(toolService.addTool({
@@ -58,16 +66,16 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
58
66
  parameters: {
59
67
  type: 'object',
60
68
  properties: {
61
- bot: { type: 'string', description: 'Bot 名称' },
69
+ endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
62
70
  },
63
- required: ['bot'],
71
+ required: ['endpoint_id'],
64
72
  },
65
73
  platforms: ['qq'],
66
74
  tags: ['qq'],
67
75
  execute: async (args: Record<string, any>) => {
68
- const bot = qq.bots.get(args.bot);
69
- if (!bot) throw new Error(`Bot ${args.bot} 不存在`);
70
- const guilds = await bot.getGuilds();
76
+ const endpoint = qq.endpoints.get(args.endpoint_id);
77
+ if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
78
+ const guilds = await endpoint.getGuilds();
71
79
  return { guilds, count: guilds.length };
72
80
  },
73
81
  }, plugin.name));
@@ -79,17 +87,18 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
79
87
  parameters: {
80
88
  type: 'object',
81
89
  properties: {
82
- bot: { type: 'string', description: 'Bot 名称' },
90
+ endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
83
91
  guild_id: { type: 'string', description: '频道 ID' },
84
92
  },
85
- required: ['bot', 'guild_id'],
93
+ required: ['endpoint_id', 'guild_id'],
86
94
  },
87
95
  platforms: ['qq'],
88
96
  tags: ['qq'],
97
+ permissions: [platformPermit('manage_channels')],
89
98
  execute: async (args: Record<string, any>) => {
90
- const bot = qq.bots.get(args.bot);
91
- if (!bot) throw new Error(`Bot ${args.bot} 不存在`);
92
- const channels = await bot.getChannels(args.guild_id);
99
+ const endpoint = qq.endpoints.get(args.endpoint_id);
100
+ if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
101
+ const channels = await endpoint.getChannels(args.guild_id);
93
102
  return { channels, count: channels.length };
94
103
  },
95
104
  }, plugin.name));
@@ -101,17 +110,18 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
101
110
  parameters: {
102
111
  type: 'object',
103
112
  properties: {
104
- bot: { type: 'string', description: 'Bot 名称' },
113
+ endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
105
114
  guild_id: { type: 'string', description: '频道 ID' },
106
115
  },
107
- required: ['bot', 'guild_id'],
116
+ required: ['endpoint_id', 'guild_id'],
108
117
  },
109
118
  platforms: ['qq'],
110
119
  tags: ['qq'],
120
+ permissions: [platformPermit('manage_roles')],
111
121
  execute: async (args: Record<string, any>) => {
112
- const bot = qq.bots.get(args.bot);
113
- if (!bot) throw new Error(`Bot ${args.bot} 不存在`);
114
- const roles = await bot.getGuildRoles(args.guild_id);
122
+ const endpoint = qq.endpoints.get(args.endpoint_id);
123
+ if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
124
+ const roles = await endpoint.getGuildRoles(args.guild_id);
115
125
  return { roles, count: roles.length };
116
126
  },
117
127
  }, plugin.name));
@@ -123,19 +133,20 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
123
133
  parameters: {
124
134
  type: 'object',
125
135
  properties: {
126
- bot: { type: 'string', description: 'Bot 名称' },
136
+ endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
127
137
  guild_id: { type: 'string', description: '频道 ID' },
128
138
  name: { type: 'string', description: '角色名称' },
129
139
  color: { type: 'number', description: '颜色(RGB 十进制数值)' },
130
140
  },
131
- required: ['bot', 'guild_id', 'name'],
141
+ required: ['endpoint_id', 'guild_id', 'name'],
132
142
  },
133
143
  platforms: ['qq'],
134
144
  tags: ['qq'],
145
+ permissions: [platformPermit('guild_owner')],
135
146
  execute: async (args: Record<string, any>) => {
136
- const bot = qq.bots.get(args.bot);
137
- if (!bot) throw new Error(`Bot ${args.bot} 不存在`);
138
- const role = await bot.createGuildRole(args.guild_id, args.name, args.color);
147
+ const endpoint = qq.endpoints.get(args.endpoint_id);
148
+ if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
149
+ const role = await endpoint.createGuildRole(args.guild_id, args.name, args.color);
139
150
  return { success: !!role, role, message: role ? `角色 "${args.name}" 创建成功` : '创建失败' };
140
151
  },
141
152
  }, plugin.name));
@@ -147,20 +158,21 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
147
158
  parameters: {
148
159
  type: 'object',
149
160
  properties: {
150
- bot: { type: 'string', description: 'Bot 名称' },
161
+ endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
151
162
  guild_id: { type: 'string', description: '频道 ID' },
152
163
  channel_id: { type: 'string', description: '子频道 ID' },
153
164
  user_id: { type: 'string', description: '用户 ID' },
154
165
  role_id: { type: 'string', description: '角色 ID' },
155
166
  },
156
- required: ['bot', 'guild_id', 'channel_id', 'user_id', 'role_id'],
167
+ required: ['endpoint_id', 'guild_id', 'channel_id', 'user_id', 'role_id'],
157
168
  },
158
169
  platforms: ['qq'],
159
170
  tags: ['qq'],
171
+ permissions: [platformPermit('manage_roles')],
160
172
  execute: async (args: Record<string, any>) => {
161
- const bot = qq.bots.get(args.bot);
162
- if (!bot) throw new Error(`Bot ${args.bot} 不存在`);
163
- const success = await bot.addMemberRole(args.guild_id, args.channel_id, args.user_id, args.role_id);
173
+ const endpoint = qq.endpoints.get(args.endpoint_id);
174
+ if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
175
+ const success = await endpoint.addMemberRole(args.guild_id, args.channel_id, args.user_id, args.role_id);
164
176
  return { success, message: success ? '已给成员添加角色' : '操作失败' };
165
177
  },
166
178
  }, plugin.name));
@@ -172,20 +184,21 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
172
184
  parameters: {
173
185
  type: 'object',
174
186
  properties: {
175
- bot: { type: 'string', description: 'Bot 名称' },
187
+ endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
176
188
  guild_id: { type: 'string', description: '频道 ID' },
177
189
  channel_id: { type: 'string', description: '子频道 ID' },
178
190
  user_id: { type: 'string', description: '用户 ID' },
179
191
  role_id: { type: 'string', description: '角色 ID' },
180
192
  },
181
- required: ['bot', 'guild_id', 'channel_id', 'user_id', 'role_id'],
193
+ required: ['endpoint_id', 'guild_id', 'channel_id', 'user_id', 'role_id'],
182
194
  },
183
195
  platforms: ['qq'],
184
196
  tags: ['qq'],
197
+ permissions: [platformPermit('manage_roles')],
185
198
  execute: async (args: Record<string, any>) => {
186
- const bot = qq.bots.get(args.bot);
187
- if (!bot) throw new Error(`Bot ${args.bot} 不存在`);
188
- const success = await bot.removeMemberRole(args.guild_id, args.channel_id, args.user_id, args.role_id);
199
+ const endpoint = qq.endpoints.get(args.endpoint_id);
200
+ if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
201
+ const success = await endpoint.removeMemberRole(args.guild_id, args.channel_id, args.user_id, args.role_id);
189
202
  return { success, message: success ? '已移除成员的角色' : '操作失败' };
190
203
  },
191
204
  }, plugin.name));
@@ -197,17 +210,18 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
197
210
  parameters: {
198
211
  type: 'object',
199
212
  properties: {
200
- bot: { type: 'string', description: 'Bot 名称' },
213
+ endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
201
214
  channel_id: { type: 'string', description: '子频道 ID' },
202
215
  },
203
- required: ['bot', 'channel_id'],
216
+ required: ['endpoint_id', 'channel_id'],
204
217
  },
205
218
  platforms: ['qq'],
206
219
  tags: ['qq'],
220
+ permissions: [platformPermit('guild_admin')],
207
221
  execute: async (args: Record<string, any>) => {
208
- const bot = qq.bots.get(args.bot);
209
- if (!bot) throw new Error(`Bot ${args.bot} 不存在`);
210
- const info = await bot.getChannelInfo(args.channel_id);
222
+ const endpoint = qq.endpoints.get(args.endpoint_id);
223
+ if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
224
+ const info = await endpoint.getChannelInfo(args.channel_id);
211
225
  return info;
212
226
  },
213
227
  }, plugin.name));
@@ -219,18 +233,19 @@ useContext('tool', 'qq', (toolService: ToolFeature, qq: QQAdapter) => {
219
233
  parameters: {
220
234
  type: 'object',
221
235
  properties: {
222
- bot: { type: 'string', description: 'Bot 名称' },
236
+ endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
223
237
  guild_id: { type: 'string', description: '频道 ID' },
224
238
  user_id: { type: 'string', description: '用户 ID' },
225
239
  },
226
- required: ['bot', 'guild_id', 'user_id'],
240
+ required: ['endpoint_id', 'guild_id', 'user_id'],
227
241
  },
228
242
  platforms: ['qq'],
229
243
  tags: ['qq'],
244
+ permissions: [platformPermit('guild_admin')],
230
245
  execute: async (args: Record<string, any>) => {
231
- const bot = qq.bots.get(args.bot);
232
- if (!bot) throw new Error(`Bot ${args.bot} 不存在`);
233
- const member = await bot.getGuildMember(args.guild_id, args.user_id);
246
+ const endpoint = qq.endpoints.get(args.endpoint_id);
247
+ if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
248
+ const member = await endpoint.getGuildMember(args.guild_id, args.user_id);
234
249
  return member;
235
250
  },
236
251
  }, plugin.name));
@@ -249,82 +264,100 @@ useContext("web", (pageManager) => {
249
264
  });
250
265
 
251
266
  useContext("router", "qq", (router: any, qq: QQAdapter) => {
252
- router.get("/api/qq/bots", async (ctx: any) => {
267
+ router.get("/api/qq/endpoints", async (ctx: any) => {
253
268
  try {
254
- const bots = Array.from(qq.bots.values());
255
- const result = await Promise.all(bots.map(async (bot) => {
269
+ const endpoints = Array.from(qq.endpoints.values());
270
+ const result = await Promise.all(endpoints.map(async (endpoint) => {
256
271
  try {
257
272
  let guildCount = 0;
258
- try { const guilds = await bot.getGuilds(); guildCount = guilds?.length || 0; } catch {}
273
+ try { const guilds = await endpoint.getGuilds(); guildCount = guilds?.length || 0; } catch {}
259
274
  return {
260
- name: bot.$config.name,
261
- connected: bot.$connected || false,
275
+ name: endpoint.$config.name,
276
+ connected: endpoint.$connected || false,
262
277
  guildCount,
263
- status: bot.$connected ? "online" : "offline",
278
+ status: endpoint.$connected ? "online" : "offline",
264
279
  };
265
280
  } catch {
266
- return { name: bot.$config.name, connected: false, guildCount: 0, status: "error" };
281
+ return { name: endpoint.$config.name, connected: false, guildCount: 0, status: "error" };
267
282
  }
268
283
  }));
269
284
  ctx.body = { success: true, data: result };
270
285
  } catch {
271
286
  ctx.status = 500;
272
- ctx.body = { success: false, error: "获取机器人数据失败" };
287
+ ctx.body = { success: false, error: "获取 Endpoint 数据失败" };
273
288
  }
274
289
  });
275
290
 
276
- // Bot 连接/断开
277
- router.post("/api/qq/bots/:name/connect", async (ctx: any) => {
291
+ // Endpoint 连接/断开
292
+ router.post("/api/qq/endpoints/:name/connect", async (ctx: any) => {
278
293
  try {
279
- const bot = qq.bots.get(ctx.params.name);
280
- if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
281
- if (bot.$connected) { ctx.body = { success: true, message: "已经在线" }; return; }
282
- await bot.$connect();
294
+ const endpoint = qq.endpoints.get(ctx.params.name);
295
+ if (!endpoint) { ctx.status = 404; ctx.body = { success: false, error: "Endpoint 不存在" }; return; }
296
+ if (endpoint.$connected) { ctx.body = { success: true, message: "已经在线" }; return; }
297
+ await endpoint.$connect();
283
298
  ctx.body = { success: true, message: "连接成功" };
284
- } catch (e: any) {
299
+ } catch (e: unknown) {
285
300
  ctx.status = 500;
286
- ctx.body = { success: false, error: e?.message || "连接失败" };
301
+ ctx.body = { success: false, error: e instanceof Error ? e.message : "连接失败" };
287
302
  }
288
303
  });
289
304
 
290
- router.post("/api/qq/bots/:name/disconnect", async (ctx: any) => {
305
+ router.post("/api/qq/endpoints/:name/disconnect", async (ctx: any) => {
291
306
  try {
292
- const bot = qq.bots.get(ctx.params.name);
293
- if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
294
- if (!bot.$connected) { ctx.body = { success: true, message: "已经离线" }; return; }
295
- await bot.$disconnect();
307
+ const endpoint = qq.endpoints.get(ctx.params.name);
308
+ if (!endpoint) { ctx.status = 404; ctx.body = { success: false, error: "Endpoint 不存在" }; return; }
309
+ if (!endpoint.$connected) { ctx.body = { success: true, message: "已经离线" }; return; }
310
+ await endpoint.$disconnect();
296
311
  ctx.body = { success: true, message: "已断开" };
297
- } catch (e: any) {
312
+ } catch (e: unknown) {
298
313
  ctx.status = 500;
299
- ctx.body = { success: false, error: e?.message || "断开失败" };
314
+ ctx.body = { success: false, error: e instanceof Error ? e.message : "断开失败" };
300
315
  }
301
316
  });
302
317
 
303
- // 频道列表
304
- router.get("/api/qq/bots/:name/guilds", async (ctx: any) => {
318
+ // 频道列表(QQ 官方 API 返回 guild_id/guild_name,归一化为控制台用的 id/name)
319
+ router.get("/api/qq/endpoints/:name/guilds", async (ctx: any) => {
305
320
  try {
306
- const bot = qq.bots.get(ctx.params.name);
307
- if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
308
- if (!bot.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Bot 未连接" }; return; }
309
- const guilds = await bot.getGuilds();
310
- ctx.body = { success: true, data: guilds || [] };
311
- } catch (e: any) {
321
+ const endpoint = qq.endpoints.get(ctx.params.name);
322
+ if (!endpoint) { ctx.status = 404; ctx.body = { success: false, error: "Endpoint 不存在" }; return; }
323
+ if (!endpoint.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Endpoint 未连接" }; return; }
324
+ const raw = await endpoint.getGuilds();
325
+ const guilds = (raw || []).map((g: any) => ({
326
+ id: g.guild_id ?? g.id,
327
+ name: g.guild_name ?? g.name,
328
+ icon: g.icon,
329
+ description: g.description,
330
+ memberCount: g.member_count,
331
+ ownerId: g.owner_id,
332
+ owner: g.owner,
333
+ joinTime: g.join_time,
334
+ }));
335
+ ctx.body = { success: true, data: guilds };
336
+ } catch (e: unknown) {
312
337
  ctx.status = 500;
313
- ctx.body = { success: false, error: e?.message || "获取频道失败" };
338
+ ctx.body = { success: false, error: e instanceof Error ? e.message : "获取频道失败" };
314
339
  }
315
340
  });
316
341
 
317
- // 子频道列表
318
- router.get("/api/qq/bots/:name/guilds/:guildId/channels", async (ctx: any) => {
342
+ // 子频道列表(QQ 官方 API 返回 channel_id/channel_name,归一化为 id/name)
343
+ router.get("/api/qq/endpoints/:name/guilds/:guildId/channels", async (ctx: any) => {
319
344
  try {
320
- const bot = qq.bots.get(ctx.params.name);
321
- if (!bot) { ctx.status = 404; ctx.body = { success: false, error: "Bot 不存在" }; return; }
322
- if (!bot.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Bot 未连接" }; return; }
323
- const channels = await bot.getChannels(ctx.params.guildId);
324
- ctx.body = { success: true, data: channels || [] };
325
- } catch (e: any) {
345
+ const endpoint = qq.endpoints.get(ctx.params.name);
346
+ if (!endpoint) { ctx.status = 404; ctx.body = { success: false, error: "Endpoint 不存在" }; return; }
347
+ if (!endpoint.$connected) { ctx.status = 400; ctx.body = { success: false, error: "Endpoint 未连接" }; return; }
348
+ const raw = await endpoint.getChannels(ctx.params.guildId);
349
+ const channels = (raw || []).map((ch: any) => ({
350
+ id: ch.channel_id ?? ch.id,
351
+ name: ch.channel_name ?? ch.name,
352
+ type: ch.type,
353
+ subType: ch.sub_type,
354
+ position: ch.position,
355
+ parentId: ch.parent_id,
356
+ }));
357
+ ctx.body = { success: true, data: channels };
358
+ } catch (e: unknown) {
326
359
  ctx.status = 500;
327
- ctx.body = { success: false, error: e?.message || "获取子频道失败" };
360
+ ctx.body = { success: false, error: e instanceof Error ? e.message : "获取子频道失败" };
328
361
  }
329
362
  });
330
363
  });
@@ -0,0 +1,62 @@
1
+ /**
2
+ * QQ 官方频道 platform permit(guild/channel,非 QQ 群 group_*)
3
+ */
4
+ import type { Message } from 'zhin.js';
5
+ import { registerPlatformPermitChecker } from 'zhin.js';
6
+
7
+ const ADAPTER = 'qq';
8
+
9
+ export function platformPermit(perm: string): string {
10
+ return `platform(${ADAPTER},${perm})`;
11
+ }
12
+
13
+ /** 官方频道工厂工具:映射到 guild 语义,不用 group_* */
14
+ const FACTORY_PERM_MAP: Record<string, string> = {
15
+ group_admin: 'guild_admin',
16
+ group_owner: 'guild_owner',
17
+ };
18
+
19
+ export function qqGuildPermitResolver(logicalPerm: string): string {
20
+ return platformPermit(FACTORY_PERM_MAP[logicalPerm] ?? logicalPerm);
21
+ }
22
+
23
+ export function normalizeQqGuildSenderForPermit(input: {
24
+ roles?: string[];
25
+ isOwner?: boolean;
26
+ isAdmin?: boolean;
27
+ }): { role?: string; permissions?: string[] } {
28
+ const permissions = [...(input.roles ?? [])];
29
+ if (input.isOwner) {
30
+ permissions.push('guild_owner', 'guild_admin');
31
+ return { role: 'owner', permissions };
32
+ }
33
+ if (input.isAdmin) {
34
+ permissions.push('guild_admin');
35
+ return { role: 'admin', permissions };
36
+ }
37
+ return { role: 'member', permissions };
38
+ }
39
+
40
+ export function checkQqPlatformPermit(perm: string, message: Message<any>): boolean {
41
+ const sender = message.$sender as { role?: string; permissions?: string[] };
42
+ const permissions = sender.permissions ?? [];
43
+ const role = sender.role;
44
+ const has = (t: string) => permissions.includes(t);
45
+
46
+ switch (perm) {
47
+ case 'guild_owner':
48
+ return role === 'owner' || has('guild_owner');
49
+ case 'guild_admin':
50
+ return role === 'owner' || role === 'admin' || has('guild_admin') || has('guild_owner');
51
+ case 'manage_roles':
52
+ return role === 'owner' || has('guild_owner') || has('manage_roles');
53
+ case 'manage_channels':
54
+ return role === 'owner' || role === 'admin' || has('guild_owner') || has('guild_admin') || has('manage_channels');
55
+ default:
56
+ return false;
57
+ }
58
+ }
59
+
60
+ export function registerQqPlatformPermitChecker(): () => void {
61
+ return registerPlatformPermitChecker(ADAPTER, checkQqPlatformPermit);
62
+ }
@@ -15,7 +15,7 @@ function readDepVersion(dep: string): string {
15
15
  export const SDK_VERSION_HEADER = "x-sdk-version";
16
16
 
17
17
  /**
18
- * Composite SDK identity: Zhin adapter + underlying qq-official-bot.
18
+ * Composite SDK identity: Zhin adapter + underlying qq-official-endpoint.
19
19
  * Example: `zhin-adapter-qq/v2.0.11+qq-official-bot/v1.2.1`
20
20
  */
21
21
  export const SDK_VERSION = `zhin-adapter-qq/v${adapterPkg.version}+qq-official-bot/v${readDepVersion("qq-official-bot")}`;
package/src/types.ts CHANGED
@@ -1,16 +1,16 @@
1
1
  /**
2
2
  * QQ 官方机器人适配器类型定义
3
3
  */
4
- import type { Bot } from "qq-official-bot";
4
+ import type { Bot as QQOfficialBot } from "qq-official-bot";
5
5
  import type { ReceiverMode, ApplicationPlatform } from "qq-official-bot";
6
6
 
7
7
  export { ReceiverMode } from "qq-official-bot";
8
8
  export type { ApplicationPlatform, Intent } from "qq-official-bot";
9
9
 
10
- export type QQBotConfig<
10
+ export type QQEndpointConfig<
11
11
  T extends ReceiverMode,
12
12
  M extends ApplicationPlatform = ApplicationPlatform,
13
- > = Bot.Config<T, M> & {
13
+ > = QQOfficialBot.Config<T, M> & {
14
14
  context: "qq";
15
15
  name: string;
16
16
  data_dir?: string;
@@ -38,9 +38,9 @@ export type QQBotConfig<
38
38
  outboundMarkdown?: boolean | "auto";
39
39
  };
40
40
 
41
- export interface QQBot<
41
+ export interface QQEndpoint<
42
42
  T extends ReceiverMode,
43
43
  M extends ApplicationPlatform = ApplicationPlatform,
44
44
  > {
45
- $config: QQBotConfig<T, M>;
45
+ $config: QQEndpointConfig<T, M>;
46
46
  }
package/lib/bot.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}
package/lib/bot.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}