koishi-plugin-bind-bot 2.1.1 → 2.1.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/lib/export-utils.js +13 -6
- package/lib/force-bind-utils.js +12 -8
- package/lib/handlers/binding.handler.js +63 -27
- package/lib/handlers/buid.handler.js +102 -45
- package/lib/handlers/group-request-review.handler.d.ts +97 -0
- package/lib/handlers/group-request-review.handler.js +582 -0
- package/lib/handlers/index.d.ts +1 -0
- package/lib/handlers/index.js +1 -0
- package/lib/handlers/lottery.handler.js +11 -9
- package/lib/handlers/mcid.handler.js +197 -86
- package/lib/handlers/tag.handler.js +86 -31
- package/lib/handlers/whitelist.handler.js +252 -77
- package/lib/index.js +282 -142
- package/lib/repositories/mcidbind.repository.js +2 -2
- package/lib/repositories/schedule-mute.repository.js +2 -2
- package/lib/services/api.service.js +27 -23
- package/lib/services/database.service.js +16 -14
- package/lib/services/nickname.service.js +12 -16
- package/lib/types/api.d.ts +90 -0
- package/lib/types/common.d.ts +45 -0
- package/lib/types/config.d.ts +88 -0
- package/lib/types/database.d.ts +50 -0
- package/lib/types/update-data.d.ts +83 -0
- package/lib/utils/error-utils.js +7 -8
- package/lib/utils/helpers.js +45 -7
- package/lib/utils/message-utils.js +36 -23
- package/lib/utils/session-manager.js +6 -1
- package/package.json +12 -2
|
@@ -10,40 +10,52 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
10
10
|
register() {
|
|
11
11
|
const cmd = this.ctx.command('mcid', 'MC账号绑定管理');
|
|
12
12
|
// mcid.query - 查询MC账号
|
|
13
|
-
cmd
|
|
13
|
+
cmd
|
|
14
|
+
.subcommand('.query [target:string]', '查询用户绑定的MC账号')
|
|
14
15
|
.action(async ({ session }, target) => this.handleQuery(session, target));
|
|
15
16
|
// mcid.finduser - 通过MC用户名查询QQ号
|
|
16
|
-
cmd
|
|
17
|
+
cmd
|
|
18
|
+
.subcommand('.finduser <username:string>', '[管理员]通过MC用户名查询绑定的QQ账号')
|
|
17
19
|
.action(async ({ session }, username) => this.handleFindUser(session, username));
|
|
18
20
|
// mcid.bind - 绑定MC账号
|
|
19
|
-
cmd
|
|
21
|
+
cmd
|
|
22
|
+
.subcommand('.bind <username:string> [target:string]', '绑定MC账号')
|
|
20
23
|
.action(async ({ session }, username, target) => this.handleBind(session, username, target));
|
|
21
24
|
// mcid.change - 修改MC账号
|
|
22
|
-
cmd
|
|
25
|
+
cmd
|
|
26
|
+
.subcommand('.change <username:string> [target:string]', '修改绑定的MC账号')
|
|
23
27
|
.action(async ({ session }, username, target) => this.handleChange(session, username, target));
|
|
24
28
|
// mcid.unbind - 解绑MC账号
|
|
25
|
-
cmd
|
|
29
|
+
cmd
|
|
30
|
+
.subcommand('.unbind [target:string]', '[管理员]解绑MC账号')
|
|
26
31
|
.action(async ({ session }, target) => this.handleUnbind(session, target));
|
|
27
32
|
// mcid.admin - 设置管理员
|
|
28
|
-
cmd
|
|
33
|
+
cmd
|
|
34
|
+
.subcommand('.admin <target:string>', '[主人]将用户设为管理员')
|
|
29
35
|
.action(async ({ session }, target) => this.handleAdmin(session, target));
|
|
30
36
|
// mcid.unadmin - 撤销管理员
|
|
31
|
-
cmd
|
|
37
|
+
cmd
|
|
38
|
+
.subcommand('.unadmin <target:string>', '[主人]撤销用户的管理员权限')
|
|
32
39
|
.action(async ({ session }, target) => this.handleUnadmin(session, target));
|
|
33
40
|
// mcid.adminlist - 列出所有管理员
|
|
34
|
-
cmd
|
|
41
|
+
cmd
|
|
42
|
+
.subcommand('.adminlist', '[主人]列出所有管理员')
|
|
35
43
|
.action(async ({ session }) => this.handleAdminlist(session));
|
|
36
44
|
// mcid.stats - 查看统计
|
|
37
|
-
cmd
|
|
45
|
+
cmd
|
|
46
|
+
.subcommand('.stats', '[管理员]查看数据库统计信息')
|
|
38
47
|
.action(async ({ session }) => this.handleStats(session));
|
|
39
48
|
// mcid.fixnicknames - 修复群昵称
|
|
40
|
-
cmd
|
|
49
|
+
cmd
|
|
50
|
+
.subcommand('.fixnicknames [groupId:string]', '[管理员]检查并修复指定群或当前群的用户群昵称格式')
|
|
41
51
|
.action(async ({ session }, groupId) => this.handleFixNicknames(session, groupId));
|
|
42
52
|
// mcid.clearreminder - 清除提醒
|
|
43
|
-
cmd
|
|
53
|
+
cmd
|
|
54
|
+
.subcommand('.clearreminder [target:string]', '[管理员]清除用户的随机提醒冷却时间和提醒次数')
|
|
44
55
|
.action(async ({ session }, target) => this.handleClearReminder(session, target));
|
|
45
56
|
// mcid.export - 导出数据
|
|
46
|
-
cmd
|
|
57
|
+
cmd
|
|
58
|
+
.subcommand('.export <groupId:string>', '[管理员]导出指定群的成员和绑定信息为Excel文件')
|
|
47
59
|
.action(async ({ session }, groupId) => this.handleExport(session, groupId));
|
|
48
60
|
}
|
|
49
61
|
/**
|
|
@@ -58,9 +70,13 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
58
70
|
if (!normalizedTargetId) {
|
|
59
71
|
this.logger.warn('查询', `QQ(${normalizedUserId})提供的目标用户ID"${target}"无效`);
|
|
60
72
|
if (target.startsWith('@')) {
|
|
61
|
-
return this.deps.sendMessage(session, [
|
|
73
|
+
return this.deps.sendMessage(session, [
|
|
74
|
+
koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')
|
|
75
|
+
]);
|
|
62
76
|
}
|
|
63
|
-
return this.deps.sendMessage(session, [
|
|
77
|
+
return this.deps.sendMessage(session, [
|
|
78
|
+
koishi_1.h.text('❌ 目标用户ID无效\n请提供有效的QQ号或使用@功能选择用户')
|
|
79
|
+
]);
|
|
64
80
|
}
|
|
65
81
|
this.logger.info('查询', `QQ(${normalizedUserId})查询QQ(${normalizedTargetId})的MC账号信息`);
|
|
66
82
|
const targetBind = await this.deps.databaseService.getMcBindByQQId(normalizedTargetId);
|
|
@@ -76,7 +92,8 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
76
92
|
let buidInfo = `该用户尚未绑定MC账号\n\nB站账号信息:\nB站UID: ${refreshedBind.buidUid}\n用户名: ${refreshedBind.buidUsername}`;
|
|
77
93
|
if (refreshedBind.guardLevel > 0) {
|
|
78
94
|
buidInfo += `\n舰长等级: ${refreshedBind.guardLevelText} (${refreshedBind.guardLevel})`;
|
|
79
|
-
if (refreshedBind.maxGuardLevel > 0 &&
|
|
95
|
+
if (refreshedBind.maxGuardLevel > 0 &&
|
|
96
|
+
refreshedBind.maxGuardLevel < refreshedBind.guardLevel) {
|
|
80
97
|
buidInfo += `\n历史最高: ${refreshedBind.maxGuardLevelText} (${refreshedBind.maxGuardLevel})`;
|
|
81
98
|
}
|
|
82
99
|
}
|
|
@@ -115,7 +132,8 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
115
132
|
let buidInfo = `您尚未绑定MC账号\n\nB站账号信息:\nB站UID: ${refreshedBind.buidUid}\n用户名: ${refreshedBind.buidUsername}`;
|
|
116
133
|
if (refreshedBind.guardLevel > 0) {
|
|
117
134
|
buidInfo += `\n舰长等级: ${refreshedBind.guardLevelText} (${refreshedBind.guardLevel})`;
|
|
118
|
-
if (refreshedBind.maxGuardLevel > 0 &&
|
|
135
|
+
if (refreshedBind.maxGuardLevel > 0 &&
|
|
136
|
+
refreshedBind.maxGuardLevel < refreshedBind.guardLevel) {
|
|
119
137
|
buidInfo += `\n历史最高: ${refreshedBind.maxGuardLevelText} (${refreshedBind.maxGuardLevel})`;
|
|
120
138
|
}
|
|
121
139
|
}
|
|
@@ -134,7 +152,11 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
134
152
|
}
|
|
135
153
|
}
|
|
136
154
|
}
|
|
137
|
-
return this.deps.sendMessage(session, [
|
|
155
|
+
return this.deps.sendMessage(session, [
|
|
156
|
+
koishi_1.h.text('您尚未绑定MC账号,请使用 ' +
|
|
157
|
+
this.deps.formatCommand('mcid bind <用户名>') +
|
|
158
|
+
' 进行绑定')
|
|
159
|
+
]);
|
|
138
160
|
}
|
|
139
161
|
// 使用智能缓存检测,避免频繁API调用
|
|
140
162
|
const updatedBind = await this.deps.databaseService.checkAndUpdateUsernameWithCache(selfBind);
|
|
@@ -165,14 +187,15 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
165
187
|
let whitelistInfo = '';
|
|
166
188
|
if (bind.whitelist && bind.whitelist.length > 0) {
|
|
167
189
|
const circledNumbers = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩'];
|
|
168
|
-
const serverList = bind.whitelist
|
|
190
|
+
const serverList = bind.whitelist
|
|
191
|
+
.map((serverId, index) => {
|
|
169
192
|
const server = this.deps.getServerConfigById(serverId);
|
|
170
193
|
if (!server) {
|
|
171
194
|
const disabledServer = this.config.servers?.find(s => s.id === serverId);
|
|
172
195
|
if (disabledServer && disabledServer.enabled === false) {
|
|
173
|
-
return `${index < circledNumbers.length ? circledNumbers[index] :
|
|
196
|
+
return `${index < circledNumbers.length ? circledNumbers[index] : index + 1} ${disabledServer.name} [已停用]`;
|
|
174
197
|
}
|
|
175
|
-
return `${index < circledNumbers.length ? circledNumbers[index] :
|
|
198
|
+
return `${index < circledNumbers.length ? circledNumbers[index] : index + 1} 未知服务器(ID: ${serverId})`;
|
|
176
199
|
}
|
|
177
200
|
const circledNumber = index < circledNumbers.length ? circledNumbers[index] : `${index + 1}`;
|
|
178
201
|
let info = `${circledNumber} ${server.name}`;
|
|
@@ -180,7 +203,8 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
180
203
|
info += `\n 地址: ${server.displayAddress}`;
|
|
181
204
|
}
|
|
182
205
|
return info;
|
|
183
|
-
})
|
|
206
|
+
})
|
|
207
|
+
.join('\n');
|
|
184
208
|
whitelistInfo = `\n已加入以下服务器的白名单:\n${serverList}`;
|
|
185
209
|
}
|
|
186
210
|
else {
|
|
@@ -208,7 +232,9 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
208
232
|
}
|
|
209
233
|
}
|
|
210
234
|
else {
|
|
211
|
-
buidInfo = targetId
|
|
235
|
+
buidInfo = targetId
|
|
236
|
+
? '该用户尚未绑定B站账号'
|
|
237
|
+
: `您尚未绑定B站账号,使用 ${this.deps.formatCommand('buid bind <B站UID>')} 进行绑定`;
|
|
212
238
|
}
|
|
213
239
|
this.logger.info('查询', `QQ(${bind.qqId})的MC账号信息:用户名=${bind.mcUsername}, UUID=${bind.mcUuid}`);
|
|
214
240
|
const displayUsername = bind.mcUsername && !bind.mcUsername.startsWith('_temp_') ? bind.mcUsername : '未绑定';
|
|
@@ -224,7 +250,8 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
224
250
|
// 异步设置群昵称
|
|
225
251
|
if (bind.buidUid && bind.buidUsername) {
|
|
226
252
|
const mcName = bind.mcUsername && !bind.mcUsername.startsWith('_temp_') ? bind.mcUsername : null;
|
|
227
|
-
this.deps.nicknameService
|
|
253
|
+
this.deps.nicknameService
|
|
254
|
+
.autoSetGroupNickname(session, mcName, bind.buidUsername, bind.buidUid, targetId || undefined)
|
|
228
255
|
.catch(err => this.logger.warn('查询', `群昵称设置失败: ${err.message}`));
|
|
229
256
|
}
|
|
230
257
|
else {
|
|
@@ -239,7 +266,7 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
239
266
|
try {
|
|
240
267
|
const normalizedUserId = this.deps.normalizeQQId(session.userId);
|
|
241
268
|
// 检查权限
|
|
242
|
-
if (!await this.deps.isAdmin(session.userId)) {
|
|
269
|
+
if (!(await this.deps.isAdmin(session.userId))) {
|
|
243
270
|
this.logger.warn('反向查询', `权限不足: QQ(${normalizedUserId})不是管理员`);
|
|
244
271
|
return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能使用此命令')]);
|
|
245
272
|
}
|
|
@@ -268,10 +295,12 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
268
295
|
let adminInfo = '';
|
|
269
296
|
if (await this.deps.isAdmin(session.userId)) {
|
|
270
297
|
if (bind.whitelist && bind.whitelist.length > 0) {
|
|
271
|
-
const serverList = bind.whitelist
|
|
298
|
+
const serverList = bind.whitelist
|
|
299
|
+
.map(serverId => {
|
|
272
300
|
const server = this.deps.getServerConfigById(serverId);
|
|
273
301
|
return server ? server.name : `未知服务器(${serverId})`;
|
|
274
|
-
})
|
|
302
|
+
})
|
|
303
|
+
.join('\n- ');
|
|
275
304
|
adminInfo = `\n\n白名单服务器:\n- ${serverList}`;
|
|
276
305
|
}
|
|
277
306
|
else {
|
|
@@ -302,13 +331,17 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
302
331
|
// 检查用户名格式
|
|
303
332
|
if (!username || !/^[a-zA-Z0-9_]{3,16}$/.test(username)) {
|
|
304
333
|
this.logger.warn('绑定', `QQ(${normalizedUserId})提供的用户名"${username}"格式无效`);
|
|
305
|
-
return this.deps.sendMessage(session, [
|
|
334
|
+
return this.deps.sendMessage(session, [
|
|
335
|
+
koishi_1.h.text('请提供有效的Minecraft用户名(3-16位字母、数字、下划线)')
|
|
336
|
+
]);
|
|
306
337
|
}
|
|
307
338
|
// 验证用户名是否存在
|
|
308
339
|
const profile = await this.deps.apiService.validateUsername(username);
|
|
309
340
|
if (!profile) {
|
|
310
341
|
this.logger.warn('绑定', `QQ(${normalizedUserId})提供的用户名"${username}"不存在`);
|
|
311
|
-
return this.deps.sendMessage(session, [
|
|
342
|
+
return this.deps.sendMessage(session, [
|
|
343
|
+
koishi_1.h.text(`无法验证用户名: ${username},该用户可能不存在`)
|
|
344
|
+
]);
|
|
312
345
|
}
|
|
313
346
|
username = profile.name;
|
|
314
347
|
const uuid = profile.id;
|
|
@@ -330,13 +363,17 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
330
363
|
if (!normalizedTargetId) {
|
|
331
364
|
this.logger.warn('绑定', `QQ(${operatorId})提供的目标用户ID"${target}"无效`);
|
|
332
365
|
if (target.startsWith('@')) {
|
|
333
|
-
return this.deps.sendMessage(session, [
|
|
366
|
+
return this.deps.sendMessage(session, [
|
|
367
|
+
koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')
|
|
368
|
+
]);
|
|
334
369
|
}
|
|
335
|
-
return this.deps.sendMessage(session, [
|
|
370
|
+
return this.deps.sendMessage(session, [
|
|
371
|
+
koishi_1.h.text('❌ 目标用户ID无效\n请提供有效的QQ号或使用@功能选择用户')
|
|
372
|
+
]);
|
|
336
373
|
}
|
|
337
374
|
this.logger.debug('绑定', `QQ(${operatorId})尝试为QQ(${normalizedTargetId})绑定MC账号: ${username}(${uuid})`);
|
|
338
375
|
// 检查权限
|
|
339
|
-
if (!await this.deps.isAdmin(session.userId)) {
|
|
376
|
+
if (!(await this.deps.isAdmin(session.userId))) {
|
|
340
377
|
this.logger.warn('绑定', `权限不足: QQ(${operatorId})不是管理员`);
|
|
341
378
|
return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能为其他用户绑定MC账号')]);
|
|
342
379
|
}
|
|
@@ -349,7 +386,9 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
349
386
|
const bindResult = await this.deps.databaseService.createOrUpdateMcBind(target, username, uuid);
|
|
350
387
|
if (!bindResult) {
|
|
351
388
|
this.logger.error('绑定', `管理员QQ(${operatorId})为QQ(${normalizedTargetId})绑定MC账号"${username}"失败`);
|
|
352
|
-
return this.deps.sendMessage(session, [
|
|
389
|
+
return this.deps.sendMessage(session, [
|
|
390
|
+
koishi_1.h.text(`为用户 ${normalizedTargetId} 绑定MC账号失败: 数据库操作出错,请联系管理员`)
|
|
391
|
+
]);
|
|
353
392
|
}
|
|
354
393
|
this.logger.info('绑定', `成功: 管理员QQ(${operatorId})为QQ(${normalizedTargetId})绑定MC账号: ${username}(${uuid})`);
|
|
355
394
|
// 清理绑定会话
|
|
@@ -396,19 +435,32 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
396
435
|
const isTempUsername = selfBind.mcUsername.startsWith('_temp_');
|
|
397
436
|
if (!isTempUsername) {
|
|
398
437
|
// 检查冷却时间
|
|
399
|
-
if (!await this.deps.isAdmin(session.userId) &&
|
|
438
|
+
if (!(await this.deps.isAdmin(session.userId)) &&
|
|
439
|
+
!this.deps.checkCooldown(selfBind.lastModified)) {
|
|
400
440
|
const days = this.config.cooldownDays;
|
|
401
441
|
const now = new Date();
|
|
402
442
|
const diffTime = now.getTime() - selfBind.lastModified.getTime();
|
|
403
443
|
const passedDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
|
|
404
444
|
const remainingDays = days - passedDays;
|
|
405
445
|
this.logger.warn('绑定', `QQ(${operatorId})已绑定MC账号"${selfBind.mcUsername}",且在冷却期内`);
|
|
406
|
-
const displayUsername = selfBind.mcUsername && !selfBind.mcUsername.startsWith('_temp_')
|
|
407
|
-
|
|
446
|
+
const displayUsername = selfBind.mcUsername && !selfBind.mcUsername.startsWith('_temp_')
|
|
447
|
+
? selfBind.mcUsername
|
|
448
|
+
: '未绑定';
|
|
449
|
+
return this.deps.sendMessage(session, [
|
|
450
|
+
koishi_1.h.text(`您已绑定MC账号: ${displayUsername},如需修改,请在冷却期结束后(还需${remainingDays}天)使用 ` +
|
|
451
|
+
this.deps.formatCommand('mcid change') +
|
|
452
|
+
' 命令或联系管理员。')
|
|
453
|
+
]);
|
|
408
454
|
}
|
|
409
455
|
this.logger.debug('绑定', `QQ(${operatorId})已绑定MC账号"${selfBind.mcUsername}",建议使用change命令`);
|
|
410
|
-
const displayUsername = selfBind.mcUsername && !selfBind.mcUsername.startsWith('_temp_')
|
|
411
|
-
|
|
456
|
+
const displayUsername = selfBind.mcUsername && !selfBind.mcUsername.startsWith('_temp_')
|
|
457
|
+
? selfBind.mcUsername
|
|
458
|
+
: '未绑定';
|
|
459
|
+
return this.deps.sendMessage(session, [
|
|
460
|
+
koishi_1.h.text(`您已绑定MC账号: ${displayUsername},如需修改请使用 ` +
|
|
461
|
+
this.deps.formatCommand('mcid change') +
|
|
462
|
+
' 命令。')
|
|
463
|
+
]);
|
|
412
464
|
}
|
|
413
465
|
else {
|
|
414
466
|
this.logger.debug('绑定', `QQ(${operatorId})之前绑定的是临时用户名"${selfBind.mcUsername}",允许直接使用bind命令`);
|
|
@@ -467,13 +519,17 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
467
519
|
// 检查用户名格式
|
|
468
520
|
if (!username || !/^[a-zA-Z0-9_]{3,16}$/.test(username)) {
|
|
469
521
|
this.logger.warn('修改', `QQ(${normalizedUserId})提供的用户名"${username}"格式无效`);
|
|
470
|
-
return this.deps.sendMessage(session, [
|
|
522
|
+
return this.deps.sendMessage(session, [
|
|
523
|
+
koishi_1.h.text('请提供有效的Minecraft用户名(3-16位字母、数字、下划线)')
|
|
524
|
+
]);
|
|
471
525
|
}
|
|
472
526
|
// 验证用户名是否存在
|
|
473
527
|
const profile = await this.deps.apiService.validateUsername(username);
|
|
474
528
|
if (!profile) {
|
|
475
529
|
this.logger.warn('修改', `QQ(${normalizedUserId})提供的用户名"${username}"不存在`);
|
|
476
|
-
return this.deps.sendMessage(session, [
|
|
530
|
+
return this.deps.sendMessage(session, [
|
|
531
|
+
koishi_1.h.text(`无法验证用户名: ${username},该用户可能不存在`)
|
|
532
|
+
]);
|
|
477
533
|
}
|
|
478
534
|
username = profile.name;
|
|
479
535
|
const uuid = profile.id;
|
|
@@ -495,13 +551,17 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
495
551
|
if (!normalizedTargetId) {
|
|
496
552
|
this.logger.warn('修改', `QQ(${operatorId})提供的目标用户ID"${target}"无效`);
|
|
497
553
|
if (target.startsWith('@')) {
|
|
498
|
-
return this.deps.sendMessage(session, [
|
|
554
|
+
return this.deps.sendMessage(session, [
|
|
555
|
+
koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')
|
|
556
|
+
]);
|
|
499
557
|
}
|
|
500
|
-
return this.deps.sendMessage(session, [
|
|
558
|
+
return this.deps.sendMessage(session, [
|
|
559
|
+
koishi_1.h.text('❌ 目标用户ID无效\n请提供有效的QQ号或使用@功能选择用户')
|
|
560
|
+
]);
|
|
501
561
|
}
|
|
502
562
|
this.logger.info('修改', `QQ(${operatorId})尝试修改QQ(${normalizedTargetId})的MC账号为: ${username}(${uuid})`);
|
|
503
563
|
// 检查权限
|
|
504
|
-
if (!await this.deps.isAdmin(session.userId)) {
|
|
564
|
+
if (!(await this.deps.isAdmin(session.userId))) {
|
|
505
565
|
this.logger.warn('修改', `权限不足: QQ(${operatorId})不是管理员`);
|
|
506
566
|
return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能修改其他用户的MC账号')]);
|
|
507
567
|
}
|
|
@@ -509,12 +569,18 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
509
569
|
const targetBind = await this.deps.databaseService.getMcBindByQQId(normalizedTargetId);
|
|
510
570
|
if (!targetBind || !targetBind.mcUsername) {
|
|
511
571
|
this.logger.warn('修改', `QQ(${normalizedTargetId})尚未绑定MC账号`);
|
|
512
|
-
return this.deps.sendMessage(session, [
|
|
572
|
+
return this.deps.sendMessage(session, [
|
|
573
|
+
koishi_1.h.text(`用户 ${normalizedTargetId} 尚未绑定MC账号,请先使用 ` +
|
|
574
|
+
this.deps.formatCommand('mcid bind') +
|
|
575
|
+
' 命令进行绑定')
|
|
576
|
+
]);
|
|
513
577
|
}
|
|
514
578
|
// 检查是否与当前用户名相同
|
|
515
579
|
if (targetBind.mcUsername === username) {
|
|
516
580
|
this.logger.warn('修改', `QQ(${normalizedTargetId})已绑定相同的MC账号"${username}"`);
|
|
517
|
-
return this.deps.sendMessage(session, [
|
|
581
|
+
return this.deps.sendMessage(session, [
|
|
582
|
+
koishi_1.h.text(`用户 ${normalizedTargetId} 当前已绑定此用户名: ${username}`)
|
|
583
|
+
]);
|
|
518
584
|
}
|
|
519
585
|
// 检查用户名是否已被占用(支持改名检测)
|
|
520
586
|
if (await this.deps.databaseService.checkUsernameExists(username, target, uuid)) {
|
|
@@ -526,7 +592,9 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
526
592
|
const bindResult = await this.deps.databaseService.createOrUpdateMcBind(target, username, uuid);
|
|
527
593
|
if (!bindResult) {
|
|
528
594
|
this.logger.error('修改', `管理员QQ(${operatorId})修改QQ(${normalizedTargetId})的MC账号失败`);
|
|
529
|
-
return this.deps.sendMessage(session, [
|
|
595
|
+
return this.deps.sendMessage(session, [
|
|
596
|
+
koishi_1.h.text(`修改用户 ${normalizedTargetId} 的MC账号失败: 数据库操作出错,请联系管理员`)
|
|
597
|
+
]);
|
|
530
598
|
}
|
|
531
599
|
this.logger.info('修改', `成功: 管理员QQ(${operatorId})修改QQ(${normalizedTargetId})的MC账号: ${oldUsername} -> ${username}(${uuid})`);
|
|
532
600
|
// MC头像
|
|
@@ -550,7 +618,9 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
550
618
|
// 检查是否已绑定
|
|
551
619
|
if (!selfBind || !selfBind.mcUsername) {
|
|
552
620
|
this.logger.warn('修改', `QQ(${operatorId})尚未绑定MC账号`);
|
|
553
|
-
return this.deps.sendMessage(session, [
|
|
621
|
+
return this.deps.sendMessage(session, [
|
|
622
|
+
koishi_1.h.text('您尚未绑定MC账号,请使用 ' + this.deps.formatCommand('mcid bind') + ' 命令进行绑定')
|
|
623
|
+
]);
|
|
554
624
|
}
|
|
555
625
|
// 检查是否与当前用户名相同
|
|
556
626
|
if (selfBind.mcUsername === username) {
|
|
@@ -558,14 +628,17 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
558
628
|
return this.deps.sendMessage(session, [koishi_1.h.text(`您当前已绑定此用户名: ${username}`)]);
|
|
559
629
|
}
|
|
560
630
|
// 检查冷却时间
|
|
561
|
-
if (!await this.deps.isAdmin(session.userId) &&
|
|
631
|
+
if (!(await this.deps.isAdmin(session.userId)) &&
|
|
632
|
+
!this.deps.checkCooldown(selfBind.lastModified)) {
|
|
562
633
|
const days = this.config.cooldownDays;
|
|
563
634
|
const now = new Date();
|
|
564
635
|
const diffTime = now.getTime() - selfBind.lastModified.getTime();
|
|
565
636
|
const passedDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
|
|
566
637
|
const remainingDays = days - passedDays;
|
|
567
638
|
this.logger.warn('修改', `QQ(${operatorId})在冷却期内,无法修改MC账号`);
|
|
568
|
-
return this.deps.sendMessage(session, [
|
|
639
|
+
return this.deps.sendMessage(session, [
|
|
640
|
+
koishi_1.h.text(`您的MC账号绑定在冷却期内,还需${remainingDays}天才能修改。如需立即修改,请联系管理员。`)
|
|
641
|
+
]);
|
|
569
642
|
}
|
|
570
643
|
// 检查用户名是否已被占用(支持改名检测)
|
|
571
644
|
if (await this.deps.databaseService.checkUsernameExists(username, session.userId, uuid)) {
|
|
@@ -621,13 +694,17 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
621
694
|
if (!normalizedTargetId) {
|
|
622
695
|
this.logger.warn('解绑', `QQ(${operatorId})提供的目标用户ID"${target}"无效`);
|
|
623
696
|
if (target.startsWith('@')) {
|
|
624
|
-
return this.deps.sendMessage(session, [
|
|
697
|
+
return this.deps.sendMessage(session, [
|
|
698
|
+
koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')
|
|
699
|
+
]);
|
|
625
700
|
}
|
|
626
|
-
return this.deps.sendMessage(session, [
|
|
701
|
+
return this.deps.sendMessage(session, [
|
|
702
|
+
koishi_1.h.text('❌ 目标用户ID无效\n请提供有效的QQ号或使用@功能选择用户')
|
|
703
|
+
]);
|
|
627
704
|
}
|
|
628
705
|
this.logger.info('解绑', `QQ(${operatorId})尝试为QQ(${normalizedTargetId})解绑MC账号`);
|
|
629
706
|
// 检查权限
|
|
630
|
-
if (!await this.deps.isAdmin(session.userId)) {
|
|
707
|
+
if (!(await this.deps.isAdmin(session.userId))) {
|
|
631
708
|
this.logger.warn('解绑', `权限不足: QQ(${operatorId})不是管理员`);
|
|
632
709
|
return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能为其他用户解绑MC账号')]);
|
|
633
710
|
}
|
|
@@ -637,12 +714,18 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
637
714
|
this.logger.warn('解绑', `QQ(${normalizedTargetId})尚未绑定MC账号`);
|
|
638
715
|
return this.deps.sendMessage(session, [koishi_1.h.text(`用户 ${normalizedTargetId} 尚未绑定MC账号`)]);
|
|
639
716
|
}
|
|
640
|
-
const oldUsername = targetBind.mcUsername && !targetBind.mcUsername.startsWith('_temp_')
|
|
641
|
-
|
|
717
|
+
const oldUsername = targetBind.mcUsername && !targetBind.mcUsername.startsWith('_temp_')
|
|
718
|
+
? targetBind.mcUsername
|
|
719
|
+
: '未绑定';
|
|
720
|
+
const oldBuidInfo = targetBind.buidUid
|
|
721
|
+
? ` 和 B站账号: ${targetBind.buidUsername}(${targetBind.buidUid})`
|
|
722
|
+
: '';
|
|
642
723
|
// 删除绑定记录
|
|
643
724
|
await this.deps.databaseService.deleteMcBind(target);
|
|
644
725
|
this.logger.info('解绑', `成功: 管理员QQ(${operatorId})为QQ(${normalizedTargetId})解绑MC账号: ${oldUsername}${oldBuidInfo}`);
|
|
645
|
-
return this.deps.sendMessage(session, [
|
|
726
|
+
return this.deps.sendMessage(session, [
|
|
727
|
+
koishi_1.h.text(`已成功为用户 ${normalizedTargetId} 解绑MC账号: ${oldUsername}${oldBuidInfo}`)
|
|
728
|
+
]);
|
|
646
729
|
}
|
|
647
730
|
async handleUnbindForSelf(session, operatorId) {
|
|
648
731
|
this.logger.info('解绑', `QQ(${operatorId})尝试解绑自己的MC账号`);
|
|
@@ -651,12 +734,18 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
651
734
|
this.logger.warn('解绑', `QQ(${operatorId})尚未绑定MC账号`);
|
|
652
735
|
return this.deps.sendMessage(session, [koishi_1.h.text('您尚未绑定MC账号')]);
|
|
653
736
|
}
|
|
654
|
-
const oldUsername = selfBind.mcUsername && !selfBind.mcUsername.startsWith('_temp_')
|
|
655
|
-
|
|
737
|
+
const oldUsername = selfBind.mcUsername && !selfBind.mcUsername.startsWith('_temp_')
|
|
738
|
+
? selfBind.mcUsername
|
|
739
|
+
: '未绑定';
|
|
740
|
+
const oldBuidInfo = selfBind.buidUid
|
|
741
|
+
? ` 和 B站账号: ${selfBind.buidUsername}(${selfBind.buidUid})`
|
|
742
|
+
: '';
|
|
656
743
|
// 删除绑定记录
|
|
657
744
|
await this.deps.databaseService.deleteMcBind(operatorId);
|
|
658
745
|
this.logger.info('解绑', `成功: QQ(${operatorId})解绑MC账号: ${oldUsername}${oldBuidInfo}`);
|
|
659
|
-
return this.deps.sendMessage(session, [
|
|
746
|
+
return this.deps.sendMessage(session, [
|
|
747
|
+
koishi_1.h.text(`已成功解绑MC账号: ${oldUsername}${oldBuidInfo}`)
|
|
748
|
+
]);
|
|
660
749
|
}
|
|
661
750
|
/**
|
|
662
751
|
* 设置管理员
|
|
@@ -681,10 +770,12 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
681
770
|
// 如果用户存在绑定记录,更新为管理员
|
|
682
771
|
if (targetBind) {
|
|
683
772
|
await this.repos.mcidbind.update(normalizedTargetId, {
|
|
684
|
-
isAdmin: true
|
|
773
|
+
isAdmin: true
|
|
685
774
|
});
|
|
686
775
|
this.logger.info('管理员', `成功: 主人QQ(${normalizedUserId})将QQ(${normalizedTargetId})设为管理员`);
|
|
687
|
-
return this.deps.sendMessage(session, [
|
|
776
|
+
return this.deps.sendMessage(session, [
|
|
777
|
+
koishi_1.h.text(`已成功将用户 ${normalizedTargetId} 设为管理员`)
|
|
778
|
+
]);
|
|
688
779
|
}
|
|
689
780
|
else {
|
|
690
781
|
// 用户不存在绑定记录,创建一个新记录并设为管理员
|
|
@@ -698,11 +789,15 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
698
789
|
isAdmin: true
|
|
699
790
|
});
|
|
700
791
|
this.logger.info('管理员', `成功: 主人QQ(${normalizedUserId})将QQ(${normalizedTargetId})设为管理员 (创建新记录)`);
|
|
701
|
-
return this.deps.sendMessage(session, [
|
|
792
|
+
return this.deps.sendMessage(session, [
|
|
793
|
+
koishi_1.h.text(`已成功将用户 ${normalizedTargetId} 设为管理员 (未绑定MC账号)`)
|
|
794
|
+
]);
|
|
702
795
|
}
|
|
703
796
|
catch (createError) {
|
|
704
797
|
this.logger.error('管理员', `创建管理员记录失败: ${createError.message}`);
|
|
705
|
-
return this.deps.sendMessage(session, [
|
|
798
|
+
return this.deps.sendMessage(session, [
|
|
799
|
+
koishi_1.h.text(this.deps.getFriendlyErrorMessage(createError))
|
|
800
|
+
]);
|
|
706
801
|
}
|
|
707
802
|
}
|
|
708
803
|
}
|
|
@@ -735,10 +830,12 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
735
830
|
}
|
|
736
831
|
// 撤销管理员权限
|
|
737
832
|
await this.repos.mcidbind.update(normalizedTargetId, {
|
|
738
|
-
isAdmin: false
|
|
833
|
+
isAdmin: false
|
|
739
834
|
});
|
|
740
835
|
this.logger.info('管理员', `成功: 主人QQ(${normalizedUserId})撤销了QQ(${normalizedTargetId})的管理员权限`);
|
|
741
|
-
return this.deps.sendMessage(session, [
|
|
836
|
+
return this.deps.sendMessage(session, [
|
|
837
|
+
koishi_1.h.text(`已成功撤销用户 ${normalizedTargetId} 的管理员权限`)
|
|
838
|
+
]);
|
|
742
839
|
}
|
|
743
840
|
catch (error) {
|
|
744
841
|
const normalizedUserId = this.deps.normalizeQQId(session.userId);
|
|
@@ -762,16 +859,20 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
762
859
|
// 查询所有管理员
|
|
763
860
|
const admins = await this.repos.mcidbind.findAllAdmins();
|
|
764
861
|
if (admins.length === 0) {
|
|
765
|
-
this.logger.info('管理员',
|
|
862
|
+
this.logger.info('管理员', '管理员列表为空');
|
|
766
863
|
return this.deps.sendMessage(session, [koishi_1.h.text('当前没有管理员')]);
|
|
767
864
|
}
|
|
768
865
|
// 格式化管理员列表
|
|
769
|
-
const adminList = admins
|
|
866
|
+
const adminList = admins
|
|
867
|
+
.map(admin => {
|
|
770
868
|
const displayUsername = admin.mcUsername && !admin.mcUsername.startsWith('_temp_') ? admin.mcUsername : null;
|
|
771
869
|
return `- ${admin.qqId}${displayUsername ? ` (MC: ${displayUsername})` : ''}`;
|
|
772
|
-
})
|
|
870
|
+
})
|
|
871
|
+
.join('\n');
|
|
773
872
|
this.logger.info('管理员', `成功: 主人QQ(${normalizedUserId})查看了管理员列表`);
|
|
774
|
-
return this.deps.sendMessage(session, [
|
|
873
|
+
return this.deps.sendMessage(session, [
|
|
874
|
+
koishi_1.h.text(`管理员列表:\n${adminList}\n\n共 ${admins.length} 名管理员`)
|
|
875
|
+
]);
|
|
775
876
|
}
|
|
776
877
|
catch (error) {
|
|
777
878
|
const normalizedUserId = this.deps.normalizeQQId(session.userId);
|
|
@@ -787,7 +888,7 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
787
888
|
const normalizedUserId = this.deps.normalizeQQId(session.userId);
|
|
788
889
|
this.logger.info('统计', `QQ(${normalizedUserId})尝试查看数据库统计`);
|
|
789
890
|
// 检查权限
|
|
790
|
-
if (!await this.deps.isAdmin(session.userId)) {
|
|
891
|
+
if (!(await this.deps.isAdmin(session.userId))) {
|
|
791
892
|
this.logger.warn('统计', `权限不足: QQ(${normalizedUserId})不是管理员`);
|
|
792
893
|
return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能查看统计信息')]);
|
|
793
894
|
}
|
|
@@ -806,7 +907,7 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
806
907
|
buidBoundUsers++;
|
|
807
908
|
}
|
|
808
909
|
}
|
|
809
|
-
let statsInfo =
|
|
910
|
+
let statsInfo = '📊 绑定统计\n';
|
|
810
911
|
statsInfo += `\n已绑定MCID: ${mcidBoundUsers}人\n`;
|
|
811
912
|
statsInfo += `已绑定BUID: ${buidBoundUsers}人`;
|
|
812
913
|
this.logger.info('统计', `成功: 管理员QQ(${normalizedUserId})查看了数据库统计`);
|
|
@@ -825,7 +926,7 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
825
926
|
try {
|
|
826
927
|
const normalizedUserId = this.deps.normalizeQQId(session.userId);
|
|
827
928
|
// 检查权限
|
|
828
|
-
if (!await this.deps.isAdmin(session.userId)) {
|
|
929
|
+
if (!(await this.deps.isAdmin(session.userId))) {
|
|
829
930
|
this.logger.warn('群昵称修复', `权限不足: QQ(${normalizedUserId})不是管理员`);
|
|
830
931
|
return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能执行群昵称修复操作')]);
|
|
831
932
|
}
|
|
@@ -843,11 +944,15 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
843
944
|
}
|
|
844
945
|
catch (error) {
|
|
845
946
|
this.logger.warn('群昵称修复', `Bot不在群${targetGroupId}中或无法获取群信息`);
|
|
846
|
-
return this.deps.sendMessage(session, [
|
|
947
|
+
return this.deps.sendMessage(session, [
|
|
948
|
+
koishi_1.h.text(`❌ Bot不在群 ${targetGroupId} 中或无权限操作该群`)
|
|
949
|
+
]);
|
|
847
950
|
}
|
|
848
951
|
const groupDisplayText = groupId ? `群 ${targetGroupId}` : '当前群';
|
|
849
952
|
this.logger.info('群昵称修复', `管理员QQ(${normalizedUserId})开始批量修复${groupDisplayText}的群昵称`);
|
|
850
|
-
await this.deps.sendMessage(session, [
|
|
953
|
+
await this.deps.sendMessage(session, [
|
|
954
|
+
koishi_1.h.text(`🔧 开始检查并修复${groupDisplayText}的所有用户群昵称格式,请稍候...`)
|
|
955
|
+
]);
|
|
851
956
|
// 获取所有已绑定B站的用户
|
|
852
957
|
const allBinds = await this.repos.mcidbind.findAll();
|
|
853
958
|
const usersWithBuid = allBinds.filter(bind => bind.buidUid && bind.buidUsername);
|
|
@@ -888,7 +993,9 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
888
993
|
}
|
|
889
994
|
// 每处理10个用户发送一次进度
|
|
890
995
|
if (checkedCount % 10 === 0) {
|
|
891
|
-
await this.deps.sendMessage(session, [
|
|
996
|
+
await this.deps.sendMessage(session, [
|
|
997
|
+
koishi_1.h.text(`进度: ${checkedCount}/${usersWithBuid.length} | 修复: ${fixedCount} | 错误: ${errorCount}`)
|
|
998
|
+
]);
|
|
892
999
|
}
|
|
893
1000
|
}
|
|
894
1001
|
catch (error) {
|
|
@@ -927,7 +1034,7 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
927
1034
|
try {
|
|
928
1035
|
const normalizedUserId = this.deps.normalizeQQId(session.userId);
|
|
929
1036
|
// 检查权限
|
|
930
|
-
if (!await this.deps.isAdmin(session.userId)) {
|
|
1037
|
+
if (!(await this.deps.isAdmin(session.userId))) {
|
|
931
1038
|
this.logger.warn('清除冷却', `权限不足: QQ(${normalizedUserId})不是管理员`);
|
|
932
1039
|
return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能清除提醒冷却和次数')]);
|
|
933
1040
|
}
|
|
@@ -940,7 +1047,9 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
940
1047
|
await this.repos.mcidbind.update(normalizedTargetId, { reminderCount: 0 });
|
|
941
1048
|
}
|
|
942
1049
|
this.logger.info('清除冷却', `管理员QQ(${normalizedUserId})清除了QQ(${normalizedTargetId})的提醒次数`);
|
|
943
|
-
return this.deps.sendMessage(session, [
|
|
1050
|
+
return this.deps.sendMessage(session, [
|
|
1051
|
+
koishi_1.h.text(`已清除用户 ${normalizedTargetId} 的随机提醒次数`)
|
|
1052
|
+
]);
|
|
944
1053
|
}
|
|
945
1054
|
else {
|
|
946
1055
|
const allBinds = await this.repos.mcidbind.findAll();
|
|
@@ -948,7 +1057,7 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
948
1057
|
await this.repos.mcidbind.update(bind.qqId, { reminderCount: 0 });
|
|
949
1058
|
}
|
|
950
1059
|
this.logger.info('清除冷却', `管理员QQ(${normalizedUserId})清除了所有用户的提醒次数`);
|
|
951
|
-
return this.deps.sendMessage(session, [koishi_1.h.text(
|
|
1060
|
+
return this.deps.sendMessage(session, [koishi_1.h.text('已清除所有用户的随机提醒次数')]);
|
|
952
1061
|
}
|
|
953
1062
|
}
|
|
954
1063
|
catch (error) {
|
|
@@ -964,7 +1073,7 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
964
1073
|
try {
|
|
965
1074
|
const normalizedUserId = this.deps.normalizeQQId(session.userId);
|
|
966
1075
|
// 检查权限
|
|
967
|
-
if (!await this.deps.isAdmin(session.userId)) {
|
|
1076
|
+
if (!(await this.deps.isAdmin(session.userId))) {
|
|
968
1077
|
this.logger.warn('数据导出', `权限不足: QQ(${normalizedUserId})不是管理员`);
|
|
969
1078
|
return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能导出群数据')]);
|
|
970
1079
|
}
|
|
@@ -985,7 +1094,9 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
985
1094
|
}
|
|
986
1095
|
catch (error) {
|
|
987
1096
|
this.logger.warn('数据导出', `Bot不在群${groupId}中或无法获取群信息`);
|
|
988
|
-
return this.deps.sendMessage(session, [
|
|
1097
|
+
return this.deps.sendMessage(session, [
|
|
1098
|
+
koishi_1.h.text(`❌ Bot不在群 ${groupId} 中或无权限操作该群`)
|
|
1099
|
+
]);
|
|
989
1100
|
}
|
|
990
1101
|
this.logger.info('数据导出', `管理员QQ(${normalizedUserId})开始导出群${groupId}的数据`);
|
|
991
1102
|
await this.deps.sendMessage(session, [koishi_1.h.text(`📊 开始导出群 ${groupId} 的数据,请稍候...`)]);
|
|
@@ -994,16 +1105,14 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
994
1105
|
const excelBuffer = await this.deps.groupExporter.exportGroupData(session, groupId);
|
|
995
1106
|
const fileName = this.deps.groupExporter.getExportFileName(groupId);
|
|
996
1107
|
// 先发送成功消息
|
|
997
|
-
await this.deps.sendMessage(session, [
|
|
1108
|
+
await this.deps.sendMessage(session, [
|
|
1109
|
+
koishi_1.h.text(`✅ 群 ${groupId} 数据导出完成!正在发送文件...`)
|
|
1110
|
+
]);
|
|
998
1111
|
// 发送文件
|
|
999
1112
|
try {
|
|
1000
1113
|
const base64Data = excelBuffer.toString('base64');
|
|
1001
1114
|
if (session.bot.internal) {
|
|
1002
|
-
await session.bot.internal.uploadPrivateFile({
|
|
1003
|
-
user_id: parseInt(normalizedUserId),
|
|
1004
|
-
file: `base64://${base64Data}`,
|
|
1005
|
-
name: fileName
|
|
1006
|
-
});
|
|
1115
|
+
await session.bot.internal.uploadPrivateFile(parseInt(normalizedUserId), `base64://${base64Data}`, fileName);
|
|
1007
1116
|
await this.deps.sendMessage(session, [koishi_1.h.text(`📁 文件已发送: ${fileName}`)]);
|
|
1008
1117
|
this.logger.info('数据导出', `成功发送文件到私聊: ${fileName}`);
|
|
1009
1118
|
}
|
|
@@ -1020,11 +1129,13 @@ class McidCommandHandler extends base_handler_1.BaseHandler {
|
|
|
1020
1129
|
koishi_1.h.text(`⚠️ 直接发送失败,文件已保存\n文件路径: ${filePath}\n文件名: ${fileName}\n请联系管理员获取文件`)
|
|
1021
1130
|
]);
|
|
1022
1131
|
// 清理过期文件
|
|
1023
|
-
this.deps.groupExporter
|
|
1132
|
+
this.deps.groupExporter
|
|
1133
|
+
.cleanupOldFiles()
|
|
1134
|
+
.catch(err => this.logger.warn('数据导出', `清理临时文件时出错: ${err.message}`));
|
|
1024
1135
|
}
|
|
1025
1136
|
catch (saveError) {
|
|
1026
1137
|
await this.deps.sendMessage(session, [
|
|
1027
|
-
koishi_1.h.text(
|
|
1138
|
+
koishi_1.h.text('❌ 文件发送和保存都失败了\n导出数据成功但无法发送文件\n请联系管理员检查Bot配置')
|
|
1028
1139
|
]);
|
|
1029
1140
|
}
|
|
1030
1141
|
}
|