koishi-plugin-class-score-system 1.0.13 → 1.0.18

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