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.
@@ -27,7 +27,8 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
27
27
  * 列出所有可用的服务器
28
28
  */
29
29
  registerServersCommand(parent) {
30
- parent.subcommand('.servers', '列出所有可用的服务器')
30
+ parent
31
+ .subcommand('.servers', '列出所有可用的服务器')
31
32
  .action(async ({ session }) => {
32
33
  try {
33
34
  const normalizedUserId = this.deps.normalizeQQId(session.userId);
@@ -35,20 +36,43 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
35
36
  // 获取启用的服务器
36
37
  const enabledServers = this.config.servers?.filter(server => server.enabled !== false) || [];
37
38
  if (!enabledServers || enabledServers.length === 0) {
38
- this.logger.info('白名单', `未配置或启用任何服务器`);
39
+ this.logger.info('白名单', '未配置或启用任何服务器');
39
40
  return this.deps.sendMessage(session, [koishi_1.h.text('当前未配置或启用任何服务器')]);
40
41
  }
41
42
  // 检查用户是否绑定了MC账号
42
43
  const userBind = await this.deps.databaseService.getMcBindByQQId(normalizedUserId);
43
44
  if (!userBind || !userBind.mcUsername) {
44
45
  this.logger.warn('白名单', `QQ(${normalizedUserId})未绑定MC账号,无法显示白名单状态`);
45
- return this.deps.sendMessage(session, [koishi_1.h.text(`您尚未绑定MC账号,请先使用 ${this.deps.formatCommand('mcid bind <用户名>')} 命令绑定账号,然后再查看服务器列表。`)]);
46
+ return this.deps.sendMessage(session, [
47
+ koishi_1.h.text(`您尚未绑定MC账号,请先使用 ${this.deps.formatCommand('mcid bind <用户名>')} 命令绑定账号,然后再查看服务器列表。`)
48
+ ]);
46
49
  }
47
50
  // 圈数字映射(1-20)
48
- const circledNumbers = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩',
49
- '', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳'];
51
+ const circledNumbers = [
52
+ '',
53
+ '②',
54
+ '③',
55
+ '④',
56
+ '⑤',
57
+ '⑥',
58
+ '⑦',
59
+ '⑧',
60
+ '⑨',
61
+ '⑩',
62
+ '⑪',
63
+ '⑫',
64
+ '⑬',
65
+ '⑭',
66
+ '⑮',
67
+ '⑯',
68
+ '⑰',
69
+ '⑱',
70
+ '⑲',
71
+ '⑳'
72
+ ];
50
73
  // 格式化服务器列表
51
- const serverList = enabledServers.map((server, index) => {
74
+ const serverList = enabledServers
75
+ .map((server, index) => {
52
76
  // 获取此用户是否已加入该服务器的白名单
53
77
  const hasWhitelist = userBind ? this.isInServerWhitelist(userBind, server.id) : false;
54
78
  // 使用圈数字作为序号
@@ -65,21 +89,25 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
65
89
  // 添加服务器ID信息
66
90
  serverInfo += `\n ID: ${server.id}`;
67
91
  // 添加服务器状态信息
68
- serverInfo += "\n 状态: " + (server.enabled === false ? '已停用' : '已启用');
92
+ serverInfo += '\n 状态: ' + (server.enabled === false ? '已停用' : '已启用');
69
93
  // 添加申请权限信息
70
- serverInfo += "\n 权限: " + (server.allowSelfApply ? '允许自助申请' : '仅管理员可操作');
94
+ serverInfo +=
95
+ '\n 权限: ' + (server.allowSelfApply ? '允许自助申请' : '仅管理员可操作');
71
96
  // 只有当设置了地址时才显示地址行
72
97
  if (server.displayAddress && server.displayAddress.trim()) {
73
- serverInfo += "\n 地址: " + server.displayAddress;
98
+ serverInfo += '\n 地址: ' + server.displayAddress;
74
99
  }
75
100
  // 只有当设置了说明信息时才显示说明行
76
101
  if (server.description && server.description.trim()) {
77
- serverInfo += "\n 说明: " + server.description;
102
+ serverInfo += '\n 说明: ' + server.description;
78
103
  }
79
104
  return serverInfo;
80
- }).join('\n\n'); // 使用双换行分隔不同服务器,增强可读性
105
+ })
106
+ .join('\n\n'); // 使用双换行分隔不同服务器,增强可读性
81
107
  this.logger.info('白名单', `成功: QQ(${normalizedUserId})获取了服务器列表,共${enabledServers.length}个服务器`);
82
- const displayUsername = userBind.mcUsername && !userBind.mcUsername.startsWith('_temp_') ? userBind.mcUsername : '未绑定MC账号';
108
+ const displayUsername = userBind.mcUsername && !userBind.mcUsername.startsWith('_temp_')
109
+ ? userBind.mcUsername
110
+ : '未绑定MC账号';
83
111
  return this.deps.sendMessage(session, [
84
112
  koishi_1.h.text(`${displayUsername} 的可用服务器列表:\n\n${serverList}\n\n使用 ${this.deps.formatCommand('mcid whitelist add <服务器名称或ID>')} 申请白名单`)
85
113
  ]);
@@ -95,34 +123,44 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
95
123
  * 添加白名单
96
124
  */
97
125
  registerAddCommand(parent) {
98
- parent.subcommand('.add <serverIdOrName:string> [...targets:string]', '申请/添加服务器白名单')
126
+ parent
127
+ .subcommand('.add <serverIdOrName:string> [...targets:string]', '申请/添加服务器白名单')
99
128
  .action(async ({ session }, serverIdOrName, ...targets) => {
100
129
  try {
101
130
  const normalizedUserId = this.deps.normalizeQQId(session.userId);
102
131
  // 检查服务器名称或ID
103
132
  if (!serverIdOrName) {
104
133
  this.logger.warn('白名单', `QQ(${normalizedUserId})未提供服务器名称或ID`);
105
- return this.deps.sendMessage(session, [koishi_1.h.text('请提供服务器名称或ID\n使用 mcid whitelist servers 查看可用服务器列表')]);
134
+ return this.deps.sendMessage(session, [
135
+ koishi_1.h.text('请提供服务器名称或ID\n使用 mcid whitelist servers 查看可用服务器列表')
136
+ ]);
106
137
  }
107
138
  // 获取服务器配置
108
139
  const server = this.getServerConfigByIdOrName(serverIdOrName);
109
140
  if (!server) {
110
141
  this.logger.warn('白名单', `QQ(${normalizedUserId})提供的服务器名称或ID"${serverIdOrName}"无效`);
111
- return this.deps.sendMessage(session, [koishi_1.h.text(`未找到名称或ID为"${serverIdOrName}"的服务器\n使用 mcid whitelist servers 查看可用服务器列表`)]);
142
+ return this.deps.sendMessage(session, [
143
+ koishi_1.h.text(`未找到名称或ID为"${serverIdOrName}"的服务器\n使用 mcid whitelist servers 查看可用服务器列表`)
144
+ ]);
112
145
  }
113
146
  // 如果有指定目标用户(批量操作或单个用户管理)
114
147
  if (targets && targets.length > 0) {
115
148
  // 检查权限
116
- if (!await this.isAdmin(session.userId)) {
149
+ if (!(await this.isAdmin(session.userId))) {
117
150
  this.logger.warn('白名单', `权限不足: QQ(${normalizedUserId})不是管理员,无法为其他用户添加白名单`);
118
- return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能为其他用户添加白名单')]);
151
+ return this.deps.sendMessage(session, [
152
+ koishi_1.h.text('只有管理员才能为其他用户添加白名单')
153
+ ]);
119
154
  }
120
155
  // 检查是否为标签(优先检查标签名,没有匹配标签再按QQ号处理)
121
156
  if (targets.length === 1) {
122
157
  const targetValue = targets[0];
123
158
  // 首先检查是否存在该标签名
124
159
  const allBinds = await this.repos.mcidbind.findAll();
125
- const usersWithTag = allBinds.filter(bind => bind.tags && bind.tags.includes(targetValue) && bind.mcUsername && !bind.mcUsername.startsWith('_temp_'));
160
+ const usersWithTag = allBinds.filter(bind => bind.tags &&
161
+ bind.tags.includes(targetValue) &&
162
+ bind.mcUsername &&
163
+ !bind.mcUsername.startsWith('_temp_'));
126
164
  if (usersWithTag.length > 0) {
127
165
  // 作为标签处理
128
166
  const tagName = targetValue;
@@ -130,7 +168,9 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
130
168
  // 转换为用户ID数组
131
169
  targets = usersWithTag.map(bind => bind.qqId);
132
170
  this.logger.info('白名单', `找到${targets.length}个有标签"${tagName}"的已绑定用户`);
133
- await this.deps.sendMessage(session, [koishi_1.h.text(`找到${targets.length}个有标签"${tagName}"的已绑定用户,开始添加白名单...`)]);
171
+ await this.deps.sendMessage(session, [
172
+ koishi_1.h.text(`找到${targets.length}个有标签"${tagName}"的已绑定用户,开始添加白名单...`)
173
+ ]);
134
174
  }
135
175
  // 如果没有找到标签,将继续按单个用户处理
136
176
  }
@@ -143,28 +183,38 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
143
183
  const targetBind = await this.deps.databaseService.getMcBindByQQId(normalizedTargetId);
144
184
  if (!targetBind || !targetBind.mcUsername) {
145
185
  this.logger.warn('白名单', `QQ(${normalizedTargetId})未绑定MC账号`);
146
- return this.deps.sendMessage(session, [koishi_1.h.text(`用户 ${normalizedTargetId} 尚未绑定MC账号,无法添加白名单`)]);
186
+ return this.deps.sendMessage(session, [
187
+ koishi_1.h.text(`用户 ${normalizedTargetId} 尚未绑定MC账号,无法添加白名单`)
188
+ ]);
147
189
  }
148
190
  // 检查是否已在白名单中
149
191
  if (this.isInServerWhitelist(targetBind, server.id)) {
150
192
  this.logger.warn('白名单', `QQ(${normalizedTargetId})已在服务器"${server.name}"的白名单中`);
151
- return this.deps.sendMessage(session, [koishi_1.h.text(`用户 ${normalizedTargetId} 已在服务器"${server.name}"的白名单中`)]);
193
+ return this.deps.sendMessage(session, [
194
+ koishi_1.h.text(`用户 ${normalizedTargetId} 已在服务器"${server.name}"的白名单中`)
195
+ ]);
152
196
  }
153
197
  // 执行添加白名单操作
154
198
  const result = await this.addServerWhitelist(targetBind, server);
155
199
  if (result) {
156
200
  this.logger.info('白名单', `成功: 管理员QQ(${normalizedUserId})为QQ(${normalizedTargetId})添加了服务器"${server.name}"的白名单`);
157
- return this.deps.sendMessage(session, [koishi_1.h.text(`已成功为用户 ${normalizedTargetId} 添加服务器"${server.name}"的白名单`)]);
201
+ return this.deps.sendMessage(session, [
202
+ koishi_1.h.text(`已成功为用户 ${normalizedTargetId} 添加服务器"${server.name}"的白名单`)
203
+ ]);
158
204
  }
159
205
  else {
160
206
  this.logger.error('白名单', `管理员QQ(${normalizedUserId})为QQ(${normalizedTargetId})添加服务器"${server.name}"白名单失败`);
161
- return this.deps.sendMessage(session, [koishi_1.h.text(`为用户 ${normalizedTargetId} 添加服务器"${server.name}"白名单失败,请检查RCON连接和命令配置`)]);
207
+ return this.deps.sendMessage(session, [
208
+ koishi_1.h.text(`为用户 ${normalizedTargetId} 添加服务器"${server.name}"白名单失败,请检查RCON连接和命令配置`)
209
+ ]);
162
210
  }
163
211
  }
164
212
  // 批量用户的详细处理逻辑
165
213
  this.logger.info('白名单', `QQ(${normalizedUserId})尝试批量为${targets.length}个用户添加服务器"${server.name}"白名单`);
166
214
  // 发送开始处理的通知
167
- await this.deps.sendMessage(session, [koishi_1.h.text(`开始为${targets.length}个用户添加服务器"${server.name}"的白名单,请稍候...`)]);
215
+ await this.deps.sendMessage(session, [
216
+ koishi_1.h.text(`开始为${targets.length}个用户添加服务器"${server.name}"的白名单,请稍候...`)
217
+ ]);
168
218
  // 统计信息
169
219
  let successCount = 0;
170
220
  let failCount = 0;
@@ -209,7 +259,9 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
209
259
  // 每处理5个用户发送一次进度更新(仅在批量操作时)
210
260
  if (targets.length > 5 && (i + 1) % 5 === 0) {
211
261
  const progress = Math.round(((i + 1) / targets.length) * 100);
212
- await this.deps.sendMessage(session, [koishi_1.h.text(`批量添加白名单进度: ${progress}% (${i + 1}/${targets.length})\n成功: ${successCount} | 失败: ${failCount} | 跳过: ${skipCount}`)]);
262
+ await this.deps.sendMessage(session, [
263
+ koishi_1.h.text(`批量添加白名单进度: ${progress}% (${i + 1}/${targets.length})\n成功: ${successCount} | 失败: ${failCount} | 跳过: ${skipCount}`)
264
+ ]);
213
265
  }
214
266
  }
215
267
  catch (error) {
@@ -230,30 +282,42 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
230
282
  // 为自己添加白名单(原有逻辑保持不变)
231
283
  this.logger.info('白名单', `QQ(${normalizedUserId})尝试为自己添加服务器"${server.name}"白名单`);
232
284
  // 检查服务器是否允许自助申请
233
- if (!server.allowSelfApply && !await this.isAdmin(session.userId)) {
285
+ if (!server.allowSelfApply && !(await this.isAdmin(session.userId))) {
234
286
  this.logger.warn('白名单', `服务器"${server.name}"不允许自助申请,且QQ(${normalizedUserId})不是管理员`);
235
- return this.deps.sendMessage(session, [koishi_1.h.text(`服务器"${server.name}"不允许自助申请白名单,请联系管理员`)]);
287
+ return this.deps.sendMessage(session, [
288
+ koishi_1.h.text(`服务器"${server.name}"不允许自助申请白名单,请联系管理员`)
289
+ ]);
236
290
  }
237
291
  // 获取自己的绑定信息
238
292
  const selfBind = await this.deps.databaseService.getMcBindByQQId(normalizedUserId);
239
293
  if (!selfBind || !selfBind.mcUsername) {
240
294
  this.logger.warn('白名单', `QQ(${normalizedUserId})未绑定MC账号`);
241
- return this.deps.sendMessage(session, [koishi_1.h.text('您尚未绑定MC账号,请先使用 ' + this.deps.formatCommand('mcid bind <用户名>') + ' 进行绑定')]);
295
+ return this.deps.sendMessage(session, [
296
+ koishi_1.h.text('您尚未绑定MC账号,请先使用 ' +
297
+ this.deps.formatCommand('mcid bind <用户名>') +
298
+ ' 进行绑定')
299
+ ]);
242
300
  }
243
301
  // 检查是否已在白名单中
244
302
  if (this.isInServerWhitelist(selfBind, server.id)) {
245
303
  this.logger.warn('白名单', `QQ(${normalizedUserId})已在服务器"${server.name}"的白名单中`);
246
- return this.deps.sendMessage(session, [koishi_1.h.text(`您已在服务器"${server.name}"的白名单中`)]);
304
+ return this.deps.sendMessage(session, [
305
+ koishi_1.h.text(`您已在服务器"${server.name}"的白名单中`)
306
+ ]);
247
307
  }
248
308
  // 执行添加白名单操作
249
309
  const result = await this.addServerWhitelist(selfBind, server);
250
310
  if (result) {
251
311
  this.logger.info('白名单', `成功: QQ(${normalizedUserId})添加了服务器"${server.name}"的白名单`);
252
- return this.deps.sendMessage(session, [koishi_1.h.text(`已成功添加服务器"${server.name}"的白名单`)]);
312
+ return this.deps.sendMessage(session, [
313
+ koishi_1.h.text(`已成功添加服务器"${server.name}"的白名单`)
314
+ ]);
253
315
  }
254
316
  else {
255
317
  this.logger.error('白名单', `QQ(${normalizedUserId})添加服务器"${server.name}"白名单失败`);
256
- return this.deps.sendMessage(session, [koishi_1.h.text(`添加服务器"${server.name}"白名单失败,请联系管理员`)]);
318
+ return this.deps.sendMessage(session, [
319
+ koishi_1.h.text(`添加服务器"${server.name}"白名单失败,请联系管理员`)
320
+ ]);
257
321
  }
258
322
  }
259
323
  catch (error) {
@@ -267,25 +331,30 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
267
331
  * 移除白名单
268
332
  */
269
333
  registerRemoveCommand(parent) {
270
- parent.subcommand('.remove <serverIdOrName:string> [...targets:string]', '[管理员]移除服务器白名单')
334
+ parent
335
+ .subcommand('.remove <serverIdOrName:string> [...targets:string]', '[管理员]移除服务器白名单')
271
336
  .action(async ({ session }, serverIdOrName, ...targets) => {
272
337
  try {
273
338
  const normalizedUserId = this.deps.normalizeQQId(session.userId);
274
339
  // 检查权限,只有管理员可以移除白名单
275
- if (!await this.isAdmin(session.userId)) {
340
+ if (!(await this.isAdmin(session.userId))) {
276
341
  this.logger.warn('白名单', `权限不足: QQ(${normalizedUserId})不是管理员,无法移除白名单`);
277
342
  return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能移除白名单')]);
278
343
  }
279
344
  // 检查服务器名称或ID
280
345
  if (!serverIdOrName) {
281
346
  this.logger.warn('白名单', `QQ(${normalizedUserId})未提供服务器名称或ID`);
282
- return this.deps.sendMessage(session, [koishi_1.h.text('请提供服务器名称或ID\n使用 mcid whitelist servers 查看可用服务器列表')]);
347
+ return this.deps.sendMessage(session, [
348
+ koishi_1.h.text('请提供服务器名称或ID\n使用 mcid whitelist servers 查看可用服务器列表')
349
+ ]);
283
350
  }
284
351
  // 获取服务器配置
285
352
  const server = this.getServerConfigByIdOrName(serverIdOrName);
286
353
  if (!server) {
287
354
  this.logger.warn('白名单', `QQ(${normalizedUserId})提供的服务器名称或ID"${serverIdOrName}"无效`);
288
- return this.deps.sendMessage(session, [koishi_1.h.text(`未找到名称或ID为"${serverIdOrName}"的服务器\n使用 mcid whitelist servers 查看可用服务器列表`)]);
355
+ return this.deps.sendMessage(session, [
356
+ koishi_1.h.text(`未找到名称或ID为"${serverIdOrName}"的服务器\n使用 mcid whitelist servers 查看可用服务器列表`)
357
+ ]);
289
358
  }
290
359
  // 如果有指定目标用户(批量操作或单个用户管理)
291
360
  if (targets && targets.length > 0) {
@@ -294,7 +363,10 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
294
363
  const targetValue = targets[0];
295
364
  // 首先检查是否存在该标签名
296
365
  const allBinds = await this.repos.mcidbind.findAll();
297
- const usersWithTag = allBinds.filter(bind => bind.tags && bind.tags.includes(targetValue) && bind.mcUsername && !bind.mcUsername.startsWith('_temp_'));
366
+ const usersWithTag = allBinds.filter(bind => bind.tags &&
367
+ bind.tags.includes(targetValue) &&
368
+ bind.mcUsername &&
369
+ !bind.mcUsername.startsWith('_temp_'));
298
370
  if (usersWithTag.length > 0) {
299
371
  // 作为标签处理
300
372
  const tagName = targetValue;
@@ -302,7 +374,9 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
302
374
  // 转换为用户ID数组
303
375
  targets = usersWithTag.map(bind => bind.qqId);
304
376
  this.logger.info('白名单', `找到${targets.length}个有标签"${tagName}"的已绑定用户`);
305
- await this.deps.sendMessage(session, [koishi_1.h.text(`找到${targets.length}个有标签"${tagName}"的已绑定用户,开始移除白名单...`)]);
377
+ await this.deps.sendMessage(session, [
378
+ koishi_1.h.text(`找到${targets.length}个有标签"${tagName}"的已绑定用户,开始移除白名单...`)
379
+ ]);
306
380
  }
307
381
  // 如果没有找到标签,将继续按单个用户处理
308
382
  }
@@ -315,28 +389,38 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
315
389
  const targetBind = await this.deps.databaseService.getMcBindByQQId(normalizedTargetId);
316
390
  if (!targetBind || !targetBind.mcUsername) {
317
391
  this.logger.warn('白名单', `QQ(${normalizedTargetId})未绑定MC账号`);
318
- return this.deps.sendMessage(session, [koishi_1.h.text(`用户 ${normalizedTargetId} 尚未绑定MC账号,无法移除白名单`)]);
392
+ return this.deps.sendMessage(session, [
393
+ koishi_1.h.text(`用户 ${normalizedTargetId} 尚未绑定MC账号,无法移除白名单`)
394
+ ]);
319
395
  }
320
396
  // 检查是否在白名单中
321
397
  if (!this.isInServerWhitelist(targetBind, server.id)) {
322
398
  this.logger.warn('白名单', `QQ(${normalizedTargetId})不在服务器"${server.name}"的白名单中`);
323
- return this.deps.sendMessage(session, [koishi_1.h.text(`用户 ${normalizedTargetId} 不在服务器"${server.name}"的白名单中`)]);
399
+ return this.deps.sendMessage(session, [
400
+ koishi_1.h.text(`用户 ${normalizedTargetId} 不在服务器"${server.name}"的白名单中`)
401
+ ]);
324
402
  }
325
403
  // 执行移除白名单操作
326
404
  const result = await this.removeServerWhitelist(targetBind, server);
327
405
  if (result) {
328
406
  this.logger.info('白名单', `成功: 管理员QQ(${normalizedUserId})为QQ(${normalizedTargetId})移除了服务器"${server.name}"的白名单`);
329
- return this.deps.sendMessage(session, [koishi_1.h.text(`已成功为用户 ${normalizedTargetId} 移除服务器"${server.name}"的白名单`)]);
407
+ return this.deps.sendMessage(session, [
408
+ koishi_1.h.text(`已成功为用户 ${normalizedTargetId} 移除服务器"${server.name}"的白名单`)
409
+ ]);
330
410
  }
331
411
  else {
332
412
  this.logger.error('白名单', `管理员QQ(${normalizedUserId})为QQ(${normalizedTargetId})移除服务器"${server.name}"白名单失败`);
333
- return this.deps.sendMessage(session, [koishi_1.h.text(`为用户 ${normalizedTargetId} 移除服务器"${server.name}"白名单失败,请检查RCON连接和命令配置`)]);
413
+ return this.deps.sendMessage(session, [
414
+ koishi_1.h.text(`为用户 ${normalizedTargetId} 移除服务器"${server.name}"白名单失败,请检查RCON连接和命令配置`)
415
+ ]);
334
416
  }
335
417
  }
336
418
  // 批量用户的详细处理逻辑
337
419
  this.logger.info('白名单', `管理员QQ(${normalizedUserId})尝试批量为${targets.length}个用户移除服务器"${server.name}"白名单`);
338
420
  // 发送开始处理的通知
339
- await this.deps.sendMessage(session, [koishi_1.h.text(`开始为${targets.length}个用户移除服务器"${server.name}"的白名单,请稍候...`)]);
421
+ await this.deps.sendMessage(session, [
422
+ koishi_1.h.text(`开始为${targets.length}个用户移除服务器"${server.name}"的白名单,请稍候...`)
423
+ ]);
340
424
  // 统计信息
341
425
  let successCount = 0;
342
426
  let failCount = 0;
@@ -381,7 +465,9 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
381
465
  // 每处理5个用户发送一次进度更新(仅在批量操作时)
382
466
  if (targets.length > 5 && (i + 1) % 5 === 0) {
383
467
  const progress = Math.round(((i + 1) / targets.length) * 100);
384
- await this.deps.sendMessage(session, [koishi_1.h.text(`批量移除白名单进度: ${progress}% (${i + 1}/${targets.length})\n成功: ${successCount} | 失败: ${failCount} | 跳过: ${skipCount}`)]);
468
+ await this.deps.sendMessage(session, [
469
+ koishi_1.h.text(`批量移除白名单进度: ${progress}% (${i + 1}/${targets.length})\n成功: ${successCount} | 失败: ${failCount} | 跳过: ${skipCount}`)
470
+ ]);
385
471
  }
386
472
  }
387
473
  catch (error) {
@@ -405,22 +491,32 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
405
491
  const selfBind = await this.deps.databaseService.getMcBindByQQId(normalizedUserId);
406
492
  if (!selfBind || !selfBind.mcUsername) {
407
493
  this.logger.warn('白名单', `QQ(${normalizedUserId})未绑定MC账号`);
408
- return this.deps.sendMessage(session, [koishi_1.h.text('您尚未绑定MC账号,请先使用 ' + this.deps.formatCommand('mcid bind <用户名>') + ' 进行绑定')]);
494
+ return this.deps.sendMessage(session, [
495
+ koishi_1.h.text('您尚未绑定MC账号,请先使用 ' +
496
+ this.deps.formatCommand('mcid bind <用户名>') +
497
+ ' 进行绑定')
498
+ ]);
409
499
  }
410
500
  // 检查是否在白名单中
411
501
  if (!this.isInServerWhitelist(selfBind, server.id)) {
412
502
  this.logger.warn('白名单', `QQ(${normalizedUserId})不在服务器"${server.name}"的白名单中`);
413
- return this.deps.sendMessage(session, [koishi_1.h.text(`您不在服务器"${server.name}"的白名单中`)]);
503
+ return this.deps.sendMessage(session, [
504
+ koishi_1.h.text(`您不在服务器"${server.name}"的白名单中`)
505
+ ]);
414
506
  }
415
507
  // 执行移除白名单操作
416
508
  const result = await this.removeServerWhitelist(selfBind, server);
417
509
  if (result) {
418
510
  this.logger.info('白名单', `成功: 管理员QQ(${normalizedUserId})移除了自己服务器"${server.name}"的白名单`);
419
- return this.deps.sendMessage(session, [koishi_1.h.text(`已成功移除服务器"${server.name}"的白名单`)]);
511
+ return this.deps.sendMessage(session, [
512
+ koishi_1.h.text(`已成功移除服务器"${server.name}"的白名单`)
513
+ ]);
420
514
  }
421
515
  else {
422
516
  this.logger.error('白名单', `管理员QQ(${normalizedUserId})移除服务器"${server.name}"白名单失败`);
423
- return this.deps.sendMessage(session, [koishi_1.h.text(`移除服务器"${server.name}"白名单失败,请检查RCON连接和命令配置`)]);
517
+ return this.deps.sendMessage(session, [
518
+ koishi_1.h.text(`移除服务器"${server.name}"白名单失败,请检查RCON连接和命令配置`)
519
+ ]);
424
520
  }
425
521
  }
426
522
  catch (error) {
@@ -434,7 +530,8 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
434
530
  * 重置服务器所有白名单记录
435
531
  */
436
532
  registerResetCommand(parent) {
437
- parent.subcommand('.reset <serverIdOrName:string>', '[主人]重置服务器所有白名单记录')
533
+ parent
534
+ .subcommand('.reset <serverIdOrName:string>', '[主人]重置服务器所有白名单记录')
438
535
  .action(async ({ session }, serverIdOrName) => {
439
536
  try {
440
537
  const normalizedUserId = this.deps.normalizeQQId(session.userId);
@@ -446,7 +543,9 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
446
543
  // 检查服务器ID或名称
447
544
  if (!serverIdOrName) {
448
545
  this.logger.warn('重置白名单', `QQ(${normalizedUserId})未提供服务器ID或名称`);
449
- return this.deps.sendMessage(session, [koishi_1.h.text('请提供服务器ID或名称\n使用 mcid whitelist servers 查看可用服务器列表')]);
546
+ return this.deps.sendMessage(session, [
547
+ koishi_1.h.text('请提供服务器ID或名称\n使用 mcid whitelist servers 查看可用服务器列表')
548
+ ]);
450
549
  }
451
550
  // 直接使用提供的ID进行删除,不验证服务器是否存在于配置中
452
551
  const serverId = serverIdOrName;
@@ -472,7 +571,9 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
472
571
  }
473
572
  }
474
573
  this.logger.info('重置白名单', `成功: 主人QQ(${normalizedUserId})重置了服务器ID"${serverId}"的白名单数据库,共处理${processedCount}条记录,更新${updatedCount}条记录`);
475
- return this.deps.sendMessage(session, [koishi_1.h.text(`已成功重置服务器ID"${serverId}"的白名单数据库记录\n共处理${processedCount}条记录,更新${updatedCount}条记录\n\n注意:此操作仅清除数据库记录,如需同时清除服务器上的白名单,请使用RCON命令手动操作`)]);
574
+ return this.deps.sendMessage(session, [
575
+ koishi_1.h.text(`已成功重置服务器ID"${serverId}"的白名单数据库记录\n共处理${processedCount}条记录,更新${updatedCount}条记录\n\n注意:此操作仅清除数据库记录,如需同时清除服务器上的白名单,请使用RCON命令手动操作`)
576
+ ]);
476
577
  }
477
578
  catch (error) {
478
579
  const normalizedUserId = this.deps.normalizeQQId(session.userId);
@@ -485,7 +586,8 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
485
586
  * 重置所有未在服务器配置中的白名单ID
486
587
  */
487
588
  registerResetAllCommand(parent) {
488
- parent.subcommand('.resetall', '[主人]清理所有未在服务器配置列表中的白名单ID')
589
+ parent
590
+ .subcommand('.resetall', '[主人]清理所有未在服务器配置列表中的白名单ID')
489
591
  .action(async ({ session }) => {
490
592
  try {
491
593
  const normalizedUserId = this.deps.normalizeQQId(session.userId);
@@ -544,37 +646,48 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
544
646
  * 批量将所有用户添加到服务器白名单
545
647
  */
546
648
  registerAddAllCommand(parent) {
547
- parent.subcommand('.addall <serverIdOrName:string>', '[管理员]将所有用户添加到指定服务器白名单')
649
+ parent
650
+ .subcommand('.addall <serverIdOrName:string>', '[管理员]将所有用户添加到指定服务器白名单')
548
651
  .action(async ({ session }, serverIdOrName) => {
549
652
  try {
550
653
  const normalizedUserId = this.deps.normalizeQQId(session.userId);
551
654
  // 检查是否为管理员
552
- if (!await this.isAdmin(session.userId)) {
655
+ if (!(await this.isAdmin(session.userId))) {
553
656
  this.logger.warn('批量白名单', `权限不足: QQ(${normalizedUserId})不是管理员,无法执行批量添加白名单操作`);
554
657
  return this.deps.sendMessage(session, [koishi_1.h.text('只有管理员才能执行批量添加白名单操作')]);
555
658
  }
556
659
  // 检查服务器名称或ID
557
660
  if (!serverIdOrName) {
558
661
  this.logger.warn('批量白名单', `QQ(${normalizedUserId})未提供服务器名称或ID`);
559
- return this.deps.sendMessage(session, [koishi_1.h.text('请提供服务器名称或ID\n使用 mcid whitelist servers 查看可用服务器列表')]);
662
+ return this.deps.sendMessage(session, [
663
+ koishi_1.h.text('请提供服务器名称或ID\n使用 mcid whitelist servers 查看可用服务器列表')
664
+ ]);
560
665
  }
561
666
  // 获取服务器配置
562
667
  const server = this.getServerConfigByIdOrName(serverIdOrName);
563
668
  if (!server) {
564
669
  this.logger.warn('批量白名单', `QQ(${normalizedUserId})提供的服务器名称或ID"${serverIdOrName}"无效`);
565
- return this.deps.sendMessage(session, [koishi_1.h.text(`未找到名称或ID为"${serverIdOrName}"的服务器\n使用 mcid whitelist servers 查看可用服务器列表`)]);
670
+ return this.deps.sendMessage(session, [
671
+ koishi_1.h.text(`未找到名称或ID为"${serverIdOrName}"的服务器\n使用 mcid whitelist servers 查看可用服务器列表`)
672
+ ]);
566
673
  }
567
674
  // 检查服务器是否启用
568
675
  if (server.enabled === false) {
569
676
  this.logger.warn('批量白名单', `QQ(${normalizedUserId})尝试为已停用的服务器"${server.name}"批量添加白名单`);
570
- return this.deps.sendMessage(session, [koishi_1.h.text(`服务器"${server.name}"已停用,无法添加白名单`)]);
677
+ return this.deps.sendMessage(session, [
678
+ koishi_1.h.text(`服务器"${server.name}"已停用,无法添加白名单`)
679
+ ]);
571
680
  }
572
681
  // 发送开始执行的通知
573
- await this.deps.sendMessage(session, [koishi_1.h.text(`开始批量添加白名单到服务器"${server.name}",请稍候...`)]);
682
+ await this.deps.sendMessage(session, [
683
+ koishi_1.h.text(`开始批量添加白名单到服务器"${server.name}",请稍候...`)
684
+ ]);
574
685
  // 查询所有已绑定MC账号的用户
575
686
  const allBinds = await this.repos.mcidbind.findAll();
576
687
  // 过滤掉无效的绑定:没有用户名或UUID的记录
577
- const validBinds = allBinds.filter(bind => (bind.mcUsername && bind.mcUsername.trim() !== '' && !bind.mcUsername.startsWith('_temp_')) ||
688
+ const validBinds = allBinds.filter(bind => (bind.mcUsername &&
689
+ bind.mcUsername.trim() !== '' &&
690
+ !bind.mcUsername.startsWith('_temp_')) ||
578
691
  (bind.mcUuid && bind.mcUuid.trim() !== ''));
579
692
  // 按绑定时间排序,早绑定的用户优先处理
580
693
  validBinds.sort((a, b) => {
@@ -602,9 +715,11 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
602
715
  else {
603
716
  // 添加错误阈值检查
604
717
  const currentFailRate = failCount / (successCount + failCount + 1);
605
- if (currentFailRate > 0.5 && (successCount + failCount) >= 5) {
718
+ if (currentFailRate > 0.5 && successCount + failCount >= 5) {
606
719
  this.logger.error('批量白名单', `失败率过高(${Math.round(currentFailRate * 100)}%),中止操作`);
607
- await this.deps.sendMessage(session, [koishi_1.h.text(`⚠️ 批量添加白名单操作已中止: 失败率过高(${Math.round(currentFailRate * 100)}%),请检查服务器连接`)]);
720
+ await this.deps.sendMessage(session, [
721
+ koishi_1.h.text(`⚠️ 批量添加白名单操作已中止: 失败率过高(${Math.round(currentFailRate * 100)}%),请检查服务器连接`)
722
+ ]);
608
723
  break;
609
724
  }
610
725
  // 执行添加白名单操作,顺序执行确保每个命令等待上一个完成
@@ -624,7 +739,9 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
624
739
  this.logger.error('批量白名单', `处理用户QQ(${bind.qqId})时出错: ${error.message}`);
625
740
  // 如果错误指示操作已中止,退出循环
626
741
  if (error.message.includes('失败率过高')) {
627
- await this.deps.sendMessage(session, [koishi_1.h.text(`⚠️ 批量添加白名单操作已中止: ${error.message}`)]);
742
+ await this.deps.sendMessage(session, [
743
+ koishi_1.h.text(`⚠️ 批量添加白名单操作已中止: ${error.message}`)
744
+ ]);
628
745
  break;
629
746
  }
630
747
  }
@@ -633,14 +750,18 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
633
750
  const progress = Math.floor((processedCount / validBinds.length) * 100);
634
751
  // 只有当进度增加了20%或以上,或者是首次或最后一次才发送通知
635
752
  if (i === 0 || progress - lastNotifiedProgress >= 20 || i === validBinds.length - 1) {
636
- await this.deps.sendMessage(session, [koishi_1.h.text(`批量添加白名单进度: ${progress}%,已处理${processedCount}/${validBinds.length}个用户\n成功: ${successCount} | 失败: ${failCount} | 跳过: ${skipCount}`)]);
753
+ await this.deps.sendMessage(session, [
754
+ koishi_1.h.text(`批量添加白名单进度: ${progress}%,已处理${processedCount}/${validBinds.length}个用户\n成功: ${successCount} | 失败: ${failCount} | 跳过: ${skipCount}`)
755
+ ]);
637
756
  lastNotifiedProgress = progress;
638
757
  }
639
758
  // 添加延迟确保RCON命令有足够的处理时间,避免过载
640
759
  await new Promise(resolve => setTimeout(resolve, 1000)); // 每个请求间隔1秒
641
760
  }
642
761
  this.logger.info('批量白名单', `成功: 管理员QQ(${normalizedUserId})批量添加了服务器"${server.name}"的白名单,成功: ${successCount},失败: ${failCount},跳过: ${skipCount}`);
643
- return this.deps.sendMessage(session, [koishi_1.h.text(`批量添加服务器"${server.name}"白名单完成\n共处理${validBinds.length}个有效用户\n✅ 成功: ${successCount} 个\n❌ 失败: ${failCount} 个\n⏭️ 跳过(已在白名单): ${skipCount} 个\n\n如需查看详细日志,请查看服务器日志文件`)]);
762
+ return this.deps.sendMessage(session, [
763
+ koishi_1.h.text(`批量添加服务器"${server.name}"白名单完成\n共处理${validBinds.length}个有效用户\n✅ 成功: ${successCount} 个\n❌ 失败: ${failCount} 个\n⏭️ 跳过(已在白名单): ${skipCount} 个\n\n如需查看详细日志,请查看服务器日志文件`)
764
+ ]);
644
765
  }
645
766
  catch (error) {
646
767
  const normalizedUserId = this.deps.normalizeQQId(session.userId);
@@ -695,7 +816,7 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
695
816
  getServerConfigById(serverId) {
696
817
  if (!this.config.servers || !Array.isArray(this.config.servers))
697
818
  return null;
698
- return this.config.servers.find(server => server.id === serverId && (server.enabled !== false)) || null;
819
+ return (this.config.servers.find(server => server.id === serverId && server.enabled !== false) || null);
699
820
  }
700
821
  /**
701
822
  * 私有辅助方法:根据服务器名称获取服务器配置
@@ -775,7 +896,7 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
775
896
  async addServerWhitelist(mcBind, server) {
776
897
  try {
777
898
  if (!mcBind || !mcBind.mcUsername) {
778
- this.logger.warn('白名单', `尝试为未绑定MC账号的用户添加白名单`);
899
+ this.logger.warn('白名单', '尝试为未绑定MC账号的用户添加白名单');
779
900
  return false;
780
901
  }
781
902
  // 重新获取最新的用户绑定信息
@@ -795,7 +916,7 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
795
916
  let mcid;
796
917
  if (server.idType === 'uuid') {
797
918
  if (!freshBind.mcUuid) {
798
- this.logger.warn('白名单', `用户缺少UUID信息,无法添加白名单`);
919
+ this.logger.warn('白名单', '用户缺少UUID信息,无法添加白名单');
799
920
  return false;
800
921
  }
801
922
  const uuid = freshBind.mcUuid.trim();
@@ -816,13 +937,35 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
816
937
  let success = false;
817
938
  if (response.trim() === '') {
818
939
  if (server.acceptEmptyResponse) {
819
- this.logger.info('白名单', `收到空响应,根据配置将其视为成功`);
940
+ this.logger.info('白名单', '收到空响应,根据配置将其视为成功');
820
941
  success = true;
821
942
  }
822
943
  }
823
944
  else {
824
- const successKeywords = ['已', '成功', 'success', 'added', 'okay', 'done', 'completed', 'added to', 'whitelist has', 'whitelisted'];
825
- const failureKeywords = ['失败', 'error', 'failed', 'not found', '不存在', 'cannot', 'unable', 'failure', 'exception', 'denied'];
945
+ const successKeywords = [
946
+ '',
947
+ '成功',
948
+ 'success',
949
+ 'added',
950
+ 'okay',
951
+ 'done',
952
+ 'completed',
953
+ 'added to',
954
+ 'whitelist has',
955
+ 'whitelisted'
956
+ ];
957
+ const failureKeywords = [
958
+ '失败',
959
+ 'error',
960
+ 'failed',
961
+ 'not found',
962
+ '不存在',
963
+ 'cannot',
964
+ 'unable',
965
+ 'failure',
966
+ 'exception',
967
+ 'denied'
968
+ ];
826
969
  const hasFailureKeyword = failureKeywords.some(keyword => response.toLowerCase().includes(keyword.toLowerCase()));
827
970
  const hasSuccessKeyword = successKeywords.some(keyword => response.toLowerCase().includes(keyword.toLowerCase()));
828
971
  if (!hasFailureKeyword && (hasSuccessKeyword || response.length > 0)) {
@@ -858,7 +1001,7 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
858
1001
  async removeServerWhitelist(mcBind, server) {
859
1002
  try {
860
1003
  if (!mcBind || !mcBind.mcUsername) {
861
- this.logger.warn('白名单', `尝试为未绑定MC账号的用户移除白名单`);
1004
+ this.logger.warn('白名单', '尝试为未绑定MC账号的用户移除白名单');
862
1005
  return false;
863
1006
  }
864
1007
  // 重新获取最新的用户绑定信息
@@ -878,7 +1021,7 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
878
1021
  let mcid;
879
1022
  if (server.idType === 'uuid') {
880
1023
  if (!freshBind.mcUuid) {
881
- this.logger.warn('白名单', `用户缺少UUID信息,无法移除白名单`);
1024
+ this.logger.warn('白名单', '用户缺少UUID信息,无法移除白名单');
882
1025
  return false;
883
1026
  }
884
1027
  const uuid = freshBind.mcUuid.trim();
@@ -899,14 +1042,42 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
899
1042
  let success = false;
900
1043
  if (response.trim() === '') {
901
1044
  if (server.acceptEmptyResponse) {
902
- this.logger.info('白名单', `收到空响应,根据配置将其视为成功`);
1045
+ this.logger.info('白名单', '收到空响应,根据配置将其视为成功');
903
1046
  success = true;
904
1047
  }
905
1048
  }
906
1049
  else {
907
- const successKeywords = ['移除', '已完成', '成功', 'success', 'removed', 'okay', 'done', 'completed', 'removePlayer', 'took', 'off'];
908
- const failureKeywords = ['失败', '错误', 'error', 'failed', 'cannot', 'unable', 'failure', 'exception', 'denied'];
909
- const notFoundKeywords = ['not found', '不存在', 'no player was removed', 'is not whitelisted', 'not in'];
1050
+ const successKeywords = [
1051
+ '移除',
1052
+ '已完成',
1053
+ '成功',
1054
+ 'success',
1055
+ 'removed',
1056
+ 'okay',
1057
+ 'done',
1058
+ 'completed',
1059
+ 'removePlayer',
1060
+ 'took',
1061
+ 'off'
1062
+ ];
1063
+ const failureKeywords = [
1064
+ '失败',
1065
+ '错误',
1066
+ 'error',
1067
+ 'failed',
1068
+ 'cannot',
1069
+ 'unable',
1070
+ 'failure',
1071
+ 'exception',
1072
+ 'denied'
1073
+ ];
1074
+ const notFoundKeywords = [
1075
+ 'not found',
1076
+ '不存在',
1077
+ 'no player was removed',
1078
+ 'is not whitelisted',
1079
+ 'not in'
1080
+ ];
910
1081
  const hasSuccessKeyword = successKeywords.some(keyword => response.toLowerCase().includes(keyword.toLowerCase()));
911
1082
  const hasFailureKeyword = failureKeywords.some(keyword => response.toLowerCase().includes(keyword.toLowerCase()));
912
1083
  const isNotExist = notFoundKeywords.some(keyword => response.toLowerCase().includes(keyword.toLowerCase()));
@@ -970,10 +1141,14 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
970
1141
  }
971
1142
  // RCON相关错误
972
1143
  if (errorMsg.includes('RCON') || errorMsg.includes('服务器')) {
973
- if (errorMsg.includes('authentication') || errorMsg.includes('auth') || errorMsg.includes('认证')) {
1144
+ if (errorMsg.includes('authentication') ||
1145
+ errorMsg.includes('auth') ||
1146
+ errorMsg.includes('认证')) {
974
1147
  return 'RCON认证失败,服务器拒绝访问,请联系管理员检查密码';
975
1148
  }
976
- if (errorMsg.includes('ECONNREFUSED') || errorMsg.includes('ETIMEDOUT') || errorMsg.includes('无法连接')) {
1149
+ if (errorMsg.includes('ECONNREFUSED') ||
1150
+ errorMsg.includes('ETIMEDOUT') ||
1151
+ errorMsg.includes('无法连接')) {
977
1152
  return '无法连接到游戏服务器,请确认服务器是否在线或联系管理员';
978
1153
  }
979
1154
  if (errorMsg.includes('command') || errorMsg.includes('执行命令')) {