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 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
- var src_exports = {};
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请求: ${url}`, cleanParams);
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响应:`, response);
77
+ this.ctx.logger.debug(`API\u54CD\u5E94:`, response);
109
78
  return response;
110
79
  } catch (error) {
111
- this.ctx.logger.error("CSMS API 请求失败:", error);
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(`验证Token中...`);
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("未授权") || errorLower.includes("token") || errorLower.includes("无效")) {
136
- this.ctx.logger.warn(`Token验证失败: ${response.error}`);
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验证异常:`, error);
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 请求数据:`, JSON.stringify(data));
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 响应:`, JSON.stringify(response));
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 返回数据格式异常,原始响应:`, response);
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: `警告:提供的用户名 "${username}" 与实际登录的管理员 "${result.username}" 不一致`
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 验证失败,请检查 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("验证服务器配置失败:", 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: "未配置CSMS服务器,请先使用 /绑定服务器 命令配置",
537
- INVALID_TOKEN: "无效的Token格式,Token必须由数字和英文大写字母组成",
538
- INVALID_QQ: "无效的QQ号码格式",
539
- INVALID_SCORE: "分数必须在 -1000 1000 之间",
540
- INVALID_USERNAME: "用户名不能为空且长度不能超过50个字符",
541
- INVALID_DESCRIPTION: "描述信息长度不能超过255个字符",
542
- INVALID_LIMIT: "数量必须在 1 50 之间",
543
- SERVER_NOT_FOUND: "服务器未找到",
544
- USER_NOT_FOUND: "用户未找到",
545
- USER_ALREADY_BOUND: "该QQ号已绑定其他用户",
546
- USER_NOT_BOUND: "该QQ号未绑定任何用户",
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: "绑定CSMS服务器\n用法:/绑定服务器 <服务器地址> <管理员用户名> <管理员Token>\n示例:/绑定服务器 https://example.com admin ABC123",
555
- QUERY_SCORE: "查询积分\n用法:/查询积分 [用户名]\n示例:/查询积分 张三",
556
- ADJUST_SCORE: "调整积分\n用法:/调整积分 <用户名> <分数> <原因>\n示例:/调整积分 张三 +5 表现优秀",
557
- BIND_QQ: "绑定QQ\n用法:/绑定QQ <用户名>\n示例:/绑定QQ 张三",
558
- VIEW_BINDING: "查看绑定\n用法:/查看绑定 [用户名]\n示例:/查看绑定 张三",
559
- UNBIND_QQ: "解除绑定\n用法:/解除绑定 <QQ号>\n示例:/解除绑定 123456789",
560
- RANKING: "排行榜\n用法:/排行榜 [数量]\n示例:/排行榜 10",
561
- STATISTICS: "统计\n用法:/统计 [用户名]\n示例:/统计 张三"
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 `数量必须在 1 ${max} 之间`;
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
- `用户: ${user.username}`,
635
- `排名: ${ranking || "未知"}`,
636
- `总积分: ${user.total_score}`,
637
- `累计加分: ${user.add_score}`,
638
- `累计扣分: ${user.deduct_score}`,
639
- `记录数: ${user.score_count}`
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 ? ["🥇", "🥈", "🥉"][index] : `${index + 1}.`;
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(`... ${users.length} 人,显示前20名`);
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 ? ["🥇", "🥈", "🥉"][rank - 1] : `${rank}.`;
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} - ${log.description}`);
638
+ lines.push(`${change}\u5206 - ${log.description}`);
685
639
  });
686
640
  if (logs.length > 10) {
687
- lines.push(`... ${logs.length} 条记录`);
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
- `【${user.username} 的统计信息】`,
694
- `总积分: ${user.total_score}`,
695
- `累计加分: ${user.add_score}`,
696
- `累计扣分: ${user.deduct_score}`,
697
- `记录数: ${user.score_count}`,
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} - ${log.description}`);
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 = `成功: ${result.summary.success_count} 条,失败: ${result.summary.failed_count} 条`;
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(`原因: ${result.message}`);
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("绑定服务器 <地址:string> <用户名:string> <token:string>").alias("bind-server").action(async ({ session }, address, username, token) => {
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 "无法获取您的用户ID";
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 格式验证失败: ${tokenError}`);
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(`服务器配置验证失败: ${errorMsg}`);
797
- return `验证失败: ${errorMsg}`;
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服务器", address, actualUsername, token);
801
- await adminService.addAdmin(session.guildId, openId, "管理员");
802
- ctx.logger.info(`群聊 ${session.guildId} 的首个绑定者 ${openId} 被自动添加为管理员`);
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(`服务器配置成功,domain=${domain},username=${actualUsername}`);
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("保存服务器配置失败:", error);
808
- return `配置保存失败: ${error.message}`;
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("服务器解绑").alias("unbind-server").action(async ({ session }) => {
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("⚠️ 确定要解除服务器绑定吗?解绑后其他人可重新绑定。请在 30 秒内输入「确认」来完成操作");
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(`群聊 ${session.guildId} 解除了服务器绑定`);
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
- var import_koishi = require("koishi");
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("生成图片失败:", 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(import_koishi.h.image(image, "image/png"));
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("查询积分 [用户名:string]").alias("query-score").action(async ({ session }, username) => {
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 "无法获取您的用户ID";
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}。请先使用 /绑定QQ <用户名> 命令绑定您的账号`;
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">📊 积分查询结果</div>
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">用户ID: ${user.id}</div>
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">当前积分</div>
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">排行榜</div>
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">班级操行分管理系统 v1.0</div>
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("查询积分失败:", 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("绑定QQ <用户名:string>").alias("bind-qq").action(async ({ session }, username) => {
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 "无法获取您的用户ID";
1009
+ return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
1061
1010
  }
1062
- ctx.logger.info(`获取到的用户 OpenID: ${openId}`);
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 `❌ 您已绑定「${existingBinding.username}」,如需更换账号请先使用 /解除绑定 解绑后重新绑定`;
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 `❌ 用户名「${username}」已被其他QQ账号绑定,每个用户名只能绑定一个QQ`;
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
- 用户名: ${username}`;
1035
+ return `\u2705 \u7ED1\u5B9A\u6210\u529F
1036
+ \u7528\u6237\u540D: ${username}`;
1088
1037
  } catch (error) {
1089
- ctx.logger.error("绑定QQ失败:", error);
1038
+ ctx.logger.error("\u7ED1\u5B9AQQ\u5931\u8D25:", error);
1090
1039
  return ERROR_MESSAGES.BINDING_FAILED;
1091
1040
  }
1092
1041
  });
1093
- ctx.command("解除绑定").alias("unbind").action(async ({ session }, username) => {
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 "无法获取您的用户ID";
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 `❌ 您尚未绑定任何账号${username ? `(用户:${username})` : ""}`;
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(`⚠️ 确定要解除「${binding.username}」的绑定吗?请在 30 秒内输入「确认」来完成操作`);
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(`用户 ${binding.username}(OpenID: ${openId})解除了绑定`);
1118
- return `✅ 已解除「${binding.username}」的绑定`;
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("调整积分 <用户名:string> <分数:number> <原因:text>").alias("adjust-score").action(async ({ session }, username, score, reason) => {
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(`调整积分请求: 用户=${username}, 分数=${score}, 原因=${reason}`);
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(`调整积分结果:`, JSON.stringify(result));
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("调整积分失败:", 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("排行榜 [页码:number]").alias("ranking").action(async ({ session }, page = 1) => {
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 ? `第 ${page}/${totalPages} 页,共 ${totalUsers} 人` : `共 ${totalUsers} 人`;
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 ? "🥇" : rank === 2 ? "🥈" : rank === 3 ? "🥉" : `${rank}.`;
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">🏆</span>积分排行榜</div>
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">班级操行分管理系统 v1.0</div>
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
- 📄 ${pageInfo}` : "");
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("获取排行榜失败:", 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("统计 [用户名:string]").alias("statistics").action(async ({ session }, username) => {
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 "无法获取您的用户ID";
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
- 请先使用 /绑定QQ <用户名> 命令绑定您的账号`;
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">📊 积分统计</div>
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">用户ID: ${user.id} | 当前积分: ${user.total_score}</div>
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">累计加分</div>
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">累计扣分</div>
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">总积分</div>
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">操作次数</div>
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">班级操行分管理系统 v1.0</div>
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
- `【${user.username} 的统计信息】`,
1416
- `总积分: ${user.total_score}`,
1417
- `累计加分: +${addScore}`,
1418
- `累计扣分: -${deductScore}`,
1419
- `操作次数: ${scoreCount}`
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("获取统计信息失败:", 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
- var import_koishi2 = require("koishi");
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 = import_koishi2.h.select(session.elements, "at");
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
- __name(getAtId, "getAtId");
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
- ` + import_koishi2.h.at(targetId) + ` 请发送 /确认 ${code} 同意加管
1496
- 备注:${adminRemark}
1497
- (120秒内有效)`
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("确认 [确认码:string]").alias("confirm").action(async ({ session }, code) => {
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 "无法获取您的用户ID";
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(`群聊 ${session.guildId} 用户同意加管: OpenID=${openId}, 备注=${remark}, Verify=0`);
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
- 您的 OpenID:${openId}
1527
- 备注:${remark}
1528
- 等待管理员执行 /加管确认 完成加管
1529
- (120秒内有效)`
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("加管确认 [确认码:string]").alias("confirm-add-admin").action(async ({ session }, code) => {
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(`群聊 ${session.guildId} 添加群管完成: OpenID=${pendingAdmin.openId}, 备注=${pendingAdmin.remark}, Verify=1`);
1551
- return `✅ 加管成功
1552
- 备注:${pendingAdmin.remark}
1553
- OpenID:${pendingAdmin.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("减管 [备注:string]").alias("remove-admin").action(async ({ session }, remark) => {
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(`群聊 ${session.guildId} 移除群管: 备注=${remark}`);
1568
- return `✅ 已移除群管
1569
- 备注:${remark}`;
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("群管列表").alias("admin-list").action(async ({ session }) => {
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">👥 群管列表</div>
1665
- <div class="count-badge">共 ${admins.length} 位管理员</div>
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">班级操行分管理系统 v1.0</div>
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("我的ID").alias("my-id").action(async ({ session }) => {
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 "无法获取您的用户ID";
1625
+ return "\u65E0\u6CD5\u83B7\u53D6\u60A8\u7684\u7528\u6237ID";
1684
1626
  }
1685
- return `您的 OpenID
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
- var import_koishi3 = require("koishi");
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">📋 班级操行分管理系统菜单</div>
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">🛠️ 基础指令</div>
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">/查询积分</span>
1803
- <span class="command-desc">[用户名]</span>
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">/绑定QQ</span>
1807
- <span class="command-desc">&lt;用户名&gt;</span>
1747
+ <span class="command-name">/\u7ED1\u5B9AQQ</span>
1748
+ <span class="command-desc">&lt;\u7528\u6237\u540D&gt;</span>
1808
1749
  </li>
1809
1750
  <li class="command-item">
1810
- <span class="command-name">/排行榜</span>
1811
- <span class="command-desc">[数量]</span>
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">/统计</span>
1815
- <span class="command-desc">[用户名]</span>
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">⚙️ 管理员指令</div>
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">/绑定服务器</span>
1825
- <span class="command-desc">&lt;地址&gt; &lt;用户&gt; &lt;token&gt;</span>
1765
+ <span class="command-name">/\u7ED1\u5B9A\u670D\u52A1\u5668</span>
1766
+ <span class="command-desc">&lt;\u5730\u5740&gt; &lt;\u7528\u6237&gt; &lt;token&gt;</span>
1826
1767
  </li>
1827
1768
  <li class="command-item">
1828
- <span class="command-name">/服务器解绑</span>
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">/调整积分</span>
1832
- <span class="command-desc">&lt;用户&gt; &lt;分数&gt; &lt;原因&gt;</span>
1772
+ <span class="command-name">/\u8C03\u6574\u79EF\u5206</span>
1773
+ <span class="command-desc">&lt;\u7528\u6237&gt; &lt;\u5206\u6570&gt; &lt;\u539F\u56E0&gt;</span>
1833
1774
  </li>
1834
1775
  </ul>
1835
1776
  </div>
1836
1777
 
1837
1778
  <div class="section">
1838
- <div class="section-title">👤 群管指令</div>
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">/加管</span>
1842
- <span class="command-desc">@某人 &lt;备注&gt;</span>
1782
+ <span class="command-name">/\u52A0\u7BA1</span>
1783
+ <span class="command-desc">@\u67D0\u4EBA &lt;\u5907\u6CE8&gt;</span>
1843
1784
  </li>
1844
1785
  <li class="command-item">
1845
- <span class="command-name">/确认</span>
1846
- <span class="command-desc">&lt;验证码&gt;</span>
1786
+ <span class="command-name">/\u786E\u8BA4</span>
1787
+ <span class="command-desc">&lt;\u9A8C\u8BC1\u7801&gt;</span>
1847
1788
  </li>
1848
1789
  <li class="command-item">
1849
- <span class="command-name">/加管确认</span>
1790
+ <span class="command-name">/\u52A0\u7BA1\u786E\u8BA4</span>
1850
1791
  </li>
1851
1792
  <li class="command-item">
1852
- <span class="command-name">/减管</span>
1853
- <span class="command-desc">&lt;备注&gt;</span>
1793
+ <span class="command-name">/\u51CF\u7BA1</span>
1794
+ <span class="command-desc">&lt;\u5907\u6CE8&gt;</span>
1854
1795
  </li>
1855
1796
  <li class="command-item">
1856
- <span class="command-name">/群管列表</span>
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">班级操行分管理系统 v1.0</div>
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("菜单").alias("menu").action(async ({ session }) => {
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(import_koishi3.h.image(screenshot, "image/png"));
1825
+ await session.send(h3.image(screenshot, "image/png"));
1885
1826
  return "";
1886
1827
  } catch (error) {
1887
- ctx.logger.error("生成菜单图片失败:", 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
- /绑定QQ <用户名> - 绑定QQ号与系统账号
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
- /绑定服务器 <地址> <用户名> <token> - 绑定CSMS服务器
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 = import_koishi4.Schema.object({});
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
- __name(apply, "apply");
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