@sfmc-bds/qq-bridge 0.2.6 → 0.3.0
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/README.md
CHANGED
|
@@ -71,7 +71,7 @@ Webhook 进程仅监听云机 `127.0.0.1:3005`。用同机 HTTPS 反向代理把
|
|
|
71
71
|
- `ip` / `地址`:只显示 `qq_config.json` 的公开连接配置,不使用数据库地址或主机名。
|
|
72
72
|
- `绑定`:获取验证码后,在游戏内执行 `/c:bind`,随后发送纯数字验证码。
|
|
73
73
|
- 解绑等需确认的操作:先显示对象与影响,60 秒内本人确认;取消、新命令或超时后失效。确认时重新核验权限,重复确认不重复提交。
|
|
74
|
-
- 管理员在「管理 → 事件推送」中可切换事件总开关、BDS
|
|
74
|
+
- 管理员在「管理 → 事件推送」中可切换事件总开关、BDS 启停与异常退出、玩家进出和死亡通知(所有事件实时发送);关闭总开关需本人确认。设置写入 `configs/qq_config.json` 并用于后续推送。
|
|
75
75
|
- 在线名单自动连续分段。官方富文本发送失败时,降级文本保留可直接发送的完整命令。
|
|
76
76
|
|
|
77
77
|
公开信息配置示例(域名仅为占位,请填写自己的公开地址):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/db-api.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * commands/db-api.ts \u2014 qq-bridge \u8C03 db-server \u5E73\u53F0 API\uFF08status / bind\uFF09\n */\n\nimport { request as httpRequest, type RequestOptions } from \"node:http\";\n\nexport type DbEndpoint = { host: string; port: number };\n\nconst TIMEOUT_MS = 5_000;\n\nfunction requestJson<T>(\n ep: DbEndpoint,\n method: string,\n pathAndQuery: string,\n body?: unknown\n): Promise<{ status: number; data: T }> {\n const payload = body === undefined ? undefined : JSON.stringify(body);\n const options: RequestOptions = {\n hostname: ep.host,\n port: ep.port,\n path: pathAndQuery,\n method,\n headers: {\n Accept: \"application/json\",\n ...(payload\n ? {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(payload),\n }\n : {}),\n },\n timeout: TIMEOUT_MS,\n };\n return new Promise((resolve, reject) => {\n const req = httpRequest(options, (res) => {\n let buf = \"\";\n res.setEncoding(\"utf-8\");\n res.on(\"data\", (c: string) => {\n buf += c;\n });\n res.on(\"end\", () => {\n const status = res.statusCode ?? 0;\n if (status >= 500 || status === 401 || status === 404) {\n reject(new Error(`db-server HTTP ${status}`));\n return;\n }\n try {\n resolve({ status, data: JSON.parse(buf) as T });\n } catch {\n reject(new Error(`db-server \u975E JSON (${status})`));\n }\n });\n });\n req.on(\"timeout\", () => req.destroy(new Error(`db-server \u8D85\u65F6 ${TIMEOUT_MS}ms`)));\n req.on(\"error\", reject);\n if (payload) req.write(payload);\n req.end();\n });\n}\n\nexport type SfmcHostStatus = {\n hostname?: string;\n platform?: string;\n arch?: string;\n release?: string;\n uptimeSec?: number;\n uptimeText?: string;\n cpu?: { model?: string; cores?: number };\n memory?: { totalMb?: number; freeMb?: number; usedMb?: number; usedPercent?: number };\n loadavg?: [number, number, number];\n};\n\nexport type SfmcProcessStatus = {\n version?: string;\n pid?: number;\n running?: boolean;\n uptimeSec?: number | null;\n uptimeText?: string;\n state?: \"running\" | \"stopped\";\n};\n\nexport type SfmcStatusResponse = {\n online?: Array<{ id?: string; name?: string }>;\n world?: { day?: number; difficulty?: string } | null;\n updatedAt?: number;\n note?: string;\n host?: SfmcHostStatus | null;\n processes?: {\n db?: SfmcProcessStatus;\n bds?: SfmcProcessStatus;\n } | null;\n};\n\nexport async function fetchSfmcStatus(ep: DbEndpoint): Promise<SfmcStatusResponse> {\n const { data } = await requestJson<SfmcStatusResponse>(ep, \"GET\", \"/api/sfmc/status\");\n return data;\n}\n\nexport type QqEventSettings = {\n enabled: boolean;\n join: boolean;\n leave: boolean;\n death: boolean;\n crash: boolean;\n start: boolean;\n stop: boolean;\n
|
|
5
|
-
"mappings": "AAIA,SAAS,WAAW,mBAAwC;AAI5D,MAAM,aAAa;AAEnB,SAAS,YACP,IACA,QACA,cACA,MACsC;AACtC,QAAM,UAAU,SAAS,SAAY,SAAY,KAAK,UAAU,IAAI;AACpE,QAAM,UAA0B;AAAA,IAC9B,UAAU,GAAG;AAAA,IACb,MAAM,GAAG;AAAA,IACT,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,GAAI,UACA;AAAA,QACE,gBAAgB;AAAA,QAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,MAC7C,IACA,CAAC;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX;AACA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,YAAY,SAAS,CAAC,QAAQ;AACxC,UAAI,MAAM;AACV,UAAI,YAAY,OAAO;AACvB,UAAI,GAAG,QAAQ,CAAC,MAAc;AAC5B,eAAO;AAAA,MACT,CAAC;AACD,UAAI,GAAG,OAAO,MAAM;AAClB,cAAM,SAAS,IAAI,cAAc;AACjC,YAAI,UAAU,OAAO,WAAW,OAAO,WAAW,KAAK;AACrD,iBAAO,IAAI,MAAM,kBAAkB,MAAM,EAAE,CAAC;AAC5C;AAAA,QACF;AACA,YAAI;AACF,kBAAQ,EAAE,QAAQ,MAAM,KAAK,MAAM,GAAG,EAAO,CAAC;AAAA,QAChD,QAAQ;AACN,iBAAO,IAAI,MAAM,0BAAqB,MAAM,GAAG,CAAC;AAAA,QAClD;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,QAAI,GAAG,WAAW,MAAM,IAAI,QAAQ,IAAI,MAAM,0BAAgB,UAAU,IAAI,CAAC,CAAC;AAC9E,QAAI,GAAG,SAAS,MAAM;AACtB,QAAI,QAAS,KAAI,MAAM,OAAO;AAC9B,QAAI,IAAI;AAAA,EACV,CAAC;AACH;AAmCA,eAAsB,gBAAgB,IAA6C;AACjF,QAAM,EAAE,KAAK,IAAI,MAAM,YAAgC,IAAI,OAAO,kBAAkB;AACpF,SAAO;AACT;
|
|
4
|
+
"sourcesContent": ["/**\n * commands/db-api.ts \u2014 qq-bridge \u8C03 db-server \u5E73\u53F0 API\uFF08status / bind\uFF09\n */\n\nimport { request as httpRequest, type RequestOptions } from \"node:http\";\n\nexport type DbEndpoint = { host: string; port: number };\n\nconst TIMEOUT_MS = 5_000;\n\nfunction requestJson<T>(\n ep: DbEndpoint,\n method: string,\n pathAndQuery: string,\n body?: unknown\n): Promise<{ status: number; data: T }> {\n const payload = body === undefined ? undefined : JSON.stringify(body);\n const options: RequestOptions = {\n hostname: ep.host,\n port: ep.port,\n path: pathAndQuery,\n method,\n headers: {\n Accept: \"application/json\",\n ...(payload\n ? {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(payload),\n }\n : {}),\n },\n timeout: TIMEOUT_MS,\n };\n return new Promise((resolve, reject) => {\n const req = httpRequest(options, (res) => {\n let buf = \"\";\n res.setEncoding(\"utf-8\");\n res.on(\"data\", (c: string) => {\n buf += c;\n });\n res.on(\"end\", () => {\n const status = res.statusCode ?? 0;\n if (status >= 500 || status === 401 || status === 404) {\n reject(new Error(`db-server HTTP ${status}`));\n return;\n }\n try {\n resolve({ status, data: JSON.parse(buf) as T });\n } catch {\n reject(new Error(`db-server \u975E JSON (${status})`));\n }\n });\n });\n req.on(\"timeout\", () => req.destroy(new Error(`db-server \u8D85\u65F6 ${TIMEOUT_MS}ms`)));\n req.on(\"error\", reject);\n if (payload) req.write(payload);\n req.end();\n });\n}\n\nexport type SfmcHostStatus = {\n hostname?: string;\n platform?: string;\n arch?: string;\n release?: string;\n uptimeSec?: number;\n uptimeText?: string;\n cpu?: { model?: string; cores?: number };\n memory?: { totalMb?: number; freeMb?: number; usedMb?: number; usedPercent?: number };\n loadavg?: [number, number, number];\n};\n\nexport type SfmcProcessStatus = {\n version?: string;\n pid?: number;\n running?: boolean;\n uptimeSec?: number | null;\n uptimeText?: string;\n state?: \"running\" | \"stopped\";\n};\n\nexport type SfmcStatusResponse = {\n online?: Array<{ id?: string; name?: string }>;\n world?: { day?: number; difficulty?: string } | null;\n updatedAt?: number;\n note?: string;\n host?: SfmcHostStatus | null;\n processes?: {\n db?: SfmcProcessStatus;\n bds?: SfmcProcessStatus;\n } | null;\n};\n\nexport async function fetchSfmcStatus(ep: DbEndpoint): Promise<SfmcStatusResponse> {\n const { data } = await requestJson<SfmcStatusResponse>(ep, \"GET\", \"/api/sfmc/status\");\n return data;\n}\n\nexport type QqEventSettings = {\n enabled: boolean;\n join: boolean;\n leave: boolean;\n death: boolean;\n crash: boolean;\n start: boolean;\n stop: boolean;\n};\n\nexport type QqEventSettingsResponse = {\n success: boolean;\n settings?: QqEventSettings;\n error?: string;\n};\n\nexport async function fetchQqEventSettings(ep: DbEndpoint): Promise<QqEventSettingsResponse> {\n const { data } = await requestJson<QqEventSettingsResponse>(ep, \"GET\", \"/api/sfmc/qq/events/settings\");\n return data;\n}\n\nexport async function postQqEventSettings(\n ep: DbEndpoint,\n body: { openid: string; as_group_admin: boolean; field: keyof QqEventSettings; value: boolean }\n): Promise<QqEventSettingsResponse> {\n const { data } = await requestJson<QqEventSettingsResponse>(ep, \"POST\", \"/api/sfmc/qq/events/settings\", body);\n return data;\n}\n\nexport type JoinRequestResponse = {\n success?: boolean;\n id?: string;\n player_name?: string;\n status?: string;\n auto_approved?: boolean;\n admin_notify?: boolean;\n note?: string;\n error?: string;\n};\n\nexport async function postJoinRequest(\n ep: DbEndpoint,\n body: { openid: string; player_name: string; qq_backend: string }\n): Promise<{ status: number; data: JoinRequestResponse }> {\n return requestJson(ep, \"POST\", \"/api/sfmc/qq/join/request\", body);\n}\n\nexport type JoinSettingsResponse = {\n success?: boolean;\n allowlist_enabled?: boolean;\n require_approval?: boolean;\n treat_group_admins_as_admins?: boolean;\n error?: string;\n note?: string;\n};\n\nexport async function fetchJoinSettings(ep: DbEndpoint): Promise<JoinSettingsResponse> {\n const { data } = await requestJson<JoinSettingsResponse>(ep, \"GET\", \"/api/sfmc/qq/join/settings\");\n return data;\n}\n\nexport async function postJoinSettings(\n ep: DbEndpoint,\n body: {\n openid: string;\n as_group_admin?: boolean;\n allowlist_enabled?: boolean;\n require_approval?: boolean;\n }\n): Promise<{ status: number; data: JoinSettingsResponse }> {\n return requestJson(ep, \"POST\", \"/api/sfmc/qq/join/settings\", body);\n}\n\nexport type JoinDecideResponse = {\n success?: boolean;\n id?: string;\n status?: string;\n player_name?: string;\n applicant_openid?: string;\n error?: string;\n};\n\nexport async function postJoinDecide(\n ep: DbEndpoint,\n body: {\n id: string;\n decision: \"approve\" | \"reject\";\n decided_by: string;\n as_group_admin?: boolean;\n }\n): Promise<{ status: number; data: JoinDecideResponse }> {\n return requestJson(ep, \"POST\", \"/api/sfmc/qq/join/decide\", body);\n}\n\nexport async function fetchJoinPending(\n ep: DbEndpoint,\n openid: string,\n asGroupAdmin = false\n): Promise<{\n success?: boolean;\n pending?: Array<{ id?: string; player_name?: string; applicant_openid?: string }>;\n error?: string;\n}> {\n const q =\n `/api/sfmc/qq/join/pending?openid=${encodeURIComponent(openid)}` + (asGroupAdmin ? \"&as_group_admin=true\" : \"\");\n const { data } = await requestJson<Awaited<ReturnType<typeof fetchJoinPending>>>(ep, \"GET\", q);\n return data;\n}\n\nexport type BindMeResponse = {\n success?: boolean;\n bound?: boolean;\n binding?: {\n player_name?: string;\n player_xuid?: string;\n qq_user_openid?: string;\n bound_at?: number;\n } | null;\n /** \u5DF2\u7ED1\u5B9A\u65F6\u9644\u5E26\u7ECF\u6D4E\u4F59\u989D\u548C\u5728\u7EBF\u65F6\u957F\u3002\u65E7 db \u6CA1\u6709\u8FD9\u4E2A\u5B57\u6BB5\u3002 */\n profile?: {\n unit?: string;\n balance?: number | null;\n today_text?: string;\n month_text?: string;\n total_text?: string;\n } | null;\n};\n\nexport async function fetchBindMe(ep: DbEndpoint, openid: string): Promise<BindMeResponse> {\n const q = `/api/sfmc/qq/bind/me?openid=${encodeURIComponent(openid)}`;\n const { data } = await requestJson<BindMeResponse>(ep, \"GET\", q);\n return data;\n}\n\nexport type BindRequestResponse = {\n success?: boolean;\n code?: string;\n expires_at?: number;\n ttl_ms?: number;\n error?: string;\n player_name?: string;\n};\n\nexport async function postBindRequest(\n ep: DbEndpoint,\n body: { openid: string; qq_backend: string }\n): Promise<{ status: number; data: BindRequestResponse }> {\n return requestJson<BindRequestResponse>(ep, \"POST\", \"/api/sfmc/qq/bind/request\", body);\n}\n\nexport type BindUnbindResponse = {\n success?: boolean;\n unbound?: boolean;\n error?: string;\n};\n\nexport type ContentSnapshotResponse = {\n success?: boolean;\n error?: string;\n note?: \"bds_unconfigured\" | \"world_unread\";\n modules?: Array<{\n id: string;\n display_name?: string;\n enabled?: boolean;\n has_resource_pack?: boolean;\n }>;\n /** \u884C\u4E3A\u5305\u4E0E\u8D44\u6E90\u5305\u3002name \u5DF2\u662F\u89E3\u6790\u540E\u7684\u663E\u793A\u540D\u3002 */\n packs?: Array<{\n kind?: \"behavior\" | \"resource\";\n name?: string;\n folder_name?: string;\n pack_id?: string;\n version?: string;\n enabled?: boolean;\n }>;\n resource_packs?: Array<{\n name?: string;\n pack_id?: string;\n version?: string;\n }>;\n};\n\n/** \u67E5\u8BE2\u6E38\u620F\u673A\u4E0A\u7684\u6A21\u5757\u4E0E\u4E16\u754C\u884C\u4E3A\u5305\u3001\u8D44\u6E90\u5305\u3002\u5F53\u524D\u7ED9 QQ\u300C\u6A21\u5757\u300D\u300C\u8D44\u6E90\u5305\u300D\u4F7F\u7528\u3002 */\nexport async function fetchContent(ep: DbEndpoint): Promise<ContentSnapshotResponse> {\n const { data } = await requestJson<ContentSnapshotResponse>(ep, \"GET\", \"/api/sfmc/content\");\n return data;\n}\n\nexport async function postBindUnbind(\n ep: DbEndpoint,\n body: { openid: string }\n): Promise<{ status: number; data: BindUnbindResponse }> {\n return requestJson<BindUnbindResponse>(ep, \"POST\", \"/api/sfmc/qq/bind/unbind\", body);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -294,17 +294,16 @@ const EVENT_SWITCHES = [
|
|
|
294
294
|
["death", "\u6B7B\u4EA1"]
|
|
295
295
|
];
|
|
296
296
|
function eventSettingsPanel(settings, prefix = "") {
|
|
297
|
-
const rows = [
|
|
298
|
-
|
|
299
|
-
["\
|
|
300
|
-
];
|
|
297
|
+
const rows = EVENT_SWITCHES.map(([field, label]) => [
|
|
298
|
+
label,
|
|
299
|
+
settings[field] ? "\u5F00" : "\u5173"
|
|
300
|
+
]);
|
|
301
301
|
const textRows = rows.map(([label, value]) => `\u2502 ${label}${"\u3000".repeat(4 - label.length)} \u2502 ${value} \u2502`);
|
|
302
302
|
const buttons = EVENT_SWITCHES.map(([field, label]) => ({
|
|
303
303
|
id: `events_${field}`,
|
|
304
304
|
label: `${label} ${settings[field] ? "\u5173" : "\u5F00"}`,
|
|
305
305
|
command: `/events ${label} ${settings[field] ? "\u5173" : "\u5F00"}`
|
|
306
306
|
}));
|
|
307
|
-
buttons.push({ id: "events_window", label: "\u805A\u5408\u95F4\u9694", command: "/events \u95F4\u9694" });
|
|
308
307
|
return {
|
|
309
308
|
text: [
|
|
310
309
|
"\u63A8\u9001\u8BBE\u7F6E",
|
|
@@ -314,7 +313,7 @@ function eventSettingsPanel(settings, prefix = "") {
|
|
|
314
313
|
"\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524",
|
|
315
314
|
...textRows,
|
|
316
315
|
"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518",
|
|
317
|
-
|
|
316
|
+
"\u6240\u6709\u4E8B\u4EF6\u5B9E\u65F6\u53D1\u9001\u3002"
|
|
318
317
|
].join("\n"),
|
|
319
318
|
markdown: [
|
|
320
319
|
"## \u63A8\u9001\u8BBE\u7F6E",
|
|
@@ -324,7 +323,7 @@ function eventSettingsPanel(settings, prefix = "") {
|
|
|
324
323
|
"| --- | --- |",
|
|
325
324
|
...rows.map(([label, value]) => `| ${label} | **${value}** |`),
|
|
326
325
|
"",
|
|
327
|
-
|
|
326
|
+
"_\u6240\u6709\u4E8B\u4EF6\u5B9E\u65F6\u53D1\u9001_"
|
|
328
327
|
].join("\n"),
|
|
329
328
|
buttons
|
|
330
329
|
};
|
|
@@ -339,34 +338,7 @@ const eventSettingsHandler = async (ctx) => {
|
|
|
339
338
|
const data = await fetchQqEventSettings(ep);
|
|
340
339
|
return data.success && data.settings ? eventSettingsPanel(data.settings) : failure(data.error);
|
|
341
340
|
}
|
|
342
|
-
if (rest
|
|
343
|
-
const data = await fetchQqEventSettings(ep);
|
|
344
|
-
if (!data.success || !data.settings) return failure(data.error);
|
|
345
|
-
return {
|
|
346
|
-
...formatCard("\u805A\u5408\u95F4\u9694", [
|
|
347
|
-
`\u5F53\u524D\uFF1A${data.settings.window_sec} \u79D2`,
|
|
348
|
-
"\u73A9\u5BB6\u8FDB\u51FA\u53CA\u6B7B\u4EA1\u901A\u77E5\u4F1A\u5728\u8FD9\u6BB5\u65F6\u95F4\u5185\u5408\u5E76\u3002",
|
|
349
|
-
"\u4E5F\u53EF\u53D1\u9001\u300C\u4E8B\u4EF6\u63A8\u9001 \u95F4\u9694 \u79D2\u6570\u300D\uFF0C\u8303\u56F4 5\u2013600 \u79D2\u3002"
|
|
350
|
-
]),
|
|
351
|
-
buttons: [30, 60, 120].map((seconds) => ({
|
|
352
|
-
id: `events_window_${seconds}`,
|
|
353
|
-
label: `${seconds} \u79D2`,
|
|
354
|
-
command: `/events \u95F4\u9694 ${seconds}`
|
|
355
|
-
}))
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
const interval = /^间隔\s+(\d+)$/.exec(rest);
|
|
359
|
-
if (interval) {
|
|
360
|
-
const seconds = Number(interval[1]);
|
|
361
|
-
if (!Number.isInteger(seconds) || seconds < 5 || seconds > 600) return { text: "\u805A\u5408\u95F4\u9694\u9700\u4E3A 5\u2013600 \u79D2\u7684\u6574\u6570\u3002" };
|
|
362
|
-
const data = await postQqEventSettings(ep, {
|
|
363
|
-
openid: ctx.inbound.userId,
|
|
364
|
-
as_group_admin: asGroupAdminField(ctx),
|
|
365
|
-
field: "window_sec",
|
|
366
|
-
value: seconds
|
|
367
|
-
});
|
|
368
|
-
return data.success && data.settings ? eventSettingsPanel(data.settings, "\u5DF2\u4FDD\u5B58") : failure(data.error);
|
|
369
|
-
}
|
|
341
|
+
if (/^间隔(\s+\d+)?$/.test(rest)) return { text: "\u4E8B\u4EF6\u63A8\u9001\u5DF2\u6539\u4E3A\u5B9E\u65F6\u53D1\u9001\uFF0C\u4E0D\u518D\u6709\u805A\u5408\u95F4\u9694\u3002" };
|
|
370
342
|
const match = /^(总开关|启动|停服|异常退出|上线|下线|死亡)\s+(开|关)$/.exec(rest);
|
|
371
343
|
if (!match) return { text: "\u53D1\u9001\u300C\u4E8B\u4EF6\u63A8\u9001\u300D\u6253\u5F00\u5F00\u5173\u9762\u677F\uFF0C\u6216\u9009\u62E9\u9762\u677F\u4E2D\u7684\u64CD\u4F5C\u3002" };
|
|
372
344
|
const item = EVENT_SWITCHES.find(([, label]) => label === match[1]);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/handlers.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * commands/handlers.ts \u2014 \u5185\u7F6E menu / ping / whoami / status / online / bind / group\n */\n\nimport { getGroupBotState, getGroupInfo } from \"@sfmc-bds/sdk/node/qq-official\";\nimport { log } from \"../log.js\";\nimport { formatAccountCard } from \"./account-format.js\";\nimport { formatModuleLines, formatPackLines, formatPackMarkdown } from \"./content-format.js\";\nimport {\n fetchBindMe,\n fetchContent,\n fetchQqEventSettings,\n fetchSfmcStatus,\n postBindRequest,\n postBindUnbind,\n postQqEventSettings,\n type DbEndpoint,\n type QqEventSettings,\n type SfmcStatusResponse,\n} from \"./db-api.js\";\nimport { formatCard, formatCommandMenu } from \"./menu-format.js\";\nimport type { CommandRegistry } from \"./registry.js\";\nimport type { CommandContext, CommandHandler, CommandResult } from \"./types.js\";\n\nfunction formatUptime(startedAt: number): string {\n const ms = Math.max(0, Date.now() - startedAt);\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}h ${m % 60}m`;\n if (m > 0) return `${m}m ${s % 60}s`;\n return `${s}s`;\n}\n\nfunction dbEp(ctx: CommandContext): DbEndpoint | null {\n const host = ctx.runtimeInfo.dbHost;\n const port = ctx.runtimeInfo.dbPort;\n if (!host || !port) return null;\n return { host, port };\n}\n\nfunction isAdmin(ctx: CommandContext): boolean {\n return ctx.adminAuthorized === true;\n}\n\nfunction failure(error: unknown): CommandResult {\n log.warn(`QQ \u64CD\u4F5C\u5931\u8D25: ${String(error)}`);\n return { text: \"\u64CD\u4F5C\u6682\u65F6\u672A\u5B8C\u6210\uFF0C\u8BF7\u7A0D\u540E\u67E5\u8BE2\u72B6\u6001\u6216\u8054\u7CFB\u7BA1\u7406\u5458\uFF1B\u8BF7\u52FF\u8FDE\u7EED\u91CD\u590D\u63D0\u4EA4\u4FEE\u6539\u3002\" };\n}\n\nfunction asGroupAdminField(ctx: CommandContext): boolean {\n return ctx.inbound.isGroupAdmin === true;\n}\n\n/** \u62C9\u53D6\u5B98\u65B9\u7FA4 info + bot_state\uFF1B\u5931\u8D25\u8FD4\u56DE\u63D0\u793A\u884C */\nasync function fetchQqGroupLines(ctx: CommandContext): Promise<string[]> {\n const creds = ctx.runtimeInfo.officialCreds;\n const gid = ctx.runtimeInfo.groupOpenid || (ctx.inbound.scene !== \"c2c\" ? ctx.inbound.groupId : \"\");\n if (!creds || !gid || ctx.inbound.backend !== \"official\") return [];\n const lines: string[] = [];\n try {\n const [infoRes, stateRes] = await Promise.all([getGroupInfo(creds, gid), getGroupBotState(creds, gid)]);\n if (infoRes.ok && infoRes.json && typeof infoRes.json === \"object\") {\n const j = infoRes.json as Record<string, unknown>;\n lines.push(`QQ\u7FA4\uFF1A${j[\"group_name\"] ?? \"\u2014\"} \u00B7 \u6210\u5458 ${j[\"group_member_num\"] ?? \"\u2014\"}`);\n } else if (!infoRes.ok) {\n const hint = /11253/.test(infoRes.error || infoRes.body || \"\")\n ? \"\u7FA4\u4FE1\u606F\u63A5\u53E3\u672A\u5F00\u901A\u767D\u540D\u5355(11253)\"\n : `\u7FA4\u4FE1\u606F\u5931\u8D25\uFF1A${(infoRes.error || \"\").slice(0, 60)}`;\n lines.push(hint);\n }\n if (stateRes.ok && stateRes.json && typeof stateRes.json === \"object\") {\n const j = stateRes.json as Record<string, unknown>;\n lines.push(\n `\u673A\u5668\u4EBA\uFF1A\u89D2\u8272=${j[\"member_role\"] ?? \"\u2014\"} \u00B7 \u4E3B\u52A8\u63A8\u9001=${j[\"allow_proactive_msg\"] === true ? \"\u5F00\" : \"\u5173\"} \u00B7 \u6536\u6D88\u606F=${j[\"recv_msg_setting\"] ?? \"\u2014\"}`\n );\n }\n } catch (e) {\n lines.push(`\u7FA4\u4FE1\u606F\u5F02\u5E38\uFF1A${(e as Error).message}`);\n }\n return lines;\n}\n\nexport function createMenuHandler(registry: CommandRegistry): CommandHandler {\n return (ctx) =>\n formatCommandMenu({\n title: \"\u4E1C\u65B9\u72AC\u660E\u6E56\",\n home: true,\n subtitle: \"\u6B22\u8FCE\u56DE\u6765\uFF0C\u4ECA\u5929\u4E5F\u4E00\u8D77\u73A9\u5427 (\u2267\u2207\u2266)\uFF89\\n\\n\u67E5\u8BE2\u670D\u52A1\u5668\u4FE1\u606F\uFF0C\u6216\u7BA1\u7406\u4F60\u7684\u6E38\u620F\u8D26\u53F7\u3002\",\n cmds: registry\n .all()\n .filter((c) => c.group === \"home\" && c.name !== \"menu\" && (c.permission !== \"admin\" || isAdmin(ctx))),\n idPrefix: \"home\",\n footerMd: \"\",\n footerText: \"\",\n });\n}\n\nexport function createAdminMenuHandler(registry: CommandRegistry): CommandHandler {\n return (ctx) => {\n if (!isAdmin(ctx)) return { text: \"\u5F53\u524D\u6CA1\u6709\u7BA1\u7406\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002\" };\n return formatCommandMenu({\n title: \"\u670D\u52A1\u5668\u7BA1\u7406\",\n subtitle: \"\u7BA1\u7406\u670D\u52A1\u5668\u4E0E\u7FA4\u63A8\u9001\u3002\",\n cmds: registry.adminMenu(),\n idPrefix: \"admin\",\n footerMd: \"\",\n footerText: \"\",\n });\n };\n}\n\nfunction sectionHandler(registry: CommandRegistry, group: \"server\", title: string): CommandHandler {\n return () =>\n formatCommandMenu({\n title,\n subtitle: \"\u67E5\u770B\u8FD0\u884C\u72B6\u6001\u3001\u5728\u7EBF\u73A9\u5BB6\u548C\u8FDE\u63A5\u65B9\u5F0F\u3002\",\n cmds: registry.all().filter((c) => c.group === group),\n idPrefix: group,\n footerMd: \"\",\n footerText: \"\",\n });\n}\n\nfunction helpHandler(registry: CommandRegistry): CommandHandler {\n return (ctx) => {\n const trigger =\n ctx.inbound.backend === \"official\"\n ? \"\u7FA4\u5185\u5F00\u542F\u300C\u63A5\u6536\u6240\u6709\u6D88\u606F\u300D\u540E\u53EF\u76F4\u63A5\u53D1\u9001\u6307\u4EE4\uFF1B\u5426\u5219\u8BF7 @\u673A\u5668\u4EBA\u3002\u5355\u804A\u76F4\u63A5\u53D1\u9001\u3002\"\n : \"\u76F4\u63A5\u53D1\u9001\u547D\u4EE4\uFF0C\u6216\u5728\u83DC\u5355\u6253\u5F00\u540E 60 \u79D2\u5185\u56DE\u590D\u7F16\u53F7\u3002\";\n const sections = [\n [\"server\", \"\u670D\u52A1\u5668\"],\n [\"account\", \"\u6211\u7684\u8D26\u53F7\"],\n [\"admin\", \"\u7BA1\u7406\"],\n ] as const;\n const lines = [trigger];\n for (const [group, title] of sections) {\n const commands = registry.all().filter((c) => c.group === group && (c.permission !== \"admin\" || isAdmin(ctx)));\n if (!commands.length) continue;\n lines.push(\n \"\",\n `\u3010${title}\u3011`,\n ...commands.map((c) => `${c.name === \"ip\" ? \"ip\" : c.aliases[0] || c.name}\uFF1A${c.description}`)\n );\n }\n lines.push(\"\", \"\u53D1\u9001 \u83DC\u5355 \u8FD4\u56DE\u9996\u9875\uFF0C\u53D1\u9001 \u53D6\u6D88 \u53D6\u6D88\u5F85\u786E\u8BA4\u64CD\u4F5C\u3002\", \"\u539F\u6709\u82F1\u6587\u547D\u4EE4\u53CA /\u547D\u4EE4 \u65B9\u5F0F\u4ECD\u53EF\u4F7F\u7528\u3002\");\n return formatCard(\"\u4F7F\u7528\u5E2E\u52A9\", lines);\n };\n}\n\nexport const serverVersionHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (ep) {\n try {\n const status = await fetchSfmcStatus(ep);\n const bds = status.processes?.bds;\n if (bds?.state === \"running\" && bds.version)\n return formatCard(\"\u7248\u672C\", [\"\u6E38\u620F\u7C7B\u578B\uFF1A\u57FA\u5CA9\u7248\", `\u5F53\u524D BDS \u7248\u672C\uFF1A${bds.version}`]);\n } catch (error) {\n log.warn(`BDS \u7248\u672C\u67E5\u8BE2\u5931\u8D25: ${String(error)}`);\n }\n }\n return {\n text: ctx.runtimeInfo.publicServer?.version\n ? `\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u5B9E\u9645 BDS \u7248\u672C\u3002\\n\u7BA1\u7406\u5458\u63D0\u4F9B\u7684\u5165\u670D\u8BF4\u660E\uFF1A${ctx.runtimeInfo.publicServer.version}`\n : \"\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u5B9E\u9645 BDS \u7248\u672C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u786E\u8BA4\u5165\u670D\u7248\u672C\u3002\",\n };\n};\nexport const serverAddressHandler: CommandHandler = (ctx) => {\n const info = ctx.runtimeInfo.publicServer;\n return formatCard(\n \"\u8FDE\u63A5\u5730\u5740\",\n info?.address\n ? [\n \"\u6E38\u620F\u7C7B\u578B\uFF1A\u57FA\u5CA9\u7248\",\n `\u670D\u52A1\u5668\u5730\u5740\uFF1A${info.address}`,\n `\u7AEF\u53E3\uFF1A${info.port ?? 19132}`,\n \"\",\n \"\u5728\u6E38\u620F\u5185\u9009\u62E9\u300C\u6DFB\u52A0\u670D\u52A1\u5668\u300D\uFF0C\u586B\u5199\u4EE5\u4E0A\u4FE1\u606F\u3002\",\n ]\n : [\"\u6682\u672A\u516C\u5E03\u670D\u52A1\u5668\u5730\u5740\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u83B7\u53D6\u3002\"]\n );\n};\n\nexport const pingHandler: CommandHandler = (ctx) => ({\n text: `\u673A\u5668\u4EBA\u8FDE\u63A5\u6B63\u5E38\uFF0C\u5DF2\u8FD0\u884C ${formatUptime(ctx.startedAt)}`,\n});\n\nexport const whoamiHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const me = await fetchBindMe(ep, ctx.inbound.userId);\n if (me.success === false) return failure(\"\u7ED1\u5B9A\u67E5\u8BE2\u5931\u8D25\");\n return {\n ...formatAccountCard({\n bound: !!me.bound,\n ...(me.binding?.player_name ? { playerName: me.binding.player_name } : {}),\n ...(me.profile ? { profile: me.profile } : {}),\n }),\n buttons: me.bound\n ? [{ id: \"unbind\", label: \"\u89E3\u7ED1\", command: \"/unbind\" }]\n : [{ id: \"bind\", label: \"\u7ED1\u5B9A\", command: \"/bind\" }],\n };\n};\n\nexport const statusHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n let st: SfmcStatusResponse;\n try {\n st = await fetchSfmcStatus(ep);\n } catch (error) {\n log.warn(`\u67E5\u670D\u72B6\u6001\u63A5\u53E3\u4E0D\u53EF\u7528: ${String(error)}`);\n return formatCard(\"\u670D\u52A1\u5668\u72B6\u6001\", [\"\u6682\u65F6\u65E0\u6CD5\u8FDE\u63A5\u72B6\u6001\u670D\u52A1\uFF0C\u65E0\u6CD5\u786E\u8BA4\u6E38\u620F\u670D\u52A1\u5668\u662F\u5426\u8FD0\u884C\u3002\", \"\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458\u3002\"]);\n }\n const state = st.processes?.bds;\n const running = state?.state === \"running\" || state?.running === true;\n const stopped = state?.state === \"stopped\" || state?.running === false;\n const onlineText = stopped\n ? \"0 \u4EBA\"\n : st.note || !Array.isArray(st.online)\n ? \"\u6570\u636E\u6682\u4E0D\u53EF\u786E\u8BA4\"\n : `${st.online.length} \u4EBA`;\n const age =\n typeof st.updatedAt === \"number\" ? `${Math.max(0, Math.floor((Date.now() - st.updatedAt) / 1000))} \u79D2\u524D` : \"\u672A\u77E5\";\n return {\n ...formatCard(\"\u670D\u52A1\u5668\u72B6\u6001\", [\n `\u8FD0\u884C\u72B6\u6001\uFF1A${running ? \"\u8FD0\u884C\u4E2D\" : stopped ? \"\u672A\u8FD0\u884C\" : \"\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\"}`,\n `\u5728\u7EBF\u73A9\u5BB6\uFF1A${onlineText}`,\n `\u4E16\u754C\u65E5\uFF1A${st.world?.day ?? \"\u672A\u77E5\"}`,\n `\u96BE\u5EA6\uFF1A${st.world?.difficulty ?? \"\u672A\u77E5\"}`,\n `\u6570\u636E\u66F4\u65B0\uFF1A${age}`,\n ...(st.note && running ? [\"\u5728\u7EBF\u6570\u636E\u6682\u4E0D\u53EF\u786E\u8BA4\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002\"] : []),\n ]),\n buttons: [\n { id: \"online\", label: \"\u5728\u7EBF\u73A9\u5BB6\", command: \"/online\" },\n { id: \"version\", label: \"\u7248\u672C\", command: \"/version\" },\n { id: \"ip\", label: \"\u8FDE\u63A5\u5730\u5740\", command: \"/ip\" },\n { id: \"refresh_status\", label: \"\u5237\u65B0\u72B6\u6001\", command: \"/status\" },\n ],\n };\n};\n\nexport const onlineHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const st = await fetchSfmcStatus(ep);\n if (st.processes?.bds?.state === \"stopped\") return formatCard(\"\u5728\u7EBF\u73A9\u5BB6\", [\"\u670D\u52A1\u5668\u672A\u8FD0\u884C\uFF0C\u5F53\u524D\u6CA1\u6709\u5728\u7EBF\u73A9\u5BB6\u3002\"]);\n if (!Array.isArray(st.online) || st.note) return { text: \"\u5728\u7EBF\u6570\u636E\u6682\u4E0D\u53EF\u786E\u8BA4\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002\" };\n if (!st.online.length) return formatCard(\"\u5728\u7EBF\u73A9\u5BB6\", [\"\u5F53\u524D\u6CA1\u6709\u5728\u7EBF\u73A9\u5BB6\u3002\"]);\n return {\n ...formatCard(\"\u5728\u7EBF\u73A9\u5BB6\", [\n `\u5F53\u524D\u5728\u7EBF ${st.online.length} \u4EBA`,\n \"\",\n ...st.online.map((p, i) => `${i + 1}. ${p.name || \"\u672A\u547D\u540D\u73A9\u5BB6\"}`),\n ]),\n };\n};\n\nexport const bindHandler: CommandHandler = async (ctx: CommandContext): Promise<CommandResult> => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n try {\n const { status, data } = await postBindRequest(ep, {\n openid: ctx.inbound.userId,\n qq_backend: ctx.inbound.backend,\n });\n if (status === 409 || data.error === \"already_bound\") {\n return {\n text: `\u4F60\u5DF2\u7ED1\u5B9A MC \u73A9\u5BB6\u300C${data.player_name || \"?\"}\u300D\u3002\u5982\u9700\u6362\u7ED1\u8BF7\u5148\u53D1\u9001\u300C\u89E3\u7ED1\u300D\u3002`,\n };\n }\n if (!data.success || !data.code) {\n return failure(data.error);\n }\n // \u672A\u7ED1\u5B9A\u4E5F\u80FD\u8FDB\u670D\uFF0C\u4F46\u6E38\u620F\u5185\u4F1A\u88AB\u9501\u6210\u8BBF\u5BA2\uFF1B\u9A8C\u8BC1\u7801\u5FC5\u987B\u5728\u6E38\u620F\u804A\u5929\u91CC\u6838\u9500\u3002\n return formatCard(\"\u7ED1\u5B9A\u8D26\u53F7\", [\n `\u7ED1\u5B9A\u7801\uFF1A${data.code}`,\n \"\",\n \"\u8FDB\u5165\u670D\u52A1\u5668\u540E\u5B8C\u6210\u4E0B\u9762\u4E24\u6B65\uFF1A\",\n \"1. \u5728\u6E38\u620F\u5185\u6267\u884C /c:bind\",\n \"2. \u5728 60 \u79D2\u5185\u628A\u4EE5\u4E0A\u7EAF\u6570\u5B57\u9A8C\u8BC1\u7801\u53D1\u5230\u6E38\u620F\u804A\u5929\",\n \"\",\n \"\u7ED1\u5B9A\u6210\u529F\u540E\u5373\u53EF\u81EA\u7531\u6D3B\u52A8\u3002\",\n \"\u8D85\u65F6\u8BF7\u91CD\u65B0\u53D1\u9001\u300C\u7ED1\u5B9A\u300D\u83B7\u53D6\u9A8C\u8BC1\u7801\u3002\",\n ]);\n } catch (e) {\n return failure(e);\n }\n};\n\nexport const unbindHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const me = await fetchBindMe(ep, ctx.inbound.userId);\n if (me.success === false) return failure(\"\u7ED1\u5B9A\u67E5\u8BE2\u5931\u8D25\");\n if (!me.bound || !me.binding) return { text: \"\u5F53\u524D\u6CA1\u6709\u7ED1\u5B9A\u8BB0\u5F55\u3002\" };\n const original = me.binding;\n return {\n text: \"\u786E\u8BA4\u89E3\u7ED1\",\n confirmation: {\n summary: `\u5373\u5C06\u89E3\u9664\u4F60\u4E0E\u300C${original.player_name || \"\u672A\u547D\u540D\u89D2\u8272\"}\u300D\u7684\u7ED1\u5B9A\u3002\u4E4B\u540E\u9700\u8981\u91CD\u65B0\u7533\u8BF7\u9A8C\u8BC1\u7801\u624D\u80FD\u7ED1\u5B9A\u3002`,\n execute: async (confirmed) => {\n const current = await fetchBindMe(ep, confirmed.inbound.userId);\n if (current.success === false) return failure(\"\u7ED1\u5B9A\u6838\u9A8C\u5931\u8D25\");\n if (\n !current.bound ||\n current.binding?.player_xuid !== original.player_xuid ||\n current.binding?.bound_at !== original.bound_at\n ) {\n return { text: \"\u7ED1\u5B9A\u72B6\u6001\u5DF2\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u67E5\u8BE2\u300C\u6211\u7684\u8D26\u53F7\u300D\u540E\u518D\u64CD\u4F5C\u3002\" };\n }\n const { data } = await postBindUnbind(ep, { openid: confirmed.inbound.userId });\n if (data.success === false) return failure(data.error);\n return { text: data.unbound ? \"\u5DF2\u89E3\u9664 QQ \u4E0E\u6E38\u620F\u89D2\u8272\u7684\u7ED1\u5B9A\u3002\" : \"\u5F53\u524D\u6CA1\u6709\u7ED1\u5B9A\u8BB0\u5F55\u3002\" };\n },\n },\n };\n};\n\nexport const groupInfoHandler: CommandHandler = async (ctx: CommandContext): Promise<CommandResult> => {\n const lines = await fetchQqGroupLines(ctx);\n if (lines.length === 0) {\n return { text: \"\u7FA4\u4FE1\u606F\u4EC5\u5B98\u65B9\u540E\u7AEF\u53EF\u7528\uFF0C\u4E14\u9700\u914D\u7F6E official.group_openid / \u51ED\u8BC1\u3002\" };\n }\n return { text: [\"QQ \u7FA4\u4FE1\u606F\", ...lines].join(\"\\n\") };\n};\n\n/**\n * \u300C\u5165\u670D\u300D\u8BF4\u660E\u9875\u3002\n * \u4E0D\u518D\u8D70\u5165\u670D\u7533\u8BF7\u3002\u73A9\u5BB6\u76F4\u63A5\u8FDB\u670D\uFF1B\u672A\u7ED1\u5B9A\u4E3A\u8BBF\u5BA2\u4E14\u4E0D\u80FD\u79FB\u52A8\uFF0C\u7ED1\u5B9A\u5199\u5165\u81EA\u6709\u767D\u540D\u5355\u540E\u5373\u53EF\u6E38\u73A9\u3002\n */\nexport const entryGuideHandler: CommandHandler = (): CommandResult =>\n formatCard(\"\u8FDB\u670D\u8BF4\u660E\", [\n \"\u76F4\u63A5\u8FDB\u5165\u670D\u52A1\u5668\u5373\u53EF\u3002\",\n \"\",\n \"\u672A\u7ED1\u5B9A\u7684\u89D2\u8272\u53EF\u4EE5\u8FDB\u670D\uFF0C\u4F46\u65E0\u6CD5\u79FB\u52A8\uFF0C\u6743\u9650\u4E3A\u8BBF\u5BA2\u3002\",\n \"\u804A\u5929\u680F\u4F1A\u63D0\u793A\u7ED1\u5B9A\u6B65\u9AA4\u3002\",\n \"\u5728 QQ \u53D1\u9001\u300C\u7ED1\u5B9A\u300D\u83B7\u53D6\u9A8C\u8BC1\u7801\uFF0C\u8FDB\u670D\u540E\u6267\u884C /c:bind\uFF0C\u518D\u628A\u9A8C\u8BC1\u7801\u53D1\u5230\u6E38\u620F\u804A\u5929\u3002\",\n \"\u7ED1\u5B9A\u6210\u529F\u540E\u5373\u53EF\u6B63\u5E38\u6E38\u73A9\u3002\",\n ]);\n\n/**\n * \u65E7\u7684\u5165\u670D\u7533\u8BF7\u3001\u5BA1\u6279\u548C\u767D\u540D\u5355\u5F00\u5173\u3002\n * \u4FDD\u7559\u8FD9\u4E9B\u89E6\u53D1\u8BCD\uFF0C\u8BA9\u65E7\u6309\u94AE\u548C\u4E60\u60EF\u547D\u4EE4\u6709\u660E\u786E\u56DE\u590D\uFF1B\u4E0D\u518D\u521B\u5EFA\u7533\u8BF7\uFF0C\u4E5F\u4E0D\u518D\u6539\u5BA1\u6279\u5F00\u5173\u3002\n */\nexport const retiredJoinFlowHandler: CommandHandler = (): CommandResult => ({\n text: \"\u5165\u670D\u7533\u8BF7\u5DF2\u5173\u95ED\u3002\u76F4\u63A5\u8FDB\u5165\u670D\u52A1\u5668\uFF0C\u5728\u6E38\u620F\u5185\u6309\u804A\u5929\u63D0\u793A\u5B8C\u6210\u7ED1\u5B9A\u540E\u5373\u53EF\u6E38\u73A9\u3002\u7ED1\u5B9A\u6210\u529F\u4F1A\u5199\u5165\u767D\u540D\u5355\u5E76\u89E3\u9664\u8BBF\u5BA2\u9650\u5236\u3002\",\n});\n\nconst EVENT_SWITCHES = [\n [\"enabled\", \"\u603B\u5F00\u5173\"],\n [\"start\", \"\u542F\u52A8\"],\n [\"stop\", \"\u505C\u670D\"],\n [\"crash\", \"\u5F02\u5E38\u9000\u51FA\"],\n [\"join\", \"\u4E0A\u7EBF\"],\n [\"leave\", \"\u4E0B\u7EBF\"],\n [\"death\", \"\u6B7B\u4EA1\"],\n] as const;\n\nfunction eventSettingsPanel(settings: QqEventSettings, prefix = \"\"): CommandResult {\n const rows: Array<[string, string]> = [\n ...EVENT_SWITCHES.map(([field, label]): [string, string] => [label, settings[field] ? \"\u5F00\" : \"\u5173\"]),\n [\"\u805A\u5408\u95F4\u9694\", `${settings.window_sec} \u79D2`],\n ];\n const textRows = rows.map(([label, value]) => `\u2502 ${label}${\"\u3000\".repeat(4 - label.length)} \u2502 ${value} \u2502`);\n const buttons = EVENT_SWITCHES.map(([field, label]) => ({\n id: `events_${field}`,\n label: `${label} ${settings[field] ? \"\u5173\" : \"\u5F00\"}`,\n command: `/events ${label} ${settings[field] ? \"\u5173\" : \"\u5F00\"}`,\n }));\n buttons.push({ id: \"events_window\", label: \"\u805A\u5408\u95F4\u9694\", command: \"/events \u95F4\u9694\" });\n return {\n text: [\n \"\u63A8\u9001\u8BBE\u7F6E\",\n ...(prefix ? [prefix] : []),\n \"\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\",\n \"\u2502 \u9879\u76EE\u3000\u3000 \u2502 \u72B6\u6001\u3000 \u2502\",\n \"\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\",\n ...textRows,\n \"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\",\n `\u73A9\u5BB6\u4E8B\u4EF6\u7EA6 ${settings.window_sec} \u79D2\u5408\u5E76\u53D1\u9001\uFF1B\u542F\u505C\u4E0E\u5F02\u5E38\u9000\u51FA\u5373\u65F6\u53D1\u9001\u3002`,\n ].join(\"\\n\"),\n markdown: [\n \"## \u63A8\u9001\u8BBE\u7F6E\",\n ...(prefix ? [\"\", prefix] : []),\n \"\",\n \"| \u9879\u76EE | \u72B6\u6001 |\",\n \"| --- | --- |\",\n ...rows.map(([label, value]) => `| ${label} | **${value}** |`),\n \"\",\n `_\u73A9\u5BB6\u4E8B\u4EF6\u7EA6 ${settings.window_sec} \u79D2\u5408\u5E76\u53D1\u9001\uFF1B\u542F\u505C\u4E0E\u5F02\u5E38\u9000\u51FA\u5373\u65F6\u53D1\u9001_`,\n ].join(\"\\n\"),\n buttons,\n };\n}\n\nexport const eventSettingsHandler: CommandHandler = async (ctx): Promise<CommandResult> => {\n if (!isAdmin(ctx)) return { text: \"\u5F53\u524D\u6CA1\u6709\u7BA1\u7406\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002\" };\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const rest = ctx.inbound.text.replace(/^\\/?(?:events|\u4E8B\u4EF6\u63A8\u9001|\u4E8B\u4EF6\u914D\u7F6E)\\s*/i, \"\").trim();\n try {\n if (!rest) {\n const data = await fetchQqEventSettings(ep);\n return data.success && data.settings ? eventSettingsPanel(data.settings) : failure(data.error);\n }\n if (rest === \"\u95F4\u9694\") {\n const data = await fetchQqEventSettings(ep);\n if (!data.success || !data.settings) return failure(data.error);\n return {\n ...formatCard(\"\u805A\u5408\u95F4\u9694\", [\n `\u5F53\u524D\uFF1A${data.settings.window_sec} \u79D2`,\n \"\u73A9\u5BB6\u8FDB\u51FA\u53CA\u6B7B\u4EA1\u901A\u77E5\u4F1A\u5728\u8FD9\u6BB5\u65F6\u95F4\u5185\u5408\u5E76\u3002\",\n \"\u4E5F\u53EF\u53D1\u9001\u300C\u4E8B\u4EF6\u63A8\u9001 \u95F4\u9694 \u79D2\u6570\u300D\uFF0C\u8303\u56F4 5\u2013600 \u79D2\u3002\",\n ]),\n buttons: [30, 60, 120].map((seconds) => ({\n id: `events_window_${seconds}`,\n label: `${seconds} \u79D2`,\n command: `/events \u95F4\u9694 ${seconds}`,\n })),\n };\n }\n const interval = /^\u95F4\u9694\\s+(\\d+)$/.exec(rest);\n if (interval) {\n const seconds = Number(interval[1]);\n if (!Number.isInteger(seconds) || seconds < 5 || seconds > 600) return { text: \"\u805A\u5408\u95F4\u9694\u9700\u4E3A 5\u2013600 \u79D2\u7684\u6574\u6570\u3002\" };\n const data = await postQqEventSettings(ep, {\n openid: ctx.inbound.userId,\n as_group_admin: asGroupAdminField(ctx),\n field: \"window_sec\",\n value: seconds,\n });\n return data.success && data.settings ? eventSettingsPanel(data.settings, \"\u5DF2\u4FDD\u5B58\") : failure(data.error);\n }\n const match = /^(\u603B\u5F00\u5173|\u542F\u52A8|\u505C\u670D|\u5F02\u5E38\u9000\u51FA|\u4E0A\u7EBF|\u4E0B\u7EBF|\u6B7B\u4EA1)\\s+(\u5F00|\u5173)$/.exec(rest);\n if (!match) return { text: \"\u53D1\u9001\u300C\u4E8B\u4EF6\u63A8\u9001\u300D\u6253\u5F00\u5F00\u5173\u9762\u677F\uFF0C\u6216\u9009\u62E9\u9762\u677F\u4E2D\u7684\u64CD\u4F5C\u3002\" };\n const item = EVENT_SWITCHES.find(([, label]) => label === match[1]);\n if (!item) return { text: \"\u6CA1\u6709\u8FD9\u4E2A\u4E8B\u4EF6\u5F00\u5173\u3002\" };\n const [field] = item;\n const value = match[2] === \"\u5F00\";\n const execute: CommandHandler = async (confirmed) => {\n try {\n const data = await postQqEventSettings(ep, {\n openid: confirmed.inbound.userId,\n as_group_admin: asGroupAdminField(confirmed),\n field,\n value,\n });\n return data.success && data.settings ? eventSettingsPanel(data.settings, \"\u5DF2\u4FDD\u5B58\") : failure(data.error);\n } catch (error) {\n return failure(error);\n }\n };\n if (field === \"enabled\" && !value) {\n return {\n text: \"\u786E\u8BA4\u5173\u95ED\u4E8B\u4EF6\u63A8\u9001\",\n confirmation: { summary: \"\u5373\u5C06\u5173\u95ED\u5168\u90E8\u670D\u52A1\u5668\u4E8B\u4EF6\u7FA4\u63A8\u9001\u3002\", execute },\n };\n }\n return execute(ctx);\n } catch (error) {\n return failure(error);\n }\n};\n\n/** \u9891\u9053 + \u8F7B\u91CF\u81EA\u68C0\uFF08\u4EBA\u4EBA\u53EF\u7528\uFF09 */\nexport const channelHandler: CommandHandler = () => ({\n text: \"QQ\u7FA4\u6D88\u606F\u8FDB\u5165\u6E38\u620F\u5185\u5DF2\u5F00\u542F\u300CQQ\u300D\u6D88\u606F\u6765\u6E90\u7684\u9891\u9053\u3002\u6E38\u620F\u5185\u5404\u9891\u9053\u53EF\u5206\u522B\u8BBE\u7F6E\u662F\u5426\u8F6C\u53D1\u5230 QQ\u3002\",\n});\n\nexport const doctorHandler: CommandHandler = async (ctx) => {\n if (!isAdmin(ctx)) return { text: \"\u5F53\u524D\u6CA1\u6709\u7BA1\u7406\u6743\u9650\u3002\" };\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const st = await fetchSfmcStatus(ep);\n const qq = await fetchQqGroupLines(ctx);\n return {\n text: [\n \"\u7BA1\u7406\u81EA\u68C0\",\n `\u540E\u7AEF\uFF1A${ctx.inbound.backend}`,\n \"QQ \u5165\u7AD9\uFF1A\u5199\u5165\u6D88\u606F\u6765\u6E90\u4E3A QQ \u7684\u6E38\u620F\u9891\u9053\",\n `\u4E3B\u673A\uFF1A${st.host?.hostname || \"\u672A\u77E5\"} \u00B7 ${st.host?.platform || \"\u672A\u77E5\"}`,\n `CPU\uFF1A${st.host?.cpu?.model || \"\u672A\u77E5\"} \u00B7 ${st.host?.cpu?.cores ?? \"\u672A\u77E5\"} \u6838`,\n `\u5185\u5B58\uFF1A${st.host?.memory?.usedMb ?? \"\u672A\u77E5\"}/${st.host?.memory?.totalMb ?? \"\u672A\u77E5\"} MB`,\n `\u4E3B\u673A\u8FD0\u884C\uFF1A${st.host?.uptimeText || \"\u672A\u77E5\"}`,\n `BDS\uFF1A${st.processes?.bds?.state || \"\u672A\u77E5\"} \u00B7 PID ${st.processes?.bds?.pid ?? \"\u672A\u77E5\"} \u00B7 ${st.processes?.bds?.uptimeText || \"\u672A\u77E5\"}`,\n `\u6570\u636E\u5E93\uFF1APID ${st.processes?.db?.pid ?? \"\u672A\u77E5\"} \u00B7 ${st.processes?.db?.uptimeText || \"\u672A\u77E5\"}`,\n ...qq,\n ].join(\"\\n\"),\n };\n};\n\n/** \u67E5\u8BE2\u5DF2\u5B89\u88C5\u6A21\u5757\u3002\u53EF\u52A0\u5173\u952E\u5B57\uFF0C\u4F8B\u5982\u300C\u6A21\u5757 \u804A\u5929\u300D\u3002 */\nexport const modulesHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const keyword = ctx.inbound.text.replace(/^\\/?(\u6A21\u5757|modules)\\s*/i, \"\").trim();\n try {\n const data = await fetchContent(ep);\n if (data.success === false) return failure(data.error);\n return formatCard(\"\u6A21\u5757\", formatModuleLines(data.modules ?? [], keyword));\n } catch (error) {\n return failure(error);\n }\n};\n\n/** \u67E5\u8BE2\u4E16\u754C\u5DF2\u5B89\u88C5\u7684\u884C\u4E3A\u5305\u548C\u8D44\u6E90\u5305\u3002\u65E7\u5FEB\u7167\u6CA1\u6709 packs \u65F6\uFF0C\u628A\u5DF2\u542F\u7528\u8D44\u6E90\u5305\u5F53\u4F5C\u8D44\u6E90\u5305\u6BB5\u3002 */\nexport const packsHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n try {\n const data = await fetchContent(ep);\n if (data.success === false) return failure(data.error);\n const packs =\n data.packs ??\n (data.resource_packs ?? []).map((pack) => ({\n kind: \"resource\" as const,\n enabled: true,\n ...(pack.name ? { name: pack.name } : {}),\n ...(pack.pack_id ? { pack_id: pack.pack_id } : {}),\n ...(pack.version ? { version: pack.version } : {}),\n }));\n return {\n text: [\"\u8D44\u6E90\u5305\", \"\", ...formatPackLines(packs, data.note)].join(\"\\n\"),\n markdown: formatPackMarkdown(packs, data.note),\n };\n } catch (error) {\n return failure(error);\n }\n};\n\n/** \u6CE8\u518C\u8868\u540C\u65F6\u9A71\u52A8\u83DC\u5355\u3001\u5E2E\u52A9\u548C\u6743\u9650\u3002 */\nexport function registerBuiltinCommands(registry: CommandRegistry): void {\n const add = (\n name: string,\n aliases: string[],\n description: string,\n handler: CommandHandler,\n group: \"home\" | \"server\" | \"account\" | \"join\" | \"help\" | \"admin\",\n admin = false\n ) =>\n registry.register({\n name,\n aliases,\n description,\n handler,\n group,\n permission: admin ? \"admin\" : \"player\",\n adminMenu: group === \"admin\",\n });\n add(\"menu\", [\"\u83DC\u5355\"], \"\u8FD4\u56DE\u9996\u9875\", createMenuHandler(registry), \"home\");\n add(\n \"server\",\n [\"\u670D\u52A1\u5668\"],\n \"\u67E5\u770B\u8FD0\u884C\u72B6\u6001\u3001\u5728\u7EBF\u73A9\u5BB6\u548C\u8FDE\u63A5\u65B9\u5F0F\",\n sectionHandler(registry, \"server\", \"\u670D\u52A1\u5668\u4FE1\u606F\"),\n \"home\"\n );\n add(\"account\", [\"\u6211\u7684\u8D26\u53F7\"], \"\u67E5\u770B\u4E0E\u7BA1\u7406\u6E38\u620F\u89D2\u8272\u7ED1\u5B9A\", whoamiHandler, \"home\");\n add(\"entry\", [\"\u5165\u670D\"], \"\u76F4\u63A5\u8FDB\u670D\uFF0C\u6E38\u620F\u5185\u7ED1\u5B9A\u540E\u5373\u53EF\u6E38\u73A9\", entryGuideHandler, \"home\");\n add(\"help\", [\"\u5E2E\u52A9\"], \"\u67E5\u770B\u4F7F\u7528\u8BF4\u660E\u548C\u5E38\u7528\u547D\u4EE4\", helpHandler(registry), \"home\");\n add(\"admin\", [\"\u7BA1\u7406\"], \"\u7BA1\u7406\u83DC\u5355\", createAdminMenuHandler(registry), \"home\", true);\n add(\"status\", [\"\u67E5\u670D\", \"\u72B6\u6001\"], \"\u670D\u52A1\u5668\u8FD0\u884C\u72B6\u6001\", statusHandler, \"server\");\n add(\"online\", [\"\u5728\u7EBF\"], \"\u5B8C\u6574\u5728\u7EBF\u540D\u5355\", onlineHandler, \"server\");\n add(\"version\", [\"\u7248\u672C\"], \"\u57FA\u5CA9\u7248\u5165\u670D\u7248\u672C\", serverVersionHandler, \"server\");\n add(\"ip\", [\"\u5730\u5740\"], \"\u516C\u5F00\u670D\u52A1\u5668\u5730\u5740\u4E0E\u7AEF\u53E3\", serverAddressHandler, \"server\");\n add(\"modules\", [\"\u6A21\u5757\"], \"\u67E5\u770B\u5DF2\u5B89\u88C5\u6A21\u5757\", modulesHandler, \"server\");\n add(\"packs\", [\"\u8D44\u6E90\u5305\", \"\u884C\u4E3A\u5305\", \"\u8D44\u6E90\u5305\"], \"\u67E5\u770B\u4E16\u754C\u884C\u4E3A\u5305\u548C\u8D44\u6E90\u5305\", packsHandler, \"server\");\n add(\"channel\", [\"\u9891\u9053\"], \"\u804A\u5929\u4E92\u901A\u72B6\u6001\", channelHandler, \"server\");\n add(\"ping\", [], \"\u673A\u5668\u4EBA\u8FDE\u901A\u6027\", pingHandler, \"server\");\n add(\"whoami\", [\"\u6211\u7684\u7ED1\u5B9A\"], \"\u67E5\u770B\u7ED1\u5B9A\u89D2\u8272\", whoamiHandler, \"account\");\n add(\"bind\", [\"\u7ED1\u5B9A\"], \"\u7533\u8BF7\u7ED1\u5B9A\u9A8C\u8BC1\u7801\", bindHandler, \"account\");\n add(\"unbind\", [\"\u89E3\u7ED1\"], \"\u786E\u8BA4\u89E3\u9664\u7ED1\u5B9A\", unbindHandler, \"account\");\n add(\n \"join\",\n [\"\u7533\u8BF7\u5165\u670D\", \"\u901A\u8FC7\", \"\u62D2\u7EDD\", \"\u5F85\u5BA1\", \"approve\", \"reject\", \"pending\", \"\u914D\u7F6E\", \"\u5165\u670D\u914D\u7F6E\", \"config\"],\n \"\u5165\u670D\u7533\u8BF7\u5DF2\u5173\u95ED\uFF0C\u8BF7\u76F4\u63A5\u8FDB\u670D\u5E76\u7ED1\u5B9A\",\n retiredJoinFlowHandler,\n \"help\"\n );\n add(\"doctor\", [\"\u81EA\u68C0\"], \"\u8FDE\u901A\u4E0E\u8FD0\u884C\u8BCA\u65AD\", doctorHandler, \"admin\", true);\n add(\"group\", [\"\u7FA4\u4FE1\u606F\"], \"\u5B98\u65B9 QQ \u7FA4\u4FE1\u606F\", groupInfoHandler, \"admin\", true);\n add(\"events\", [\"\u4E8B\u4EF6\u63A8\u9001\", \"\u4E8B\u4EF6\u914D\u7F6E\"], \"\u670D\u52A1\u5668\u4E8B\u4EF6\u63A8\u9001\u5F00\u5173\", eventSettingsHandler, \"admin\", true);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * commands/handlers.ts \u2014 \u5185\u7F6E menu / ping / whoami / status / online / bind / group\n */\n\nimport { getGroupBotState, getGroupInfo } from \"@sfmc-bds/sdk/node/qq-official\";\nimport { log } from \"../log.js\";\nimport { formatAccountCard } from \"./account-format.js\";\nimport { formatModuleLines, formatPackLines, formatPackMarkdown } from \"./content-format.js\";\nimport {\n fetchBindMe,\n fetchContent,\n fetchQqEventSettings,\n fetchSfmcStatus,\n postBindRequest,\n postBindUnbind,\n postQqEventSettings,\n type DbEndpoint,\n type QqEventSettings,\n type SfmcStatusResponse,\n} from \"./db-api.js\";\nimport { formatCard, formatCommandMenu } from \"./menu-format.js\";\nimport type { CommandRegistry } from \"./registry.js\";\nimport type { CommandContext, CommandHandler, CommandResult } from \"./types.js\";\n\nfunction formatUptime(startedAt: number): string {\n const ms = Math.max(0, Date.now() - startedAt);\n const s = Math.floor(ms / 1000);\n const m = Math.floor(s / 60);\n const h = Math.floor(m / 60);\n if (h > 0) return `${h}h ${m % 60}m`;\n if (m > 0) return `${m}m ${s % 60}s`;\n return `${s}s`;\n}\n\nfunction dbEp(ctx: CommandContext): DbEndpoint | null {\n const host = ctx.runtimeInfo.dbHost;\n const port = ctx.runtimeInfo.dbPort;\n if (!host || !port) return null;\n return { host, port };\n}\n\nfunction isAdmin(ctx: CommandContext): boolean {\n return ctx.adminAuthorized === true;\n}\n\nfunction failure(error: unknown): CommandResult {\n log.warn(`QQ \u64CD\u4F5C\u5931\u8D25: ${String(error)}`);\n return { text: \"\u64CD\u4F5C\u6682\u65F6\u672A\u5B8C\u6210\uFF0C\u8BF7\u7A0D\u540E\u67E5\u8BE2\u72B6\u6001\u6216\u8054\u7CFB\u7BA1\u7406\u5458\uFF1B\u8BF7\u52FF\u8FDE\u7EED\u91CD\u590D\u63D0\u4EA4\u4FEE\u6539\u3002\" };\n}\n\nfunction asGroupAdminField(ctx: CommandContext): boolean {\n return ctx.inbound.isGroupAdmin === true;\n}\n\n/** \u62C9\u53D6\u5B98\u65B9\u7FA4 info + bot_state\uFF1B\u5931\u8D25\u8FD4\u56DE\u63D0\u793A\u884C */\nasync function fetchQqGroupLines(ctx: CommandContext): Promise<string[]> {\n const creds = ctx.runtimeInfo.officialCreds;\n const gid = ctx.runtimeInfo.groupOpenid || (ctx.inbound.scene !== \"c2c\" ? ctx.inbound.groupId : \"\");\n if (!creds || !gid || ctx.inbound.backend !== \"official\") return [];\n const lines: string[] = [];\n try {\n const [infoRes, stateRes] = await Promise.all([getGroupInfo(creds, gid), getGroupBotState(creds, gid)]);\n if (infoRes.ok && infoRes.json && typeof infoRes.json === \"object\") {\n const j = infoRes.json as Record<string, unknown>;\n lines.push(`QQ\u7FA4\uFF1A${j[\"group_name\"] ?? \"\u2014\"} \u00B7 \u6210\u5458 ${j[\"group_member_num\"] ?? \"\u2014\"}`);\n } else if (!infoRes.ok) {\n const hint = /11253/.test(infoRes.error || infoRes.body || \"\")\n ? \"\u7FA4\u4FE1\u606F\u63A5\u53E3\u672A\u5F00\u901A\u767D\u540D\u5355(11253)\"\n : `\u7FA4\u4FE1\u606F\u5931\u8D25\uFF1A${(infoRes.error || \"\").slice(0, 60)}`;\n lines.push(hint);\n }\n if (stateRes.ok && stateRes.json && typeof stateRes.json === \"object\") {\n const j = stateRes.json as Record<string, unknown>;\n lines.push(\n `\u673A\u5668\u4EBA\uFF1A\u89D2\u8272=${j[\"member_role\"] ?? \"\u2014\"} \u00B7 \u4E3B\u52A8\u63A8\u9001=${j[\"allow_proactive_msg\"] === true ? \"\u5F00\" : \"\u5173\"} \u00B7 \u6536\u6D88\u606F=${j[\"recv_msg_setting\"] ?? \"\u2014\"}`\n );\n }\n } catch (e) {\n lines.push(`\u7FA4\u4FE1\u606F\u5F02\u5E38\uFF1A${(e as Error).message}`);\n }\n return lines;\n}\n\nexport function createMenuHandler(registry: CommandRegistry): CommandHandler {\n return (ctx) =>\n formatCommandMenu({\n title: \"\u4E1C\u65B9\u72AC\u660E\u6E56\",\n home: true,\n subtitle: \"\u6B22\u8FCE\u56DE\u6765\uFF0C\u4ECA\u5929\u4E5F\u4E00\u8D77\u73A9\u5427 (\u2267\u2207\u2266)\uFF89\\n\\n\u67E5\u8BE2\u670D\u52A1\u5668\u4FE1\u606F\uFF0C\u6216\u7BA1\u7406\u4F60\u7684\u6E38\u620F\u8D26\u53F7\u3002\",\n cmds: registry\n .all()\n .filter((c) => c.group === \"home\" && c.name !== \"menu\" && (c.permission !== \"admin\" || isAdmin(ctx))),\n idPrefix: \"home\",\n footerMd: \"\",\n footerText: \"\",\n });\n}\n\nexport function createAdminMenuHandler(registry: CommandRegistry): CommandHandler {\n return (ctx) => {\n if (!isAdmin(ctx)) return { text: \"\u5F53\u524D\u6CA1\u6709\u7BA1\u7406\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002\" };\n return formatCommandMenu({\n title: \"\u670D\u52A1\u5668\u7BA1\u7406\",\n subtitle: \"\u7BA1\u7406\u670D\u52A1\u5668\u4E0E\u7FA4\u63A8\u9001\u3002\",\n cmds: registry.adminMenu(),\n idPrefix: \"admin\",\n footerMd: \"\",\n footerText: \"\",\n });\n };\n}\n\nfunction sectionHandler(registry: CommandRegistry, group: \"server\", title: string): CommandHandler {\n return () =>\n formatCommandMenu({\n title,\n subtitle: \"\u67E5\u770B\u8FD0\u884C\u72B6\u6001\u3001\u5728\u7EBF\u73A9\u5BB6\u548C\u8FDE\u63A5\u65B9\u5F0F\u3002\",\n cmds: registry.all().filter((c) => c.group === group),\n idPrefix: group,\n footerMd: \"\",\n footerText: \"\",\n });\n}\n\nfunction helpHandler(registry: CommandRegistry): CommandHandler {\n return (ctx) => {\n const trigger =\n ctx.inbound.backend === \"official\"\n ? \"\u7FA4\u5185\u5F00\u542F\u300C\u63A5\u6536\u6240\u6709\u6D88\u606F\u300D\u540E\u53EF\u76F4\u63A5\u53D1\u9001\u6307\u4EE4\uFF1B\u5426\u5219\u8BF7 @\u673A\u5668\u4EBA\u3002\u5355\u804A\u76F4\u63A5\u53D1\u9001\u3002\"\n : \"\u76F4\u63A5\u53D1\u9001\u547D\u4EE4\uFF0C\u6216\u5728\u83DC\u5355\u6253\u5F00\u540E 60 \u79D2\u5185\u56DE\u590D\u7F16\u53F7\u3002\";\n const sections = [\n [\"server\", \"\u670D\u52A1\u5668\"],\n [\"account\", \"\u6211\u7684\u8D26\u53F7\"],\n [\"admin\", \"\u7BA1\u7406\"],\n ] as const;\n const lines = [trigger];\n for (const [group, title] of sections) {\n const commands = registry.all().filter((c) => c.group === group && (c.permission !== \"admin\" || isAdmin(ctx)));\n if (!commands.length) continue;\n lines.push(\n \"\",\n `\u3010${title}\u3011`,\n ...commands.map((c) => `${c.name === \"ip\" ? \"ip\" : c.aliases[0] || c.name}\uFF1A${c.description}`)\n );\n }\n lines.push(\"\", \"\u53D1\u9001 \u83DC\u5355 \u8FD4\u56DE\u9996\u9875\uFF0C\u53D1\u9001 \u53D6\u6D88 \u53D6\u6D88\u5F85\u786E\u8BA4\u64CD\u4F5C\u3002\", \"\u539F\u6709\u82F1\u6587\u547D\u4EE4\u53CA /\u547D\u4EE4 \u65B9\u5F0F\u4ECD\u53EF\u4F7F\u7528\u3002\");\n return formatCard(\"\u4F7F\u7528\u5E2E\u52A9\", lines);\n };\n}\n\nexport const serverVersionHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (ep) {\n try {\n const status = await fetchSfmcStatus(ep);\n const bds = status.processes?.bds;\n if (bds?.state === \"running\" && bds.version)\n return formatCard(\"\u7248\u672C\", [\"\u6E38\u620F\u7C7B\u578B\uFF1A\u57FA\u5CA9\u7248\", `\u5F53\u524D BDS \u7248\u672C\uFF1A${bds.version}`]);\n } catch (error) {\n log.warn(`BDS \u7248\u672C\u67E5\u8BE2\u5931\u8D25: ${String(error)}`);\n }\n }\n return {\n text: ctx.runtimeInfo.publicServer?.version\n ? `\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u5B9E\u9645 BDS \u7248\u672C\u3002\\n\u7BA1\u7406\u5458\u63D0\u4F9B\u7684\u5165\u670D\u8BF4\u660E\uFF1A${ctx.runtimeInfo.publicServer.version}`\n : \"\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u5B9E\u9645 BDS \u7248\u672C\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u786E\u8BA4\u5165\u670D\u7248\u672C\u3002\",\n };\n};\nexport const serverAddressHandler: CommandHandler = (ctx) => {\n const info = ctx.runtimeInfo.publicServer;\n return formatCard(\n \"\u8FDE\u63A5\u5730\u5740\",\n info?.address\n ? [\n \"\u6E38\u620F\u7C7B\u578B\uFF1A\u57FA\u5CA9\u7248\",\n `\u670D\u52A1\u5668\u5730\u5740\uFF1A${info.address}`,\n `\u7AEF\u53E3\uFF1A${info.port ?? 19132}`,\n \"\",\n \"\u5728\u6E38\u620F\u5185\u9009\u62E9\u300C\u6DFB\u52A0\u670D\u52A1\u5668\u300D\uFF0C\u586B\u5199\u4EE5\u4E0A\u4FE1\u606F\u3002\",\n ]\n : [\"\u6682\u672A\u516C\u5E03\u670D\u52A1\u5668\u5730\u5740\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u83B7\u53D6\u3002\"]\n );\n};\n\nexport const pingHandler: CommandHandler = (ctx) => ({\n text: `\u673A\u5668\u4EBA\u8FDE\u63A5\u6B63\u5E38\uFF0C\u5DF2\u8FD0\u884C ${formatUptime(ctx.startedAt)}`,\n});\n\nexport const whoamiHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const me = await fetchBindMe(ep, ctx.inbound.userId);\n if (me.success === false) return failure(\"\u7ED1\u5B9A\u67E5\u8BE2\u5931\u8D25\");\n return {\n ...formatAccountCard({\n bound: !!me.bound,\n ...(me.binding?.player_name ? { playerName: me.binding.player_name } : {}),\n ...(me.profile ? { profile: me.profile } : {}),\n }),\n buttons: me.bound\n ? [{ id: \"unbind\", label: \"\u89E3\u7ED1\", command: \"/unbind\" }]\n : [{ id: \"bind\", label: \"\u7ED1\u5B9A\", command: \"/bind\" }],\n };\n};\n\nexport const statusHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n let st: SfmcStatusResponse;\n try {\n st = await fetchSfmcStatus(ep);\n } catch (error) {\n log.warn(`\u67E5\u670D\u72B6\u6001\u63A5\u53E3\u4E0D\u53EF\u7528: ${String(error)}`);\n return formatCard(\"\u670D\u52A1\u5668\u72B6\u6001\", [\"\u6682\u65F6\u65E0\u6CD5\u8FDE\u63A5\u72B6\u6001\u670D\u52A1\uFF0C\u65E0\u6CD5\u786E\u8BA4\u6E38\u620F\u670D\u52A1\u5668\u662F\u5426\u8FD0\u884C\u3002\", \"\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u8054\u7CFB\u7BA1\u7406\u5458\u3002\"]);\n }\n const state = st.processes?.bds;\n const running = state?.state === \"running\" || state?.running === true;\n const stopped = state?.state === \"stopped\" || state?.running === false;\n const onlineText = stopped\n ? \"0 \u4EBA\"\n : st.note || !Array.isArray(st.online)\n ? \"\u6570\u636E\u6682\u4E0D\u53EF\u786E\u8BA4\"\n : `${st.online.length} \u4EBA`;\n const age =\n typeof st.updatedAt === \"number\" ? `${Math.max(0, Math.floor((Date.now() - st.updatedAt) / 1000))} \u79D2\u524D` : \"\u672A\u77E5\";\n return {\n ...formatCard(\"\u670D\u52A1\u5668\u72B6\u6001\", [\n `\u8FD0\u884C\u72B6\u6001\uFF1A${running ? \"\u8FD0\u884C\u4E2D\" : stopped ? \"\u672A\u8FD0\u884C\" : \"\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\"}`,\n `\u5728\u7EBF\u73A9\u5BB6\uFF1A${onlineText}`,\n `\u4E16\u754C\u65E5\uFF1A${st.world?.day ?? \"\u672A\u77E5\"}`,\n `\u96BE\u5EA6\uFF1A${st.world?.difficulty ?? \"\u672A\u77E5\"}`,\n `\u6570\u636E\u66F4\u65B0\uFF1A${age}`,\n ...(st.note && running ? [\"\u5728\u7EBF\u6570\u636E\u6682\u4E0D\u53EF\u786E\u8BA4\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002\"] : []),\n ]),\n buttons: [\n { id: \"online\", label: \"\u5728\u7EBF\u73A9\u5BB6\", command: \"/online\" },\n { id: \"version\", label: \"\u7248\u672C\", command: \"/version\" },\n { id: \"ip\", label: \"\u8FDE\u63A5\u5730\u5740\", command: \"/ip\" },\n { id: \"refresh_status\", label: \"\u5237\u65B0\u72B6\u6001\", command: \"/status\" },\n ],\n };\n};\n\nexport const onlineHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const st = await fetchSfmcStatus(ep);\n if (st.processes?.bds?.state === \"stopped\") return formatCard(\"\u5728\u7EBF\u73A9\u5BB6\", [\"\u670D\u52A1\u5668\u672A\u8FD0\u884C\uFF0C\u5F53\u524D\u6CA1\u6709\u5728\u7EBF\u73A9\u5BB6\u3002\"]);\n if (!Array.isArray(st.online) || st.note) return { text: \"\u5728\u7EBF\u6570\u636E\u6682\u4E0D\u53EF\u786E\u8BA4\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002\" };\n if (!st.online.length) return formatCard(\"\u5728\u7EBF\u73A9\u5BB6\", [\"\u5F53\u524D\u6CA1\u6709\u5728\u7EBF\u73A9\u5BB6\u3002\"]);\n return {\n ...formatCard(\"\u5728\u7EBF\u73A9\u5BB6\", [\n `\u5F53\u524D\u5728\u7EBF ${st.online.length} \u4EBA`,\n \"\",\n ...st.online.map((p, i) => `${i + 1}. ${p.name || \"\u672A\u547D\u540D\u73A9\u5BB6\"}`),\n ]),\n };\n};\n\nexport const bindHandler: CommandHandler = async (ctx: CommandContext): Promise<CommandResult> => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n try {\n const { status, data } = await postBindRequest(ep, {\n openid: ctx.inbound.userId,\n qq_backend: ctx.inbound.backend,\n });\n if (status === 409 || data.error === \"already_bound\") {\n return {\n text: `\u4F60\u5DF2\u7ED1\u5B9A MC \u73A9\u5BB6\u300C${data.player_name || \"?\"}\u300D\u3002\u5982\u9700\u6362\u7ED1\u8BF7\u5148\u53D1\u9001\u300C\u89E3\u7ED1\u300D\u3002`,\n };\n }\n if (!data.success || !data.code) {\n return failure(data.error);\n }\n // \u672A\u7ED1\u5B9A\u4E5F\u80FD\u8FDB\u670D\uFF0C\u4F46\u6E38\u620F\u5185\u4F1A\u88AB\u9501\u6210\u8BBF\u5BA2\uFF1B\u9A8C\u8BC1\u7801\u5FC5\u987B\u5728\u6E38\u620F\u804A\u5929\u91CC\u6838\u9500\u3002\n return formatCard(\"\u7ED1\u5B9A\u8D26\u53F7\", [\n `\u7ED1\u5B9A\u7801\uFF1A${data.code}`,\n \"\",\n \"\u8FDB\u5165\u670D\u52A1\u5668\u540E\u5B8C\u6210\u4E0B\u9762\u4E24\u6B65\uFF1A\",\n \"1. \u5728\u6E38\u620F\u5185\u6267\u884C /c:bind\",\n \"2. \u5728 60 \u79D2\u5185\u628A\u4EE5\u4E0A\u7EAF\u6570\u5B57\u9A8C\u8BC1\u7801\u53D1\u5230\u6E38\u620F\u804A\u5929\",\n \"\",\n \"\u7ED1\u5B9A\u6210\u529F\u540E\u5373\u53EF\u81EA\u7531\u6D3B\u52A8\u3002\",\n \"\u8D85\u65F6\u8BF7\u91CD\u65B0\u53D1\u9001\u300C\u7ED1\u5B9A\u300D\u83B7\u53D6\u9A8C\u8BC1\u7801\u3002\",\n ]);\n } catch (e) {\n return failure(e);\n }\n};\n\nexport const unbindHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const me = await fetchBindMe(ep, ctx.inbound.userId);\n if (me.success === false) return failure(\"\u7ED1\u5B9A\u67E5\u8BE2\u5931\u8D25\");\n if (!me.bound || !me.binding) return { text: \"\u5F53\u524D\u6CA1\u6709\u7ED1\u5B9A\u8BB0\u5F55\u3002\" };\n const original = me.binding;\n return {\n text: \"\u786E\u8BA4\u89E3\u7ED1\",\n confirmation: {\n summary: `\u5373\u5C06\u89E3\u9664\u4F60\u4E0E\u300C${original.player_name || \"\u672A\u547D\u540D\u89D2\u8272\"}\u300D\u7684\u7ED1\u5B9A\u3002\u4E4B\u540E\u9700\u8981\u91CD\u65B0\u7533\u8BF7\u9A8C\u8BC1\u7801\u624D\u80FD\u7ED1\u5B9A\u3002`,\n execute: async (confirmed) => {\n const current = await fetchBindMe(ep, confirmed.inbound.userId);\n if (current.success === false) return failure(\"\u7ED1\u5B9A\u6838\u9A8C\u5931\u8D25\");\n if (\n !current.bound ||\n current.binding?.player_xuid !== original.player_xuid ||\n current.binding?.bound_at !== original.bound_at\n ) {\n return { text: \"\u7ED1\u5B9A\u72B6\u6001\u5DF2\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u67E5\u8BE2\u300C\u6211\u7684\u8D26\u53F7\u300D\u540E\u518D\u64CD\u4F5C\u3002\" };\n }\n const { data } = await postBindUnbind(ep, { openid: confirmed.inbound.userId });\n if (data.success === false) return failure(data.error);\n return { text: data.unbound ? \"\u5DF2\u89E3\u9664 QQ \u4E0E\u6E38\u620F\u89D2\u8272\u7684\u7ED1\u5B9A\u3002\" : \"\u5F53\u524D\u6CA1\u6709\u7ED1\u5B9A\u8BB0\u5F55\u3002\" };\n },\n },\n };\n};\n\nexport const groupInfoHandler: CommandHandler = async (ctx: CommandContext): Promise<CommandResult> => {\n const lines = await fetchQqGroupLines(ctx);\n if (lines.length === 0) {\n return { text: \"\u7FA4\u4FE1\u606F\u4EC5\u5B98\u65B9\u540E\u7AEF\u53EF\u7528\uFF0C\u4E14\u9700\u914D\u7F6E official.group_openid / \u51ED\u8BC1\u3002\" };\n }\n return { text: [\"QQ \u7FA4\u4FE1\u606F\", ...lines].join(\"\\n\") };\n};\n\n/**\n * \u300C\u5165\u670D\u300D\u8BF4\u660E\u9875\u3002\n * \u4E0D\u518D\u8D70\u5165\u670D\u7533\u8BF7\u3002\u73A9\u5BB6\u76F4\u63A5\u8FDB\u670D\uFF1B\u672A\u7ED1\u5B9A\u4E3A\u8BBF\u5BA2\u4E14\u4E0D\u80FD\u79FB\u52A8\uFF0C\u7ED1\u5B9A\u5199\u5165\u81EA\u6709\u767D\u540D\u5355\u540E\u5373\u53EF\u6E38\u73A9\u3002\n */\nexport const entryGuideHandler: CommandHandler = (): CommandResult =>\n formatCard(\"\u8FDB\u670D\u8BF4\u660E\", [\n \"\u76F4\u63A5\u8FDB\u5165\u670D\u52A1\u5668\u5373\u53EF\u3002\",\n \"\",\n \"\u672A\u7ED1\u5B9A\u7684\u89D2\u8272\u53EF\u4EE5\u8FDB\u670D\uFF0C\u4F46\u65E0\u6CD5\u79FB\u52A8\uFF0C\u6743\u9650\u4E3A\u8BBF\u5BA2\u3002\",\n \"\u804A\u5929\u680F\u4F1A\u63D0\u793A\u7ED1\u5B9A\u6B65\u9AA4\u3002\",\n \"\u5728 QQ \u53D1\u9001\u300C\u7ED1\u5B9A\u300D\u83B7\u53D6\u9A8C\u8BC1\u7801\uFF0C\u8FDB\u670D\u540E\u6267\u884C /c:bind\uFF0C\u518D\u628A\u9A8C\u8BC1\u7801\u53D1\u5230\u6E38\u620F\u804A\u5929\u3002\",\n \"\u7ED1\u5B9A\u6210\u529F\u540E\u5373\u53EF\u6B63\u5E38\u6E38\u73A9\u3002\",\n ]);\n\n/**\n * \u65E7\u7684\u5165\u670D\u7533\u8BF7\u3001\u5BA1\u6279\u548C\u767D\u540D\u5355\u5F00\u5173\u3002\n * \u4FDD\u7559\u8FD9\u4E9B\u89E6\u53D1\u8BCD\uFF0C\u8BA9\u65E7\u6309\u94AE\u548C\u4E60\u60EF\u547D\u4EE4\u6709\u660E\u786E\u56DE\u590D\uFF1B\u4E0D\u518D\u521B\u5EFA\u7533\u8BF7\uFF0C\u4E5F\u4E0D\u518D\u6539\u5BA1\u6279\u5F00\u5173\u3002\n */\nexport const retiredJoinFlowHandler: CommandHandler = (): CommandResult => ({\n text: \"\u5165\u670D\u7533\u8BF7\u5DF2\u5173\u95ED\u3002\u76F4\u63A5\u8FDB\u5165\u670D\u52A1\u5668\uFF0C\u5728\u6E38\u620F\u5185\u6309\u804A\u5929\u63D0\u793A\u5B8C\u6210\u7ED1\u5B9A\u540E\u5373\u53EF\u6E38\u73A9\u3002\u7ED1\u5B9A\u6210\u529F\u4F1A\u5199\u5165\u767D\u540D\u5355\u5E76\u89E3\u9664\u8BBF\u5BA2\u9650\u5236\u3002\",\n});\n\nconst EVENT_SWITCHES = [\n [\"enabled\", \"\u603B\u5F00\u5173\"],\n [\"start\", \"\u542F\u52A8\"],\n [\"stop\", \"\u505C\u670D\"],\n [\"crash\", \"\u5F02\u5E38\u9000\u51FA\"],\n [\"join\", \"\u4E0A\u7EBF\"],\n [\"leave\", \"\u4E0B\u7EBF\"],\n [\"death\", \"\u6B7B\u4EA1\"],\n] as const;\n\nfunction eventSettingsPanel(settings: QqEventSettings, prefix = \"\"): CommandResult {\n const rows: Array<[string, string]> = EVENT_SWITCHES.map(([field, label]): [string, string] => [\n label,\n settings[field] ? \"\u5F00\" : \"\u5173\",\n ]);\n const textRows = rows.map(([label, value]) => `\u2502 ${label}${\"\u3000\".repeat(4 - label.length)} \u2502 ${value} \u2502`);\n const buttons = EVENT_SWITCHES.map(([field, label]) => ({\n id: `events_${field}`,\n label: `${label} ${settings[field] ? \"\u5173\" : \"\u5F00\"}`,\n command: `/events ${label} ${settings[field] ? \"\u5173\" : \"\u5F00\"}`,\n }));\n return {\n text: [\n \"\u63A8\u9001\u8BBE\u7F6E\",\n ...(prefix ? [prefix] : []),\n \"\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\",\n \"\u2502 \u9879\u76EE\u3000\u3000 \u2502 \u72B6\u6001\u3000 \u2502\",\n \"\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\",\n ...textRows,\n \"\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\",\n \"\u6240\u6709\u4E8B\u4EF6\u5B9E\u65F6\u53D1\u9001\u3002\",\n ].join(\"\\n\"),\n markdown: [\n \"## \u63A8\u9001\u8BBE\u7F6E\",\n ...(prefix ? [\"\", prefix] : []),\n \"\",\n \"| \u9879\u76EE | \u72B6\u6001 |\",\n \"| --- | --- |\",\n ...rows.map(([label, value]) => `| ${label} | **${value}** |`),\n \"\",\n \"_\u6240\u6709\u4E8B\u4EF6\u5B9E\u65F6\u53D1\u9001_\",\n ].join(\"\\n\"),\n buttons,\n };\n}\n\nexport const eventSettingsHandler: CommandHandler = async (ctx): Promise<CommandResult> => {\n if (!isAdmin(ctx)) return { text: \"\u5F53\u524D\u6CA1\u6709\u7BA1\u7406\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002\" };\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const rest = ctx.inbound.text.replace(/^\\/?(?:events|\u4E8B\u4EF6\u63A8\u9001|\u4E8B\u4EF6\u914D\u7F6E)\\s*/i, \"\").trim();\n try {\n if (!rest) {\n const data = await fetchQqEventSettings(ep);\n return data.success && data.settings ? eventSettingsPanel(data.settings) : failure(data.error);\n }\n // \u65E7\u9762\u677F\u7684\u300C\u805A\u5408\u95F4\u9694\u300D\u6309\u94AE\u6216\u4E60\u60EF\u547D\u4EE4\u4ECD\u53EF\u80FD\u53D1\u6765\uFF0C\u7ED9\u51FA\u660E\u786E\u56DE\u590D\n if (/^\u95F4\u9694(\\s+\\d+)?$/.test(rest)) return { text: \"\u4E8B\u4EF6\u63A8\u9001\u5DF2\u6539\u4E3A\u5B9E\u65F6\u53D1\u9001\uFF0C\u4E0D\u518D\u6709\u805A\u5408\u95F4\u9694\u3002\" };\n const match = /^(\u603B\u5F00\u5173|\u542F\u52A8|\u505C\u670D|\u5F02\u5E38\u9000\u51FA|\u4E0A\u7EBF|\u4E0B\u7EBF|\u6B7B\u4EA1)\\s+(\u5F00|\u5173)$/.exec(rest);\n if (!match) return { text: \"\u53D1\u9001\u300C\u4E8B\u4EF6\u63A8\u9001\u300D\u6253\u5F00\u5F00\u5173\u9762\u677F\uFF0C\u6216\u9009\u62E9\u9762\u677F\u4E2D\u7684\u64CD\u4F5C\u3002\" };\n const item = EVENT_SWITCHES.find(([, label]) => label === match[1]);\n if (!item) return { text: \"\u6CA1\u6709\u8FD9\u4E2A\u4E8B\u4EF6\u5F00\u5173\u3002\" };\n const [field] = item;\n const value = match[2] === \"\u5F00\";\n const execute: CommandHandler = async (confirmed) => {\n try {\n const data = await postQqEventSettings(ep, {\n openid: confirmed.inbound.userId,\n as_group_admin: asGroupAdminField(confirmed),\n field,\n value,\n });\n return data.success && data.settings ? eventSettingsPanel(data.settings, \"\u5DF2\u4FDD\u5B58\") : failure(data.error);\n } catch (error) {\n return failure(error);\n }\n };\n if (field === \"enabled\" && !value) {\n return {\n text: \"\u786E\u8BA4\u5173\u95ED\u4E8B\u4EF6\u63A8\u9001\",\n confirmation: { summary: \"\u5373\u5C06\u5173\u95ED\u5168\u90E8\u670D\u52A1\u5668\u4E8B\u4EF6\u7FA4\u63A8\u9001\u3002\", execute },\n };\n }\n return execute(ctx);\n } catch (error) {\n return failure(error);\n }\n};\n\n/** \u9891\u9053 + \u8F7B\u91CF\u81EA\u68C0\uFF08\u4EBA\u4EBA\u53EF\u7528\uFF09 */\nexport const channelHandler: CommandHandler = () => ({\n text: \"QQ\u7FA4\u6D88\u606F\u8FDB\u5165\u6E38\u620F\u5185\u5DF2\u5F00\u542F\u300CQQ\u300D\u6D88\u606F\u6765\u6E90\u7684\u9891\u9053\u3002\u6E38\u620F\u5185\u5404\u9891\u9053\u53EF\u5206\u522B\u8BBE\u7F6E\u662F\u5426\u8F6C\u53D1\u5230 QQ\u3002\",\n});\n\nexport const doctorHandler: CommandHandler = async (ctx) => {\n if (!isAdmin(ctx)) return { text: \"\u5F53\u524D\u6CA1\u6709\u7BA1\u7406\u6743\u9650\u3002\" };\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const st = await fetchSfmcStatus(ep);\n const qq = await fetchQqGroupLines(ctx);\n return {\n text: [\n \"\u7BA1\u7406\u81EA\u68C0\",\n `\u540E\u7AEF\uFF1A${ctx.inbound.backend}`,\n \"QQ \u5165\u7AD9\uFF1A\u5199\u5165\u6D88\u606F\u6765\u6E90\u4E3A QQ \u7684\u6E38\u620F\u9891\u9053\",\n `\u4E3B\u673A\uFF1A${st.host?.hostname || \"\u672A\u77E5\"} \u00B7 ${st.host?.platform || \"\u672A\u77E5\"}`,\n `CPU\uFF1A${st.host?.cpu?.model || \"\u672A\u77E5\"} \u00B7 ${st.host?.cpu?.cores ?? \"\u672A\u77E5\"} \u6838`,\n `\u5185\u5B58\uFF1A${st.host?.memory?.usedMb ?? \"\u672A\u77E5\"}/${st.host?.memory?.totalMb ?? \"\u672A\u77E5\"} MB`,\n `\u4E3B\u673A\u8FD0\u884C\uFF1A${st.host?.uptimeText || \"\u672A\u77E5\"}`,\n `BDS\uFF1A${st.processes?.bds?.state || \"\u672A\u77E5\"} \u00B7 PID ${st.processes?.bds?.pid ?? \"\u672A\u77E5\"} \u00B7 ${st.processes?.bds?.uptimeText || \"\u672A\u77E5\"}`,\n `\u6570\u636E\u5E93\uFF1APID ${st.processes?.db?.pid ?? \"\u672A\u77E5\"} \u00B7 ${st.processes?.db?.uptimeText || \"\u672A\u77E5\"}`,\n ...qq,\n ].join(\"\\n\"),\n };\n};\n\n/** \u67E5\u8BE2\u5DF2\u5B89\u88C5\u6A21\u5757\u3002\u53EF\u52A0\u5173\u952E\u5B57\uFF0C\u4F8B\u5982\u300C\u6A21\u5757 \u804A\u5929\u300D\u3002 */\nexport const modulesHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n const keyword = ctx.inbound.text.replace(/^\\/?(\u6A21\u5757|modules)\\s*/i, \"\").trim();\n try {\n const data = await fetchContent(ep);\n if (data.success === false) return failure(data.error);\n return formatCard(\"\u6A21\u5757\", formatModuleLines(data.modules ?? [], keyword));\n } catch (error) {\n return failure(error);\n }\n};\n\n/** \u67E5\u8BE2\u4E16\u754C\u5DF2\u5B89\u88C5\u7684\u884C\u4E3A\u5305\u548C\u8D44\u6E90\u5305\u3002\u65E7\u5FEB\u7167\u6CA1\u6709 packs \u65F6\uFF0C\u628A\u5DF2\u542F\u7528\u8D44\u6E90\u5305\u5F53\u4F5C\u8D44\u6E90\u5305\u6BB5\u3002 */\nexport const packsHandler: CommandHandler = async (ctx) => {\n const ep = dbEp(ctx);\n if (!ep) return failure(\"db \u672A\u914D\u7F6E\");\n try {\n const data = await fetchContent(ep);\n if (data.success === false) return failure(data.error);\n const packs =\n data.packs ??\n (data.resource_packs ?? []).map((pack) => ({\n kind: \"resource\" as const,\n enabled: true,\n ...(pack.name ? { name: pack.name } : {}),\n ...(pack.pack_id ? { pack_id: pack.pack_id } : {}),\n ...(pack.version ? { version: pack.version } : {}),\n }));\n return {\n text: [\"\u8D44\u6E90\u5305\", \"\", ...formatPackLines(packs, data.note)].join(\"\\n\"),\n markdown: formatPackMarkdown(packs, data.note),\n };\n } catch (error) {\n return failure(error);\n }\n};\n\n/** \u6CE8\u518C\u8868\u540C\u65F6\u9A71\u52A8\u83DC\u5355\u3001\u5E2E\u52A9\u548C\u6743\u9650\u3002 */\nexport function registerBuiltinCommands(registry: CommandRegistry): void {\n const add = (\n name: string,\n aliases: string[],\n description: string,\n handler: CommandHandler,\n group: \"home\" | \"server\" | \"account\" | \"join\" | \"help\" | \"admin\",\n admin = false\n ) =>\n registry.register({\n name,\n aliases,\n description,\n handler,\n group,\n permission: admin ? \"admin\" : \"player\",\n adminMenu: group === \"admin\",\n });\n add(\"menu\", [\"\u83DC\u5355\"], \"\u8FD4\u56DE\u9996\u9875\", createMenuHandler(registry), \"home\");\n add(\n \"server\",\n [\"\u670D\u52A1\u5668\"],\n \"\u67E5\u770B\u8FD0\u884C\u72B6\u6001\u3001\u5728\u7EBF\u73A9\u5BB6\u548C\u8FDE\u63A5\u65B9\u5F0F\",\n sectionHandler(registry, \"server\", \"\u670D\u52A1\u5668\u4FE1\u606F\"),\n \"home\"\n );\n add(\"account\", [\"\u6211\u7684\u8D26\u53F7\"], \"\u67E5\u770B\u4E0E\u7BA1\u7406\u6E38\u620F\u89D2\u8272\u7ED1\u5B9A\", whoamiHandler, \"home\");\n add(\"entry\", [\"\u5165\u670D\"], \"\u76F4\u63A5\u8FDB\u670D\uFF0C\u6E38\u620F\u5185\u7ED1\u5B9A\u540E\u5373\u53EF\u6E38\u73A9\", entryGuideHandler, \"home\");\n add(\"help\", [\"\u5E2E\u52A9\"], \"\u67E5\u770B\u4F7F\u7528\u8BF4\u660E\u548C\u5E38\u7528\u547D\u4EE4\", helpHandler(registry), \"home\");\n add(\"admin\", [\"\u7BA1\u7406\"], \"\u7BA1\u7406\u83DC\u5355\", createAdminMenuHandler(registry), \"home\", true);\n add(\"status\", [\"\u67E5\u670D\", \"\u72B6\u6001\"], \"\u670D\u52A1\u5668\u8FD0\u884C\u72B6\u6001\", statusHandler, \"server\");\n add(\"online\", [\"\u5728\u7EBF\"], \"\u5B8C\u6574\u5728\u7EBF\u540D\u5355\", onlineHandler, \"server\");\n add(\"version\", [\"\u7248\u672C\"], \"\u57FA\u5CA9\u7248\u5165\u670D\u7248\u672C\", serverVersionHandler, \"server\");\n add(\"ip\", [\"\u5730\u5740\"], \"\u516C\u5F00\u670D\u52A1\u5668\u5730\u5740\u4E0E\u7AEF\u53E3\", serverAddressHandler, \"server\");\n add(\"modules\", [\"\u6A21\u5757\"], \"\u67E5\u770B\u5DF2\u5B89\u88C5\u6A21\u5757\", modulesHandler, \"server\");\n add(\"packs\", [\"\u8D44\u6E90\u5305\", \"\u884C\u4E3A\u5305\", \"\u8D44\u6E90\u5305\"], \"\u67E5\u770B\u4E16\u754C\u884C\u4E3A\u5305\u548C\u8D44\u6E90\u5305\", packsHandler, \"server\");\n add(\"channel\", [\"\u9891\u9053\"], \"\u804A\u5929\u4E92\u901A\u72B6\u6001\", channelHandler, \"server\");\n add(\"ping\", [], \"\u673A\u5668\u4EBA\u8FDE\u901A\u6027\", pingHandler, \"server\");\n add(\"whoami\", [\"\u6211\u7684\u7ED1\u5B9A\"], \"\u67E5\u770B\u7ED1\u5B9A\u89D2\u8272\", whoamiHandler, \"account\");\n add(\"bind\", [\"\u7ED1\u5B9A\"], \"\u7533\u8BF7\u7ED1\u5B9A\u9A8C\u8BC1\u7801\", bindHandler, \"account\");\n add(\"unbind\", [\"\u89E3\u7ED1\"], \"\u786E\u8BA4\u89E3\u9664\u7ED1\u5B9A\", unbindHandler, \"account\");\n add(\n \"join\",\n [\"\u7533\u8BF7\u5165\u670D\", \"\u901A\u8FC7\", \"\u62D2\u7EDD\", \"\u5F85\u5BA1\", \"approve\", \"reject\", \"pending\", \"\u914D\u7F6E\", \"\u5165\u670D\u914D\u7F6E\", \"config\"],\n \"\u5165\u670D\u7533\u8BF7\u5DF2\u5173\u95ED\uFF0C\u8BF7\u76F4\u63A5\u8FDB\u670D\u5E76\u7ED1\u5B9A\",\n retiredJoinFlowHandler,\n \"help\"\n );\n add(\"doctor\", [\"\u81EA\u68C0\"], \"\u8FDE\u901A\u4E0E\u8FD0\u884C\u8BCA\u65AD\", doctorHandler, \"admin\", true);\n add(\"group\", [\"\u7FA4\u4FE1\u606F\"], \"\u5B98\u65B9 QQ \u7FA4\u4FE1\u606F\", groupInfoHandler, \"admin\", true);\n add(\"events\", [\"\u4E8B\u4EF6\u63A8\u9001\", \"\u4E8B\u4EF6\u914D\u7F6E\"], \"\u670D\u52A1\u5668\u4E8B\u4EF6\u63A8\u9001\u5F00\u5173\", eventSettingsHandler, \"admin\", true);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sfmc-bds/qq-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "SFMC QQ ↔ MC bridge — official QQ Open Platform Bot and/or LLBot OneBot 11",
|
|
5
5
|
"author": "Shiroha7z",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
],
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"ws": "^8.21.1",
|
|
36
|
-
"@sfmc-bds/sdk": "0.3.
|
|
36
|
+
"@sfmc-bds/sdk": "0.3.2"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@sfmc-bds/tools": "0.2.
|
|
39
|
+
"@sfmc-bds/tools": "0.2.7"
|
|
40
40
|
},
|
|
41
41
|
"publishConfig": {
|
|
42
42
|
"access": "public",
|