koishi-plugin-group-control 0.2.1 → 0.2.3

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 CHANGED
@@ -6,4 +6,4 @@ Koishi群聊自管理插件,支持自定义机器人进群消息、被踢出
6
6
 
7
7
  #### 仅支持Onebot协议
8
8
 
9
- > 使用Qwen3-Coder协助完成
9
+ > 使用 Qwen3-Coder & Gemini-3-Pro-Preview 协助完成
package/lib/index.d.ts CHANGED
@@ -49,6 +49,7 @@ export interface GroupConfig {
49
49
  export interface GroupInviteConfig {
50
50
  enabled: boolean;
51
51
  adminQQs: string[];
52
+ notificationGroupId: string;
52
53
  inviteWaitMessage: string;
53
54
  inviteRequestMessage: string;
54
55
  autoApprove: boolean;
package/lib/index.js CHANGED
@@ -54,9 +54,10 @@ var Config = import_koishi.Schema.intersect([
54
54
  import_koishi.Schema.object({
55
55
  invite: import_koishi.Schema.object({
56
56
  enabled: import_koishi.Schema.boolean().default(false).description("启用群聊邀请审核功能"),
57
- adminQQs: import_koishi.Schema.array(String).default([]).description("管理员QQ号列表,用于接收邀请审核请求"),
57
+ adminQQs: import_koishi.Schema.array(String).default([]).description("管理员QQ号列表(用于权限验证)"),
58
+ notificationGroupId: import_koishi.Schema.string().description("通知群号(可选:若填写,邀请请求将发送到此群;若不填,则发送私聊给管理员)"),
58
59
  inviteWaitMessage: import_koishi.Schema.string().default("已收到您的群聊邀请,正在等待管理员审核,请耐心等待。").description("发送给邀请者的等待审核提示消息"),
59
- inviteRequestMessage: import_koishi.Schema.string().default('收到新的群聊邀请请求:\n群名称:{groupName}\n群号:{groupId}\n邀请者:{userName} (QQ: {userId})\n\n请引用此消息回复"同意"或"拒绝"进行审核。').description("发送给管理员的邀请请求消息模板,支持变量{groupName}, {groupId}, {userName}, {userId}"),
60
+ inviteRequestMessage: import_koishi.Schema.string().default('收到新的群聊邀请请求:\n群名称:{groupName}\n群号:{groupId}\n邀请者:{userName} (QQ: {userId})\n\n请管理员引用此消息回复"同意"或"拒绝"').description("发送给管理员的邀请请求消息模板,支持变量{groupName}, {groupId}, {userName}, {userId}"),
60
61
  autoApprove: import_koishi.Schema.boolean().default(false).description("是否自动同意邀请(仅在没有指定管理员时)"),
61
62
  showDetailedLog: import_koishi.Schema.boolean().default(false).description("是否显示详细日志")
62
63
  }).description("群聊邀请审核")
@@ -141,7 +142,11 @@ function apply(ctx, config) {
141
142
  const pendingInvites = /* @__PURE__ */ new Map();
142
143
  ctx.on("guild-request", async (session) => {
143
144
  const { guildId, userId, platform } = session;
144
- const flag = session.messageId || session.flag || session.event?.flag;
145
+ const raw = session.original || session.raw || session.event?._data || {};
146
+ const flag = raw.flag || session.flag || session.messageId;
147
+ if (!flag && config.invite.showDetailedLog) {
148
+ console.warn("Group Control: 未能提取到邀请 flag,可能导致无法处理邀请。Raw event:", JSON.stringify(raw));
149
+ }
145
150
  let userName = userId;
146
151
  try {
147
152
  const userInfo = await session.bot.getUser(userId);
@@ -194,22 +199,45 @@ function apply(ctx, config) {
194
199
  // 保存flag用于后续处理请求
195
200
  });
196
201
  const requestMessage = config.invite.inviteRequestMessage.replace("{groupName}", groupName).replace("{groupId}", guildId).replace("{userName}", userName).replace("{userId}", userId);
197
- for (const adminQQ of config.invite.adminQQs) {
202
+ let requestSent = false;
203
+ if (config.invite.notificationGroupId) {
198
204
  try {
199
- const messageId = await session.bot.sendMessage(adminQQ, requestMessage, platform);
205
+ await session.bot.sendMessage(config.invite.notificationGroupId, requestMessage, platform);
206
+ requestSent = true;
200
207
  if (config.invite.showDetailedLog) {
201
- console.log(`发送群聊邀请请求给管理员 ${adminQQ}: 群号 ${guildId}, 邀请者 ${userId}`);
208
+ console.log(`发送群聊邀请请求到通知群 ${config.invite.notificationGroupId}`);
202
209
  }
203
210
  } catch (error) {
204
- console.error(`发送邀请请求给管理员 ${adminQQ} 失败:`, error);
211
+ console.error(`发送邀请请求到通知群 ${config.invite.notificationGroupId} 失败:`, error);
205
212
  }
206
213
  }
214
+ if (!config.invite.notificationGroupId) {
215
+ for (const adminQQ of config.invite.adminQQs) {
216
+ try {
217
+ await session.bot.sendMessage(adminQQ, requestMessage, platform);
218
+ requestSent = true;
219
+ if (config.invite.showDetailedLog) {
220
+ console.log(`发送群聊邀请请求给管理员 ${adminQQ}: 群号 ${guildId}, 邀请者 ${userId}`);
221
+ }
222
+ } catch (error) {
223
+ console.error(`发送邀请请求给管理员 ${adminQQ} 失败:`, error);
224
+ }
225
+ }
226
+ }
227
+ if (!requestSent && config.invite.showDetailedLog) {
228
+ console.warn("群邀请请求未发送给任何目标(未配置通知群且私聊发送失败或未配置管理员)");
229
+ }
207
230
  });
208
231
  ctx.on("message", async (session) => {
209
- const { userId, content, platform } = session;
232
+ const { userId, content, platform, guildId } = session;
210
233
  if (!config.invite.adminQQs.includes(userId)) {
211
234
  return;
212
235
  }
236
+ const isNotificationGroup = config.invite.notificationGroupId && guildId === config.invite.notificationGroupId;
237
+ const isPrivate = !guildId;
238
+ if (!isNotificationGroup && !isPrivate && config.invite.notificationGroupId) {
239
+ return;
240
+ }
213
241
  const hasQuote = session.elements.some((element) => element.type === "quote");
214
242
  if (!hasQuote) {
215
243
  return;
@@ -249,7 +277,7 @@ function apply(ctx, config) {
249
277
  if (config.invite.showDetailedLog) {
250
278
  console.log(`管理员 ${userId} 同意群聊邀请: 群号 ${inviteData.groupId}, 邀请者 ${inviteData.userId}`);
251
279
  }
252
- await session.bot.sendMessage(userId, `已同意加入群 ${inviteData.groupId}`, platform);
280
+ await session.send(`已同意加入群 ${inviteData.groupId}`);
253
281
  try {
254
282
  await session.bot.sendMessage(inviteData.userId, `您的群聊邀请已通过管理员审核,机器人已加入群聊。`, platform);
255
283
  } catch (error) {
@@ -257,7 +285,7 @@ function apply(ctx, config) {
257
285
  }
258
286
  } catch (error) {
259
287
  console.error("处理同意邀请失败:", error);
260
- await session.bot.sendMessage(userId, `处理同意邀请失败: ${error.message}`, platform);
288
+ await session.send(`处理同意邀请失败: ${error.message}`);
261
289
  }
262
290
  } else if (trimmedContent === "拒绝" || trimmedContent === "reject") {
263
291
  try {
@@ -270,7 +298,7 @@ function apply(ctx, config) {
270
298
  if (config.invite.showDetailedLog) {
271
299
  console.log(`管理员 ${userId} 拒绝群聊邀请: 群号 ${inviteData.groupId}, 邀请者 ${inviteData.userId}`);
272
300
  }
273
- await session.bot.sendMessage(userId, `已拒绝加入群 ${inviteData.groupId}`, platform);
301
+ await session.send(`已拒绝加入群 ${inviteData.groupId}`);
274
302
  try {
275
303
  await session.bot.sendMessage(inviteData.userId, `您的群聊邀请未通过管理员审核,机器人将不会加入该群聊。`, platform);
276
304
  } catch (error) {
@@ -278,7 +306,7 @@ function apply(ctx, config) {
278
306
  }
279
307
  } catch (error) {
280
308
  console.error("处理拒绝邀请失败:", error);
281
- await session.bot.sendMessage(userId, `处理拒绝邀请失败: ${error.message}`, platform);
309
+ await session.send(`处理拒绝邀请失败: ${error.message}`);
282
310
  }
283
311
  }
284
312
  pendingInvites.delete(targetInviteId);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-group-control",
3
- "description": "Koishi群聊自管理插件,支持自定义机器人进群消息、被踢出自动拉黑、刷屏自动屏蔽功能和主动退群指令。(仅支持OneBot适配器)",
4
- "version": "0.2.1",
3
+ "description": "Koishi群聊自管理插件,支持自定义机器人进群消息、被踢出自动拉黑、刷屏自动屏蔽功能和主动退群指令等。(仅支持OneBot适配器)",
4
+ "version": "0.2.3",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [