koishi-plugin-bind-bot 2.1.0 → 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.
- 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/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 +260 -142
- package/lib/repositories/mcidbind.repository.js +2 -2
- package/lib/repositories/schedule-mute.repository.js +2 -2
- package/lib/services/api.service.js +28 -22
- package/lib/services/database.service.js +16 -14
- package/lib/services/nickname.service.js +10 -10
- package/lib/types/api.d.ts +90 -0
- package/lib/types/config.d.ts +61 -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
|
@@ -27,7 +27,8 @@ class WhitelistHandler extends base_handler_1.BaseHandler {
|
|
|
27
27
|
* 列出所有可用的服务器
|
|
28
28
|
*/
|
|
29
29
|
registerServersCommand(parent) {
|
|
30
|
-
parent
|
|
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, [
|
|
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
|
|
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 +=
|
|
92
|
+
serverInfo += '\n 状态: ' + (server.enabled === false ? '已停用' : '已启用');
|
|
69
93
|
// 添加申请权限信息
|
|
70
|
-
serverInfo +=
|
|
94
|
+
serverInfo +=
|
|
95
|
+
'\n 权限: ' + (server.allowSelfApply ? '允许自助申请' : '仅管理员可操作');
|
|
71
96
|
// 只有当设置了地址时才显示地址行
|
|
72
97
|
if (server.displayAddress && server.displayAddress.trim()) {
|
|
73
|
-
serverInfo +=
|
|
98
|
+
serverInfo += '\n 地址: ' + server.displayAddress;
|
|
74
99
|
}
|
|
75
100
|
// 只有当设置了说明信息时才显示说明行
|
|
76
101
|
if (server.description && server.description.trim()) {
|
|
77
|
-
serverInfo +=
|
|
102
|
+
serverInfo += '\n 说明: ' + server.description;
|
|
78
103
|
}
|
|
79
104
|
return serverInfo;
|
|
80
|
-
})
|
|
105
|
+
})
|
|
106
|
+
.join('\n\n'); // 使用双换行分隔不同服务器,增强可读性
|
|
81
107
|
this.logger.info('白名单', `成功: QQ(${normalizedUserId})获取了服务器列表,共${enabledServers.length}个服务器`);
|
|
82
|
-
const displayUsername = userBind.mcUsername && !userBind.mcUsername.startsWith('_temp_')
|
|
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
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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 &&
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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
|
|
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, [
|
|
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, [
|
|
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 &&
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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
|
|
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, [
|
|
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, [
|
|
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
|
|
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
|
|
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, [
|
|
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, [
|
|
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, [
|
|
677
|
+
return this.deps.sendMessage(session, [
|
|
678
|
+
koishi_1.h.text(`服务器"${server.name}"已停用,无法添加白名单`)
|
|
679
|
+
]);
|
|
571
680
|
}
|
|
572
681
|
// 发送开始执行的通知
|
|
573
|
-
await this.deps.sendMessage(session, [
|
|
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 &&
|
|
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 &&
|
|
718
|
+
if (currentFailRate > 0.5 && successCount + failCount >= 5) {
|
|
606
719
|
this.logger.error('批量白名单', `失败率过高(${Math.round(currentFailRate * 100)}%),中止操作`);
|
|
607
|
-
await this.deps.sendMessage(session, [
|
|
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, [
|
|
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, [
|
|
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, [
|
|
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 &&
|
|
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('白名单',
|
|
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('白名单',
|
|
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 = [
|
|
825
|
-
|
|
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('白名单',
|
|
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('白名单',
|
|
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 = [
|
|
908
|
-
|
|
909
|
-
|
|
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') ||
|
|
1144
|
+
if (errorMsg.includes('authentication') ||
|
|
1145
|
+
errorMsg.includes('auth') ||
|
|
1146
|
+
errorMsg.includes('认证')) {
|
|
974
1147
|
return 'RCON认证失败,服务器拒绝访问,请联系管理员检查密码';
|
|
975
1148
|
}
|
|
976
|
-
if (errorMsg.includes('ECONNREFUSED') ||
|
|
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('执行命令')) {
|