koishi-plugin-ggcevo 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/lib/index.js +48 -16
  2. package/package.json +1 -1
  3. package/readme.md +18 -3
package/lib/index.js CHANGED
@@ -503,6 +503,36 @@ ${message}
503
503
  return "⚠️ 服务器繁忙, 请稍后尝试。";
504
504
  }
505
505
  });
506
+ ctx.command("sc2arcade/迁移 <qq>", "将指定QQ号绑定的游戏句柄迁移到当前账号").usage("用于从onebot机器人迁移至QQ官方机器人: /迁移 123456789").action(async (argv, qq) => {
507
+ const session = argv.session;
508
+ try {
509
+ const qqNumber = String(qq).trim();
510
+ if (!/^\d{5,15}$/.test(qqNumber)) {
511
+ return `<quote id="${session.messageId}"/>❌ 参数错误, 请输入正确的QQ号, 例如: /迁移 123456789`;
512
+ }
513
+ const records = await ctx.database.get("sc2arcade_player", { userId: qqNumber });
514
+ if (records.length === 0) {
515
+ return `<quote id="${session.messageId}"/>❌ 未找到QQ号 ${qqNumber} 绑定的游戏句柄, 无法迁移。`;
516
+ }
517
+ const currentUserId = session.userId;
518
+ const currentUserHandles = await ctx.database.get("sc2arcade_player", { userId: currentUserId });
519
+ const keepOriginalActive = currentUserHandles.length === 0;
520
+ await Promise.all(records.map(
521
+ (record) => ctx.database.set("sc2arcade_player", { id: record.id }, {
522
+ userId: currentUserId,
523
+ isActive: keepOriginalActive ? record.isActive : false
524
+ })
525
+ ));
526
+ const message = records.map(
527
+ (h2, i) => `${i + 1}. ${formatHandle(h2, keepOriginalActive ? h2.isActive : false)}`
528
+ ).join("\n");
529
+ return `<quote id="${session.messageId}"/>✅ 已将QQ号 ${qqNumber} 绑定的 ${records.length} 个游戏句柄迁移至当前账号:
530
+ ${message}`;
531
+ } catch (error) {
532
+ console.error("迁移句柄时发生错误:", error);
533
+ return "⚠️ 服务器繁忙, 请稍后尝试。";
534
+ }
535
+ });
506
536
  ctx.command("sc2arcade/地图检测", "查询已配置的地图详细信息").action(async (argv) => {
507
537
  if (!config.mapMonitorEnabled || config.mapMonitorMapIds.length === 0) {
508
538
  return `<quote id="${argv.session.messageId}"/>⚠️ 地图检测功能未开启或未配置地图ID。`;
@@ -2159,17 +2189,10 @@ ${message}
2159
2189
  const notifyNewBanRecords = /* @__PURE__ */ __name(async (records) => {
2160
2190
  const groups = config.banNotifyGroups || [];
2161
2191
  if (groups.length === 0 || records.length === 0) return;
2162
- const players = await ctx.database.get("sc2arcade_player", {});
2163
- const handleUserMap = /* @__PURE__ */ new Map();
2164
- for (const p of players) {
2165
- const key = normalizeHandle(`${p.regionId}-S2-${p.realmId}-${p.profileId}`);
2166
- if (p.isActive || !handleUserMap.has(key)) handleUserMap.set(key, p.userId);
2167
- }
2168
2192
  for (const r of records) {
2169
- const userId = handleUserMap.get(normalizeHandle(r.handle));
2170
2193
  const lines = [
2171
2194
  "🚫 封禁提醒",
2172
- userId ? `${(0, import_koishi.h)("at", { id: userId })} 你的句柄 ${r.handle} 有新的封禁记录` : `句柄 ${r.handle} 有新的封禁记录`,
2195
+ `句柄 ${r.handle} 有新的封禁记录`,
2173
2196
  `封禁等级: ${r.ban_level || "-"}`,
2174
2197
  `审核员: ${r.auditor || "-"}`,
2175
2198
  `审核时间: ${dateOnly(r.audit_time) || "-"}`,
@@ -2455,14 +2478,20 @@ ${message}
2455
2478
  `审核员: ${r.auditor || "-"}`,
2456
2479
  `审核时间: ${dateOnly(r.audit_time) || "-"}`,
2457
2480
  "",
2458
- '💡 回复 "下一页"/"上一页"/页码数字 翻页, 回复其他任意内容退出'
2481
+ '💡 每次最多展示3条, 回复 "下一页"/"上一页"/页码数字 翻页, 回复其他任意内容退出'
2459
2482
  ].join("\n");
2460
2483
  }, "formatRecord");
2484
+ const MAX_VIEW = 3;
2461
2485
  let page = 0;
2462
- await session.send([
2463
- formatRecord(page),
2464
- `📊 数据最近同步: ${toBeijingTime(syncTime.toISOString())}`
2465
- ].join("\n"));
2486
+ let viewCount = 0;
2487
+ const sendPage = /* @__PURE__ */ __name(async (idx, withSync) => {
2488
+ const lines = [formatRecord(idx)];
2489
+ if (withSync) lines.push(`📊 数据最近同步: ${toBeijingTime(syncTime.toISOString())}`);
2490
+ await session.send(lines.join("\n"));
2491
+ viewCount++;
2492
+ }, "sendPage");
2493
+ await sendPage(page, true);
2494
+ if (viewCount >= MAX_VIEW) return "已退出封禁记录查询。";
2466
2495
  while (true) {
2467
2496
  const input = await session.prompt(6e4);
2468
2497
  if (!input) break;
@@ -2470,18 +2499,21 @@ ${message}
2470
2499
  if (/^(下一页|下页|next|n)$/i.test(cmd)) {
2471
2500
  if (page < records.length - 1) {
2472
2501
  page++;
2473
- await session.send(formatRecord(page));
2502
+ await sendPage(page, false);
2503
+ if (viewCount >= MAX_VIEW) break;
2474
2504
  } else await session.send('已是最后一页。回复 "上一页" 或其他任意内容退出。');
2475
2505
  } else if (/^(上一页|上页|prev|p|上一个)$/i.test(cmd)) {
2476
2506
  if (page > 0) {
2477
2507
  page--;
2478
- await session.send(formatRecord(page));
2508
+ await sendPage(page, false);
2509
+ if (viewCount >= MAX_VIEW) break;
2479
2510
  } else await session.send('已是第一页。回复 "下一页" 或其他任意内容退出。');
2480
2511
  } else {
2481
2512
  const n = parseInt(cmd, 10);
2482
2513
  if (!isNaN(n) && n >= 1 && n <= records.length) {
2483
2514
  page = n - 1;
2484
- await session.send(formatRecord(page));
2515
+ await sendPage(page, false);
2516
+ if (viewCount >= MAX_VIEW) break;
2485
2517
  } else {
2486
2518
  break;
2487
2519
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-ggcevo",
3
3
  "description": "GGCEVO 综合插件:星际争霸2游戏句柄绑定 + 签到/抽奖/兑换/背包/活动系统等虚拟物品玩法",
4
- "version": "1.1.0",
4
+ "version": "1.1.2",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
package/readme.md CHANGED
@@ -58,7 +58,7 @@ npm install koishi-plugin-ggcevo
58
58
  | `tencentDocsBanListSheetId` | `string` | `''` | 封禁记录工作表ID(表格URL中 `tab` 参数) |
59
59
  | `tencentDocsAdminWelfareFileId` | `string` | `''` | 管理员福利在线表格文件ID(短ID或完整ID,A列QQ号/B列句柄) |
60
60
  | `tencentDocsAdminWelfareSheetId` | `string` | `''` | 管理员福利工作表ID(表格URL中 `tab` 参数) |
61
- | `banNotifyGroups` | `string[]` | `[]` | 封禁提醒广播的群组ID列表。同步检测到新增封禁记录时在此提醒:句柄绑定了QQ则 @该用户,未绑定则只提醒句柄(含封禁等级、审核员、审核时间,处罚原因详情见封禁文档) |
61
+ | `banNotifyGroups` | `string[]` | `[]` | 封禁提醒广播的群组ID列表。同步检测到新增封禁记录时在此提醒(含句柄、封禁等级、审核员、审核时间,处罚原因详情见封禁文档) |
62
62
 
63
63
  **授权模式说明:**
64
64
  - **用户级模式**(推荐用于无 `Client Secret` 的场景):填写 `tencentDocsClientId` + `tencentDocsAccessToken` + `tencentDocsOpenId`,三者均通过腾讯文档开放平台扫码授权流程获取。Token 过期后需重新获取并在控制台更新。
@@ -75,7 +75,8 @@ npm install koishi-plugin-ggcevo
75
75
  | `切换 [index]` | — | 切换正在使用的游戏句柄 |
76
76
  | `查询 [handle]` | — | 查询某游戏句柄是否已被绑定 |
77
77
  | `解绑 [index]` | 解绑句柄 | 解除绑定某个游戏句柄 |
78
- | `地图检测` | — | 查询已配置地图(`mapMonitorMapIds`)的检测状态:在线状态、最后状态变更时间、24h/30d离线次数、近期事件。当所有配置地图均离线时,底部额外提示推荐游玩的地图(需配置 `mapMonitorRecommendMapName`)。需开启 `mapMonitorEnabled` 且配置地图ID |
78
+ | `迁移 <qq>` | — | 将指定QQ号绑定的全部游戏句柄迁移到当前账号(用于从 onebot 机器人切换至 QQ 官方机器人后,将旧 QQ 号下绑定的句柄转移到新的 openid 身份下) |
79
+ | `地图检测` | — | 查询已配置地图(`mapMonitorMapIds`)的检测状态:在线状态、最后状态变更时间、24h/30d离线次数、近期事件。当所有配置地图均离线时,底部额外提示推荐游玩的地图名称(需配置 `mapMonitorRecommendMapName`)。需开启 `mapMonitorEnabled` 且配置地图ID |
79
80
 
80
81
  ### 签到与虚拟物品(ggcevo)
81
82
 
@@ -95,7 +96,7 @@ npm install koishi-plugin-ggcevo
95
96
  | `活动列表 [showAll]` | — | — | 查看活动列表。默认只显示进行中与未开始的活动,携带参数(如"全部")显示含已过期在内的全部活动 |
96
97
  | `补签` | — | — | 使用补签券补签漏签的日期 |
97
98
  | `使用 <name>` | — | — | 使用指定物品(如赎罪券等) |
98
- | `封禁记录 [user]` | — | — | 查询封禁记录。不带参数查询自己,携带 @用户 查询对方句柄的封禁记录。每页显示 1 条,支持翻页(回复"下一页/上一页/页码"翻页,回复其他任意内容退出)。审核时间仅显示年月日 |
99
+ | `封禁记录 [user]` | — | — | 查询封禁记录。不带参数查询自己,携带 @用户 查询对方句柄的封禁记录。每页显示 1 条,支持翻页,每次指令最多展示 3 条,第 3 条输出后自动退出查询(回复"下一页/上一页/页码"翻页,回复其他任意内容退出)。审核时间仅显示年月日 |
99
100
  | `同步封禁记录` | — | 3 | 立即从腾讯文档拉取全量数据并写入数据库(管理员指令) |
100
101
  | `同步管理员福利` | — | 3 | 立即从腾讯文档拉取管理员福利表(A列QQ号/B列句柄)全量数据并写入数据库(管理员指令) |
101
102
 
@@ -146,6 +147,20 @@ npm install koishi-plugin-ggcevo
146
147
 
147
148
  ## 更新日志
148
149
 
150
+ ### v1.1.2
151
+
152
+ 封禁提醒不再@用户,封禁记录查询增加展示上限。
153
+
154
+ - **封禁提醒去@化**:定时同步检测到新增封禁记录时,群提醒不再 @绑定句柄的用户,仅广播句柄及封禁详情
155
+ - **封禁记录查询上限**:每次指令最多展示 3 条封禁记录,第 3 条输出后自动退出查询,避免无限制翻页刷屏
156
+
157
+ ### v1.1.1
158
+
159
+ 新增句柄绑定迁移指令,适配 QQ 官方机器人。
160
+
161
+ - **新增指令 `迁移 <qq>`**:从 onebot 机器人更换为 QQ 官方机器人后,用户 `userId` 由 QQ 号变更为 openid,使用本指令可将指定 QQ 号下绑定的全部游戏句柄迁移至当前账号(openid)名下
162
+ - **迁移逻辑**:仅更新 `sc2arcade_player` 表中对应记录的 `userId`;若当前账号名下已有句柄,迁移过来的句柄一律不设为当前使用,避免出现多个当前使用句柄
163
+
149
164
  ### v1.1.0
150
165
 
151
166
  优化封禁记录查询的翻页交互。