koishi-plugin-bind-bot 2.1.1 → 2.1.2

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.
@@ -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.subcommand('.query [target:string]', '查询用户绑定的MC账号')
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.subcommand('.finduser <username:string>', '[管理员]通过MC用户名查询绑定的QQ账号')
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.subcommand('.bind <username:string> [target:string]', '绑定MC账号')
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.subcommand('.change <username:string> [target:string]', '修改绑定的MC账号')
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.subcommand('.unbind [target:string]', '[管理员]解绑MC账号')
29
+ cmd
30
+ .subcommand('.unbind [target:string]', '[管理员]解绑MC账号')
26
31
  .action(async ({ session }, target) => this.handleUnbind(session, target));
27
32
  // mcid.admin - 设置管理员
28
- cmd.subcommand('.admin <target:string>', '[主人]将用户设为管理员')
33
+ cmd
34
+ .subcommand('.admin <target:string>', '[主人]将用户设为管理员')
29
35
  .action(async ({ session }, target) => this.handleAdmin(session, target));
30
36
  // mcid.unadmin - 撤销管理员
31
- cmd.subcommand('.unadmin <target:string>', '[主人]撤销用户的管理员权限')
37
+ cmd
38
+ .subcommand('.unadmin <target:string>', '[主人]撤销用户的管理员权限')
32
39
  .action(async ({ session }, target) => this.handleUnadmin(session, target));
33
40
  // mcid.adminlist - 列出所有管理员
34
- cmd.subcommand('.adminlist', '[主人]列出所有管理员')
41
+ cmd
42
+ .subcommand('.adminlist', '[主人]列出所有管理员')
35
43
  .action(async ({ session }) => this.handleAdminlist(session));
36
44
  // mcid.stats - 查看统计
37
- cmd.subcommand('.stats', '[管理员]查看数据库统计信息')
45
+ cmd
46
+ .subcommand('.stats', '[管理员]查看数据库统计信息')
38
47
  .action(async ({ session }) => this.handleStats(session));
39
48
  // mcid.fixnicknames - 修复群昵称
40
- cmd.subcommand('.fixnicknames [groupId:string]', '[管理员]检查并修复指定群或当前群的用户群昵称格式')
49
+ cmd
50
+ .subcommand('.fixnicknames [groupId:string]', '[管理员]检查并修复指定群或当前群的用户群昵称格式')
41
51
  .action(async ({ session }, groupId) => this.handleFixNicknames(session, groupId));
42
52
  // mcid.clearreminder - 清除提醒
43
- cmd.subcommand('.clearreminder [target:string]', '[管理员]清除用户的随机提醒冷却时间和提醒次数')
53
+ cmd
54
+ .subcommand('.clearreminder [target:string]', '[管理员]清除用户的随机提醒冷却时间和提醒次数')
44
55
  .action(async ({ session }, target) => this.handleClearReminder(session, target));
45
56
  // mcid.export - 导出数据
46
- cmd.subcommand('.export <groupId:string>', '[管理员]导出指定群的成员和绑定信息为Excel文件')
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, [koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')]);
73
+ return this.deps.sendMessage(session, [
74
+ koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')
75
+ ]);
62
76
  }
