mioku-plugin-admin 2.3.5 → 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.
package/notify/welcome.ts CHANGED
@@ -1,17 +1,16 @@
1
- import { type MiokiContext, wait } from "mioki";
1
+ import { type MiokuContext, wait } from "mioku";
2
2
  import { getPluginRuntimeState, type AIService } from "mioku";
3
3
  import type { AdminConfig } from "../config";
4
4
 
5
5
  export async function resolveMemberName(
6
- ctx: MiokiContext,
6
+ ctx: MiokuContext,
7
+ bot: import("mioku").Bot | undefined,
7
8
  groupId: number,
8
9
  userId: number,
9
- selfId: number,
10
10
  ): Promise<string> {
11
11
  try {
12
- const member = await ctx
13
- .pickBot(selfId)
14
- .getGroupMemberInfo(groupId, userId);
12
+ if (!bot) return String(userId);
13
+ const member = await bot.getMemberInfo(groupId, userId);
15
14
  return (
16
15
  String(member?.card || "").trim() ||
17
16
  String(member?.nickname || "").trim() ||
@@ -43,7 +42,7 @@ function getBatchMap(): Map<string, BatchState> {
43
42
  return state[RUNTIME_KEY] as Map<string, BatchState>;
44
43
  }
45
44
 
46
- function batchKey(selfId: number, groupId: number): string {
45
+ function batchKey(selfId: string | number, groupId: number): string {
47
46
  return `${selfId}:${groupId}`;
48
47
  }
49
48
 
@@ -66,20 +65,21 @@ function normalizeGeneratedText(value: string): string {
66
65
  }
67
66
 
68
67
  async function flushBatch(options: {
69
- ctx: MiokiContext;
68
+ ctx: MiokuContext;
70
69
  aiService?: AIService;
71
70
  config: AdminConfig;
72
- selfId: number;
71
+ selfId: string | number;
73
72
  groupId: number;
74
73
  groupName: string;
75
74
  members: PendingMember[];
76
75
  promptInjections?: { content: string; title?: string }[];
76
+ bot?: import("mioku").Bot;
77
77
  tryCustomPrompt?: (info: {
78
- selfId: number;
78
+ selfId: string | number;
79
79
  groupId: number;
80
80
  userId: number;
81
81
  groupName: string;
82
- }) => Promise<boolean>;
82
+ }, bot?: import("mioku").Bot) => Promise<boolean>;
83
83
  }): Promise<string> {
84
84
  const {
85
85
  ctx,
@@ -90,6 +90,7 @@ async function flushBatch(options: {
90
90
  groupName,
91
91
  members,
92
92
  promptInjections,
93
+ bot,
93
94
  tryCustomPrompt,
94
95
  } = options;
95
96
  if (!members.length) return "";
@@ -97,12 +98,15 @@ async function flushBatch(options: {
97
98
  if (tryCustomPrompt) {
98
99
  let anyCustom = false;
99
100
  for (const m of members) {
100
- const handled = await tryCustomPrompt({
101
- selfId,
102
- groupId,
103
- userId: m.userId,
104
- groupName,
105
- });
101
+ const handled = await tryCustomPrompt(
102
+ {
103
+ selfId,
104
+ groupId,
105
+ userId: m.userId,
106
+ groupName,
107
+ },
108
+ bot,
109
+ );
106
110
  if (handled) anyCustom = true;
107
111
  }
108
112
  if (anyCustom) return "";
@@ -152,21 +156,22 @@ async function flushBatch(options: {
152
156
  }
153
157
 
154
158
  async function sendSingleWelcome(options: {
155
- ctx: MiokiContext;
159
+ ctx: MiokuContext;
156
160
  aiService?: AIService;
157
161
  config: AdminConfig;
158
- selfId: number;
162
+ selfId: string | number;
159
163
  groupId: number;
160
164
  groupName: string;
161
165
  userId: number;
162
166
  memberName: string;
163
167
  promptInjections?: { content: string; title?: string }[];
168
+ bot?: import("mioku").Bot;
164
169
  tryCustomPrompt?: (info: {
165
- selfId: number;
170
+ selfId: string | number;
166
171
  groupId: number;
167
172
  userId: number;
168
173
  groupName: string;
169
- }) => Promise<boolean>;
174
+ }, bot?: import("mioku").Bot) => Promise<boolean>;
170
175
  }): Promise<void> {
171
176
  const {
172
177
  ctx,
@@ -178,6 +183,7 @@ async function sendSingleWelcome(options: {
178
183
  userId,
179
184
  memberName,
180
185
  promptInjections,
186
+ bot,
181
187
  tryCustomPrompt,
182
188
  } = options;
183
189
  const welcomeMessage = await flushBatch({
@@ -189,42 +195,42 @@ async function sendSingleWelcome(options: {
189
195
  groupName,
190
196
  members: [{ userId, memberName }],
191
197
  promptInjections,
198
+ bot,
192
199
  tryCustomPrompt,
193
200
  });
194
201
  if (!welcomeMessage) return;
195
- const bot = ctx.pickBot(selfId);
196
202
  if (!bot) return;
197
203
  try {
198
- await bot.sendGroupMsg(groupId, [ctx.segment.text(welcomeMessage)]);
204
+ await bot.sendMessage({ type: "group", group_id: groupId}, [ctx.segment.text(welcomeMessage)]);
199
205
  } catch (error) {
200
206
  ctx.logger.warn(`发送入群欢迎失败: ${error}`);
201
207
  }
202
208
  }
203
209
 
204
210
  export async function triggerSingleWelcome(options: {
205
- ctx: MiokiContext;
211
+ ctx: MiokuContext;
206
212
  aiService?: AIService;
207
213
  getConfig: () => AdminConfig;
208
- selfId: number;
214
+ selfId: string | number;
209
215
  groupId: number;
210
216
  groupName: string;
211
217
  userId: number;
212
218
  memberName?: string;
213
219
  promptInjections?: { content: string; title?: string }[];
214
220
  tryCustomPrompt?: (info: {
215
- selfId: number;
221
+ selfId: string | number;
216
222
  groupId: number;
217
223
  userId: number;
218
224
  groupName: string;
219
- }) => Promise<boolean>;
220
- }): Promise<void> {
225
+ }, bot?: import("mioku").Bot) => Promise<boolean>;
226
+ }, bot?: import("mioku").Bot): Promise<void> {
221
227
  const memberName =
222
228
  options.memberName ||
223
229
  (await resolveMemberName(
224
230
  options.ctx,
231
+ bot,
225
232
  options.groupId,
226
233
  options.userId,
227
- options.selfId,
228
234
  ));
229
235
  await sendSingleWelcome({
230
236
  ctx: options.ctx,
@@ -236,26 +242,27 @@ export async function triggerSingleWelcome(options: {
236
242
  userId: options.userId,
237
243
  memberName,
238
244
  promptInjections: options.promptInjections,
245
+ bot,
239
246
  tryCustomPrompt: options.tryCustomPrompt,
240
247
  });
241
248
  }
242
249
 
243
250
  export function registerWelcomeHandler(
244
- ctx: MiokiContext,
251
+ ctx: MiokuContext,
245
252
  aiService: AIService | undefined,
246
253
  getConfig: () => AdminConfig,
247
254
  shouldSuppress?: (info: {
248
- selfId: number;
255
+ selfId: string | number;
249
256
  groupId: number;
250
257
  userId: number;
251
258
  groupName: string;
252
- }) => Promise<boolean> | boolean,
259
+ }, bot?: import("mioku").Bot) => Promise<boolean> | boolean,
253
260
  tryCustomPrompt?: (info: {
254
- selfId: number;
261
+ selfId: string | number;
255
262
  groupId: number;
256
263
  userId: number;
257
264
  groupName: string;
258
- }) => Promise<boolean>,
265
+ }, bot?: import("mioku").Bot) => Promise<boolean>,
259
266
  ): () => void {
260
267
  const batches = getBatchMap();
261
268
 
@@ -263,18 +270,19 @@ export function registerWelcomeHandler(
263
270
  "notice.group.increase",
264
271
  async (event) => {
265
272
  const cfg = getConfig();
266
- const selfId = Number(event?.self_id || ctx.self_id);
273
+ const bot = event.bot;
274
+ const selfId = event?.self_id || ctx.self_id || "";
267
275
  const groupId = Number(event?.group_id || 0);
268
276
  const userId = Number(event?.user_id || 0);
269
277
  if (!groupId || !userId) return;
270
- if (userId === selfId) return;
278
+ if (selfId != null && String(userId) === String(selfId)) return;
271
279
 
272
280
  const groupName =
273
- String(event?.group?.group_name || "").trim() || String(groupId);
281
+ String((event.raw as { group_name?: string } | undefined)?.group_name || "").trim() || String(groupId);
274
282
 
275
283
  if (
276
284
  shouldSuppress &&
277
- (await shouldSuppress({ selfId, groupId, userId, groupName }))
285
+ (await shouldSuppress({ selfId, groupId, userId, groupName }, bot))
278
286
  ) {
279
287
  return;
280
288
  }
@@ -286,9 +294,9 @@ export function registerWelcomeHandler(
286
294
  if (batchWindowMs === 0) {
287
295
  const memberName = await resolveMemberName(
288
296
  ctx,
297
+ bot,
289
298
  groupId,
290
299
  userId,
291
- selfId,
292
300
  );
293
301
  const welcomeMessage = await flushBatch({
294
302
  ctx,
@@ -298,12 +306,12 @@ export function registerWelcomeHandler(
298
306
  groupId,
299
307
  groupName,
300
308
  members: [{ userId, memberName }],
309
+ bot,
301
310
  });
302
311
  if (!welcomeMessage) return;
303
- const bot = ctx.pickBot(selfId);
304
312
  if (!bot) return;
305
313
  try {
306
- await bot.sendGroupMsg(groupId, [ctx.segment.text(welcomeMessage)]);
314
+ await bot.sendMessage({ type: "group", group_id: groupId}, [ctx.segment.text(welcomeMessage)]);
307
315
  } catch (error) {
308
316
  ctx.logger.warn(`发送入群欢迎失败: ${error}`);
309
317
  }
@@ -320,7 +328,7 @@ export function registerWelcomeHandler(
320
328
  state.groupName = groupName;
321
329
  }
322
330
 
323
- const memberName = await resolveMemberName(ctx, groupId, userId, selfId);
331
+ const memberName = await resolveMemberName(ctx, bot, groupId, userId);
324
332
  if (!state.members.some((m) => m.userId === userId)) {
325
333
  state.members.push({ userId, memberName });
326
334
  }
@@ -344,14 +352,14 @@ export function registerWelcomeHandler(
344
352
  groupId,
345
353
  groupName: pending.groupName,
346
354
  members: pending.members,
355
+ bot,
347
356
  tryCustomPrompt,
348
357
  });
349
358
  if (!welcomeMessage) return;
350
359
 
351
- const bot = ctx.pickBot(selfId);
352
360
  if (!bot) return;
353
361
  try {
354
- await bot.sendGroupMsg(groupId, [ctx.segment.text(welcomeMessage)]);
362
+ await bot.sendMessage({ type: "group", group_id: groupId}, [ctx.segment.text(welcomeMessage)]);
355
363
  } catch (error) {
356
364
  ctx.logger.warn(`发送入群欢迎失败: ${error}`);
357
365
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mioku-plugin-admin",
3
- "version": "2.3.5",
3
+ "version": "3.0.1",
4
4
  "description": "管理插件,提供事件通知与群管/个人管理指令",
5
5
  "main": "index.ts",
6
6
  "type": "module",
@@ -12,294 +12,15 @@
12
12
  "url": "https://github.com/mioku-lab/mioku-plugin-admin.git"
13
13
  },
14
14
  "peerDependencies": {
15
- "mioku": "^0.8.0",
16
- "mioki": "^0.16.0"
15
+ "mioku": "^1.0.0"
17
16
  },
18
17
  "devDependencies": {
19
- "mioku": "workspace:*",
20
- "mioki": "^0.16.0"
18
+ "mioku": "workspace:*"
21
19
  },
22
20
  "mioku": {
23
21
  "services": [
24
22
  "config",
25
23
  "ai"
26
- ],
27
- "accessHooks": [
28
- {
29
- "id": "/改头像",
30
- "match": "/^\\/改头像/"
31
- },
32
- {
33
- "id": "/改昵称",
34
- "match": "/^\\/改昵称/"
35
- },
36
- {
37
- "id": "/改签名",
38
- "match": "/^\\/改签名/"
39
- },
40
- {
41
- "id": "/改性别",
42
- "match": "/^\\/改性别/"
43
- },
44
- {
45
- "id": "/改群名片",
46
- "match": "/^\\/改群名片/"
47
- },
48
- {
49
- "id": "/改群昵称",
50
- "match": "/^\\/改群昵称/"
51
- },
52
- {
53
- "id": "/改群头像",
54
- "match": "/^\\/改群头像/"
55
- },
56
- {
57
- "id": "/撤回",
58
- "match": "/^(\\/撤回|撤回)/"
59
- },
60
- {
61
- "id": "/改头衔",
62
- "match": "/^\\/改头衔/"
63
- },
64
- {
65
- "id": "我要头衔",
66
- "match": "/^我要头衔/"
67
- },
68
- {
69
- "id": "/踢",
70
- "match": "/^\\/踢/"
71
- },
72
- {
73
- "id": "/禁言",
74
- "match": "/^\\/禁言/"
75
- },
76
- {
77
- "id": "/解禁",
78
- "match": "/^\\/解禁/"
79
- },
80
- {
81
- "id": "/设管理",
82
- "match": "/^\\/设管理/"
83
- },
84
- {
85
- "id": "/全体禁言",
86
- "match": "/^\\/全体禁言/"
87
- },
88
- {
89
- "id": "/全体解禁",
90
- "match": "/^\\/全体解禁/"
91
- },
92
- {
93
- "id": "/删好友",
94
- "match": "/^\\/删好友/"
95
- },
96
- {
97
- "id": "/退群",
98
- "match": "/^\\/退群/"
99
- },
100
- {
101
- "id": "/发好友",
102
- "match": "/^\\/发好友/"
103
- },
104
- {
105
- "id": "/发群聊",
106
- "match": "/^\\/发群聊/"
107
- },
108
- {
109
- "id": "/全部好友",
110
- "match": "/^\\/全部好友/"
111
- },
112
- {
113
- "id": "/全部群聊",
114
- "match": "/^\\/全部群聊/"
115
- },
116
- {
117
- "id": "welcome",
118
- "event": "notice.group.increase",
119
- "description": "新人入群相关功能"
120
- },
121
- {
122
- "id": "/开启验证",
123
- "match": "/^[/#]开启验证$/"
124
- },
125
- {
126
- "id": "/关闭验证",
127
- "match": "/^[/#]关闭验证$/"
128
- },
129
- {
130
- "id": "/切换验证模式",
131
- "match": "/^[/#]切换验证模式/"
132
- },
133
- {
134
- "id": "/绕过验证",
135
- "match": "/^[/#]绕过验证/"
136
- },
137
- {
138
- "id": "/重新验证",
139
- "match": "/^[/#]重新验证/"
140
- },
141
- {
142
- "id": "/入群提示",
143
- "match": "/^[/#]入群提示/"
144
- }
145
- ],
146
- "help": {
147
- "title": "管理",
148
- "description": "Bot管理插件,提供事件通知与管理指令",
149
- "commands": [
150
- {
151
- "cmd": "/改头像",
152
- "desc": "修改Bot头像",
153
- "role": "master"
154
- },
155
- {
156
- "cmd": "/改昵称",
157
- "desc": "修改Bot昵称",
158
- "role": "master"
159
- },
160
- {
161
- "cmd": "/改签名",
162
- "desc": "修改Bot个性签名",
163
- "role": "master"
164
- },
165
- {
166
- "cmd": "/改性别",
167
- "desc": "修改Bot性别",
168
- "role": "master"
169
- },
170
- {
171
- "cmd": "/改群名片",
172
- "desc": "修改Bot在群里的名片",
173
- "role": "admin"
174
- },
175
- {
176
- "cmd": "/改群昵称",
177
- "desc": "修改群聊名称",
178
- "role": "admin"
179
- },
180
- {
181
- "cmd": "/改群头像",
182
- "desc": "修改群头像",
183
- "role": "admin"
184
- },
185
- {
186
- "cmd": "/撤回",
187
- "desc": "撤回别人的消息",
188
- "usage": "引用一条消息后输入 /撤回",
189
- "role": "admin"
190
- },
191
- {
192
- "cmd": "/改头衔",
193
- "desc": "设置群成员专属头衔",
194
- "usage": "/改头衔 qq号或@人 头衔",
195
- "role": "admin"
196
- },
197
- {
198
- "cmd": "我要头衔",
199
- "desc": "普通群员给自己设置专属头衔",
200
- "usage": "我要头衔 头衔内容",
201
- "role": "member"
202
- },
203
- {
204
- "cmd": "/踢",
205
- "desc": "踢出群成员",
206
- "role": "admin"
207
- },
208
- {
209
- "cmd": "/禁言",
210
- "desc": "禁言群成员(支持分钟/小时/天)",
211
- "usage": "/禁言 @人 10分钟",
212
- "role": "admin"
213
- },
214
- {
215
- "cmd": "/解禁",
216
- "desc": "解除群成员禁言",
217
- "role": "admin"
218
- },
219
- {
220
- "cmd": "/设管理",
221
- "desc": "设置群管理员",
222
- "role": "admin"
223
- },
224
- {
225
- "cmd": "/全体禁言",
226
- "desc": "开启全体禁言",
227
- "role": "admin"
228
- },
229
- {
230
- "cmd": "/全体解禁",
231
- "desc": "关闭全体禁言",
232
- "role": "admin"
233
- },
234
- {
235
- "cmd": "/删好友",
236
- "desc": "删除好友",
237
- "usage": "/删好友 qq号",
238
- "role": "master"
239
- },
240
- {
241
- "cmd": "/退群",
242
- "desc": "退出群聊",
243
- "usage": "/退群 群号",
244
- "role": "master"
245
- },
246
- {
247
- "cmd": "/发好友",
248
- "desc": "给好友发送私聊消息",
249
- "usage": "/发好友 qq号 内容",
250
- "role": "master"
251
- },
252
- {
253
- "cmd": "/发群聊",
254
- "desc": "给群聊发送消息",
255
- "usage": "/发群聊 群号 内容",
256
- "role": "master"
257
- },
258
- {
259
- "cmd": "/全部好友",
260
- "desc": "获取全部好友列表",
261
- "role": "master"
262
- },
263
- {
264
- "cmd": "/全部群聊",
265
- "desc": "获取全部群聊列表",
266
- "role": "master"
267
- },
268
- {
269
- "cmd": "/开启验证",
270
- "desc": "开启本群入群验证",
271
- "role": "admin"
272
- },
273
- {
274
- "cmd": "/关闭验证",
275
- "desc": "关闭本群入群验证",
276
- "role": "admin"
277
- },
278
- {
279
- "cmd": "/切换验证模式",
280
- "desc": "切换验证模式:回应/数字/手性碳",
281
- "usage": "/切换验证模式 回应",
282
- "role": "admin"
283
- },
284
- {
285
- "cmd": "/绕过验证",
286
- "desc": "绕过指定新成员的验证直接欢迎",
287
- "usage": "/绕过验证 @新成员",
288
- "role": "admin"
289
- },
290
- {
291
- "cmd": "/重新验证",
292
- "desc": "让指定成员重新进行入群验证",
293
- "usage": "/重新验证 @成员",
294
- "role": "admin"
295
- },
296
- {
297
- "cmd": "/入群提示",
298
- "desc": "设置本群自定义入群提示,可附带文字+图片",
299
- "usage": "/入群提示 xxx;/入群提示 关闭",
300
- "role": "admin"
301
- }
302
- ]
303
- }
24
+ ]
304
25
  }
305
26
  }