koishi-plugin-class-score-system 1.0.13 → 1.0.18
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/index.js +310 -325
- package/lib/index.js.map +7 -0
- package/package.json +39 -1
- package/src/commands/bind-server.ts +3 -2
- package/src/index.ts +18 -3
- package/src/services/api.ts +20 -23
- package/src/services/server.ts +8 -7
- package/src/utils/image.ts +27 -3
package/lib/index.js
CHANGED
|
@@ -2,7 +2,6 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
3
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
5
|
var __export = (target, all) => {
|
|
7
6
|
for (var name2 in all)
|
|
8
7
|
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
@@ -18,14 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
17
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
18
|
|
|
20
19
|
// src/index.ts
|
|
21
|
-
var
|
|
22
|
-
__export(
|
|
20
|
+
var index_exports = {};
|
|
21
|
+
__export(index_exports, {
|
|
23
22
|
Config: () => Config,
|
|
24
23
|
apply: () => apply,
|
|
25
24
|
inject: () => inject,
|
|
26
25
|
name: () => name
|
|
27
26
|
});
|
|
28
|
-
module.exports = __toCommonJS(
|
|
27
|
+
module.exports = __toCommonJS(index_exports);
|
|
29
28
|
var import_koishi4 = require("koishi");
|
|
30
29
|
|
|
31
30
|
// src/models/database.ts
|
|
@@ -70,13 +69,9 @@ function extendDatabase(ctx) {
|
|
|
70
69
|
unique: ["openId", "guildId"]
|
|
71
70
|
});
|
|
72
71
|
}
|
|
73
|
-
__name(extendDatabase, "extendDatabase");
|
|
74
72
|
|
|
75
73
|
// src/services/api.ts
|
|
76
74
|
var CsmsApiService = class {
|
|
77
|
-
static {
|
|
78
|
-
__name(this, "CsmsApiService");
|
|
79
|
-
}
|
|
80
75
|
baseUrl;
|
|
81
76
|
token;
|
|
82
77
|
ctx;
|
|
@@ -98,50 +93,50 @@ var CsmsApiService = class {
|
|
|
98
93
|
cleanParams[key] = String(value);
|
|
99
94
|
}
|
|
100
95
|
}
|
|
101
|
-
this.ctx.logger.debug(`API
|
|
96
|
+
this.ctx.logger.debug(`API\u8BF7\u6C42: ${url}`, cleanParams);
|
|
102
97
|
const response = await this.ctx.http.get(url, {
|
|
103
98
|
params: cleanParams,
|
|
104
99
|
headers: {
|
|
105
100
|
"Authorization": this.token
|
|
106
101
|
}
|
|
107
102
|
});
|
|
108
|
-
this.ctx.logger.debug(`API
|
|
103
|
+
this.ctx.logger.debug(`API\u54CD\u5E94:`, response);
|
|
109
104
|
return response;
|
|
110
105
|
} catch (error) {
|
|
111
|
-
this.ctx.logger.error("CSMS API
|
|
112
|
-
return { error: error.message || "API
|
|
106
|
+
this.ctx.logger.error("CSMS API \u8BF7\u6C42\u5931\u8D25:", error);
|
|
107
|
+
return { error: error.message || "API\u8BF7\u6C42\u5931\u8D25" };
|
|
113
108
|
}
|
|
114
109
|
}
|
|
115
110
|
/**
|
|
116
|
-
* 验证 Token -
|
|
117
|
-
*
|
|
111
|
+
* 验证 Token - 使用 verify_token 接口
|
|
112
|
+
* GET /api/global_api.php?action=verify_token&token=xxx
|
|
113
|
+
* 成功: {"success":true,"message":"token 有效","username":"admin","new_token":"..."}
|
|
114
|
+
* 失败: {"error":"无效的token,token不存在或已失效"}
|
|
118
115
|
*/
|
|
119
116
|
async validateToken() {
|
|
120
117
|
try {
|
|
121
118
|
const url = `${this.baseUrl}/api/global_api.php`;
|
|
122
119
|
const params = {
|
|
123
|
-
action: "
|
|
124
|
-
data: JSON.stringify({
|
|
125
|
-
username: "__validate__",
|
|
126
|
-
score_change: 0,
|
|
127
|
-
description: "__token_validation__"
|
|
128
|
-
}),
|
|
120
|
+
action: "verify_token",
|
|
129
121
|
token: this.token
|
|
130
122
|
};
|
|
131
|
-
this.ctx.logger.info(
|
|
123
|
+
this.ctx.logger.info(`\u9A8C\u8BC1Token\u4E2D...`);
|
|
132
124
|
const response = await this.ctx.http.get(url, { params });
|
|
133
125
|
if (response.error) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
this.ctx.logger.warn(`Token验证失败: ${response.error}`);
|
|
137
|
-
return { valid: false };
|
|
138
|
-
}
|
|
139
|
-
this.ctx.logger.info(`Token验证成功`);
|
|
140
|
-
return { valid: true };
|
|
126
|
+
this.ctx.logger.warn(`Token\u9A8C\u8BC1\u5931\u8D25: ${response.error}`);
|
|
127
|
+
return { valid: false };
|
|
141
128
|
}
|
|
142
|
-
|
|
129
|
+
if (response.success) {
|
|
130
|
+
this.ctx.logger.info(`Token\u9A8C\u8BC1\u6210\u529F\uFF0C\u7528\u6237: ${response.username}`);
|
|
131
|
+
return {
|
|
132
|
+
valid: true,
|
|
133
|
+
username: response.username,
|
|
134
|
+
newToken: response.new_token
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
return { valid: false };
|
|
143
138
|
} catch (error) {
|
|
144
|
-
this.ctx.logger.error(`Token
|
|
139
|
+
this.ctx.logger.error(`Token\u9A8C\u8BC1\u5F02\u5E38:`, error);
|
|
145
140
|
return { valid: false };
|
|
146
141
|
}
|
|
147
142
|
}
|
|
@@ -258,12 +253,12 @@ var CsmsApiService = class {
|
|
|
258
253
|
* GET /api/global_api.php?action=add_score&data={"users":[...],"description":"xxx"}&token=xxx
|
|
259
254
|
*/
|
|
260
255
|
async batchAddScore(data) {
|
|
261
|
-
this.ctx.logger.info(`batchAddScore
|
|
256
|
+
this.ctx.logger.info(`batchAddScore \u8BF7\u6C42\u6570\u636E:`, JSON.stringify(data));
|
|
262
257
|
const response = await this.request({
|
|
263
258
|
action: "add_score",
|
|
264
259
|
data: JSON.stringify(data)
|
|
265
260
|
});
|
|
266
|
-
this.ctx.logger.info(`batchAddScore API
|
|
261
|
+
this.ctx.logger.info(`batchAddScore API \u54CD\u5E94:`, JSON.stringify(response));
|
|
267
262
|
if (response.error) {
|
|
268
263
|
return {
|
|
269
264
|
success: false,
|
|
@@ -281,15 +276,15 @@ var CsmsApiService = class {
|
|
|
281
276
|
if (Array.isArray(response.data)) {
|
|
282
277
|
return {
|
|
283
278
|
success: true,
|
|
284
|
-
message: "
|
|
279
|
+
message: "\u64CD\u4F5C\u5B8C\u6210",
|
|
285
280
|
summary: { success_count: response.data.length, failed_count: 0, total_count: response.data.length },
|
|
286
281
|
details: response.data
|
|
287
282
|
};
|
|
288
283
|
}
|
|
289
|
-
this.ctx.logger.error(`batchAddScore
|
|
284
|
+
this.ctx.logger.error(`batchAddScore \u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u5F02\u5E38\uFF0C\u539F\u59CB\u54CD\u5E94:`, response);
|
|
290
285
|
return {
|
|
291
286
|
success: false,
|
|
292
|
-
message: "API
|
|
287
|
+
message: "API \u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u5F02\u5E38",
|
|
293
288
|
summary: { success_count: 0, failed_count: 0, total_count: 0 },
|
|
294
289
|
details: []
|
|
295
290
|
};
|
|
@@ -307,9 +302,6 @@ var CsmsApiService = class {
|
|
|
307
302
|
|
|
308
303
|
// src/services/server.ts
|
|
309
304
|
var ServerConfigService = class {
|
|
310
|
-
static {
|
|
311
|
-
__name(this, "ServerConfigService");
|
|
312
|
-
}
|
|
313
305
|
ctx;
|
|
314
306
|
constructor(ctx) {
|
|
315
307
|
this.ctx = ctx;
|
|
@@ -365,14 +357,15 @@ var ServerConfigService = class {
|
|
|
365
357
|
return {
|
|
366
358
|
valid: true,
|
|
367
359
|
actualUsername: result.username,
|
|
368
|
-
|
|
360
|
+
newToken: result.newToken,
|
|
361
|
+
error: `\u8B66\u544A\uFF1A\u63D0\u4F9B\u7684\u7528\u6237\u540D "${username}" \u4E0E\u5B9E\u9645\u767B\u5F55\u7684\u7BA1\u7406\u5458 "${result.username}" \u4E0D\u4E00\u81F4`
|
|
369
362
|
};
|
|
370
363
|
}
|
|
371
|
-
return { valid: true, actualUsername: result.username };
|
|
364
|
+
return { valid: true, actualUsername: result.username, newToken: result.newToken };
|
|
372
365
|
}
|
|
373
|
-
return { valid: false, error: "Token
|
|
366
|
+
return { valid: false, error: "Token \u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u662F\u5426\u6B63\u786E" };
|
|
374
367
|
} catch (error) {
|
|
375
|
-
this.ctx.logger.error("
|
|
368
|
+
this.ctx.logger.error("\u9A8C\u8BC1\u670D\u52A1\u5668\u914D\u7F6E\u5931\u8D25:", error);
|
|
376
369
|
return { valid: false, error: error.message };
|
|
377
370
|
}
|
|
378
371
|
}
|
|
@@ -380,9 +373,6 @@ var ServerConfigService = class {
|
|
|
380
373
|
|
|
381
374
|
// src/services/binding.ts
|
|
382
375
|
var QqBindingService = class {
|
|
383
|
-
static {
|
|
384
|
-
__name(this, "QqBindingService");
|
|
385
|
-
}
|
|
386
376
|
ctx;
|
|
387
377
|
constructor(ctx) {
|
|
388
378
|
this.ctx = ctx;
|
|
@@ -442,9 +432,6 @@ var QqBindingService = class {
|
|
|
442
432
|
|
|
443
433
|
// src/services/group-admin.ts
|
|
444
434
|
var GroupAdminService = class {
|
|
445
|
-
static {
|
|
446
|
-
__name(this, "GroupAdminService");
|
|
447
|
-
}
|
|
448
435
|
ctx;
|
|
449
436
|
constructor(ctx) {
|
|
450
437
|
this.ctx = ctx;
|
|
@@ -533,39 +520,36 @@ var CONSTANTS = {
|
|
|
533
520
|
DESCRIPTION_MAX_LENGTH: 255
|
|
534
521
|
};
|
|
535
522
|
var ERROR_MESSAGES = {
|
|
536
|
-
NO_SERVER_CONFIG: "
|
|
537
|
-
INVALID_TOKEN: "
|
|
538
|
-
INVALID_QQ: "
|
|
539
|
-
INVALID_SCORE: "
|
|
540
|
-
INVALID_USERNAME: "
|
|
541
|
-
INVALID_DESCRIPTION: "
|
|
542
|
-
INVALID_LIMIT: "
|
|
543
|
-
SERVER_NOT_FOUND: "
|
|
544
|
-
USER_NOT_FOUND: "
|
|
545
|
-
USER_ALREADY_BOUND: "
|
|
546
|
-
USER_NOT_BOUND: "
|
|
547
|
-
API_REQUEST_FAILED: "API
|
|
548
|
-
INSUFFICIENT_PERMISSION: "
|
|
549
|
-
BINDING_FAILED: "
|
|
550
|
-
UNBINDING_FAILED: "
|
|
551
|
-
CONFIGURATION_FAILED: "
|
|
523
|
+
NO_SERVER_CONFIG: "\u672A\u914D\u7F6ECSMS\u670D\u52A1\u5668\uFF0C\u8BF7\u5148\u4F7F\u7528 /\u7ED1\u5B9A\u670D\u52A1\u5668 \u547D\u4EE4\u914D\u7F6E",
|
|
524
|
+
INVALID_TOKEN: "\u65E0\u6548\u7684Token\u683C\u5F0F\uFF0CToken\u5FC5\u987B\u7531\u6570\u5B57\u548C\u82F1\u6587\u5927\u5199\u5B57\u6BCD\u7EC4\u6210",
|
|
525
|
+
INVALID_QQ: "\u65E0\u6548\u7684QQ\u53F7\u7801\u683C\u5F0F",
|
|
526
|
+
INVALID_SCORE: "\u5206\u6570\u5FC5\u987B\u5728 -1000 \u5230 1000 \u4E4B\u95F4",
|
|
527
|
+
INVALID_USERNAME: "\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26",
|
|
528
|
+
INVALID_DESCRIPTION: "\u63CF\u8FF0\u4FE1\u606F\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26",
|
|
529
|
+
INVALID_LIMIT: "\u6570\u91CF\u5FC5\u987B\u5728 1 \u5230 50 \u4E4B\u95F4",
|
|
530
|
+
SERVER_NOT_FOUND: "\u670D\u52A1\u5668\u672A\u627E\u5230",
|
|
531
|
+
USER_NOT_FOUND: "\u7528\u6237\u672A\u627E\u5230",
|
|
532
|
+
USER_ALREADY_BOUND: "\u8BE5QQ\u53F7\u5DF2\u7ED1\u5B9A\u5176\u4ED6\u7528\u6237",
|
|
533
|
+
USER_NOT_BOUND: "\u8BE5QQ\u53F7\u672A\u7ED1\u5B9A\u4EFB\u4F55\u7528\u6237",
|
|
534
|
+
API_REQUEST_FAILED: "API\u8BF7\u6C42\u5931\u8D25",
|
|
535
|
+
INSUFFICIENT_PERMISSION: "\u6743\u9650\u4E0D\u8DB3\uFF0C\u4EC5\u7BA1\u7406\u5458\u53EF\u6267\u884C\u6B64\u64CD\u4F5C",
|
|
536
|
+
BINDING_FAILED: "\u7ED1\u5B9A\u5931\u8D25",
|
|
537
|
+
UNBINDING_FAILED: "\u89E3\u9664\u7ED1\u5B9A\u5931\u8D25",
|
|
538
|
+
CONFIGURATION_FAILED: "\u914D\u7F6E\u4FDD\u5B58\u5931\u8D25"
|
|
552
539
|
};
|
|
553
540
|
var HELP_MESSAGES = {
|
|
554
|
-
BIND_SERVER: "
|
|
555
|
-
QUERY_SCORE: "
|
|
556
|
-
ADJUST_SCORE: "
|
|
557
|
-
BIND_QQ: "
|
|
558
|
-
VIEW_BINDING: "
|
|
559
|
-
UNBIND_QQ: "
|
|
560
|
-
RANKING: "
|
|
561
|
-
STATISTICS: "
|
|
541
|
+
BIND_SERVER: "\u7ED1\u5B9ACSMS\u670D\u52A1\u5668\n\u7528\u6CD5\uFF1A/\u7ED1\u5B9A\u670D\u52A1\u5668 <\u670D\u52A1\u5668\u5730\u5740> <\u7BA1\u7406\u5458\u7528\u6237\u540D> <\u7BA1\u7406\u5458Token>\n\u793A\u4F8B\uFF1A/\u7ED1\u5B9A\u670D\u52A1\u5668 https://example.com admin ABC123",
|
|
542
|
+
QUERY_SCORE: "\u67E5\u8BE2\u79EF\u5206\n\u7528\u6CD5\uFF1A/\u67E5\u8BE2\u79EF\u5206 [\u7528\u6237\u540D]\n\u793A\u4F8B\uFF1A/\u67E5\u8BE2\u79EF\u5206 \u5F20\u4E09",
|
|
543
|
+
ADJUST_SCORE: "\u8C03\u6574\u79EF\u5206\n\u7528\u6CD5\uFF1A/\u8C03\u6574\u79EF\u5206 <\u7528\u6237\u540D> <\u5206\u6570> <\u539F\u56E0>\n\u793A\u4F8B\uFF1A/\u8C03\u6574\u79EF\u5206 \u5F20\u4E09 +5 \u8868\u73B0\u4F18\u79C0",
|
|
544
|
+
BIND_QQ: "\u7ED1\u5B9AQQ\n\u7528\u6CD5\uFF1A/\u7ED1\u5B9AQQ <\u7528\u6237\u540D>\n\u793A\u4F8B\uFF1A/\u7ED1\u5B9AQQ \u5F20\u4E09",
|
|
545
|
+
VIEW_BINDING: "\u67E5\u770B\u7ED1\u5B9A\n\u7528\u6CD5\uFF1A/\u67E5\u770B\u7ED1\u5B9A [\u7528\u6237\u540D]\n\u793A\u4F8B\uFF1A/\u67E5\u770B\u7ED1\u5B9A \u5F20\u4E09",
|
|
546
|
+
UNBIND_QQ: "\u89E3\u9664\u7ED1\u5B9A\n\u7528\u6CD5\uFF1A/\u89E3\u9664\u7ED1\u5B9A <QQ\u53F7>\n\u793A\u4F8B\uFF1A/\u89E3\u9664\u7ED1\u5B9A 123456789",
|
|
547
|
+
RANKING: "\u6392\u884C\u699C\n\u7528\u6CD5\uFF1A/\u6392\u884C\u699C [\u6570\u91CF]\n\u793A\u4F8B\uFF1A/\u6392\u884C\u699C 10",
|
|
548
|
+
STATISTICS: "\u7EDF\u8BA1\n\u7528\u6CD5\uFF1A/\u7EDF\u8BA1 [\u7528\u6237\u540D]\n\u793A\u4F8B\uFF1A/\u7EDF\u8BA1 \u5F20\u4E09"
|
|
562
549
|
};
|
|
563
550
|
|
|
564
551
|
// src/utils/validator.ts
|
|
565
552
|
var Validator = class {
|
|
566
|
-
static {
|
|
567
|
-
__name(this, "Validator");
|
|
568
|
-
}
|
|
569
553
|
static validateToken(token) {
|
|
570
554
|
return CONSTANTS.TOKEN_PATTERN.test(token);
|
|
571
555
|
}
|
|
@@ -616,7 +600,7 @@ var Validator = class {
|
|
|
616
600
|
}
|
|
617
601
|
static validateLimitWithMessage(limit, max = CONSTANTS.RANKING_MAX_LIMIT) {
|
|
618
602
|
if (!this.validateLimit(limit, max)) {
|
|
619
|
-
return
|
|
603
|
+
return `\u6570\u91CF\u5FC5\u987B\u5728 1 \u5230 ${max} \u4E4B\u95F4`;
|
|
620
604
|
}
|
|
621
605
|
return null;
|
|
622
606
|
}
|
|
@@ -624,33 +608,30 @@ var Validator = class {
|
|
|
624
608
|
|
|
625
609
|
// src/utils/formatter.ts
|
|
626
610
|
var Formatter = class {
|
|
627
|
-
static {
|
|
628
|
-
__name(this, "Formatter");
|
|
629
|
-
}
|
|
630
611
|
// QQ 消息单条最大长度限制(留有余量)
|
|
631
612
|
static MAX_MESSAGE_LENGTH = 1800;
|
|
632
613
|
static formatScoreInfo(user, ranking) {
|
|
633
614
|
return [
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
615
|
+
`\u7528\u6237: ${user.username}`,
|
|
616
|
+
`\u6392\u540D: ${ranking || "\u672A\u77E5"}`,
|
|
617
|
+
`\u603B\u79EF\u5206: ${user.total_score}`,
|
|
618
|
+
`\u7D2F\u8BA1\u52A0\u5206: ${user.add_score}`,
|
|
619
|
+
`\u7D2F\u8BA1\u6263\u5206: ${user.deduct_score}`,
|
|
620
|
+
`\u8BB0\u5F55\u6570: ${user.score_count}`
|
|
640
621
|
].join("\n");
|
|
641
622
|
}
|
|
642
623
|
static formatRanking(users) {
|
|
643
624
|
if (users.length === 0) {
|
|
644
|
-
return "
|
|
625
|
+
return "\u6682\u65E0\u6392\u540D\u6570\u636E";
|
|
645
626
|
}
|
|
646
|
-
const lines = ["
|
|
627
|
+
const lines = ["\u3010\u79EF\u5206\u6392\u884C\u699C\u3011"];
|
|
647
628
|
const displayUsers = users.slice(0, 20);
|
|
648
629
|
displayUsers.forEach((user, index) => {
|
|
649
|
-
const medal = index < 3 ? ["
|
|
650
|
-
lines.push(`${medal} ${user.username}: ${user.total_score}
|
|
630
|
+
const medal = index < 3 ? ["\u{1F947}", "\u{1F948}", "\u{1F949}"][index] : `${index + 1}.`;
|
|
631
|
+
lines.push(`${medal} ${user.username}: ${user.total_score}\u5206`);
|
|
651
632
|
});
|
|
652
633
|
if (users.length > 20) {
|
|
653
|
-
lines.push(`...
|
|
634
|
+
lines.push(`... \u5171 ${users.length} \u4EBA\uFF0C\u663E\u793A\u524D20\u540D`);
|
|
654
635
|
}
|
|
655
636
|
return lines.join("\n");
|
|
656
637
|
}
|
|
@@ -659,70 +640,70 @@ var Formatter = class {
|
|
|
659
640
|
*/
|
|
660
641
|
static formatRankingWithRank(users, startRank) {
|
|
661
642
|
if (users.length === 0) {
|
|
662
|
-
return "
|
|
643
|
+
return "\u6682\u65E0\u6392\u540D\u6570\u636E";
|
|
663
644
|
}
|
|
664
|
-
const lines = ["
|
|
645
|
+
const lines = ["\u3010\u79EF\u5206\u6392\u884C\u699C\u3011"];
|
|
665
646
|
users.forEach((user, index) => {
|
|
666
647
|
const rank = startRank + index;
|
|
667
|
-
const medal = rank <= 3 ? ["
|
|
668
|
-
lines.push(`${medal} ${user.username}: ${user.total_score}
|
|
648
|
+
const medal = rank <= 3 ? ["\u{1F947}", "\u{1F948}", "\u{1F949}"][rank - 1] : `${rank}.`;
|
|
649
|
+
lines.push(`${medal} ${user.username}: ${user.total_score}\u5206`);
|
|
669
650
|
});
|
|
670
651
|
return lines.join("\n");
|
|
671
652
|
}
|
|
672
653
|
static getMedal(index) {
|
|
673
|
-
const medals = ["
|
|
654
|
+
const medals = ["\u{1F947}", "\u{1F948}", "\u{1F949}"];
|
|
674
655
|
return medals[index] || `${index + 1}.`;
|
|
675
656
|
}
|
|
676
657
|
static formatScoreLogs(logs) {
|
|
677
658
|
if (logs.length === 0) {
|
|
678
|
-
return "
|
|
659
|
+
return "\u6682\u65E0\u79EF\u5206\u8BB0\u5F55";
|
|
679
660
|
}
|
|
680
|
-
const lines = ["
|
|
661
|
+
const lines = ["\u3010\u79EF\u5206\u8BB0\u5F55\u3011"];
|
|
681
662
|
const displayLogs = logs.slice(0, 10);
|
|
682
663
|
displayLogs.forEach((log) => {
|
|
683
664
|
const change = log.score_change > 0 ? `+${log.score_change}` : log.score_change;
|
|
684
|
-
lines.push(`${change}
|
|
665
|
+
lines.push(`${change}\u5206 - ${log.description}`);
|
|
685
666
|
});
|
|
686
667
|
if (logs.length > 10) {
|
|
687
|
-
lines.push(`...
|
|
668
|
+
lines.push(`... \u5171 ${logs.length} \u6761\u8BB0\u5F55`);
|
|
688
669
|
}
|
|
689
670
|
return lines.join("\n");
|
|
690
671
|
}
|
|
691
672
|
static formatStatistics(user, logs) {
|
|
692
673
|
const lines = [
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
"
|
|
674
|
+
`\u3010${user.username} \u7684\u7EDF\u8BA1\u4FE1\u606F\u3011`,
|
|
675
|
+
`\u603B\u79EF\u5206: ${user.total_score}`,
|
|
676
|
+
`\u7D2F\u8BA1\u52A0\u5206: ${user.add_score}`,
|
|
677
|
+
`\u7D2F\u8BA1\u6263\u5206: ${user.deduct_score}`,
|
|
678
|
+
`\u8BB0\u5F55\u6570: ${user.score_count}`,
|
|
679
|
+
"\u6700\u8FD1\u79EF\u5206\u8BB0\u5F55:"
|
|
699
680
|
];
|
|
700
681
|
const recentLogs = logs.slice(0, 5);
|
|
701
682
|
if (recentLogs.length > 0) {
|
|
702
683
|
recentLogs.forEach((log) => {
|
|
703
684
|
const change = log.score_change > 0 ? `+${log.score_change}` : log.score_change;
|
|
704
|
-
lines.push(`${change}
|
|
685
|
+
lines.push(`${change}\u5206 - ${log.description}`);
|
|
705
686
|
});
|
|
706
687
|
} else {
|
|
707
|
-
lines.push("
|
|
688
|
+
lines.push("\u6682\u65E0\u8BB0\u5F55");
|
|
708
689
|
}
|
|
709
690
|
return lines.join("\n");
|
|
710
691
|
}
|
|
711
692
|
static formatAddScoreResult(result) {
|
|
712
|
-
const status = result.success ? "
|
|
713
|
-
const summary =
|
|
693
|
+
const status = result.success ? "\u79EF\u5206\u8C03\u6574\u6210\u529F" : "\u79EF\u5206\u8C03\u6574\u5931\u8D25";
|
|
694
|
+
const summary = `\u6210\u529F: ${result.summary.success_count} \u6761\uFF0C\u5931\u8D25: ${result.summary.failed_count} \u6761`;
|
|
714
695
|
const lines = [status, summary];
|
|
715
696
|
if (!result.success && result.message) {
|
|
716
|
-
lines.push(
|
|
697
|
+
lines.push(`\u539F\u56E0: ${result.message}`);
|
|
717
698
|
}
|
|
718
699
|
if (result.details && result.details.length > 0) {
|
|
719
|
-
lines.push("
|
|
700
|
+
lines.push("\u8BE6\u60C5:");
|
|
720
701
|
result.details.forEach((detail) => {
|
|
721
702
|
if (detail.success) {
|
|
722
703
|
const change = detail.score_change > 0 ? "+" : "";
|
|
723
|
-
lines.push(`[OK] ${detail.username}: ${change}${detail.score_change}
|
|
704
|
+
lines.push(`[OK] ${detail.username}: ${change}${detail.score_change}\u5206`);
|
|
724
705
|
} else {
|
|
725
|
-
lines.push(`[FAIL] ${detail.username}: ${detail.error || "
|
|
706
|
+
lines.push(`[FAIL] ${detail.username}: ${detail.error || "\u5931\u8D25"}`);
|
|
726
707
|
}
|
|
727
708
|
});
|
|
728
709
|
}
|
|
@@ -768,72 +749,79 @@ var Formatter = class {
|
|
|
768
749
|
|
|
769
750
|
// src/commands/bind-server.ts
|
|
770
751
|
function registerBindServerCommand(ctx, serverService, adminService) {
|
|
771
|
-
ctx.command("
|
|
752
|
+
ctx.command("\u7ED1\u5B9A\u670D\u52A1\u5668 <\u5730\u5740:string> <\u7528\u6237\u540D:string> <token:string>").alias("bind-server").action(async ({ session }, address, username, token) => {
|
|
772
753
|
if (!address || !username || !token) {
|
|
773
754
|
return HELP_MESSAGES.BIND_SERVER;
|
|
774
755
|
}
|
|
775
756
|
if (!session.guildId) {
|
|
776
|
-
return "
|
|
757
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
777
758
|
}
|
|
778
759
|
const openId = session.userId?.toString();
|
|
779
760
|
if (!openId) {
|
|
780
|
-
return "
|
|
761
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
781
762
|
}
|
|
782
763
|
const existingConfig = await serverService.getConfigByGuild(session.guildId);
|
|
783
764
|
if (existingConfig) {
|
|
784
|
-
return "
|
|
765
|
+
return "\u274C \u8BE5\u7FA4\u804A\u5DF2\u7ED1\u5B9A\u670D\u52A1\u5668\uFF0C\u5982\u9700\u66F4\u6362\u8BF7\u5148\u4F7F\u7528 /\u670D\u52A1\u5668\u89E3\u7ED1";
|
|
785
766
|
}
|
|
786
767
|
const tokenError = Validator.validateTokenWithMessage(token);
|
|
787
768
|
if (tokenError) {
|
|
788
|
-
ctx.logger.info(`Token
|
|
789
|
-
return `Token
|
|
769
|
+
ctx.logger.info(`Token \u683C\u5F0F\u9A8C\u8BC1\u5931\u8D25: ${tokenError}`);
|
|
770
|
+
return `Token \u683C\u5F0F\u9A8C\u8BC1\u5931\u8D25`;
|
|
790
771
|
}
|
|
791
772
|
try {
|
|
792
|
-
ctx.logger.info(
|
|
773
|
+
ctx.logger.info(`\u6B63\u5728\u9A8C\u8BC1\u670D\u52A1\u5668\u914D\u7F6E...`);
|
|
793
774
|
const result = await serverService.validateConfig(address, username, token);
|
|
794
775
|
if (!result.valid) {
|
|
795
|
-
const errorMsg = result.error || "
|
|
796
|
-
ctx.logger.info(
|
|
797
|
-
return
|
|
776
|
+
const errorMsg = result.error || "\u670D\u52A1\u5668\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25";
|
|
777
|
+
ctx.logger.info(`\u670D\u52A1\u5668\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25: ${errorMsg}`);
|
|
778
|
+
return `\u9A8C\u8BC1\u5931\u8D25: ${errorMsg}`;
|
|
798
779
|
}
|
|
799
780
|
const actualUsername = result.actualUsername || username;
|
|
800
|
-
const
|
|
801
|
-
await
|
|
802
|
-
|
|
781
|
+
const newToken = result.newToken || token;
|
|
782
|
+
const config = await serverService.saveConfig(session.guildId, "CSMS\u670D\u52A1\u5668", address, actualUsername, newToken);
|
|
783
|
+
await adminService.addAdmin(session.guildId, openId, "\u7BA1\u7406\u5458");
|
|
784
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u7684\u9996\u4E2A\u7ED1\u5B9A\u8005 ${openId} \u88AB\u81EA\u52A8\u6DFB\u52A0\u4E3A\u7BA1\u7406\u5458`);
|
|
803
785
|
const domain = config.address.replace(/^https?:\/\//, "").split("/")[0];
|
|
804
|
-
ctx.logger.info(
|
|
805
|
-
return
|
|
786
|
+
ctx.logger.info(`\u670D\u52A1\u5668\u914D\u7F6E\u6210\u529F\uFF0Cdomain=${domain}\uFF0Cusername=${actualUsername}`);
|
|
787
|
+
return `\u2705 \u670D\u52A1\u5668\u914D\u7F6E\u6210\u529F\uFF0C\u65B0token\u5DF2\u751F\u6210\uFF0C\u65E7token\u5DF2\u5931\u6548`;
|
|
806
788
|
} catch (error) {
|
|
807
|
-
ctx.logger.error("
|
|
808
|
-
return
|
|
789
|
+
ctx.logger.error("\u4FDD\u5B58\u670D\u52A1\u5668\u914D\u7F6E\u5931\u8D25:", error);
|
|
790
|
+
return `\u914D\u7F6E\u4FDD\u5B58\u5931\u8D25: ${error.message}`;
|
|
809
791
|
}
|
|
810
792
|
});
|
|
811
|
-
ctx.command("
|
|
793
|
+
ctx.command("\u670D\u52A1\u5668\u89E3\u7ED1").alias("unbind-server").action(async ({ session }) => {
|
|
812
794
|
if (!session.guildId) {
|
|
813
|
-
return "
|
|
795
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
814
796
|
}
|
|
815
797
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
816
798
|
if (!hasPermission) {
|
|
817
|
-
return "
|
|
799
|
+
return "\u274C \u6B64\u547D\u4EE4\u4EC5\u9650\u7BA1\u7406\u5458\u4F7F\u7528";
|
|
818
800
|
}
|
|
819
801
|
const config = await serverService.getConfigByGuild(session.guildId);
|
|
820
802
|
if (!config) {
|
|
821
|
-
return "
|
|
803
|
+
return "\u274C \u8BE5\u7FA4\u804A\u5C1A\u672A\u7ED1\u5B9A\u4EFB\u4F55\u670D\u52A1\u5668";
|
|
822
804
|
}
|
|
823
|
-
await session.send("
|
|
805
|
+
await session.send("\u26A0\uFE0F \u786E\u5B9A\u8981\u89E3\u9664\u670D\u52A1\u5668\u7ED1\u5B9A\u5417\uFF1F\u89E3\u7ED1\u540E\u5176\u4ED6\u4EBA\u53EF\u91CD\u65B0\u7ED1\u5B9A\u3002\u8BF7\u5728 30 \u79D2\u5185\u8F93\u5165\u300C\u786E\u8BA4\u300D\u6765\u5B8C\u6210\u64CD\u4F5C");
|
|
824
806
|
const reply = await session.prompt(3e4);
|
|
825
|
-
if (reply?.trim() !== "
|
|
826
|
-
return "
|
|
807
|
+
if (reply?.trim() !== "\u786E\u8BA4") {
|
|
808
|
+
return "\u2705 \u5DF2\u53D6\u6D88\u89E3\u7ED1\u64CD\u4F5C";
|
|
827
809
|
}
|
|
828
810
|
await serverService.deleteConfig(session.guildId);
|
|
829
|
-
ctx.logger.info(
|
|
830
|
-
return
|
|
811
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u89E3\u9664\u4E86\u670D\u52A1\u5668\u7ED1\u5B9A`);
|
|
812
|
+
return `\u2705 \u5DF2\u89E3\u9664\u670D\u52A1\u5668\u7ED1\u5B9A`;
|
|
831
813
|
});
|
|
832
814
|
}
|
|
833
|
-
__name(registerBindServerCommand, "registerBindServerCommand");
|
|
834
815
|
|
|
835
816
|
// src/utils/image.ts
|
|
836
817
|
var import_koishi = require("koishi");
|
|
818
|
+
var currentConfig = {
|
|
819
|
+
backgroundImage: "https://api.yppp.net/pe.php",
|
|
820
|
+
cardOpacity: 0.5
|
|
821
|
+
};
|
|
822
|
+
function setImageConfig(config) {
|
|
823
|
+
currentConfig = { ...currentConfig, ...config };
|
|
824
|
+
}
|
|
837
825
|
async function generateImage(ctx, html, options = {}) {
|
|
838
826
|
const width = options.width || 450;
|
|
839
827
|
const height = options.height || 800;
|
|
@@ -865,11 +853,10 @@ async function generateImage(ctx, html, options = {}) {
|
|
|
865
853
|
});
|
|
866
854
|
return screenshot;
|
|
867
855
|
} catch (error) {
|
|
868
|
-
ctx.logger.error("
|
|
856
|
+
ctx.logger.error("\u751F\u6210\u56FE\u7247\u5931\u8D25:", error);
|
|
869
857
|
return null;
|
|
870
858
|
}
|
|
871
859
|
}
|
|
872
|
-
__name(generateImage, "generateImage");
|
|
873
860
|
async function sendImageOrText(ctx, session, html, fallbackText, options = {}) {
|
|
874
861
|
const image = await generateImage(ctx, html, options);
|
|
875
862
|
if (image) {
|
|
@@ -878,13 +865,14 @@ async function sendImageOrText(ctx, session, html, fallbackText, options = {}) {
|
|
|
878
865
|
await session.send(fallbackText);
|
|
879
866
|
}
|
|
880
867
|
}
|
|
881
|
-
|
|
882
|
-
|
|
868
|
+
function getBaseStyles(config) {
|
|
869
|
+
const bg = config?.backgroundImage || currentConfig.backgroundImage || "https://api.yppp.net/pe.php";
|
|
870
|
+
const opacity = config?.cardOpacity ?? currentConfig.cardOpacity ?? 0.5;
|
|
883
871
|
return `
|
|
884
872
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
885
873
|
body {
|
|
886
874
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
|
887
|
-
background: url('
|
|
875
|
+
background: url('${bg}') center/cover no-repeat;
|
|
888
876
|
width: 450px;
|
|
889
877
|
min-height: 800px;
|
|
890
878
|
display: flex;
|
|
@@ -893,7 +881,7 @@ function getBaseStyles() {
|
|
|
893
881
|
padding: 40px 0;
|
|
894
882
|
}
|
|
895
883
|
.container {
|
|
896
|
-
background: rgba(255, 255, 255,
|
|
884
|
+
background: rgba(255, 255, 255, ${opacity});
|
|
897
885
|
border-radius: 24px;
|
|
898
886
|
padding: 28px 24px;
|
|
899
887
|
width: 380px;
|
|
@@ -926,13 +914,12 @@ function getBaseStyles() {
|
|
|
926
914
|
}
|
|
927
915
|
`;
|
|
928
916
|
}
|
|
929
|
-
__name(getBaseStyles, "getBaseStyles");
|
|
930
917
|
|
|
931
918
|
// src/commands/query-score.ts
|
|
932
919
|
function registerQueryScoreCommand(ctx, serverService, bindingService) {
|
|
933
|
-
ctx.command("
|
|
920
|
+
ctx.command("\u67E5\u8BE2\u79EF\u5206 [\u7528\u6237\u540D:string]").alias("query-score").action(async ({ session }, username) => {
|
|
934
921
|
if (!session.guildId) {
|
|
935
|
-
return "
|
|
922
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
936
923
|
}
|
|
937
924
|
const api = await serverService.createApiService(session.guildId);
|
|
938
925
|
if (!api) {
|
|
@@ -943,11 +930,11 @@ function registerQueryScoreCommand(ctx, serverService, bindingService) {
|
|
|
943
930
|
if (!username) {
|
|
944
931
|
const openId = session.userId?.toString();
|
|
945
932
|
if (!openId) {
|
|
946
|
-
return "
|
|
933
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
947
934
|
}
|
|
948
935
|
const binding = await bindingService.getUserByOpenId(session.guildId, openId);
|
|
949
936
|
if (!binding) {
|
|
950
|
-
return `${ERROR_MESSAGES.USER_NOT_BOUND}
|
|
937
|
+
return `${ERROR_MESSAGES.USER_NOT_BOUND}\u3002\u8BF7\u5148\u4F7F\u7528 /\u7ED1\u5B9AQQ <\u7528\u6237\u540D> \u547D\u4EE4\u7ED1\u5B9A\u60A8\u7684\u8D26\u53F7`;
|
|
951
938
|
}
|
|
952
939
|
targetUsername = binding.username;
|
|
953
940
|
}
|
|
@@ -1015,41 +1002,40 @@ function registerQueryScoreCommand(ctx, serverService, bindingService) {
|
|
|
1015
1002
|
</head>
|
|
1016
1003
|
<body>
|
|
1017
1004
|
<div class="container">
|
|
1018
|
-
<div class="title"
|
|
1005
|
+
<div class="title">\u{1F4CA} \u79EF\u5206\u67E5\u8BE2\u7ED3\u679C</div>
|
|
1019
1006
|
<div class="username">${user.username}</div>
|
|
1020
|
-
<div class="subtitle"
|
|
1007
|
+
<div class="subtitle">\u7528\u6237ID: ${user.id}</div>
|
|
1021
1008
|
<div class="info-grid">
|
|
1022
1009
|
<div class="info-item">
|
|
1023
|
-
<div class="info-label"
|
|
1010
|
+
<div class="info-label">\u5F53\u524D\u79EF\u5206</div>
|
|
1024
1011
|
<div class="info-value score">${user.total_score}</div>
|
|
1025
1012
|
</div>
|
|
1026
1013
|
<div class="info-item">
|
|
1027
|
-
<div class="info-label"
|
|
1014
|
+
<div class="info-label">\u6392\u884C\u699C</div>
|
|
1028
1015
|
<div class="info-value rank">#${ranking}</div>
|
|
1029
1016
|
</div>
|
|
1030
1017
|
</div>
|
|
1031
|
-
<div class="footer"
|
|
1018
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1032
1019
|
</div>
|
|
1033
1020
|
</body>
|
|
1034
1021
|
</html>`;
|
|
1035
1022
|
await sendImageOrText(ctx, session, html, textResult, { height: 600 });
|
|
1036
1023
|
return "";
|
|
1037
1024
|
} catch (error) {
|
|
1038
|
-
ctx.logger.error("
|
|
1025
|
+
ctx.logger.error("\u67E5\u8BE2\u79EF\u5206\u5931\u8D25:", error);
|
|
1039
1026
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1040
1027
|
}
|
|
1041
1028
|
});
|
|
1042
1029
|
}
|
|
1043
|
-
__name(registerQueryScoreCommand, "registerQueryScoreCommand");
|
|
1044
1030
|
|
|
1045
1031
|
// src/commands/bind-qq.ts
|
|
1046
1032
|
function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
1047
|
-
ctx.command("
|
|
1033
|
+
ctx.command("\u7ED1\u5B9AQQ <\u7528\u6237\u540D:string>").alias("bind-qq").action(async ({ session }, username) => {
|
|
1048
1034
|
if (!username) {
|
|
1049
1035
|
return HELP_MESSAGES.BIND_QQ;
|
|
1050
1036
|
}
|
|
1051
1037
|
if (!session.guildId) {
|
|
1052
|
-
return "
|
|
1038
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1053
1039
|
}
|
|
1054
1040
|
const usernameError = Validator.validateUsernameWithMessage(username);
|
|
1055
1041
|
if (usernameError) {
|
|
@@ -1057,9 +1043,9 @@ function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
|
1057
1043
|
}
|
|
1058
1044
|
const openId = session.userId?.toString();
|
|
1059
1045
|
if (!openId) {
|
|
1060
|
-
return "
|
|
1046
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1061
1047
|
}
|
|
1062
|
-
ctx.logger.info(
|
|
1048
|
+
ctx.logger.info(`\u83B7\u53D6\u5230\u7684\u7528\u6237 OpenID: ${openId}`);
|
|
1063
1049
|
const config = await serverService.getConfigByGuild(session.guildId);
|
|
1064
1050
|
if (!config) {
|
|
1065
1051
|
return ERROR_MESSAGES.NO_SERVER_CONFIG;
|
|
@@ -1067,11 +1053,11 @@ function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
|
1067
1053
|
try {
|
|
1068
1054
|
const existingBinding = await bindingService.getUserByOpenId(session.guildId, openId);
|
|
1069
1055
|
if (existingBinding) {
|
|
1070
|
-
return
|
|
1056
|
+
return `\u274C \u60A8\u5DF2\u7ED1\u5B9A\u300C${existingBinding.username}\u300D\uFF0C\u5982\u9700\u66F4\u6362\u8D26\u53F7\u8BF7\u5148\u4F7F\u7528 /\u89E3\u9664\u7ED1\u5B9A \u89E3\u7ED1\u540E\u91CD\u65B0\u7ED1\u5B9A`;
|
|
1071
1057
|
}
|
|
1072
1058
|
const existingBindings = await bindingService.getBindingsByUsername(session.guildId, username);
|
|
1073
1059
|
if (existingBindings.length > 0) {
|
|
1074
|
-
return
|
|
1060
|
+
return `\u274C \u7528\u6237\u540D\u300C${username}\u300D\u5DF2\u88AB\u5176\u4ED6QQ\u8D26\u53F7\u7ED1\u5B9A\uFF0C\u6BCF\u4E2A\u7528\u6237\u540D\u53EA\u80FD\u7ED1\u5B9A\u4E00\u4E2AQQ`;
|
|
1075
1061
|
}
|
|
1076
1062
|
const api = await serverService.createApiService(session.guildId);
|
|
1077
1063
|
if (!api) {
|
|
@@ -1083,20 +1069,20 @@ function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
|
1083
1069
|
}
|
|
1084
1070
|
const user = response.data[0];
|
|
1085
1071
|
await bindingService.bindQq(session.guildId, user.id, username, openId, config.id);
|
|
1086
|
-
return
|
|
1087
|
-
|
|
1072
|
+
return `\u2705 \u7ED1\u5B9A\u6210\u529F
|
|
1073
|
+
\u7528\u6237\u540D: ${username}`;
|
|
1088
1074
|
} catch (error) {
|
|
1089
|
-
ctx.logger.error("
|
|
1075
|
+
ctx.logger.error("\u7ED1\u5B9AQQ\u5931\u8D25:", error);
|
|
1090
1076
|
return ERROR_MESSAGES.BINDING_FAILED;
|
|
1091
1077
|
}
|
|
1092
1078
|
});
|
|
1093
|
-
ctx.command("
|
|
1079
|
+
ctx.command("\u89E3\u9664\u7ED1\u5B9A").alias("unbind").action(async ({ session }, username) => {
|
|
1094
1080
|
if (!session.guildId) {
|
|
1095
|
-
return "
|
|
1081
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1096
1082
|
}
|
|
1097
1083
|
const openId = session.userId?.toString();
|
|
1098
1084
|
if (!openId) {
|
|
1099
|
-
return "
|
|
1085
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1100
1086
|
}
|
|
1101
1087
|
let binding = null;
|
|
1102
1088
|
if (username) {
|
|
@@ -1106,28 +1092,27 @@ function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
|
1106
1092
|
binding = await bindingService.getUserByOpenId(session.guildId, openId);
|
|
1107
1093
|
}
|
|
1108
1094
|
if (!binding) {
|
|
1109
|
-
return
|
|
1095
|
+
return `\u274C \u60A8\u5C1A\u672A\u7ED1\u5B9A\u4EFB\u4F55\u8D26\u53F7${username ? `\uFF08\u7528\u6237\uFF1A${username}\uFF09` : ""}`;
|
|
1110
1096
|
}
|
|
1111
|
-
await session.send(
|
|
1097
|
+
await session.send(`\u26A0\uFE0F \u786E\u5B9A\u8981\u89E3\u9664\u300C${binding.username}\u300D\u7684\u7ED1\u5B9A\u5417\uFF1F\u8BF7\u5728 30 \u79D2\u5185\u8F93\u5165\u300C\u786E\u8BA4\u300D\u6765\u5B8C\u6210\u64CD\u4F5C`);
|
|
1112
1098
|
const reply = await session.prompt(3e4);
|
|
1113
|
-
if (reply?.trim() !== "
|
|
1114
|
-
return "
|
|
1099
|
+
if (reply?.trim() !== "\u786E\u8BA4") {
|
|
1100
|
+
return "\u2705 \u5DF2\u53D6\u6D88\u89E3\u7ED1\u64CD\u4F5C";
|
|
1115
1101
|
}
|
|
1116
1102
|
await bindingService.unbindQq(session.guildId, openId);
|
|
1117
|
-
ctx.logger.info(
|
|
1118
|
-
return
|
|
1103
|
+
ctx.logger.info(`\u7528\u6237 ${binding.username}\uFF08OpenID: ${openId}\uFF09\u89E3\u9664\u4E86\u7ED1\u5B9A`);
|
|
1104
|
+
return `\u2705 \u5DF2\u89E3\u9664\u300C${binding.username}\u300D\u7684\u7ED1\u5B9A`;
|
|
1119
1105
|
});
|
|
1120
1106
|
}
|
|
1121
|
-
__name(registerBindQqCommand, "registerBindQqCommand");
|
|
1122
1107
|
|
|
1123
1108
|
// src/commands/adjust-score.ts
|
|
1124
1109
|
function registerAdjustScoreCommand(ctx, serverService, adminService) {
|
|
1125
|
-
ctx.command("
|
|
1110
|
+
ctx.command("\u8C03\u6574\u79EF\u5206 <\u7528\u6237\u540D:string> <\u5206\u6570:number> <\u539F\u56E0:text>").alias("adjust-score").action(async ({ session }, username, score, reason) => {
|
|
1126
1111
|
if (!username || score === void 0 || !reason) {
|
|
1127
1112
|
return HELP_MESSAGES.ADJUST_SCORE;
|
|
1128
1113
|
}
|
|
1129
1114
|
if (!session.guildId) {
|
|
1130
|
-
return "
|
|
1115
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1131
1116
|
}
|
|
1132
1117
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
1133
1118
|
if (!hasPermission) {
|
|
@@ -1159,25 +1144,24 @@ function registerAdjustScoreCommand(ctx, serverService, adminService) {
|
|
|
1159
1144
|
],
|
|
1160
1145
|
description: reason
|
|
1161
1146
|
};
|
|
1162
|
-
ctx.logger.info(
|
|
1147
|
+
ctx.logger.info(`\u8C03\u6574\u79EF\u5206\u8BF7\u6C42: \u7528\u6237=${username}, \u5206\u6570=${score}, \u539F\u56E0=${reason}`);
|
|
1163
1148
|
const result = await api.batchAddScore(data);
|
|
1164
|
-
ctx.logger.info(
|
|
1149
|
+
ctx.logger.info(`\u8C03\u6574\u79EF\u5206\u7ED3\u679C:`, JSON.stringify(result));
|
|
1165
1150
|
const message = Formatter.formatAddScoreResult(result);
|
|
1166
1151
|
return Formatter.splitMessage(message);
|
|
1167
1152
|
} catch (error) {
|
|
1168
|
-
ctx.logger.error("
|
|
1153
|
+
ctx.logger.error("\u8C03\u6574\u79EF\u5206\u5931\u8D25:", error);
|
|
1169
1154
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1170
1155
|
}
|
|
1171
1156
|
});
|
|
1172
1157
|
}
|
|
1173
|
-
__name(registerAdjustScoreCommand, "registerAdjustScoreCommand");
|
|
1174
1158
|
|
|
1175
1159
|
// src/commands/ranking.ts
|
|
1176
1160
|
var PAGE_SIZE = 10;
|
|
1177
1161
|
function registerRankingCommand(ctx, serverService) {
|
|
1178
|
-
ctx.command("
|
|
1162
|
+
ctx.command("\u6392\u884C\u699C [\u9875\u7801:number]").alias("ranking").action(async ({ session }, page = 1) => {
|
|
1179
1163
|
if (!session.guildId) {
|
|
1180
|
-
return "
|
|
1164
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1181
1165
|
}
|
|
1182
1166
|
const api = await serverService.createApiService(session.guildId);
|
|
1183
1167
|
if (!api) {
|
|
@@ -1198,14 +1182,14 @@ function registerRankingCommand(ctx, serverService) {
|
|
|
1198
1182
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1199
1183
|
}
|
|
1200
1184
|
if (response.data.length === 0) {
|
|
1201
|
-
return
|
|
1185
|
+
return `\u6682\u65E0\u6392\u884C\u6570\u636E`;
|
|
1202
1186
|
}
|
|
1203
1187
|
const startRank = offset + 1;
|
|
1204
1188
|
const message = Formatter.formatRankingWithRank(response.data, startRank);
|
|
1205
|
-
const pageInfo = totalPages > 1 ?
|
|
1189
|
+
const pageInfo = totalPages > 1 ? `\u7B2C ${page}/${totalPages} \u9875\uFF0C\u5171 ${totalUsers} \u4EBA` : `\u5171 ${totalUsers} \u4EBA`;
|
|
1206
1190
|
const rankItems = response.data.map((user, index) => {
|
|
1207
1191
|
const rank = startRank + index;
|
|
1208
|
-
const medal = rank === 1 ? "
|
|
1192
|
+
const medal = rank === 1 ? "\u{1F947}" : rank === 2 ? "\u{1F948}" : rank === 3 ? "\u{1F949}" : `${rank}.`;
|
|
1209
1193
|
const scoreColor = user.total_score >= 0 ? "#27ae60" : "#e74c3c";
|
|
1210
1194
|
return `
|
|
1211
1195
|
<div class="rank-item">
|
|
@@ -1269,33 +1253,32 @@ function registerRankingCommand(ctx, serverService) {
|
|
|
1269
1253
|
</head>
|
|
1270
1254
|
<body>
|
|
1271
1255
|
<div class="container">
|
|
1272
|
-
<div class="title"><span class="title-icon"
|
|
1256
|
+
<div class="title"><span class="title-icon">\u{1F3C6}</span>\u79EF\u5206\u6392\u884C\u699C</div>
|
|
1273
1257
|
<div class="rank-list">
|
|
1274
1258
|
${rankItems}
|
|
1275
1259
|
</div>
|
|
1276
1260
|
<div class="page-info">${pageInfo}</div>
|
|
1277
|
-
<div class="footer"
|
|
1261
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1278
1262
|
</div>
|
|
1279
1263
|
</body>
|
|
1280
1264
|
</html>`;
|
|
1281
1265
|
const textResult = message + (totalPages > 1 ? `
|
|
1282
1266
|
|
|
1283
|
-
|
|
1267
|
+
\u{1F4C4} ${pageInfo}` : "");
|
|
1284
1268
|
await sendImageOrText(ctx, session, html, textResult, { height: 820 });
|
|
1285
1269
|
return "";
|
|
1286
1270
|
} catch (error) {
|
|
1287
|
-
ctx.logger.error("
|
|
1271
|
+
ctx.logger.error("\u83B7\u53D6\u6392\u884C\u699C\u5931\u8D25:", error);
|
|
1288
1272
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1289
1273
|
}
|
|
1290
1274
|
});
|
|
1291
1275
|
}
|
|
1292
|
-
__name(registerRankingCommand, "registerRankingCommand");
|
|
1293
1276
|
|
|
1294
1277
|
// src/commands/statistics.ts
|
|
1295
1278
|
function registerStatisticsCommand(ctx, serverService, bindingService) {
|
|
1296
|
-
ctx.command("
|
|
1279
|
+
ctx.command("\u7EDF\u8BA1 [\u7528\u6237\u540D:string]").alias("statistics").action(async ({ session }, username) => {
|
|
1297
1280
|
if (!session.guildId) {
|
|
1298
|
-
return "
|
|
1281
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1299
1282
|
}
|
|
1300
1283
|
const api = await serverService.createApiService(session.guildId);
|
|
1301
1284
|
if (!api) {
|
|
@@ -1306,13 +1289,13 @@ function registerStatisticsCommand(ctx, serverService, bindingService) {
|
|
|
1306
1289
|
if (!username) {
|
|
1307
1290
|
const openId = session.userId?.toString();
|
|
1308
1291
|
if (!openId) {
|
|
1309
|
-
return "
|
|
1292
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1310
1293
|
}
|
|
1311
1294
|
const binding = await bindingService.getUserByOpenId(session.guildId, openId);
|
|
1312
1295
|
if (!binding) {
|
|
1313
1296
|
return `${ERROR_MESSAGES.USER_NOT_BOUND}
|
|
1314
1297
|
|
|
1315
|
-
|
|
1298
|
+
\u8BF7\u5148\u4F7F\u7528 /\u7ED1\u5B9AQQ <\u7528\u6237\u540D> \u547D\u4EE4\u7ED1\u5B9A\u60A8\u7684\u8D26\u53F7`;
|
|
1316
1299
|
}
|
|
1317
1300
|
targetUsername = binding.username;
|
|
1318
1301
|
}
|
|
@@ -1384,49 +1367,48 @@ function registerStatisticsCommand(ctx, serverService, bindingService) {
|
|
|
1384
1367
|
</head>
|
|
1385
1368
|
<body>
|
|
1386
1369
|
<div class="container">
|
|
1387
|
-
<div class="title"
|
|
1370
|
+
<div class="title">\u{1F4CA} \u79EF\u5206\u7EDF\u8BA1</div>
|
|
1388
1371
|
<div class="user-info">
|
|
1389
1372
|
<div class="username">${user.username}</div>
|
|
1390
|
-
<div class="user-id"
|
|
1373
|
+
<div class="user-id">\u7528\u6237ID: ${user.id} | \u5F53\u524D\u79EF\u5206: ${user.total_score}</div>
|
|
1391
1374
|
</div>
|
|
1392
1375
|
<div class="stats-grid">
|
|
1393
1376
|
<div class="stat-card positive">
|
|
1394
|
-
<div class="stat-label"
|
|
1377
|
+
<div class="stat-label">\u7D2F\u8BA1\u52A0\u5206</div>
|
|
1395
1378
|
<div class="stat-value positive">+${addScore}</div>
|
|
1396
1379
|
</div>
|
|
1397
1380
|
<div class="stat-card negative">
|
|
1398
|
-
<div class="stat-label"
|
|
1381
|
+
<div class="stat-label">\u7D2F\u8BA1\u6263\u5206</div>
|
|
1399
1382
|
<div class="stat-value negative">-${deductScore}</div>
|
|
1400
1383
|
</div>
|
|
1401
1384
|
<div class="stat-card total">
|
|
1402
|
-
<div class="stat-label"
|
|
1385
|
+
<div class="stat-label">\u603B\u79EF\u5206</div>
|
|
1403
1386
|
<div class="stat-value total">${totalScore}</div>
|
|
1404
1387
|
</div>
|
|
1405
1388
|
<div class="stat-card">
|
|
1406
|
-
<div class="stat-label"
|
|
1389
|
+
<div class="stat-label">\u64CD\u4F5C\u6B21\u6570</div>
|
|
1407
1390
|
<div class="stat-value">${scoreCount}</div>
|
|
1408
1391
|
</div>
|
|
1409
1392
|
</div>
|
|
1410
|
-
<div class="footer"
|
|
1393
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1411
1394
|
</div>
|
|
1412
1395
|
</body>
|
|
1413
1396
|
</html>`;
|
|
1414
1397
|
const textResult = [
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1398
|
+
`\u3010${user.username} \u7684\u7EDF\u8BA1\u4FE1\u606F\u3011`,
|
|
1399
|
+
`\u603B\u79EF\u5206: ${user.total_score}`,
|
|
1400
|
+
`\u7D2F\u8BA1\u52A0\u5206: +${addScore}`,
|
|
1401
|
+
`\u7D2F\u8BA1\u6263\u5206: -${deductScore}`,
|
|
1402
|
+
`\u64CD\u4F5C\u6B21\u6570: ${scoreCount}`
|
|
1420
1403
|
].join("\n");
|
|
1421
1404
|
await sendImageOrText(ctx, session, html, textResult, { height: 550 });
|
|
1422
1405
|
return "";
|
|
1423
1406
|
} catch (error) {
|
|
1424
|
-
ctx.logger.error("
|
|
1407
|
+
ctx.logger.error("\u83B7\u53D6\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:", error);
|
|
1425
1408
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1426
1409
|
}
|
|
1427
1410
|
});
|
|
1428
1411
|
}
|
|
1429
|
-
__name(registerStatisticsCommand, "registerStatisticsCommand");
|
|
1430
1412
|
|
|
1431
1413
|
// src/commands/admin-manager.ts
|
|
1432
1414
|
var import_koishi2 = require("koishi");
|
|
@@ -1439,7 +1421,6 @@ function generateCode() {
|
|
|
1439
1421
|
}
|
|
1440
1422
|
return code;
|
|
1441
1423
|
}
|
|
1442
|
-
__name(generateCode, "generateCode");
|
|
1443
1424
|
function cleanupExpiredRequests() {
|
|
1444
1425
|
const now = Date.now();
|
|
1445
1426
|
for (const [code, req] of pendingRequests) {
|
|
@@ -1448,7 +1429,6 @@ function cleanupExpiredRequests() {
|
|
|
1448
1429
|
}
|
|
1449
1430
|
}
|
|
1450
1431
|
}
|
|
1451
|
-
__name(cleanupExpiredRequests, "cleanupExpiredRequests");
|
|
1452
1432
|
setInterval(cleanupExpiredRequests, 3e4);
|
|
1453
1433
|
function registerGroupAdminCommand(ctx, adminService) {
|
|
1454
1434
|
function getAtId(session) {
|
|
@@ -1460,18 +1440,17 @@ function registerGroupAdminCommand(ctx, adminService) {
|
|
|
1460
1440
|
}
|
|
1461
1441
|
return "";
|
|
1462
1442
|
}
|
|
1463
|
-
|
|
1464
|
-
ctx.command("加管 [备注:string]").alias("add-admin").action(async ({ session }, remark) => {
|
|
1443
|
+
ctx.command("\u52A0\u7BA1 [\u5907\u6CE8:string]").alias("add-admin").action(async ({ session }, remark) => {
|
|
1465
1444
|
if (!session.guildId) {
|
|
1466
|
-
return "
|
|
1445
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1467
1446
|
}
|
|
1468
1447
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
1469
1448
|
if (!hasPermission) {
|
|
1470
|
-
return "
|
|
1449
|
+
return "\u274C \u6B64\u547D\u4EE4\u4EC5\u9650\u7BA1\u7406\u5458\u4F7F\u7528";
|
|
1471
1450
|
}
|
|
1472
1451
|
const targetId = getAtId(session);
|
|
1473
1452
|
if (!targetId) {
|
|
1474
|
-
return "
|
|
1453
|
+
return "\u8BF7\u7528 @ \u6307\u5B9A\u8981\u6DFB\u52A0\u4E3A\u7FA4\u7BA1\u7684\u7528\u6237\uFF1A/\u52A0\u7BA1 @\u67D0\u4EBA";
|
|
1475
1454
|
}
|
|
1476
1455
|
cleanupExpiredRequests();
|
|
1477
1456
|
for (const [, req] of pendingRequests) {
|
|
@@ -1479,11 +1458,11 @@ function registerGroupAdminCommand(ctx, adminService) {
|
|
|
1479
1458
|
const admins = await adminService.getAllAdmins(session.guildId);
|
|
1480
1459
|
const existing = admins.find((a) => a.verify === 0);
|
|
1481
1460
|
if (existing) {
|
|
1482
|
-
return
|
|
1461
|
+
return `\u274C \u8BE5\u7528\u6237\u5DF2\u6709\u6B63\u5728\u7B49\u5F85\u786E\u8BA4\u7684\u52A0\u7BA1\u8BF7\u6C42`;
|
|
1483
1462
|
}
|
|
1484
1463
|
}
|
|
1485
1464
|
}
|
|
1486
|
-
const adminRemark = remark || "
|
|
1465
|
+
const adminRemark = remark || "\u672A\u547D\u540D";
|
|
1487
1466
|
const code = generateCode();
|
|
1488
1467
|
pendingRequests.set(code, {
|
|
1489
1468
|
guildId: session.guildId,
|
|
@@ -1491,96 +1470,96 @@ function registerGroupAdminCommand(ctx, adminService) {
|
|
|
1491
1470
|
createdAt: Date.now()
|
|
1492
1471
|
});
|
|
1493
1472
|
await session.send(
|
|
1494
|
-
|
|
1495
|
-
` + import_koishi2.h.at(targetId) + `
|
|
1496
|
-
|
|
1497
|
-
|
|
1473
|
+
`\u2705 \u5DF2\u53D1\u8D77\u52A0\u7BA1\u8BF7\u6C42
|
|
1474
|
+
` + import_koishi2.h.at(targetId) + ` \u8BF7\u53D1\u9001 /\u786E\u8BA4 ${code} \u540C\u610F\u52A0\u7BA1
|
|
1475
|
+
\u5907\u6CE8\uFF1A${adminRemark}
|
|
1476
|
+
\uFF08120\u79D2\u5185\u6709\u6548\uFF09`
|
|
1498
1477
|
);
|
|
1499
1478
|
return "";
|
|
1500
1479
|
});
|
|
1501
|
-
ctx.command("
|
|
1480
|
+
ctx.command("\u786E\u8BA4 [\u786E\u8BA4\u7801:string]").alias("confirm").action(async ({ session }, code) => {
|
|
1502
1481
|
if (!session.guildId) {
|
|
1503
|
-
return "
|
|
1482
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1504
1483
|
}
|
|
1505
1484
|
const openId = session.userId?.toString();
|
|
1506
1485
|
if (!openId) {
|
|
1507
|
-
return "
|
|
1486
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1508
1487
|
}
|
|
1509
1488
|
if (!code) {
|
|
1510
|
-
return "
|
|
1489
|
+
return "\u8BF7\u63D0\u4F9B\u786E\u8BA4\u7801\uFF1A/\u786E\u8BA4 [\u786E\u8BA4\u7801]";
|
|
1511
1490
|
}
|
|
1512
1491
|
cleanupExpiredRequests();
|
|
1513
1492
|
const req = pendingRequests.get(code);
|
|
1514
1493
|
if (!req) {
|
|
1515
|
-
return "
|
|
1494
|
+
return "\u274C \u65E0\u6548\u7684\u786E\u8BA4\u7801\u6216\u5DF2\u8FC7\u671F";
|
|
1516
1495
|
}
|
|
1517
1496
|
if (req.guildId !== session.guildId) {
|
|
1518
|
-
return "
|
|
1497
|
+
return "\u274C \u8BF7\u5728\u53D1\u8D77\u52A0\u7BA1\u8BF7\u6C42\u7684\u7FA4\u804A\u4E2D\u786E\u8BA4";
|
|
1519
1498
|
}
|
|
1520
1499
|
const remark = req.remark;
|
|
1521
1500
|
pendingRequests.delete(code);
|
|
1522
1501
|
await adminService.createPendingAdmin(session.guildId, openId, remark);
|
|
1523
|
-
ctx.logger.info(
|
|
1502
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u7528\u6237\u540C\u610F\u52A0\u7BA1: OpenID=${openId}, \u5907\u6CE8=${remark}, Verify=0`);
|
|
1524
1503
|
await session.send(
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1504
|
+
`\u2705 \u60A8\u5DF2\u540C\u610F\u52A0\u7BA1
|
|
1505
|
+
\u60A8\u7684 OpenID\uFF1A${openId}
|
|
1506
|
+
\u5907\u6CE8\uFF1A${remark}
|
|
1507
|
+
\u7B49\u5F85\u7BA1\u7406\u5458\u6267\u884C /\u52A0\u7BA1\u786E\u8BA4 \u5B8C\u6210\u52A0\u7BA1
|
|
1508
|
+
\uFF08120\u79D2\u5185\u6709\u6548\uFF09`
|
|
1530
1509
|
);
|
|
1531
1510
|
return "";
|
|
1532
1511
|
});
|
|
1533
|
-
ctx.command("
|
|
1512
|
+
ctx.command("\u52A0\u7BA1\u786E\u8BA4 [\u786E\u8BA4\u7801:string]").alias("confirm-add-admin").action(async ({ session }, code) => {
|
|
1534
1513
|
if (!session.guildId) {
|
|
1535
|
-
return "
|
|
1514
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1536
1515
|
}
|
|
1537
1516
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
1538
1517
|
if (!hasPermission) {
|
|
1539
|
-
return "
|
|
1518
|
+
return "\u274C \u6B64\u547D\u4EE4\u4EC5\u9650\u7BA1\u7406\u5458\u4F7F\u7528";
|
|
1540
1519
|
}
|
|
1541
1520
|
if (!code) {
|
|
1542
|
-
return "
|
|
1521
|
+
return "\u8BF7\u63D0\u4F9B\u786E\u8BA4\u7801\uFF1A/\u52A0\u7BA1\u786E\u8BA4 [\u786E\u8BA4\u7801]";
|
|
1543
1522
|
}
|
|
1544
1523
|
const admins = await adminService.getAllAdmins(session.guildId);
|
|
1545
1524
|
const pendingAdmin = admins.find((a) => a.verify === 0);
|
|
1546
1525
|
if (!pendingAdmin) {
|
|
1547
|
-
return "
|
|
1526
|
+
return "\u274C \u6CA1\u6709\u5F85\u786E\u8BA4\u7684\u52A0\u7BA1\u8BF7\u6C42";
|
|
1548
1527
|
}
|
|
1549
1528
|
await adminService.confirmAdmin(session.guildId, pendingAdmin.openId);
|
|
1550
|
-
ctx.logger.info(
|
|
1551
|
-
return
|
|
1552
|
-
|
|
1553
|
-
OpenID
|
|
1529
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u6DFB\u52A0\u7FA4\u7BA1\u5B8C\u6210: OpenID=${pendingAdmin.openId}, \u5907\u6CE8=${pendingAdmin.remark}, Verify=1`);
|
|
1530
|
+
return `\u2705 \u52A0\u7BA1\u6210\u529F
|
|
1531
|
+
\u5907\u6CE8\uFF1A${pendingAdmin.remark}
|
|
1532
|
+
OpenID\uFF1A${pendingAdmin.openId}`;
|
|
1554
1533
|
});
|
|
1555
|
-
ctx.command("
|
|
1534
|
+
ctx.command("\u51CF\u7BA1 [\u5907\u6CE8:string]").alias("remove-admin").action(async ({ session }, remark) => {
|
|
1556
1535
|
if (!session.guildId) {
|
|
1557
|
-
return "
|
|
1536
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1558
1537
|
}
|
|
1559
1538
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
1560
1539
|
if (!hasPermission) {
|
|
1561
|
-
return "
|
|
1540
|
+
return "\u274C \u6B64\u547D\u4EE4\u4EC5\u9650\u7BA1\u7406\u5458\u4F7F\u7528";
|
|
1562
1541
|
}
|
|
1563
1542
|
if (!remark) {
|
|
1564
|
-
return "
|
|
1543
|
+
return "\u8BF7\u63D0\u4F9B\u8981\u79FB\u9664\u7684\u7FA4\u7BA1\u5907\u6CE8\uFF1A/\u51CF\u7BA1 [\u5907\u6CE8]";
|
|
1565
1544
|
}
|
|
1566
1545
|
await adminService.removeAdminByRemark(session.guildId, remark);
|
|
1567
|
-
ctx.logger.info(
|
|
1568
|
-
return
|
|
1569
|
-
|
|
1546
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u79FB\u9664\u7FA4\u7BA1: \u5907\u6CE8=${remark}`);
|
|
1547
|
+
return `\u2705 \u5DF2\u79FB\u9664\u7FA4\u7BA1
|
|
1548
|
+
\u5907\u6CE8\uFF1A${remark}`;
|
|
1570
1549
|
});
|
|
1571
|
-
ctx.command("
|
|
1550
|
+
ctx.command("\u7FA4\u7BA1\u5217\u8868").alias("admin-list").action(async ({ session }) => {
|
|
1572
1551
|
if (!session.guildId) {
|
|
1573
|
-
return "
|
|
1552
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1574
1553
|
}
|
|
1575
1554
|
const admins = await adminService.getAllAdmins(session.guildId);
|
|
1576
1555
|
if (admins.length === 0) {
|
|
1577
|
-
return "
|
|
1556
|
+
return "\u5F53\u524D\u7FA4\u804A\u6CA1\u6709\u7BA1\u7406\u5458";
|
|
1578
1557
|
}
|
|
1579
1558
|
const list = admins.map(
|
|
1580
|
-
(admin, index) => `${index + 1}. [${admin.remark}] ${admin.openId} ${admin.verify === 1 ? "
|
|
1559
|
+
(admin, index) => `${index + 1}. [${admin.remark}] ${admin.openId} ${admin.verify === 1 ? "\u2705" : "\u23F3"}`
|
|
1581
1560
|
).join("\n");
|
|
1582
1561
|
const adminItems = admins.map((admin, index) => {
|
|
1583
|
-
const status = admin.verify === 1 ? "
|
|
1562
|
+
const status = admin.verify === 1 ? "\u2705 \u5DF2\u9A8C\u8BC1" : "\u23F3 \u5F85\u786E\u8BA4";
|
|
1584
1563
|
const statusColor = admin.verify === 1 ? "#27ae60" : "#f39c12";
|
|
1585
1564
|
return `
|
|
1586
1565
|
<div class="admin-item">
|
|
@@ -1661,32 +1640,31 @@ OpenID:${pendingAdmin.openId}`;
|
|
|
1661
1640
|
</head>
|
|
1662
1641
|
<body>
|
|
1663
1642
|
<div class="container">
|
|
1664
|
-
<div class="title"
|
|
1665
|
-
<div class="count-badge"
|
|
1643
|
+
<div class="title">\u{1F465} \u7FA4\u7BA1\u5217\u8868</div>
|
|
1644
|
+
<div class="count-badge">\u5171 ${admins.length} \u4F4D\u7BA1\u7406\u5458</div>
|
|
1666
1645
|
<div class="admin-list">
|
|
1667
1646
|
${adminItems}
|
|
1668
1647
|
</div>
|
|
1669
|
-
<div class="footer"
|
|
1648
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1670
1649
|
</div>
|
|
1671
1650
|
</body>
|
|
1672
1651
|
</html>`;
|
|
1673
|
-
await sendImageOrText(ctx, session, html,
|
|
1652
|
+
await sendImageOrText(ctx, session, html, `\u5F53\u524D\u7FA4\u804A\u7684\u7BA1\u7406\u5458\uFF1A
|
|
1674
1653
|
${list}`, { height: 600 });
|
|
1675
1654
|
return "";
|
|
1676
1655
|
});
|
|
1677
|
-
ctx.command("
|
|
1656
|
+
ctx.command("\u6211\u7684ID").alias("my-id").action(async ({ session }) => {
|
|
1678
1657
|
if (!session.guildId) {
|
|
1679
|
-
return "
|
|
1658
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1680
1659
|
}
|
|
1681
1660
|
const openId = session.userId?.toString();
|
|
1682
1661
|
if (!openId) {
|
|
1683
|
-
return "
|
|
1662
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1684
1663
|
}
|
|
1685
|
-
return
|
|
1664
|
+
return `\u60A8\u7684 OpenID\uFF1A
|
|
1686
1665
|
${openId}`;
|
|
1687
1666
|
});
|
|
1688
1667
|
}
|
|
1689
|
-
__name(registerGroupAdminCommand, "registerGroupAdminCommand");
|
|
1690
1668
|
|
|
1691
1669
|
// src/commands/menu.ts
|
|
1692
1670
|
var import_koishi3 = require("koishi");
|
|
@@ -1760,7 +1738,7 @@ var MENU_HTML = `
|
|
|
1760
1738
|
border-bottom: none;
|
|
1761
1739
|
}
|
|
1762
1740
|
.command-item::before {
|
|
1763
|
-
content: '
|
|
1741
|
+
content: '\u2022';
|
|
1764
1742
|
color: #9b59b6;
|
|
1765
1743
|
font-weight: bold;
|
|
1766
1744
|
margin-right: 6px;
|
|
@@ -1793,80 +1771,80 @@ var MENU_HTML = `
|
|
|
1793
1771
|
</head>
|
|
1794
1772
|
<body>
|
|
1795
1773
|
<div class="container">
|
|
1796
|
-
<div class="title"
|
|
1774
|
+
<div class="title">\u{1F4CB} \u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF\u83DC\u5355</div>
|
|
1797
1775
|
|
|
1798
1776
|
<div class="section">
|
|
1799
|
-
<div class="section-title"
|
|
1777
|
+
<div class="section-title">\u{1F6E0}\uFE0F \u57FA\u7840\u6307\u4EE4</div>
|
|
1800
1778
|
<ul class="command-list">
|
|
1801
1779
|
<li class="command-item">
|
|
1802
|
-
<span class="command-name"
|
|
1803
|
-
<span class="command-desc">[
|
|
1780
|
+
<span class="command-name">/\u67E5\u8BE2\u79EF\u5206</span>
|
|
1781
|
+
<span class="command-desc">[\u7528\u6237\u540D]</span>
|
|
1804
1782
|
</li>
|
|
1805
1783
|
<li class="command-item">
|
|
1806
|
-
<span class="command-name"
|
|
1807
|
-
<span class="command-desc"><
|
|
1784
|
+
<span class="command-name">/\u7ED1\u5B9AQQ</span>
|
|
1785
|
+
<span class="command-desc"><\u7528\u6237\u540D></span>
|
|
1808
1786
|
</li>
|
|
1809
1787
|
<li class="command-item">
|
|
1810
|
-
<span class="command-name"
|
|
1811
|
-
<span class="command-desc">[
|
|
1788
|
+
<span class="command-name">/\u6392\u884C\u699C</span>
|
|
1789
|
+
<span class="command-desc">[\u6570\u91CF]</span>
|
|
1812
1790
|
</li>
|
|
1813
1791
|
<li class="command-item">
|
|
1814
|
-
<span class="command-name"
|
|
1815
|
-
<span class="command-desc">[
|
|
1792
|
+
<span class="command-name">/\u7EDF\u8BA1</span>
|
|
1793
|
+
<span class="command-desc">[\u7528\u6237\u540D]</span>
|
|
1816
1794
|
</li>
|
|
1817
1795
|
</ul>
|
|
1818
1796
|
</div>
|
|
1819
1797
|
|
|
1820
1798
|
<div class="section">
|
|
1821
|
-
<div class="section-title"
|
|
1799
|
+
<div class="section-title">\u2699\uFE0F \u7BA1\u7406\u5458\u6307\u4EE4</div>
|
|
1822
1800
|
<ul class="command-list">
|
|
1823
1801
|
<li class="command-item">
|
|
1824
|
-
<span class="command-name"
|
|
1825
|
-
<span class="command-desc"><
|
|
1802
|
+
<span class="command-name">/\u7ED1\u5B9A\u670D\u52A1\u5668</span>
|
|
1803
|
+
<span class="command-desc"><\u5730\u5740> <\u7528\u6237> <token></span>
|
|
1826
1804
|
</li>
|
|
1827
1805
|
<li class="command-item">
|
|
1828
|
-
<span class="command-name"
|
|
1806
|
+
<span class="command-name">/\u670D\u52A1\u5668\u89E3\u7ED1</span>
|
|
1829
1807
|
</li>
|
|
1830
1808
|
<li class="command-item">
|
|
1831
|
-
<span class="command-name"
|
|
1832
|
-
<span class="command-desc"><
|
|
1809
|
+
<span class="command-name">/\u8C03\u6574\u79EF\u5206</span>
|
|
1810
|
+
<span class="command-desc"><\u7528\u6237> <\u5206\u6570> <\u539F\u56E0></span>
|
|
1833
1811
|
</li>
|
|
1834
1812
|
</ul>
|
|
1835
1813
|
</div>
|
|
1836
1814
|
|
|
1837
1815
|
<div class="section">
|
|
1838
|
-
<div class="section-title"
|
|
1816
|
+
<div class="section-title">\u{1F464} \u7FA4\u7BA1\u6307\u4EE4</div>
|
|
1839
1817
|
<ul class="command-list">
|
|
1840
1818
|
<li class="command-item">
|
|
1841
|
-
<span class="command-name"
|
|
1842
|
-
<span class="command-desc"
|
|
1819
|
+
<span class="command-name">/\u52A0\u7BA1</span>
|
|
1820
|
+
<span class="command-desc">@\u67D0\u4EBA <\u5907\u6CE8></span>
|
|
1843
1821
|
</li>
|
|
1844
1822
|
<li class="command-item">
|
|
1845
|
-
<span class="command-name"
|
|
1846
|
-
<span class="command-desc"><
|
|
1823
|
+
<span class="command-name">/\u786E\u8BA4</span>
|
|
1824
|
+
<span class="command-desc"><\u9A8C\u8BC1\u7801></span>
|
|
1847
1825
|
</li>
|
|
1848
1826
|
<li class="command-item">
|
|
1849
|
-
<span class="command-name"
|
|
1827
|
+
<span class="command-name">/\u52A0\u7BA1\u786E\u8BA4</span>
|
|
1850
1828
|
</li>
|
|
1851
1829
|
<li class="command-item">
|
|
1852
|
-
<span class="command-name"
|
|
1853
|
-
<span class="command-desc"><
|
|
1830
|
+
<span class="command-name">/\u51CF\u7BA1</span>
|
|
1831
|
+
<span class="command-desc"><\u5907\u6CE8></span>
|
|
1854
1832
|
</li>
|
|
1855
1833
|
<li class="command-item">
|
|
1856
|
-
<span class="command-name"
|
|
1834
|
+
<span class="command-name">/\u7FA4\u7BA1\u5217\u8868</span>
|
|
1857
1835
|
</li>
|
|
1858
1836
|
</ul>
|
|
1859
1837
|
</div>
|
|
1860
1838
|
|
|
1861
|
-
<div class="footer"
|
|
1839
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1862
1840
|
</div>
|
|
1863
1841
|
</body>
|
|
1864
1842
|
</html>
|
|
1865
1843
|
`;
|
|
1866
1844
|
function registerMenuCommand(ctx) {
|
|
1867
|
-
ctx.command("
|
|
1845
|
+
ctx.command("\u83DC\u5355").alias("menu").action(async ({ session }) => {
|
|
1868
1846
|
if (!session.guildId) {
|
|
1869
|
-
return "
|
|
1847
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1870
1848
|
}
|
|
1871
1849
|
try {
|
|
1872
1850
|
const page = await ctx.puppeteer.page();
|
|
@@ -1884,45 +1862,51 @@ function registerMenuCommand(ctx) {
|
|
|
1884
1862
|
await session.send(import_koishi3.h.image(screenshot, "image/png"));
|
|
1885
1863
|
return "";
|
|
1886
1864
|
} catch (error) {
|
|
1887
|
-
ctx.logger.error("
|
|
1888
|
-
return
|
|
1865
|
+
ctx.logger.error("\u751F\u6210\u83DC\u5355\u56FE\u7247\u5931\u8D25:", error);
|
|
1866
|
+
return `\u{1F4CB} **\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF\u83DC\u5355**
|
|
1889
1867
|
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1868
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1869
|
+
\u{1F6E0}\uFE0F **\u57FA\u7840\u6307\u4EE4**
|
|
1870
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1871
|
+
\u2022 /\u67E5\u8BE2\u79EF\u5206 [\u7528\u6237\u540D] - \u67E5\u8BE2\u79EF\u5206\u548C\u6392\u540D
|
|
1872
|
+
\u2022 /\u7ED1\u5B9AQQ <\u7528\u6237\u540D> - \u7ED1\u5B9AQQ\u53F7\u4E0E\u7CFB\u7EDF\u8D26\u53F7
|
|
1873
|
+
\u2022 /\u6392\u884C\u699C [\u6570\u91CF] - \u663E\u793A\u79EF\u5206\u6392\u884C\u699C
|
|
1874
|
+
\u2022 /\u7EDF\u8BA1 [\u7528\u6237\u540D] - \u663E\u793A\u79EF\u5206\u7EDF\u8BA1\u4FE1\u606F
|
|
1897
1875
|
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1876
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1877
|
+
\u2699\uFE0F **\u7BA1\u7406\u5458\u6307\u4EE4**
|
|
1878
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1879
|
+
\u2022 /\u7ED1\u5B9A\u670D\u52A1\u5668 <\u5730\u5740> <\u7528\u6237\u540D> <token> - \u7ED1\u5B9ACSMS\u670D\u52A1\u5668
|
|
1880
|
+
\u2022 /\u670D\u52A1\u5668\u89E3\u7ED1 - \u89E3\u9664\u670D\u52A1\u5668\u7ED1\u5B9A
|
|
1881
|
+
\u2022 /\u8C03\u6574\u79EF\u5206 <\u7528\u6237\u540D> <\u5206\u6570> <\u539F\u56E0> - \u8C03\u6574\u79EF\u5206
|
|
1904
1882
|
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1883
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1884
|
+
\u{1F464} **\u7FA4\u7BA1\u6307\u4EE4**
|
|
1885
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1886
|
+
\u2022 /\u52A0\u7BA1 @\u67D0\u4EBA <\u5907\u6CE8> - \u6DFB\u52A0\u7BA1\u7406\u5458
|
|
1887
|
+
\u2022 /\u786E\u8BA4 <\u9A8C\u8BC1\u7801> - \u786E\u8BA4\u52A0\u7BA1
|
|
1888
|
+
\u2022 /\u52A0\u7BA1\u786E\u8BA4 - \u5B8C\u6210\u52A0\u7BA1\u6D41\u7A0B
|
|
1889
|
+
\u2022 /\u51CF\u7BA1 <\u5907\u6CE8> - \u79FB\u9664\u7BA1\u7406\u5458
|
|
1890
|
+
\u2022 /\u7FA4\u7BA1\u5217\u8868 - \u663E\u793A\u7BA1\u7406\u5458\u5217\u8868
|
|
1913
1891
|
|
|
1914
|
-
|
|
1892
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`;
|
|
1915
1893
|
}
|
|
1916
1894
|
});
|
|
1917
1895
|
}
|
|
1918
|
-
__name(registerMenuCommand, "registerMenuCommand");
|
|
1919
1896
|
|
|
1920
1897
|
// src/index.ts
|
|
1921
1898
|
var name = "class-score-system";
|
|
1922
1899
|
var inject = ["database", "puppeteer"];
|
|
1923
|
-
var Config = import_koishi4.Schema.object({
|
|
1924
|
-
|
|
1925
|
-
|
|
1900
|
+
var Config = import_koishi4.Schema.object({
|
|
1901
|
+
backgroundImage: import_koishi4.Schema.string().description("\u5361\u7247\u80CC\u666F\u56FE\u7247 URL").default("https://api.yppp.net/pe.php"),
|
|
1902
|
+
cardOpacity: import_koishi4.Schema.number().description("\u5361\u7247\u80CC\u666F\u900F\u660E\u5EA6 (0-1)").default(0.5)
|
|
1903
|
+
});
|
|
1904
|
+
function apply(ctx, config) {
|
|
1905
|
+
ctx.logger.info("\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF\u63D2\u4EF6\u6B63\u5728\u52A0\u8F7D...");
|
|
1906
|
+
setImageConfig({
|
|
1907
|
+
backgroundImage: config.backgroundImage,
|
|
1908
|
+
cardOpacity: config.cardOpacity
|
|
1909
|
+
});
|
|
1926
1910
|
extendDatabase(ctx);
|
|
1927
1911
|
const serverService = new ServerConfigService(ctx);
|
|
1928
1912
|
const bindingService = new QqBindingService(ctx);
|
|
@@ -1935,9 +1919,8 @@ function apply(ctx) {
|
|
|
1935
1919
|
registerRankingCommand(ctx, serverService);
|
|
1936
1920
|
registerStatisticsCommand(ctx, serverService, bindingService);
|
|
1937
1921
|
registerMenuCommand(ctx);
|
|
1938
|
-
ctx.logger.info("
|
|
1922
|
+
ctx.logger.info("\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF\u63D2\u4EF6\u52A0\u8F7D\u5B8C\u6210");
|
|
1939
1923
|
}
|
|
1940
|
-
__name(apply, "apply");
|
|
1941
1924
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1942
1925
|
0 && (module.exports = {
|
|
1943
1926
|
Config,
|
|
@@ -1945,3 +1928,5 @@ __name(apply, "apply");
|
|
|
1945
1928
|
inject,
|
|
1946
1929
|
name
|
|
1947
1930
|
});
|
|
1931
|
+
module.exports={Config,apply,inject,name};
|
|
1932
|
+
//# sourceMappingURL=index.js.map
|