63
- return this.deps.sendMessage(session, [koishi_1.h.text('❌ 目标用户ID无效\n请提供有效的QQ号或使用@功能选择用户')]);
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 && refreshedBind.maxGuardLevel < refreshedBind.guardLevel) {
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 && refreshedBind.maxGuardLevel < refreshedBind.guardLevel) {
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, [koishi_1.h.text('您尚未绑定MC账号,请使用 ' + this.deps.formatCommand('mcid bind <用户名>') + ' 进行绑定')]);
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.map((serverId, index) => {
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] : (index + 1)} ${disabledServer.name} [已停用]`;
196
+ return `${index < circledNumbers.length ? circledNumbers[index] : index + 1} ${disabledServer.name} [已停用]`;
174
197
  }
175
- return `${index < circledNumbers.length ? circledNumbers[index] : (index + 1)} 未知服务器(ID: ${serverId})`;
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
- }).join('\n');
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 ? '该用户尚未绑定B站账号' : `您尚未绑定B站账号,使用 ${this.deps.formatCommand('buid bind <B站UID>')} 进行绑定`;
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.autoSetGroupNickname(session, mcName, bind.buidUsername, bind.buidUid, targetId || undefined)
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.map(serverId => {
298
+ const serverList = bind.whitelist
299
+ .map(serverId => {
272
300
  const server = this.deps.getServerConfigById(serverId);
273
301
  return server ? server.name : `未知服务器(${serverId})`;
274
- }).join('\n- ');
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, [koishi_1.h.text('请提供有效的Minecraft用户名(3-16位字母、数字、下划线)')]);
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, [koishi_1.h.text(`无法验证用户名: ${username},该用户可能不存在`)]);
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, [koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')]);
366
+ return this.deps.sendMessage(session, [
367
+ koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')
368
+ ]);
334
369
  }
335
- return this.deps.sendMessage(session, [koishi_1.h.text('❌ 目标用户ID无效\n请提供有效的QQ号或使用@功能选择用户')]);
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, [koishi_1.h.text(`为用户 ${normalizedTargetId} 绑定MC账号失败: 数据库操作出错,请联系管理员`)]);
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) && !this.deps.checkCooldown(selfBind.lastModified)) {
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_') ? selfBind.mcUsername : '未绑定';
407
- return this.deps.sendMessage(session, [koishi_1.h.text(`您已绑定MC账号: ${displayUsername},如需修改,请在冷却期结束后(还需${remainingDays}天)使用 ` + this.deps.formatCommand('mcid change') + ` 命令或联系管理员。`)]);
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_') ? selfBind.mcUsername : '未绑定';
411
- return this.deps.sendMessage(session, [koishi_1.h.text(`您已绑定MC账号: ${displayUsername},如需修改请使用 ` + this.deps.formatCommand('mcid change') + ` 命令。`)]);
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, [koishi_1.h.text('请提供有效的Minecraft用户名(3-16位字母、数字、下划线)')]);
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, [koishi_1.h.text(`无法验证用户名: ${username},该用户可能不存在`)]);
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, [koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')]);
554
+ return this.deps.sendMessage(session, [
555
+ koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')
556
+ ]);
499
557
  }
500
- return this.deps.sendMessage(session, [koishi_1.h.text('❌ 目标用户ID无效\n请提供有效的QQ号或使用@功能选择用户')]);
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, [koishi_1.h.text(`用户 ${normalizedTargetId} 尚未绑定MC账号,请先使用 ` + this.deps.formatCommand('mcid bind') + ` 命令进行绑定`)]);
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, [koishi_1.h.text(`用户 ${normalizedTargetId} 当前已绑定此用户名: ${username}`)]);
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, [koishi_1.h.text(`修改用户 ${normalizedTargetId} 的MC账号失败: 数据库操作出错,请联系管理员`)]);
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, [koishi_1.h.text('您尚未绑定MC账号,请使用 ' + this.deps.formatCommand('mcid bind') + ' 命令进行绑定')]);
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) && !this.deps.checkCooldown(selfBind.lastModified)) {
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, [koishi_1.h.text(`您的MC账号绑定在冷却期内,还需${remainingDays}天才能修改。如需立即修改,请联系管理员。`)]);
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, [koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')]);
697
+ return this.deps.sendMessage(session, [
698
+ koishi_1.h.text('❌ 请使用真正的@功能,而不是手动输入@符号\n正确做法:点击或长按用户头像选择@功能')
699
+ ]);
625
700
  }
626
- return this.deps.sendMessage(session, [koishi_1.h.text('❌ 目标用户ID无效\n请提供有效的QQ号或使用@功能选择用户')]);
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_') ? targetBind.mcUsername : '未绑定';
641
- const oldBuidInfo = targetBind.buidUid ? ` 和 B站账号: ${targetBind.buidUsername}(${targetBind.buidUid})` : '';
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, [koishi_1.h.text(`已成功为用户 ${normalizedTargetId} 解绑MC账号: ${oldUsername}${oldBuidInfo}`)]);
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_') ? selfBind.mcUsername : '未绑定';
655
- const oldBuidInfo = selfBind.buidUid ? ` 和 B站账号: ${selfBind.buidUsername}(${selfBind.buidUid})` : '';
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, [koishi_1.h.text(`已成功解绑MC账号: ${oldUsername}${oldBuidInfo}`)]);
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, [koishi_1.h.text(`已成功将用户 ${normalizedTargetId} 设为管理员`)]);
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, [koishi_1.h.text(`已成功将用户 ${normalizedTargetId} 设为管理员 (未绑定MC账号)`)]);
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, [koishi_1.h.text(this.deps.getFriendlyErrorMessage(createError))]);
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, [koishi_1.h.text(`已成功撤销用户 ${normalizedTargetId} 的管理员权限`)]);
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.map(admin => {
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
- }).join('\n');
870
+ })
871
+ .join('\n');
773
872
  this.logger.info('管理员', `成功: 主人QQ(${normalizedUserId})查看了管理员列表`);
774
- return this.deps.sendMessage(session, [koishi_1.h.text(`管理员列表:\n${adminList}\n\n共 ${admins.length} 名管理员`)]);
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 = `📊 绑定统计\n`;
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, [koishi_1.h.text(`❌ Bot不在群 ${targetGroupId} 中或无权限操作该群`)]);
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, [koishi_1.h.text(`🔧 开始检查并修复${groupDisplayText}的所有用户群昵称格式,请稍候...`)]);
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, [koishi_1.h.text(`进度: ${checkedCount}/${usersWithBuid.length} | 修复: ${fixedCount} | 错误: ${errorCount}`)]);
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, [koishi_1.h.text(`已清除用户 ${normalizedTargetId} 的随机提醒次数`)]);
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, [koishi_1.h.text(`❌ Bot不在群 ${groupId} 中或无权限操作该群`)]);
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, [koishi_1.h.text(`✅ 群 ${groupId} 数据导出完成!正在发送文件...`)]);
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.cleanupOldFiles().catch(err => this.logger.warn('数据导出', `清理临时文件时出错: ${err.message}`));
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(`❌ 文件发送和保存都失败了\n导出数据成功但无法发送文件\n请联系管理员检查Bot配置`)
1138
+ koishi_1.h.text('❌ 文件发送和保存都失败了\n导出数据成功但无法发送文件\n请联系管理员检查Bot配置')
1028
1139
  ]);
1029
1140
  }
1030
1141
  }