koishi-plugin-class-score-system 1.0.3 → 1.0.5
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 +279 -340
- package/lib/index.js.map +7 -0
- package/package.json +8 -3
package/lib/index.js
CHANGED
|
@@ -1,32 +1,5 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name2 in all)
|
|
8
|
-
__defProp(target, name2, { get: all[name2], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
1
|
// src/index.ts
|
|
21
|
-
|
|
22
|
-
__export(src_exports, {
|
|
23
|
-
Config: () => Config,
|
|
24
|
-
apply: () => apply,
|
|
25
|
-
inject: () => inject,
|
|
26
|
-
name: () => name
|
|
27
|
-
});
|
|
28
|
-
module.exports = __toCommonJS(src_exports);
|
|
29
|
-
var import_koishi4 = require("koishi");
|
|
2
|
+
import { Schema } from "koishi";
|
|
30
3
|
|
|
31
4
|
// src/models/database.ts
|
|
32
5
|
function extendDatabase(ctx) {
|
|
@@ -70,13 +43,9 @@ function extendDatabase(ctx) {
|
|
|
70
43
|
unique: ["openId", "guildId"]
|
|
71
44
|
});
|
|
72
45
|
}
|
|
73
|
-
__name(extendDatabase, "extendDatabase");
|
|
74
46
|
|
|
75
47
|
// src/services/api.ts
|
|
76
48
|
var CsmsApiService = class {
|
|
77
|
-
static {
|
|
78
|
-
__name(this, "CsmsApiService");
|
|
79
|
-
}
|
|
80
49
|
baseUrl;
|
|
81
50
|
token;
|
|
82
51
|
ctx;
|
|
@@ -98,18 +67,18 @@ var CsmsApiService = class {
|
|
|
98
67
|
cleanParams[key] = String(value);
|
|
99
68
|
}
|
|
100
69
|
}
|
|
101
|
-
this.ctx.logger.debug(`API
|
|
70
|
+
this.ctx.logger.debug(`API\u8BF7\u6C42: ${url}`, cleanParams);
|
|
102
71
|
const response = await this.ctx.http.get(url, {
|
|
103
72
|
params: cleanParams,
|
|
104
73
|
headers: {
|
|
105
74
|
"Authorization": this.token
|
|
106
75
|
}
|
|
107
76
|
});
|
|
108
|
-
this.ctx.logger.debug(`API
|
|
77
|
+
this.ctx.logger.debug(`API\u54CD\u5E94:`, response);
|
|
109
78
|
return response;
|
|
110
79
|
} catch (error) {
|
|
111
|
-
this.ctx.logger.error("CSMS API
|
|
112
|
-
return { error: error.message || "API
|
|
80
|
+
this.ctx.logger.error("CSMS API \u8BF7\u6C42\u5931\u8D25:", error);
|
|
81
|
+
return { error: error.message || "API\u8BF7\u6C42\u5931\u8D25" };
|
|
113
82
|
}
|
|
114
83
|
}
|
|
115
84
|
/**
|
|
@@ -128,20 +97,20 @@ var CsmsApiService = class {
|
|
|
128
97
|
}),
|
|
129
98
|
token: this.token
|
|
130
99
|
};
|
|
131
|
-
this.ctx.logger.info(
|
|
100
|
+
this.ctx.logger.info(`\u9A8C\u8BC1Token\u4E2D...`);
|
|
132
101
|
const response = await this.ctx.http.get(url, { params });
|
|
133
102
|
if (response.error) {
|
|
134
103
|
const errorLower = response.error.toLowerCase();
|
|
135
|
-
if (errorLower.includes("
|
|
136
|
-
this.ctx.logger.warn(`Token
|
|
104
|
+
if (errorLower.includes("\u672A\u6388\u6743") || errorLower.includes("token") || errorLower.includes("\u65E0\u6548")) {
|
|
105
|
+
this.ctx.logger.warn(`Token\u9A8C\u8BC1\u5931\u8D25: ${response.error}`);
|
|
137
106
|
return { valid: false };
|
|
138
107
|
}
|
|
139
|
-
this.ctx.logger.info(`Token
|
|
108
|
+
this.ctx.logger.info(`Token\u9A8C\u8BC1\u6210\u529F`);
|
|
140
109
|
return { valid: true };
|
|
141
110
|
}
|
|
142
111
|
return { valid: true };
|
|
143
112
|
} catch (error) {
|
|
144
|
-
this.ctx.logger.error(`Token
|
|
113
|
+
this.ctx.logger.error(`Token\u9A8C\u8BC1\u5F02\u5E38:`, error);
|
|
145
114
|
return { valid: false };
|
|
146
115
|
}
|
|
147
116
|
}
|
|
@@ -258,12 +227,12 @@ var CsmsApiService = class {
|
|
|
258
227
|
* GET /api/global_api.php?action=add_score&data={"users":[...],"description":"xxx"}&token=xxx
|
|
259
228
|
*/
|
|
260
229
|
async batchAddScore(data) {
|
|
261
|
-
this.ctx.logger.info(`batchAddScore
|
|
230
|
+
this.ctx.logger.info(`batchAddScore \u8BF7\u6C42\u6570\u636E:`, JSON.stringify(data));
|
|
262
231
|
const response = await this.request({
|
|
263
232
|
action: "add_score",
|
|
264
233
|
data: JSON.stringify(data)
|
|
265
234
|
});
|
|
266
|
-
this.ctx.logger.info(`batchAddScore API
|
|
235
|
+
this.ctx.logger.info(`batchAddScore API \u54CD\u5E94:`, JSON.stringify(response));
|
|
267
236
|
if (response.error) {
|
|
268
237
|
return {
|
|
269
238
|
success: false,
|
|
@@ -281,15 +250,15 @@ var CsmsApiService = class {
|
|
|
281
250
|
if (Array.isArray(response.data)) {
|
|
282
251
|
return {
|
|
283
252
|
success: true,
|
|
284
|
-
message: "
|
|
253
|
+
message: "\u64CD\u4F5C\u5B8C\u6210",
|
|
285
254
|
summary: { success_count: response.data.length, failed_count: 0, total_count: response.data.length },
|
|
286
255
|
details: response.data
|
|
287
256
|
};
|
|
288
257
|
}
|
|
289
|
-
this.ctx.logger.error(`batchAddScore
|
|
258
|
+
this.ctx.logger.error(`batchAddScore \u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u5F02\u5E38\uFF0C\u539F\u59CB\u54CD\u5E94:`, response);
|
|
290
259
|
return {
|
|
291
260
|
success: false,
|
|
292
|
-
message: "API
|
|
261
|
+
message: "API \u8FD4\u56DE\u6570\u636E\u683C\u5F0F\u5F02\u5E38",
|
|
293
262
|
summary: { success_count: 0, failed_count: 0, total_count: 0 },
|
|
294
263
|
details: []
|
|
295
264
|
};
|
|
@@ -307,9 +276,6 @@ var CsmsApiService = class {
|
|
|
307
276
|
|
|
308
277
|
// src/services/server.ts
|
|
309
278
|
var ServerConfigService = class {
|
|
310
|
-
static {
|
|
311
|
-
__name(this, "ServerConfigService");
|
|
312
|
-
}
|
|
313
279
|
ctx;
|
|
314
280
|
constructor(ctx) {
|
|
315
281
|
this.ctx = ctx;
|
|
@@ -365,14 +331,14 @@ var ServerConfigService = class {
|
|
|
365
331
|
return {
|
|
366
332
|
valid: true,
|
|
367
333
|
actualUsername: result.username,
|
|
368
|
-
error:
|
|
334
|
+
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
335
|
};
|
|
370
336
|
}
|
|
371
337
|
return { valid: true, actualUsername: result.username };
|
|
372
338
|
}
|
|
373
|
-
return { valid: false, error: "Token
|
|
339
|
+
return { valid: false, error: "Token \u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 Token \u662F\u5426\u6B63\u786E" };
|
|
374
340
|
} catch (error) {
|
|
375
|
-
this.ctx.logger.error("
|
|
341
|
+
this.ctx.logger.error("\u9A8C\u8BC1\u670D\u52A1\u5668\u914D\u7F6E\u5931\u8D25:", error);
|
|
376
342
|
return { valid: false, error: error.message };
|
|
377
343
|
}
|
|
378
344
|
}
|
|
@@ -380,9 +346,6 @@ var ServerConfigService = class {
|
|
|
380
346
|
|
|
381
347
|
// src/services/binding.ts
|
|
382
348
|
var QqBindingService = class {
|
|
383
|
-
static {
|
|
384
|
-
__name(this, "QqBindingService");
|
|
385
|
-
}
|
|
386
349
|
ctx;
|
|
387
350
|
constructor(ctx) {
|
|
388
351
|
this.ctx = ctx;
|
|
@@ -442,9 +405,6 @@ var QqBindingService = class {
|
|
|
442
405
|
|
|
443
406
|
// src/services/group-admin.ts
|
|
444
407
|
var GroupAdminService = class {
|
|
445
|
-
static {
|
|
446
|
-
__name(this, "GroupAdminService");
|
|
447
|
-
}
|
|
448
408
|
ctx;
|
|
449
409
|
constructor(ctx) {
|
|
450
410
|
this.ctx = ctx;
|
|
@@ -533,39 +493,36 @@ var CONSTANTS = {
|
|
|
533
493
|
DESCRIPTION_MAX_LENGTH: 255
|
|
534
494
|
};
|
|
535
495
|
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: "
|
|
496
|
+
NO_SERVER_CONFIG: "\u672A\u914D\u7F6ECSMS\u670D\u52A1\u5668\uFF0C\u8BF7\u5148\u4F7F\u7528 /\u7ED1\u5B9A\u670D\u52A1\u5668 \u547D\u4EE4\u914D\u7F6E",
|
|
497
|
+
INVALID_TOKEN: "\u65E0\u6548\u7684Token\u683C\u5F0F\uFF0CToken\u5FC5\u987B\u7531\u6570\u5B57\u548C\u82F1\u6587\u5927\u5199\u5B57\u6BCD\u7EC4\u6210",
|
|
498
|
+
INVALID_QQ: "\u65E0\u6548\u7684QQ\u53F7\u7801\u683C\u5F0F",
|
|
499
|
+
INVALID_SCORE: "\u5206\u6570\u5FC5\u987B\u5728 -1000 \u5230 1000 \u4E4B\u95F4",
|
|
500
|
+
INVALID_USERNAME: "\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\u4E14\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC750\u4E2A\u5B57\u7B26",
|
|
501
|
+
INVALID_DESCRIPTION: "\u63CF\u8FF0\u4FE1\u606F\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7255\u4E2A\u5B57\u7B26",
|
|
502
|
+
INVALID_LIMIT: "\u6570\u91CF\u5FC5\u987B\u5728 1 \u5230 50 \u4E4B\u95F4",
|
|
503
|
+
SERVER_NOT_FOUND: "\u670D\u52A1\u5668\u672A\u627E\u5230",
|
|
504
|
+
USER_NOT_FOUND: "\u7528\u6237\u672A\u627E\u5230",
|
|
505
|
+
USER_ALREADY_BOUND: "\u8BE5QQ\u53F7\u5DF2\u7ED1\u5B9A\u5176\u4ED6\u7528\u6237",
|
|
506
|
+
USER_NOT_BOUND: "\u8BE5QQ\u53F7\u672A\u7ED1\u5B9A\u4EFB\u4F55\u7528\u6237",
|
|
507
|
+
API_REQUEST_FAILED: "API\u8BF7\u6C42\u5931\u8D25",
|
|
508
|
+
INSUFFICIENT_PERMISSION: "\u6743\u9650\u4E0D\u8DB3\uFF0C\u4EC5\u7BA1\u7406\u5458\u53EF\u6267\u884C\u6B64\u64CD\u4F5C",
|
|
509
|
+
BINDING_FAILED: "\u7ED1\u5B9A\u5931\u8D25",
|
|
510
|
+
UNBINDING_FAILED: "\u89E3\u9664\u7ED1\u5B9A\u5931\u8D25",
|
|
511
|
+
CONFIGURATION_FAILED: "\u914D\u7F6E\u4FDD\u5B58\u5931\u8D25"
|
|
552
512
|
};
|
|
553
513
|
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: "
|
|
514
|
+
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",
|
|
515
|
+
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",
|
|
516
|
+
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",
|
|
517
|
+
BIND_QQ: "\u7ED1\u5B9AQQ\n\u7528\u6CD5\uFF1A/\u7ED1\u5B9AQQ <\u7528\u6237\u540D>\n\u793A\u4F8B\uFF1A/\u7ED1\u5B9AQQ \u5F20\u4E09",
|
|
518
|
+
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",
|
|
519
|
+
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",
|
|
520
|
+
RANKING: "\u6392\u884C\u699C\n\u7528\u6CD5\uFF1A/\u6392\u884C\u699C [\u6570\u91CF]\n\u793A\u4F8B\uFF1A/\u6392\u884C\u699C 10",
|
|
521
|
+
STATISTICS: "\u7EDF\u8BA1\n\u7528\u6CD5\uFF1A/\u7EDF\u8BA1 [\u7528\u6237\u540D]\n\u793A\u4F8B\uFF1A/\u7EDF\u8BA1 \u5F20\u4E09"
|
|
562
522
|
};
|
|
563
523
|
|
|
564
524
|
// src/utils/validator.ts
|
|
565
525
|
var Validator = class {
|
|
566
|
-
static {
|
|
567
|
-
__name(this, "Validator");
|
|
568
|
-
}
|
|
569
526
|
static validateToken(token) {
|
|
570
527
|
return CONSTANTS.TOKEN_PATTERN.test(token);
|
|
571
528
|
}
|
|
@@ -616,7 +573,7 @@ var Validator = class {
|
|
|
616
573
|
}
|
|
617
574
|
static validateLimitWithMessage(limit, max = CONSTANTS.RANKING_MAX_LIMIT) {
|
|
618
575
|
if (!this.validateLimit(limit, max)) {
|
|
619
|
-
return
|
|
576
|
+
return `\u6570\u91CF\u5FC5\u987B\u5728 1 \u5230 ${max} \u4E4B\u95F4`;
|
|
620
577
|
}
|
|
621
578
|
return null;
|
|
622
579
|
}
|
|
@@ -624,33 +581,30 @@ var Validator = class {
|
|
|
624
581
|
|
|
625
582
|
// src/utils/formatter.ts
|
|
626
583
|
var Formatter = class {
|
|
627
|
-
static {
|
|
628
|
-
__name(this, "Formatter");
|
|
629
|
-
}
|
|
630
584
|
// QQ 消息单条最大长度限制(留有余量)
|
|
631
585
|
static MAX_MESSAGE_LENGTH = 1800;
|
|
632
586
|
static formatScoreInfo(user, ranking) {
|
|
633
587
|
return [
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
588
|
+
`\u7528\u6237: ${user.username}`,
|
|
589
|
+
`\u6392\u540D: ${ranking || "\u672A\u77E5"}`,
|
|
590
|
+
`\u603B\u79EF\u5206: ${user.total_score}`,
|
|
591
|
+
`\u7D2F\u8BA1\u52A0\u5206: ${user.add_score}`,
|
|
592
|
+
`\u7D2F\u8BA1\u6263\u5206: ${user.deduct_score}`,
|
|
593
|
+
`\u8BB0\u5F55\u6570: ${user.score_count}`
|
|
640
594
|
].join("\n");
|
|
641
595
|
}
|
|
642
596
|
static formatRanking(users) {
|
|
643
597
|
if (users.length === 0) {
|
|
644
|
-
return "
|
|
598
|
+
return "\u6682\u65E0\u6392\u540D\u6570\u636E";
|
|
645
599
|
}
|
|
646
|
-
const lines = ["
|
|
600
|
+
const lines = ["\u3010\u79EF\u5206\u6392\u884C\u699C\u3011"];
|
|
647
601
|
const displayUsers = users.slice(0, 20);
|
|
648
602
|
displayUsers.forEach((user, index) => {
|
|
649
|
-
const medal = index < 3 ? ["
|
|
650
|
-
lines.push(`${medal} ${user.username}: ${user.total_score}
|
|
603
|
+
const medal = index < 3 ? ["\u{1F947}", "\u{1F948}", "\u{1F949}"][index] : `${index + 1}.`;
|
|
604
|
+
lines.push(`${medal} ${user.username}: ${user.total_score}\u5206`);
|
|
651
605
|
});
|
|
652
606
|
if (users.length > 20) {
|
|
653
|
-
lines.push(`...
|
|
607
|
+
lines.push(`... \u5171 ${users.length} \u4EBA\uFF0C\u663E\u793A\u524D20\u540D`);
|
|
654
608
|
}
|
|
655
609
|
return lines.join("\n");
|
|
656
610
|
}
|
|
@@ -659,70 +613,70 @@ var Formatter = class {
|
|
|
659
613
|
*/
|
|
660
614
|
static formatRankingWithRank(users, startRank) {
|
|
661
615
|
if (users.length === 0) {
|
|
662
|
-
return "
|
|
616
|
+
return "\u6682\u65E0\u6392\u540D\u6570\u636E";
|
|
663
617
|
}
|
|
664
|
-
const lines = ["
|
|
618
|
+
const lines = ["\u3010\u79EF\u5206\u6392\u884C\u699C\u3011"];
|
|
665
619
|
users.forEach((user, index) => {
|
|
666
620
|
const rank = startRank + index;
|
|
667
|
-
const medal = rank <= 3 ? ["
|
|
668
|
-
lines.push(`${medal} ${user.username}: ${user.total_score}
|
|
621
|
+
const medal = rank <= 3 ? ["\u{1F947}", "\u{1F948}", "\u{1F949}"][rank - 1] : `${rank}.`;
|
|
622
|
+
lines.push(`${medal} ${user.username}: ${user.total_score}\u5206`);
|
|
669
623
|
});
|
|
670
624
|
return lines.join("\n");
|
|
671
625
|
}
|
|
672
626
|
static getMedal(index) {
|
|
673
|
-
const medals = ["
|
|
627
|
+
const medals = ["\u{1F947}", "\u{1F948}", "\u{1F949}"];
|
|
674
628
|
return medals[index] || `${index + 1}.`;
|
|
675
629
|
}
|
|
676
630
|
static formatScoreLogs(logs) {
|
|
677
631
|
if (logs.length === 0) {
|
|
678
|
-
return "
|
|
632
|
+
return "\u6682\u65E0\u79EF\u5206\u8BB0\u5F55";
|
|
679
633
|
}
|
|
680
|
-
const lines = ["
|
|
634
|
+
const lines = ["\u3010\u79EF\u5206\u8BB0\u5F55\u3011"];
|
|
681
635
|
const displayLogs = logs.slice(0, 10);
|
|
682
636
|
displayLogs.forEach((log) => {
|
|
683
637
|
const change = log.score_change > 0 ? `+${log.score_change}` : log.score_change;
|
|
684
|
-
lines.push(`${change}
|
|
638
|
+
lines.push(`${change}\u5206 - ${log.description}`);
|
|
685
639
|
});
|
|
686
640
|
if (logs.length > 10) {
|
|
687
|
-
lines.push(`...
|
|
641
|
+
lines.push(`... \u5171 ${logs.length} \u6761\u8BB0\u5F55`);
|
|
688
642
|
}
|
|
689
643
|
return lines.join("\n");
|
|
690
644
|
}
|
|
691
645
|
static formatStatistics(user, logs) {
|
|
692
646
|
const lines = [
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
"
|
|
647
|
+
`\u3010${user.username} \u7684\u7EDF\u8BA1\u4FE1\u606F\u3011`,
|
|
648
|
+
`\u603B\u79EF\u5206: ${user.total_score}`,
|
|
649
|
+
`\u7D2F\u8BA1\u52A0\u5206: ${user.add_score}`,
|
|
650
|
+
`\u7D2F\u8BA1\u6263\u5206: ${user.deduct_score}`,
|
|
651
|
+
`\u8BB0\u5F55\u6570: ${user.score_count}`,
|
|
652
|
+
"\u6700\u8FD1\u79EF\u5206\u8BB0\u5F55:"
|
|
699
653
|
];
|
|
700
654
|
const recentLogs = logs.slice(0, 5);
|
|
701
655
|
if (recentLogs.length > 0) {
|
|
702
656
|
recentLogs.forEach((log) => {
|
|
703
657
|
const change = log.score_change > 0 ? `+${log.score_change}` : log.score_change;
|
|
704
|
-
lines.push(`${change}
|
|
658
|
+
lines.push(`${change}\u5206 - ${log.description}`);
|
|
705
659
|
});
|
|
706
660
|
} else {
|
|
707
|
-
lines.push("
|
|
661
|
+
lines.push("\u6682\u65E0\u8BB0\u5F55");
|
|
708
662
|
}
|
|
709
663
|
return lines.join("\n");
|
|
710
664
|
}
|
|
711
665
|
static formatAddScoreResult(result) {
|
|
712
|
-
const status = result.success ? "
|
|
713
|
-
const summary =
|
|
666
|
+
const status = result.success ? "\u79EF\u5206\u8C03\u6574\u6210\u529F" : "\u79EF\u5206\u8C03\u6574\u5931\u8D25";
|
|
667
|
+
const summary = `\u6210\u529F: ${result.summary.success_count} \u6761\uFF0C\u5931\u8D25: ${result.summary.failed_count} \u6761`;
|
|
714
668
|
const lines = [status, summary];
|
|
715
669
|
if (!result.success && result.message) {
|
|
716
|
-
lines.push(
|
|
670
|
+
lines.push(`\u539F\u56E0: ${result.message}`);
|
|
717
671
|
}
|
|
718
672
|
if (result.details && result.details.length > 0) {
|
|
719
|
-
lines.push("
|
|
673
|
+
lines.push("\u8BE6\u60C5:");
|
|
720
674
|
result.details.forEach((detail) => {
|
|
721
675
|
if (detail.success) {
|
|
722
676
|
const change = detail.score_change > 0 ? "+" : "";
|
|
723
|
-
lines.push(`[OK] ${detail.username}: ${change}${detail.score_change}
|
|
677
|
+
lines.push(`[OK] ${detail.username}: ${change}${detail.score_change}\u5206`);
|
|
724
678
|
} else {
|
|
725
|
-
lines.push(`[FAIL] ${detail.username}: ${detail.error || "
|
|
679
|
+
lines.push(`[FAIL] ${detail.username}: ${detail.error || "\u5931\u8D25"}`);
|
|
726
680
|
}
|
|
727
681
|
});
|
|
728
682
|
}
|
|
@@ -768,72 +722,71 @@ var Formatter = class {
|
|
|
768
722
|
|
|
769
723
|
// src/commands/bind-server.ts
|
|
770
724
|
function registerBindServerCommand(ctx, serverService, adminService) {
|
|
771
|
-
ctx.command("
|
|
725
|
+
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
726
|
if (!address || !username || !token) {
|
|
773
727
|
return HELP_MESSAGES.BIND_SERVER;
|
|
774
728
|
}
|
|
775
729
|
if (!session.guildId) {
|
|
776
|
-
return "
|
|
730
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
777
731
|
}
|
|
778
732
|
const openId = session.userId?.toString();
|
|
779
733
|
if (!openId) {
|
|
780
|
-
return "
|
|
734
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
781
735
|
}
|
|
782
736
|
const existingConfig = await serverService.getConfigByGuild(session.guildId);
|
|
783
737
|
if (existingConfig) {
|
|
784
|
-
return "
|
|
738
|
+
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
739
|
}
|
|
786
740
|
const tokenError = Validator.validateTokenWithMessage(token);
|
|
787
741
|
if (tokenError) {
|
|
788
|
-
ctx.logger.info(`Token
|
|
789
|
-
return `Token
|
|
742
|
+
ctx.logger.info(`Token \u683C\u5F0F\u9A8C\u8BC1\u5931\u8D25: ${tokenError}`);
|
|
743
|
+
return `Token \u683C\u5F0F\u9A8C\u8BC1\u5931\u8D25`;
|
|
790
744
|
}
|
|
791
745
|
try {
|
|
792
|
-
ctx.logger.info(
|
|
746
|
+
ctx.logger.info(`\u6B63\u5728\u9A8C\u8BC1\u670D\u52A1\u5668\u914D\u7F6E...`);
|
|
793
747
|
const result = await serverService.validateConfig(address, username, token);
|
|
794
748
|
if (!result.valid) {
|
|
795
|
-
const errorMsg = result.error || "
|
|
796
|
-
ctx.logger.info(
|
|
797
|
-
return
|
|
749
|
+
const errorMsg = result.error || "\u670D\u52A1\u5668\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25";
|
|
750
|
+
ctx.logger.info(`\u670D\u52A1\u5668\u914D\u7F6E\u9A8C\u8BC1\u5931\u8D25: ${errorMsg}`);
|
|
751
|
+
return `\u9A8C\u8BC1\u5931\u8D25: ${errorMsg}`;
|
|
798
752
|
}
|
|
799
753
|
const actualUsername = result.actualUsername || username;
|
|
800
|
-
const config = await serverService.saveConfig(session.guildId, "CSMS
|
|
801
|
-
await adminService.addAdmin(session.guildId, openId, "
|
|
802
|
-
ctx.logger.info(
|
|
754
|
+
const config = await serverService.saveConfig(session.guildId, "CSMS\u670D\u52A1\u5668", address, actualUsername, token);
|
|
755
|
+
await adminService.addAdmin(session.guildId, openId, "\u7BA1\u7406\u5458");
|
|
756
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u7684\u9996\u4E2A\u7ED1\u5B9A\u8005 ${openId} \u88AB\u81EA\u52A8\u6DFB\u52A0\u4E3A\u7BA1\u7406\u5458`);
|
|
803
757
|
const domain = config.address.replace(/^https?:\/\//, "").split("/")[0];
|
|
804
|
-
ctx.logger.info(
|
|
805
|
-
return
|
|
758
|
+
ctx.logger.info(`\u670D\u52A1\u5668\u914D\u7F6E\u6210\u529F\uFF0Cdomain=${domain}\uFF0Cusername=${actualUsername}`);
|
|
759
|
+
return `\u2705 \u670D\u52A1\u5668\u914D\u7F6E\u6210\u529F`;
|
|
806
760
|
} catch (error) {
|
|
807
|
-
ctx.logger.error("
|
|
808
|
-
return
|
|
761
|
+
ctx.logger.error("\u4FDD\u5B58\u670D\u52A1\u5668\u914D\u7F6E\u5931\u8D25:", error);
|
|
762
|
+
return `\u914D\u7F6E\u4FDD\u5B58\u5931\u8D25: ${error.message}`;
|
|
809
763
|
}
|
|
810
764
|
});
|
|
811
|
-
ctx.command("
|
|
765
|
+
ctx.command("\u670D\u52A1\u5668\u89E3\u7ED1").alias("unbind-server").action(async ({ session }) => {
|
|
812
766
|
if (!session.guildId) {
|
|
813
|
-
return "
|
|
767
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
814
768
|
}
|
|
815
769
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
816
770
|
if (!hasPermission) {
|
|
817
|
-
return "
|
|
771
|
+
return "\u274C \u6B64\u547D\u4EE4\u4EC5\u9650\u7BA1\u7406\u5458\u4F7F\u7528";
|
|
818
772
|
}
|
|
819
773
|
const config = await serverService.getConfigByGuild(session.guildId);
|
|
820
774
|
if (!config) {
|
|
821
|
-
return "
|
|
775
|
+
return "\u274C \u8BE5\u7FA4\u804A\u5C1A\u672A\u7ED1\u5B9A\u4EFB\u4F55\u670D\u52A1\u5668";
|
|
822
776
|
}
|
|
823
|
-
await session.send("
|
|
777
|
+
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
778
|
const reply = await session.prompt(3e4);
|
|
825
|
-
if (reply?.trim() !== "
|
|
826
|
-
return "
|
|
779
|
+
if (reply?.trim() !== "\u786E\u8BA4") {
|
|
780
|
+
return "\u2705 \u5DF2\u53D6\u6D88\u89E3\u7ED1\u64CD\u4F5C";
|
|
827
781
|
}
|
|
828
782
|
await serverService.deleteConfig(session.guildId);
|
|
829
|
-
ctx.logger.info(
|
|
830
|
-
return
|
|
783
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u89E3\u9664\u4E86\u670D\u52A1\u5668\u7ED1\u5B9A`);
|
|
784
|
+
return `\u2705 \u5DF2\u89E3\u9664\u670D\u52A1\u5668\u7ED1\u5B9A`;
|
|
831
785
|
});
|
|
832
786
|
}
|
|
833
|
-
__name(registerBindServerCommand, "registerBindServerCommand");
|
|
834
787
|
|
|
835
788
|
// src/utils/image.ts
|
|
836
|
-
|
|
789
|
+
import { h } from "koishi";
|
|
837
790
|
async function generateImage(ctx, html, options = {}) {
|
|
838
791
|
const width = options.width || 450;
|
|
839
792
|
const height = options.height || 800;
|
|
@@ -865,20 +818,18 @@ async function generateImage(ctx, html, options = {}) {
|
|
|
865
818
|
});
|
|
866
819
|
return screenshot;
|
|
867
820
|
} catch (error) {
|
|
868
|
-
ctx.logger.error("
|
|
821
|
+
ctx.logger.error("\u751F\u6210\u56FE\u7247\u5931\u8D25:", error);
|
|
869
822
|
return null;
|
|
870
823
|
}
|
|
871
824
|
}
|
|
872
|
-
__name(generateImage, "generateImage");
|
|
873
825
|
async function sendImageOrText(ctx, session, html, fallbackText, options = {}) {
|
|
874
826
|
const image = await generateImage(ctx, html, options);
|
|
875
827
|
if (image) {
|
|
876
|
-
await session.send(
|
|
828
|
+
await session.send(h.image(image, "image/png"));
|
|
877
829
|
} else {
|
|
878
830
|
await session.send(fallbackText);
|
|
879
831
|
}
|
|
880
832
|
}
|
|
881
|
-
__name(sendImageOrText, "sendImageOrText");
|
|
882
833
|
function getBaseStyles() {
|
|
883
834
|
return `
|
|
884
835
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
@@ -926,13 +877,12 @@ function getBaseStyles() {
|
|
|
926
877
|
}
|
|
927
878
|
`;
|
|
928
879
|
}
|
|
929
|
-
__name(getBaseStyles, "getBaseStyles");
|
|
930
880
|
|
|
931
881
|
// src/commands/query-score.ts
|
|
932
882
|
function registerQueryScoreCommand(ctx, serverService, bindingService) {
|
|
933
|
-
ctx.command("
|
|
883
|
+
ctx.command("\u67E5\u8BE2\u79EF\u5206 [\u7528\u6237\u540D:string]").alias("query-score").action(async ({ session }, username) => {
|
|
934
884
|
if (!session.guildId) {
|
|
935
|
-
return "
|
|
885
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
936
886
|
}
|
|
937
887
|
const api = await serverService.createApiService(session.guildId);
|
|
938
888
|
if (!api) {
|
|
@@ -943,11 +893,11 @@ function registerQueryScoreCommand(ctx, serverService, bindingService) {
|
|
|
943
893
|
if (!username) {
|
|
944
894
|
const openId = session.userId?.toString();
|
|
945
895
|
if (!openId) {
|
|
946
|
-
return "
|
|
896
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
947
897
|
}
|
|
948
898
|
const binding = await bindingService.getUserByOpenId(session.guildId, openId);
|
|
949
899
|
if (!binding) {
|
|
950
|
-
return `${ERROR_MESSAGES.USER_NOT_BOUND}
|
|
900
|
+
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
901
|
}
|
|
952
902
|
targetUsername = binding.username;
|
|
953
903
|
}
|
|
@@ -1015,41 +965,40 @@ function registerQueryScoreCommand(ctx, serverService, bindingService) {
|
|
|
1015
965
|
</head>
|
|
1016
966
|
<body>
|
|
1017
967
|
<div class="container">
|
|
1018
|
-
<div class="title"
|
|
968
|
+
<div class="title">\u{1F4CA} \u79EF\u5206\u67E5\u8BE2\u7ED3\u679C</div>
|
|
1019
969
|
<div class="username">${user.username}</div>
|
|
1020
|
-
<div class="subtitle"
|
|
970
|
+
<div class="subtitle">\u7528\u6237ID: ${user.id}</div>
|
|
1021
971
|
<div class="info-grid">
|
|
1022
972
|
<div class="info-item">
|
|
1023
|
-
<div class="info-label"
|
|
973
|
+
<div class="info-label">\u5F53\u524D\u79EF\u5206</div>
|
|
1024
974
|
<div class="info-value score">${user.total_score}</div>
|
|
1025
975
|
</div>
|
|
1026
976
|
<div class="info-item">
|
|
1027
|
-
<div class="info-label"
|
|
977
|
+
<div class="info-label">\u6392\u884C\u699C</div>
|
|
1028
978
|
<div class="info-value rank">#${ranking}</div>
|
|
1029
979
|
</div>
|
|
1030
980
|
</div>
|
|
1031
|
-
<div class="footer"
|
|
981
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1032
982
|
</div>
|
|
1033
983
|
</body>
|
|
1034
984
|
</html>`;
|
|
1035
985
|
await sendImageOrText(ctx, session, html, textResult, { height: 600 });
|
|
1036
986
|
return "";
|
|
1037
987
|
} catch (error) {
|
|
1038
|
-
ctx.logger.error("
|
|
988
|
+
ctx.logger.error("\u67E5\u8BE2\u79EF\u5206\u5931\u8D25:", error);
|
|
1039
989
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1040
990
|
}
|
|
1041
991
|
});
|
|
1042
992
|
}
|
|
1043
|
-
__name(registerQueryScoreCommand, "registerQueryScoreCommand");
|
|
1044
993
|
|
|
1045
994
|
// src/commands/bind-qq.ts
|
|
1046
995
|
function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
1047
|
-
ctx.command("
|
|
996
|
+
ctx.command("\u7ED1\u5B9AQQ <\u7528\u6237\u540D:string>").alias("bind-qq").action(async ({ session }, username) => {
|
|
1048
997
|
if (!username) {
|
|
1049
998
|
return HELP_MESSAGES.BIND_QQ;
|
|
1050
999
|
}
|
|
1051
1000
|
if (!session.guildId) {
|
|
1052
|
-
return "
|
|
1001
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1053
1002
|
}
|
|
1054
1003
|
const usernameError = Validator.validateUsernameWithMessage(username);
|
|
1055
1004
|
if (usernameError) {
|
|
@@ -1057,9 +1006,9 @@ function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
|
1057
1006
|
}
|
|
1058
1007
|
const openId = session.userId?.toString();
|
|
1059
1008
|
if (!openId) {
|
|
1060
|
-
return "
|
|
1009
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1061
1010
|
}
|
|
1062
|
-
ctx.logger.info(
|
|
1011
|
+
ctx.logger.info(`\u83B7\u53D6\u5230\u7684\u7528\u6237 OpenID: ${openId}`);
|
|
1063
1012
|
const config = await serverService.getConfigByGuild(session.guildId);
|
|
1064
1013
|
if (!config) {
|
|
1065
1014
|
return ERROR_MESSAGES.NO_SERVER_CONFIG;
|
|
@@ -1067,11 +1016,11 @@ function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
|
1067
1016
|
try {
|
|
1068
1017
|
const existingBinding = await bindingService.getUserByOpenId(session.guildId, openId);
|
|
1069
1018
|
if (existingBinding) {
|
|
1070
|
-
return
|
|
1019
|
+
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
1020
|
}
|
|
1072
1021
|
const existingBindings = await bindingService.getBindingsByUsername(session.guildId, username);
|
|
1073
1022
|
if (existingBindings.length > 0) {
|
|
1074
|
-
return
|
|
1023
|
+
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
1024
|
}
|
|
1076
1025
|
const api = await serverService.createApiService(session.guildId);
|
|
1077
1026
|
if (!api) {
|
|
@@ -1083,20 +1032,20 @@ function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
|
1083
1032
|
}
|
|
1084
1033
|
const user = response.data[0];
|
|
1085
1034
|
await bindingService.bindQq(session.guildId, user.id, username, openId, config.id);
|
|
1086
|
-
return
|
|
1087
|
-
|
|
1035
|
+
return `\u2705 \u7ED1\u5B9A\u6210\u529F
|
|
1036
|
+
\u7528\u6237\u540D: ${username}`;
|
|
1088
1037
|
} catch (error) {
|
|
1089
|
-
ctx.logger.error("
|
|
1038
|
+
ctx.logger.error("\u7ED1\u5B9AQQ\u5931\u8D25:", error);
|
|
1090
1039
|
return ERROR_MESSAGES.BINDING_FAILED;
|
|
1091
1040
|
}
|
|
1092
1041
|
});
|
|
1093
|
-
ctx.command("
|
|
1042
|
+
ctx.command("\u89E3\u9664\u7ED1\u5B9A").alias("unbind").action(async ({ session }, username) => {
|
|
1094
1043
|
if (!session.guildId) {
|
|
1095
|
-
return "
|
|
1044
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1096
1045
|
}
|
|
1097
1046
|
const openId = session.userId?.toString();
|
|
1098
1047
|
if (!openId) {
|
|
1099
|
-
return "
|
|
1048
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1100
1049
|
}
|
|
1101
1050
|
let binding = null;
|
|
1102
1051
|
if (username) {
|
|
@@ -1106,28 +1055,27 @@ function registerBindQqCommand(ctx, serverService, bindingService) {
|
|
|
1106
1055
|
binding = await bindingService.getUserByOpenId(session.guildId, openId);
|
|
1107
1056
|
}
|
|
1108
1057
|
if (!binding) {
|
|
1109
|
-
return
|
|
1058
|
+
return `\u274C \u60A8\u5C1A\u672A\u7ED1\u5B9A\u4EFB\u4F55\u8D26\u53F7${username ? `\uFF08\u7528\u6237\uFF1A${username}\uFF09` : ""}`;
|
|
1110
1059
|
}
|
|
1111
|
-
await session.send(
|
|
1060
|
+
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
1061
|
const reply = await session.prompt(3e4);
|
|
1113
|
-
if (reply?.trim() !== "
|
|
1114
|
-
return "
|
|
1062
|
+
if (reply?.trim() !== "\u786E\u8BA4") {
|
|
1063
|
+
return "\u2705 \u5DF2\u53D6\u6D88\u89E3\u7ED1\u64CD\u4F5C";
|
|
1115
1064
|
}
|
|
1116
1065
|
await bindingService.unbindQq(session.guildId, openId);
|
|
1117
|
-
ctx.logger.info(
|
|
1118
|
-
return
|
|
1066
|
+
ctx.logger.info(`\u7528\u6237 ${binding.username}\uFF08OpenID: ${openId}\uFF09\u89E3\u9664\u4E86\u7ED1\u5B9A`);
|
|
1067
|
+
return `\u2705 \u5DF2\u89E3\u9664\u300C${binding.username}\u300D\u7684\u7ED1\u5B9A`;
|
|
1119
1068
|
});
|
|
1120
1069
|
}
|
|
1121
|
-
__name(registerBindQqCommand, "registerBindQqCommand");
|
|
1122
1070
|
|
|
1123
1071
|
// src/commands/adjust-score.ts
|
|
1124
1072
|
function registerAdjustScoreCommand(ctx, serverService, adminService) {
|
|
1125
|
-
ctx.command("
|
|
1073
|
+
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
1074
|
if (!username || score === void 0 || !reason) {
|
|
1127
1075
|
return HELP_MESSAGES.ADJUST_SCORE;
|
|
1128
1076
|
}
|
|
1129
1077
|
if (!session.guildId) {
|
|
1130
|
-
return "
|
|
1078
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1131
1079
|
}
|
|
1132
1080
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
1133
1081
|
if (!hasPermission) {
|
|
@@ -1159,25 +1107,24 @@ function registerAdjustScoreCommand(ctx, serverService, adminService) {
|
|
|
1159
1107
|
],
|
|
1160
1108
|
description: reason
|
|
1161
1109
|
};
|
|
1162
|
-
ctx.logger.info(
|
|
1110
|
+
ctx.logger.info(`\u8C03\u6574\u79EF\u5206\u8BF7\u6C42: \u7528\u6237=${username}, \u5206\u6570=${score}, \u539F\u56E0=${reason}`);
|
|
1163
1111
|
const result = await api.batchAddScore(data);
|
|
1164
|
-
ctx.logger.info(
|
|
1112
|
+
ctx.logger.info(`\u8C03\u6574\u79EF\u5206\u7ED3\u679C:`, JSON.stringify(result));
|
|
1165
1113
|
const message = Formatter.formatAddScoreResult(result);
|
|
1166
1114
|
return Formatter.splitMessage(message);
|
|
1167
1115
|
} catch (error) {
|
|
1168
|
-
ctx.logger.error("
|
|
1116
|
+
ctx.logger.error("\u8C03\u6574\u79EF\u5206\u5931\u8D25:", error);
|
|
1169
1117
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1170
1118
|
}
|
|
1171
1119
|
});
|
|
1172
1120
|
}
|
|
1173
|
-
__name(registerAdjustScoreCommand, "registerAdjustScoreCommand");
|
|
1174
1121
|
|
|
1175
1122
|
// src/commands/ranking.ts
|
|
1176
1123
|
var PAGE_SIZE = 10;
|
|
1177
1124
|
function registerRankingCommand(ctx, serverService) {
|
|
1178
|
-
ctx.command("
|
|
1125
|
+
ctx.command("\u6392\u884C\u699C [\u9875\u7801:number]").alias("ranking").action(async ({ session }, page = 1) => {
|
|
1179
1126
|
if (!session.guildId) {
|
|
1180
|
-
return "
|
|
1127
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1181
1128
|
}
|
|
1182
1129
|
const api = await serverService.createApiService(session.guildId);
|
|
1183
1130
|
if (!api) {
|
|
@@ -1198,14 +1145,14 @@ function registerRankingCommand(ctx, serverService) {
|
|
|
1198
1145
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1199
1146
|
}
|
|
1200
1147
|
if (response.data.length === 0) {
|
|
1201
|
-
return
|
|
1148
|
+
return `\u6682\u65E0\u6392\u884C\u6570\u636E`;
|
|
1202
1149
|
}
|
|
1203
1150
|
const startRank = offset + 1;
|
|
1204
1151
|
const message = Formatter.formatRankingWithRank(response.data, startRank);
|
|
1205
|
-
const pageInfo = totalPages > 1 ?
|
|
1152
|
+
const pageInfo = totalPages > 1 ? `\u7B2C ${page}/${totalPages} \u9875\uFF0C\u5171 ${totalUsers} \u4EBA` : `\u5171 ${totalUsers} \u4EBA`;
|
|
1206
1153
|
const rankItems = response.data.map((user, index) => {
|
|
1207
1154
|
const rank = startRank + index;
|
|
1208
|
-
const medal = rank === 1 ? "
|
|
1155
|
+
const medal = rank === 1 ? "\u{1F947}" : rank === 2 ? "\u{1F948}" : rank === 3 ? "\u{1F949}" : `${rank}.`;
|
|
1209
1156
|
const scoreColor = user.total_score >= 0 ? "#27ae60" : "#e74c3c";
|
|
1210
1157
|
return `
|
|
1211
1158
|
<div class="rank-item">
|
|
@@ -1269,33 +1216,32 @@ function registerRankingCommand(ctx, serverService) {
|
|
|
1269
1216
|
</head>
|
|
1270
1217
|
<body>
|
|
1271
1218
|
<div class="container">
|
|
1272
|
-
<div class="title"><span class="title-icon"
|
|
1219
|
+
<div class="title"><span class="title-icon">\u{1F3C6}</span>\u79EF\u5206\u6392\u884C\u699C</div>
|
|
1273
1220
|
<div class="rank-list">
|
|
1274
1221
|
${rankItems}
|
|
1275
1222
|
</div>
|
|
1276
1223
|
<div class="page-info">${pageInfo}</div>
|
|
1277
|
-
<div class="footer"
|
|
1224
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1278
1225
|
</div>
|
|
1279
1226
|
</body>
|
|
1280
1227
|
</html>`;
|
|
1281
1228
|
const textResult = message + (totalPages > 1 ? `
|
|
1282
1229
|
|
|
1283
|
-
|
|
1230
|
+
\u{1F4C4} ${pageInfo}` : "");
|
|
1284
1231
|
await sendImageOrText(ctx, session, html, textResult, { height: 820 });
|
|
1285
1232
|
return "";
|
|
1286
1233
|
} catch (error) {
|
|
1287
|
-
ctx.logger.error("
|
|
1234
|
+
ctx.logger.error("\u83B7\u53D6\u6392\u884C\u699C\u5931\u8D25:", error);
|
|
1288
1235
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1289
1236
|
}
|
|
1290
1237
|
});
|
|
1291
1238
|
}
|
|
1292
|
-
__name(registerRankingCommand, "registerRankingCommand");
|
|
1293
1239
|
|
|
1294
1240
|
// src/commands/statistics.ts
|
|
1295
1241
|
function registerStatisticsCommand(ctx, serverService, bindingService) {
|
|
1296
|
-
ctx.command("
|
|
1242
|
+
ctx.command("\u7EDF\u8BA1 [\u7528\u6237\u540D:string]").alias("statistics").action(async ({ session }, username) => {
|
|
1297
1243
|
if (!session.guildId) {
|
|
1298
|
-
return "
|
|
1244
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1299
1245
|
}
|
|
1300
1246
|
const api = await serverService.createApiService(session.guildId);
|
|
1301
1247
|
if (!api) {
|
|
@@ -1306,13 +1252,13 @@ function registerStatisticsCommand(ctx, serverService, bindingService) {
|
|
|
1306
1252
|
if (!username) {
|
|
1307
1253
|
const openId = session.userId?.toString();
|
|
1308
1254
|
if (!openId) {
|
|
1309
|
-
return "
|
|
1255
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1310
1256
|
}
|
|
1311
1257
|
const binding = await bindingService.getUserByOpenId(session.guildId, openId);
|
|
1312
1258
|
if (!binding) {
|
|
1313
1259
|
return `${ERROR_MESSAGES.USER_NOT_BOUND}
|
|
1314
1260
|
|
|
1315
|
-
|
|
1261
|
+
\u8BF7\u5148\u4F7F\u7528 /\u7ED1\u5B9AQQ <\u7528\u6237\u540D> \u547D\u4EE4\u7ED1\u5B9A\u60A8\u7684\u8D26\u53F7`;
|
|
1316
1262
|
}
|
|
1317
1263
|
targetUsername = binding.username;
|
|
1318
1264
|
}
|
|
@@ -1384,52 +1330,51 @@ function registerStatisticsCommand(ctx, serverService, bindingService) {
|
|
|
1384
1330
|
</head>
|
|
1385
1331
|
<body>
|
|
1386
1332
|
<div class="container">
|
|
1387
|
-
<div class="title"
|
|
1333
|
+
<div class="title">\u{1F4CA} \u79EF\u5206\u7EDF\u8BA1</div>
|
|
1388
1334
|
<div class="user-info">
|
|
1389
1335
|
<div class="username">${user.username}</div>
|
|
1390
|
-
<div class="user-id"
|
|
1336
|
+
<div class="user-id">\u7528\u6237ID: ${user.id} | \u5F53\u524D\u79EF\u5206: ${user.total_score}</div>
|
|
1391
1337
|
</div>
|
|
1392
1338
|
<div class="stats-grid">
|
|
1393
1339
|
<div class="stat-card positive">
|
|
1394
|
-
<div class="stat-label"
|
|
1340
|
+
<div class="stat-label">\u7D2F\u8BA1\u52A0\u5206</div>
|
|
1395
1341
|
<div class="stat-value positive">+${addScore}</div>
|
|
1396
1342
|
</div>
|
|
1397
1343
|
<div class="stat-card negative">
|
|
1398
|
-
<div class="stat-label"
|
|
1344
|
+
<div class="stat-label">\u7D2F\u8BA1\u6263\u5206</div>
|
|
1399
1345
|
<div class="stat-value negative">-${deductScore}</div>
|
|
1400
1346
|
</div>
|
|
1401
1347
|
<div class="stat-card total">
|
|
1402
|
-
<div class="stat-label"
|
|
1348
|
+
<div class="stat-label">\u603B\u79EF\u5206</div>
|
|
1403
1349
|
<div class="stat-value total">${totalScore}</div>
|
|
1404
1350
|
</div>
|
|
1405
1351
|
<div class="stat-card">
|
|
1406
|
-
<div class="stat-label"
|
|
1352
|
+
<div class="stat-label">\u64CD\u4F5C\u6B21\u6570</div>
|
|
1407
1353
|
<div class="stat-value">${scoreCount}</div>
|
|
1408
1354
|
</div>
|
|
1409
1355
|
</div>
|
|
1410
|
-
<div class="footer"
|
|
1356
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1411
1357
|
</div>
|
|
1412
1358
|
</body>
|
|
1413
1359
|
</html>`;
|
|
1414
1360
|
const textResult = [
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1361
|
+
`\u3010${user.username} \u7684\u7EDF\u8BA1\u4FE1\u606F\u3011`,
|
|
1362
|
+
`\u603B\u79EF\u5206: ${user.total_score}`,
|
|
1363
|
+
`\u7D2F\u8BA1\u52A0\u5206: +${addScore}`,
|
|
1364
|
+
`\u7D2F\u8BA1\u6263\u5206: -${deductScore}`,
|
|
1365
|
+
`\u64CD\u4F5C\u6B21\u6570: ${scoreCount}`
|
|
1420
1366
|
].join("\n");
|
|
1421
1367
|
await sendImageOrText(ctx, session, html, textResult, { height: 550 });
|
|
1422
1368
|
return "";
|
|
1423
1369
|
} catch (error) {
|
|
1424
|
-
ctx.logger.error("
|
|
1370
|
+
ctx.logger.error("\u83B7\u53D6\u7EDF\u8BA1\u4FE1\u606F\u5931\u8D25:", error);
|
|
1425
1371
|
return ERROR_MESSAGES.API_REQUEST_FAILED;
|
|
1426
1372
|
}
|
|
1427
1373
|
});
|
|
1428
1374
|
}
|
|
1429
|
-
__name(registerStatisticsCommand, "registerStatisticsCommand");
|
|
1430
1375
|
|
|
1431
1376
|
// src/commands/admin-manager.ts
|
|
1432
|
-
|
|
1377
|
+
import { h as h2 } from "koishi";
|
|
1433
1378
|
var pendingRequests = /* @__PURE__ */ new Map();
|
|
1434
1379
|
function generateCode() {
|
|
1435
1380
|
const chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
|
|
@@ -1439,7 +1384,6 @@ function generateCode() {
|
|
|
1439
1384
|
}
|
|
1440
1385
|
return code;
|
|
1441
1386
|
}
|
|
1442
|
-
__name(generateCode, "generateCode");
|
|
1443
1387
|
function cleanupExpiredRequests() {
|
|
1444
1388
|
const now = Date.now();
|
|
1445
1389
|
for (const [code, req] of pendingRequests) {
|
|
@@ -1448,30 +1392,28 @@ function cleanupExpiredRequests() {
|
|
|
1448
1392
|
}
|
|
1449
1393
|
}
|
|
1450
1394
|
}
|
|
1451
|
-
__name(cleanupExpiredRequests, "cleanupExpiredRequests");
|
|
1452
1395
|
setInterval(cleanupExpiredRequests, 3e4);
|
|
1453
1396
|
function registerGroupAdminCommand(ctx, adminService) {
|
|
1454
1397
|
function getAtId(session) {
|
|
1455
1398
|
if (session.elements) {
|
|
1456
|
-
const atElements =
|
|
1399
|
+
const atElements = h2.select(session.elements, "at");
|
|
1457
1400
|
if (atElements.length > 0) {
|
|
1458
1401
|
return String(atElements[0].attrs?.id || "");
|
|
1459
1402
|
}
|
|
1460
1403
|
}
|
|
1461
1404
|
return "";
|
|
1462
1405
|
}
|
|
1463
|
-
|
|
1464
|
-
ctx.command("加管 [备注:string]").alias("add-admin").action(async ({ session }, remark) => {
|
|
1406
|
+
ctx.command("\u52A0\u7BA1 [\u5907\u6CE8:string]").alias("add-admin").action(async ({ session }, remark) => {
|
|
1465
1407
|
if (!session.guildId) {
|
|
1466
|
-
return "
|
|
1408
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1467
1409
|
}
|
|
1468
1410
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
1469
1411
|
if (!hasPermission) {
|
|
1470
|
-
return "
|
|
1412
|
+
return "\u274C \u6B64\u547D\u4EE4\u4EC5\u9650\u7BA1\u7406\u5458\u4F7F\u7528";
|
|
1471
1413
|
}
|
|
1472
1414
|
const targetId = getAtId(session);
|
|
1473
1415
|
if (!targetId) {
|
|
1474
|
-
return "
|
|
1416
|
+
return "\u8BF7\u7528 @ \u6307\u5B9A\u8981\u6DFB\u52A0\u4E3A\u7FA4\u7BA1\u7684\u7528\u6237\uFF1A/\u52A0\u7BA1 @\u67D0\u4EBA";
|
|
1475
1417
|
}
|
|
1476
1418
|
cleanupExpiredRequests();
|
|
1477
1419
|
for (const [, req] of pendingRequests) {
|
|
@@ -1479,11 +1421,11 @@ function registerGroupAdminCommand(ctx, adminService) {
|
|
|
1479
1421
|
const admins = await adminService.getAllAdmins(session.guildId);
|
|
1480
1422
|
const existing = admins.find((a) => a.verify === 0);
|
|
1481
1423
|
if (existing) {
|
|
1482
|
-
return
|
|
1424
|
+
return `\u274C \u8BE5\u7528\u6237\u5DF2\u6709\u6B63\u5728\u7B49\u5F85\u786E\u8BA4\u7684\u52A0\u7BA1\u8BF7\u6C42`;
|
|
1483
1425
|
}
|
|
1484
1426
|
}
|
|
1485
1427
|
}
|
|
1486
|
-
const adminRemark = remark || "
|
|
1428
|
+
const adminRemark = remark || "\u672A\u547D\u540D";
|
|
1487
1429
|
const code = generateCode();
|
|
1488
1430
|
pendingRequests.set(code, {
|
|
1489
1431
|
guildId: session.guildId,
|
|
@@ -1491,96 +1433,96 @@ function registerGroupAdminCommand(ctx, adminService) {
|
|
|
1491
1433
|
createdAt: Date.now()
|
|
1492
1434
|
});
|
|
1493
1435
|
await session.send(
|
|
1494
|
-
|
|
1495
|
-
` +
|
|
1496
|
-
|
|
1497
|
-
|
|
1436
|
+
`\u2705 \u5DF2\u53D1\u8D77\u52A0\u7BA1\u8BF7\u6C42
|
|
1437
|
+
` + h2.at(targetId) + ` \u8BF7\u53D1\u9001 /\u786E\u8BA4 ${code} \u540C\u610F\u52A0\u7BA1
|
|
1438
|
+
\u5907\u6CE8\uFF1A${adminRemark}
|
|
1439
|
+
\uFF08120\u79D2\u5185\u6709\u6548\uFF09`
|
|
1498
1440
|
);
|
|
1499
1441
|
return "";
|
|
1500
1442
|
});
|
|
1501
|
-
ctx.command("
|
|
1443
|
+
ctx.command("\u786E\u8BA4 [\u786E\u8BA4\u7801:string]").alias("confirm").action(async ({ session }, code) => {
|
|
1502
1444
|
if (!session.guildId) {
|
|
1503
|
-
return "
|
|
1445
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1504
1446
|
}
|
|
1505
1447
|
const openId = session.userId?.toString();
|
|
1506
1448
|
if (!openId) {
|
|
1507
|
-
return "
|
|
1449
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1508
1450
|
}
|
|
1509
1451
|
if (!code) {
|
|
1510
|
-
return "
|
|
1452
|
+
return "\u8BF7\u63D0\u4F9B\u786E\u8BA4\u7801\uFF1A/\u786E\u8BA4 [\u786E\u8BA4\u7801]";
|
|
1511
1453
|
}
|
|
1512
1454
|
cleanupExpiredRequests();
|
|
1513
1455
|
const req = pendingRequests.get(code);
|
|
1514
1456
|
if (!req) {
|
|
1515
|
-
return "
|
|
1457
|
+
return "\u274C \u65E0\u6548\u7684\u786E\u8BA4\u7801\u6216\u5DF2\u8FC7\u671F";
|
|
1516
1458
|
}
|
|
1517
1459
|
if (req.guildId !== session.guildId) {
|
|
1518
|
-
return "
|
|
1460
|
+
return "\u274C \u8BF7\u5728\u53D1\u8D77\u52A0\u7BA1\u8BF7\u6C42\u7684\u7FA4\u804A\u4E2D\u786E\u8BA4";
|
|
1519
1461
|
}
|
|
1520
1462
|
const remark = req.remark;
|
|
1521
1463
|
pendingRequests.delete(code);
|
|
1522
1464
|
await adminService.createPendingAdmin(session.guildId, openId, remark);
|
|
1523
|
-
ctx.logger.info(
|
|
1465
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u7528\u6237\u540C\u610F\u52A0\u7BA1: OpenID=${openId}, \u5907\u6CE8=${remark}, Verify=0`);
|
|
1524
1466
|
await session.send(
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1467
|
+
`\u2705 \u60A8\u5DF2\u540C\u610F\u52A0\u7BA1
|
|
1468
|
+
\u60A8\u7684 OpenID\uFF1A${openId}
|
|
1469
|
+
\u5907\u6CE8\uFF1A${remark}
|
|
1470
|
+
\u7B49\u5F85\u7BA1\u7406\u5458\u6267\u884C /\u52A0\u7BA1\u786E\u8BA4 \u5B8C\u6210\u52A0\u7BA1
|
|
1471
|
+
\uFF08120\u79D2\u5185\u6709\u6548\uFF09`
|
|
1530
1472
|
);
|
|
1531
1473
|
return "";
|
|
1532
1474
|
});
|
|
1533
|
-
ctx.command("
|
|
1475
|
+
ctx.command("\u52A0\u7BA1\u786E\u8BA4 [\u786E\u8BA4\u7801:string]").alias("confirm-add-admin").action(async ({ session }, code) => {
|
|
1534
1476
|
if (!session.guildId) {
|
|
1535
|
-
return "
|
|
1477
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1536
1478
|
}
|
|
1537
1479
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
1538
1480
|
if (!hasPermission) {
|
|
1539
|
-
return "
|
|
1481
|
+
return "\u274C \u6B64\u547D\u4EE4\u4EC5\u9650\u7BA1\u7406\u5458\u4F7F\u7528";
|
|
1540
1482
|
}
|
|
1541
1483
|
if (!code) {
|
|
1542
|
-
return "
|
|
1484
|
+
return "\u8BF7\u63D0\u4F9B\u786E\u8BA4\u7801\uFF1A/\u52A0\u7BA1\u786E\u8BA4 [\u786E\u8BA4\u7801]";
|
|
1543
1485
|
}
|
|
1544
1486
|
const admins = await adminService.getAllAdmins(session.guildId);
|
|
1545
1487
|
const pendingAdmin = admins.find((a) => a.verify === 0);
|
|
1546
1488
|
if (!pendingAdmin) {
|
|
1547
|
-
return "
|
|
1489
|
+
return "\u274C \u6CA1\u6709\u5F85\u786E\u8BA4\u7684\u52A0\u7BA1\u8BF7\u6C42";
|
|
1548
1490
|
}
|
|
1549
1491
|
await adminService.confirmAdmin(session.guildId, pendingAdmin.openId);
|
|
1550
|
-
ctx.logger.info(
|
|
1551
|
-
return
|
|
1552
|
-
|
|
1553
|
-
OpenID
|
|
1492
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u6DFB\u52A0\u7FA4\u7BA1\u5B8C\u6210: OpenID=${pendingAdmin.openId}, \u5907\u6CE8=${pendingAdmin.remark}, Verify=1`);
|
|
1493
|
+
return `\u2705 \u52A0\u7BA1\u6210\u529F
|
|
1494
|
+
\u5907\u6CE8\uFF1A${pendingAdmin.remark}
|
|
1495
|
+
OpenID\uFF1A${pendingAdmin.openId}`;
|
|
1554
1496
|
});
|
|
1555
|
-
ctx.command("
|
|
1497
|
+
ctx.command("\u51CF\u7BA1 [\u5907\u6CE8:string]").alias("remove-admin").action(async ({ session }, remark) => {
|
|
1556
1498
|
if (!session.guildId) {
|
|
1557
|
-
return "
|
|
1499
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1558
1500
|
}
|
|
1559
1501
|
const hasPermission = await adminService.hasAdminPermission(session);
|
|
1560
1502
|
if (!hasPermission) {
|
|
1561
|
-
return "
|
|
1503
|
+
return "\u274C \u6B64\u547D\u4EE4\u4EC5\u9650\u7BA1\u7406\u5458\u4F7F\u7528";
|
|
1562
1504
|
}
|
|
1563
1505
|
if (!remark) {
|
|
1564
|
-
return "
|
|
1506
|
+
return "\u8BF7\u63D0\u4F9B\u8981\u79FB\u9664\u7684\u7FA4\u7BA1\u5907\u6CE8\uFF1A/\u51CF\u7BA1 [\u5907\u6CE8]";
|
|
1565
1507
|
}
|
|
1566
1508
|
await adminService.removeAdminByRemark(session.guildId, remark);
|
|
1567
|
-
ctx.logger.info(
|
|
1568
|
-
return
|
|
1569
|
-
|
|
1509
|
+
ctx.logger.info(`\u7FA4\u804A ${session.guildId} \u79FB\u9664\u7FA4\u7BA1: \u5907\u6CE8=${remark}`);
|
|
1510
|
+
return `\u2705 \u5DF2\u79FB\u9664\u7FA4\u7BA1
|
|
1511
|
+
\u5907\u6CE8\uFF1A${remark}`;
|
|
1570
1512
|
});
|
|
1571
|
-
ctx.command("
|
|
1513
|
+
ctx.command("\u7FA4\u7BA1\u5217\u8868").alias("admin-list").action(async ({ session }) => {
|
|
1572
1514
|
if (!session.guildId) {
|
|
1573
|
-
return "
|
|
1515
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1574
1516
|
}
|
|
1575
1517
|
const admins = await adminService.getAllAdmins(session.guildId);
|
|
1576
1518
|
if (admins.length === 0) {
|
|
1577
|
-
return "
|
|
1519
|
+
return "\u5F53\u524D\u7FA4\u804A\u6CA1\u6709\u7BA1\u7406\u5458";
|
|
1578
1520
|
}
|
|
1579
1521
|
const list = admins.map(
|
|
1580
|
-
(admin, index) => `${index + 1}. [${admin.remark}] ${admin.openId} ${admin.verify === 1 ? "
|
|
1522
|
+
(admin, index) => `${index + 1}. [${admin.remark}] ${admin.openId} ${admin.verify === 1 ? "\u2705" : "\u23F3"}`
|
|
1581
1523
|
).join("\n");
|
|
1582
1524
|
const adminItems = admins.map((admin, index) => {
|
|
1583
|
-
const status = admin.verify === 1 ? "
|
|
1525
|
+
const status = admin.verify === 1 ? "\u2705 \u5DF2\u9A8C\u8BC1" : "\u23F3 \u5F85\u786E\u8BA4";
|
|
1584
1526
|
const statusColor = admin.verify === 1 ? "#27ae60" : "#f39c12";
|
|
1585
1527
|
return `
|
|
1586
1528
|
<div class="admin-item">
|
|
@@ -1661,35 +1603,34 @@ OpenID:${pendingAdmin.openId}`;
|
|
|
1661
1603
|
</head>
|
|
1662
1604
|
<body>
|
|
1663
1605
|
<div class="container">
|
|
1664
|
-
<div class="title"
|
|
1665
|
-
<div class="count-badge"
|
|
1606
|
+
<div class="title">\u{1F465} \u7FA4\u7BA1\u5217\u8868</div>
|
|
1607
|
+
<div class="count-badge">\u5171 ${admins.length} \u4F4D\u7BA1\u7406\u5458</div>
|
|
1666
1608
|
<div class="admin-list">
|
|
1667
1609
|
${adminItems}
|
|
1668
1610
|
</div>
|
|
1669
|
-
<div class="footer"
|
|
1611
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1670
1612
|
</div>
|
|
1671
1613
|
</body>
|
|
1672
1614
|
</html>`;
|
|
1673
|
-
await sendImageOrText(ctx, session, html,
|
|
1615
|
+
await sendImageOrText(ctx, session, html, `\u5F53\u524D\u7FA4\u804A\u7684\u7BA1\u7406\u5458\uFF1A
|
|
1674
1616
|
${list}`, { height: 600 });
|
|
1675
1617
|
return "";
|
|
1676
1618
|
});
|
|
1677
|
-
ctx.command("
|
|
1619
|
+
ctx.command("\u6211\u7684ID").alias("my-id").action(async ({ session }) => {
|
|
1678
1620
|
if (!session.guildId) {
|
|
1679
|
-
return "
|
|
1621
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1680
1622
|
}
|
|
1681
1623
|
const openId = session.userId?.toString();
|
|
1682
1624
|
if (!openId) {
|
|
1683
|
-
return "
|
|
1625
|
+
return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
|
|
1684
1626
|
}
|
|
1685
|
-
return
|
|
1627
|
+
return `\u60A8\u7684 OpenID\uFF1A
|
|
1686
1628
|
${openId}`;
|
|
1687
1629
|
});
|
|
1688
1630
|
}
|
|
1689
|
-
__name(registerGroupAdminCommand, "registerGroupAdminCommand");
|
|
1690
1631
|
|
|
1691
1632
|
// src/commands/menu.ts
|
|
1692
|
-
|
|
1633
|
+
import { h as h3 } from "koishi";
|
|
1693
1634
|
var MENU_HTML = `
|
|
1694
1635
|
<!DOCTYPE html>
|
|
1695
1636
|
<html>
|
|
@@ -1760,7 +1701,7 @@ var MENU_HTML = `
|
|
|
1760
1701
|
border-bottom: none;
|
|
1761
1702
|
}
|
|
1762
1703
|
.command-item::before {
|
|
1763
|
-
content: '
|
|
1704
|
+
content: '\u2022';
|
|
1764
1705
|
color: #9b59b6;
|
|
1765
1706
|
font-weight: bold;
|
|
1766
1707
|
margin-right: 6px;
|
|
@@ -1793,80 +1734,80 @@ var MENU_HTML = `
|
|
|
1793
1734
|
</head>
|
|
1794
1735
|
<body>
|
|
1795
1736
|
<div class="container">
|
|
1796
|
-
<div class="title"
|
|
1737
|
+
<div class="title">\u{1F4CB} \u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF\u83DC\u5355</div>
|
|
1797
1738
|
|
|
1798
1739
|
<div class="section">
|
|
1799
|
-
<div class="section-title"
|
|
1740
|
+
<div class="section-title">\u{1F6E0}\uFE0F \u57FA\u7840\u6307\u4EE4</div>
|
|
1800
1741
|
<ul class="command-list">
|
|
1801
1742
|
<li class="command-item">
|
|
1802
|
-
<span class="command-name"
|
|
1803
|
-
<span class="command-desc">[
|
|
1743
|
+
<span class="command-name">/\u67E5\u8BE2\u79EF\u5206</span>
|
|
1744
|
+
<span class="command-desc">[\u7528\u6237\u540D]</span>
|
|
1804
1745
|
</li>
|
|
1805
1746
|
<li class="command-item">
|
|
1806
|
-
<span class="command-name"
|
|
1807
|
-
<span class="command-desc"><
|
|
1747
|
+
<span class="command-name">/\u7ED1\u5B9AQQ</span>
|
|
1748
|
+
<span class="command-desc"><\u7528\u6237\u540D></span>
|
|
1808
1749
|
</li>
|
|
1809
1750
|
<li class="command-item">
|
|
1810
|
-
<span class="command-name"
|
|
1811
|
-
<span class="command-desc">[
|
|
1751
|
+
<span class="command-name">/\u6392\u884C\u699C</span>
|
|
1752
|
+
<span class="command-desc">[\u6570\u91CF]</span>
|
|
1812
1753
|
</li>
|
|
1813
1754
|
<li class="command-item">
|
|
1814
|
-
<span class="command-name"
|
|
1815
|
-
<span class="command-desc">[
|
|
1755
|
+
<span class="command-name">/\u7EDF\u8BA1</span>
|
|
1756
|
+
<span class="command-desc">[\u7528\u6237\u540D]</span>
|
|
1816
1757
|
</li>
|
|
1817
1758
|
</ul>
|
|
1818
1759
|
</div>
|
|
1819
1760
|
|
|
1820
1761
|
<div class="section">
|
|
1821
|
-
<div class="section-title"
|
|
1762
|
+
<div class="section-title">\u2699\uFE0F \u7BA1\u7406\u5458\u6307\u4EE4</div>
|
|
1822
1763
|
<ul class="command-list">
|
|
1823
1764
|
<li class="command-item">
|
|
1824
|
-
<span class="command-name"
|
|
1825
|
-
<span class="command-desc"><
|
|
1765
|
+
<span class="command-name">/\u7ED1\u5B9A\u670D\u52A1\u5668</span>
|
|
1766
|
+
<span class="command-desc"><\u5730\u5740> <\u7528\u6237> <token></span>
|
|
1826
1767
|
</li>
|
|
1827
1768
|
<li class="command-item">
|
|
1828
|
-
<span class="command-name"
|
|
1769
|
+
<span class="command-name">/\u670D\u52A1\u5668\u89E3\u7ED1</span>
|
|
1829
1770
|
</li>
|
|
1830
1771
|
<li class="command-item">
|
|
1831
|
-
<span class="command-name"
|
|
1832
|
-
<span class="command-desc"><
|
|
1772
|
+
<span class="command-name">/\u8C03\u6574\u79EF\u5206</span>
|
|
1773
|
+
<span class="command-desc"><\u7528\u6237> <\u5206\u6570> <\u539F\u56E0></span>
|
|
1833
1774
|
</li>
|
|
1834
1775
|
</ul>
|
|
1835
1776
|
</div>
|
|
1836
1777
|
|
|
1837
1778
|
<div class="section">
|
|
1838
|
-
<div class="section-title"
|
|
1779
|
+
<div class="section-title">\u{1F464} \u7FA4\u7BA1\u6307\u4EE4</div>
|
|
1839
1780
|
<ul class="command-list">
|
|
1840
1781
|
<li class="command-item">
|
|
1841
|
-
<span class="command-name"
|
|
1842
|
-
<span class="command-desc"
|
|
1782
|
+
<span class="command-name">/\u52A0\u7BA1</span>
|
|
1783
|
+
<span class="command-desc">@\u67D0\u4EBA <\u5907\u6CE8></span>
|
|
1843
1784
|
</li>
|
|
1844
1785
|
<li class="command-item">
|
|
1845
|
-
<span class="command-name"
|
|
1846
|
-
<span class="command-desc"><
|
|
1786
|
+
<span class="command-name">/\u786E\u8BA4</span>
|
|
1787
|
+
<span class="command-desc"><\u9A8C\u8BC1\u7801></span>
|
|
1847
1788
|
</li>
|
|
1848
1789
|
<li class="command-item">
|
|
1849
|
-
<span class="command-name"
|
|
1790
|
+
<span class="command-name">/\u52A0\u7BA1\u786E\u8BA4</span>
|
|
1850
1791
|
</li>
|
|
1851
1792
|
<li class="command-item">
|
|
1852
|
-
<span class="command-name"
|
|
1853
|
-
<span class="command-desc"><
|
|
1793
|
+
<span class="command-name">/\u51CF\u7BA1</span>
|
|
1794
|
+
<span class="command-desc"><\u5907\u6CE8></span>
|
|
1854
1795
|
</li>
|
|
1855
1796
|
<li class="command-item">
|
|
1856
|
-
<span class="command-name"
|
|
1797
|
+
<span class="command-name">/\u7FA4\u7BA1\u5217\u8868</span>
|
|
1857
1798
|
</li>
|
|
1858
1799
|
</ul>
|
|
1859
1800
|
</div>
|
|
1860
1801
|
|
|
1861
|
-
<div class="footer"
|
|
1802
|
+
<div class="footer">\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF v1.0</div>
|
|
1862
1803
|
</div>
|
|
1863
1804
|
</body>
|
|
1864
1805
|
</html>
|
|
1865
1806
|
`;
|
|
1866
1807
|
function registerMenuCommand(ctx) {
|
|
1867
|
-
ctx.command("
|
|
1808
|
+
ctx.command("\u83DC\u5355").alias("menu").action(async ({ session }) => {
|
|
1868
1809
|
if (!session.guildId) {
|
|
1869
|
-
return "
|
|
1810
|
+
return "\u6B64\u547D\u4EE4\u53EA\u80FD\u5728\u7FA4\u804A\u4E2D\u4F7F\u7528";
|
|
1870
1811
|
}
|
|
1871
1812
|
try {
|
|
1872
1813
|
const page = await ctx.puppeteer.page();
|
|
@@ -1881,48 +1822,47 @@ function registerMenuCommand(ctx) {
|
|
|
1881
1822
|
type: "png",
|
|
1882
1823
|
clip: { x: 0, y: 0, width: 450, height: 800 }
|
|
1883
1824
|
});
|
|
1884
|
-
await session.send(
|
|
1825
|
+
await session.send(h3.image(screenshot, "image/png"));
|
|
1885
1826
|
return "";
|
|
1886
1827
|
} catch (error) {
|
|
1887
|
-
ctx.logger.error("
|
|
1888
|
-
return
|
|
1828
|
+
ctx.logger.error("\u751F\u6210\u83DC\u5355\u56FE\u7247\u5931\u8D25:", error);
|
|
1829
|
+
return `\u{1F4CB} **\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF\u83DC\u5355**
|
|
1889
1830
|
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1831
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1832
|
+
\u{1F6E0}\uFE0F **\u57FA\u7840\u6307\u4EE4**
|
|
1833
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1834
|
+
\u2022 /\u67E5\u8BE2\u79EF\u5206 [\u7528\u6237\u540D] - \u67E5\u8BE2\u79EF\u5206\u548C\u6392\u540D
|
|
1835
|
+
\u2022 /\u7ED1\u5B9AQQ <\u7528\u6237\u540D> - \u7ED1\u5B9AQQ\u53F7\u4E0E\u7CFB\u7EDF\u8D26\u53F7
|
|
1836
|
+
\u2022 /\u6392\u884C\u699C [\u6570\u91CF] - \u663E\u793A\u79EF\u5206\u6392\u884C\u699C
|
|
1837
|
+
\u2022 /\u7EDF\u8BA1 [\u7528\u6237\u540D] - \u663E\u793A\u79EF\u5206\u7EDF\u8BA1\u4FE1\u606F
|
|
1897
1838
|
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1839
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1840
|
+
\u2699\uFE0F **\u7BA1\u7406\u5458\u6307\u4EE4**
|
|
1841
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1842
|
+
\u2022 /\u7ED1\u5B9A\u670D\u52A1\u5668 <\u5730\u5740> <\u7528\u6237\u540D> <token> - \u7ED1\u5B9ACSMS\u670D\u52A1\u5668
|
|
1843
|
+
\u2022 /\u670D\u52A1\u5668\u89E3\u7ED1 - \u89E3\u9664\u670D\u52A1\u5668\u7ED1\u5B9A
|
|
1844
|
+
\u2022 /\u8C03\u6574\u79EF\u5206 <\u7528\u6237\u540D> <\u5206\u6570> <\u539F\u56E0> - \u8C03\u6574\u79EF\u5206
|
|
1904
1845
|
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1846
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1847
|
+
\u{1F464} **\u7FA4\u7BA1\u6307\u4EE4**
|
|
1848
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1849
|
+
\u2022 /\u52A0\u7BA1 @\u67D0\u4EBA <\u5907\u6CE8> - \u6DFB\u52A0\u7BA1\u7406\u5458
|
|
1850
|
+
\u2022 /\u786E\u8BA4 <\u9A8C\u8BC1\u7801> - \u786E\u8BA4\u52A0\u7BA1
|
|
1851
|
+
\u2022 /\u52A0\u7BA1\u786E\u8BA4 - \u5B8C\u6210\u52A0\u7BA1\u6D41\u7A0B
|
|
1852
|
+
\u2022 /\u51CF\u7BA1 <\u5907\u6CE8> - \u79FB\u9664\u7BA1\u7406\u5458
|
|
1853
|
+
\u2022 /\u7FA4\u7BA1\u5217\u8868 - \u663E\u793A\u7BA1\u7406\u5458\u5217\u8868
|
|
1913
1854
|
|
|
1914
|
-
|
|
1855
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`;
|
|
1915
1856
|
}
|
|
1916
1857
|
});
|
|
1917
1858
|
}
|
|
1918
|
-
__name(registerMenuCommand, "registerMenuCommand");
|
|
1919
1859
|
|
|
1920
1860
|
// src/index.ts
|
|
1921
1861
|
var name = "class-score-system";
|
|
1922
1862
|
var inject = ["database", "puppeteer"];
|
|
1923
|
-
var Config =
|
|
1863
|
+
var Config = Schema.object({});
|
|
1924
1864
|
function apply(ctx) {
|
|
1925
|
-
ctx.logger.info("
|
|
1865
|
+
ctx.logger.info("\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF\u63D2\u4EF6\u6B63\u5728\u52A0\u8F7D...");
|
|
1926
1866
|
extendDatabase(ctx);
|
|
1927
1867
|
const serverService = new ServerConfigService(ctx);
|
|
1928
1868
|
const bindingService = new QqBindingService(ctx);
|
|
@@ -1935,13 +1875,12 @@ function apply(ctx) {
|
|
|
1935
1875
|
registerRankingCommand(ctx, serverService);
|
|
1936
1876
|
registerStatisticsCommand(ctx, serverService, bindingService);
|
|
1937
1877
|
registerMenuCommand(ctx);
|
|
1938
|
-
ctx.logger.info("
|
|
1878
|
+
ctx.logger.info("\u73ED\u7EA7\u64CD\u884C\u5206\u7BA1\u7406\u7CFB\u7EDF\u63D2\u4EF6\u52A0\u8F7D\u5B8C\u6210");
|
|
1939
1879
|
}
|
|
1940
|
-
|
|
1941
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
1942
|
-
0 && (module.exports = {
|
|
1880
|
+
export {
|
|
1943
1881
|
Config,
|
|
1944
1882
|
apply,
|
|
1945
1883
|
inject,
|
|
1946
1884
|
name
|
|
1947
|
-
}
|
|
1885
|
+
};
|
|
1886
|
+
//# sourceMappingURL=index.js.map
|