koishi-plugin-node-async-bot-all 2.29.0 → 2.31.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/lib/commands.d.ts CHANGED
@@ -7,22 +7,6 @@ declare module 'koishi' {
7
7
  puppeteer: Puppeteer;
8
8
  }
9
9
  }
10
- export interface APIUserInfo {
11
- qq: string;
12
- nickname: string;
13
- long_nick: string;
14
- avatar_url: string;
15
- age: number;
16
- sex: string;
17
- qid: string;
18
- qq_level: number;
19
- location: string;
20
- email: string;
21
- is_vip: boolean;
22
- vip_level: number;
23
- reg_time: string;
24
- last_updated: string;
25
- }
26
10
  export interface APINews {
27
11
  appnews: AppNews;
28
12
  }
@@ -60,24 +44,17 @@ export interface MonitorStatusResponse {
60
44
  heartbeatList: HeartbeatList;
61
45
  uptimeList: UptimeList;
62
46
  }
63
- export declare function getServer(ctx: Context, session: Session): Promise<Object>;
47
+ export declare function getServer(ctx: Context, session: Session): Promise<number>;
64
48
  export declare function getStatus(ctx: Context, session: Session): Promise<Object>;
65
49
  export declare function getRandom(ctx: Context, session: Session, min: number, max: number): Promise<Object>;
66
50
  export declare function getInfo(ctx: Context, session: Session): Promise<Object>;
67
51
  export declare function getRandomWord(ctx: Context, session: Session): Promise<Object>;
68
52
  export declare function getBlueArchive(ctx: Context, session: Session): Promise<Number>;
69
- export declare function centerServerTest(ctx: Context, session: Session): Promise<{
70
- success: string;
71
- data: object;
72
- }>;
73
- export declare function getMeme(ctx: Context, session: Session, count: number): Promise<Number>;
53
+ export declare function centerServerTest(ctx: Context, session: Session): Promise<number>;
74
54
  export declare function getCat(ctx: Context, session: Session): Promise<Number>;
75
- export declare function getQQInfo(ctx: Context, session: Session, qq: string): Promise<number>;
76
- export declare function getMsg(ctx: Context, session: Session, inversion: boolean | undefined): Promise<number>;
77
55
  export declare function getNewsMsg(ctx: Context, type: number): Promise<{
78
56
  success: boolean;
79
57
  data?: Buffer;
80
58
  msg: string;
81
59
  }>;
82
- export declare function getUse(ctx: Context, session: Session, qq: string, desc: string | undefined): Promise<number>;
83
60
  export {};
package/lib/fun.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Context } from "koishi";
2
- import { APINews, APIUserInfo } from "./commands.ts";
2
+ import { APINews } from "./commands.ts";
3
3
  import { JavaStatusResponse } from 'minecraft-server-util';
4
4
  export type HttpResponse<T> = {
5
5
  success: true;
@@ -31,13 +31,15 @@ export declare function getSystemUsage(): Promise<{
31
31
  success: 1;
32
32
  }>;
33
33
  export declare function getHongKongTime(): string;
34
- export declare function readInfoFile(ctx: Context): Promise<string>;
34
+ export declare function readInfo(ctx: Context): Promise<{
35
+ version: string;
36
+ koishiVersion: string;
37
+ nodeVersion: string;
38
+ } | string>;
35
39
  export declare function formatTimestampDiff(start: number, end: number): string;
36
40
  export declare function getMsgCount(ctx: Context): Promise<Object>;
37
41
  export declare function random(type: number | undefined, data: number | number[], data2?: number): number;
38
42
  export declare function request<T = any>(url: string, options?: RequestInit, timeout?: number, log?: any): Promise<HttpResponse<T>>;
39
- export declare function readUserCardFile(userInfo: APIUserInfo): Promise<string>;
40
- export declare function readUserMsgFile(userName: string, userAvatar: string, msg: string, inversion: boolean | undefined, replyUserName: string | undefined, replyMsg: string | undefined): Promise<string>;
41
43
  export declare function queryA2S(host: string, log: any): Promise<serverInfo>;
42
44
  export declare function readNewsFile(info: APINews, log: any): Promise<string[]>;
43
45
  export declare function translateAPI(log: any, text: string): Promise<string>;
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Context, Dict, Schema } from 'koishi';
1
+ import { Context, Schema } from 'koishi';
2
2
  export declare const inject: string[];
3
3
  declare module 'koishi' {
4
4
  interface Tables {
@@ -26,22 +26,14 @@ interface ConfigV3Server {
26
26
  note: string;
27
27
  type: "mc" | "a2s" | null | undefined;
28
28
  }
29
- interface CenterServerConfig {
30
- id: string;
31
- name: string;
32
- }
33
29
  export interface Config {
34
30
  cxV3: Array<ConfigCxV3>;
35
31
  rwAPI: string;
36
32
  htmlTimeout: number;
37
33
  timeout: number;
38
34
  baAPI: string[];
39
- slTest: CenterServerConfig[];
40
- steamAPI: string;
41
35
  newsAPI: string;
42
- memesAPI: Dict<string>;
43
36
  catAPI: string;
44
- qqAPI: string;
45
37
  slNews: string[];
46
38
  specialMsg: string[];
47
39
  reactionId: number[];
package/lib/index.js CHANGED
@@ -34,7 +34,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
34
34
  // src/locales/zh-CN.yml
35
35
  var require_zh_CN = __commonJS({
36
36
  "src/locales/zh-CN.yml"(exports2, module2) {
37
- module2.exports = { noApi: "未指定 API", noop: "无", unknownError: "未知错误。", commands: { na: { description: "NodeAsync Bot" }, cxgame: { description: "查询服务器当前人数。", messages: { msg: "{time}{list}\n进服指南请在群公告中查看。", list: "【MC 服务器 {count}】\n➣ {version}:{players}\n➣ 玩家列表:{list}\n➣ 备注:{note}", listNoPlayer: "【MC 服务器 {count}】\n➣ {version}:{players}\n➣ 备注:{note}", listFailed: "【MC 服务器 {count}】\n➣ 查询失败:{data}\n➣ 请稍后重试。\n➣ 备注:{note}", listA2S: "【A2S 服务器 {count}】\n {version}:{players}\n 机器人:{bots}\n 备注:{note}", listFailedA2S: "【A2S 服务器 {count}】\n➣ 查询失败:{data}\n➣ 请稍后重试。\n➣ 备注:{note}", forbidden: "{time}\n此指令不允许在本群使用。", failed: "{time}\n查询失败:{data}", timeout: "请求超时。", fewData: "服务端返回的数据过少。", close: "服务器已关闭。", host: "没有到主机的路由。", dns: "解析失败。" } }, status: { description: "查询机器人状态。", messages: { msg: "{time}\n--- 系统状态 ---\n系统名称:{name}\nCPU使用率:{cpu}\n内存使用率:{memory}\n--- 机器人状态 ---\n昨日收/发消息数量:{msgCount}\n机器人版本:{version}\n运行时间:{online}", failed: "{time}\n状态获取失败。" } }, random: { description: "随机数生成器。", usage: "缺少参数时默认生成 0-10000 的随机数。\n使用示例:", examples: "random 1 128 生成1到128范围的随机数", messages: { msg: "{time}\n生成的随机数:{data}" } }, info: { description: "查询机器人信息。", messages: { msg: "{data}", failed: "{time}\n读取信息失败。" } }, rw: { description: "随机名言名句。", messages: { msg: "{time}\n{data}", failed: "{time}\n获取失败({data})。" } }, randomba: { description: "随机BA图。", messages: { msg: "{quote}{image}" } }, centerservertest: { description: "查看中心服务器状态。", messages: { msg: "{time}{list}", list: "== {name} ==\n状态:{status}\n存活率:{uptime}\n检测时间:{time}", listFailed: "== {name} ==\n查看失败:{data}", failed: "{time}\n查看失败:{data}", statusLive: "✅ 正常", statusDie: "❌ 故障", dataFail: "未能获取到此服务器的状态信息。" } }, meme: { description: "群友的怪话!", usage: "不带参数时随机查看\n带参数时为查看指定 meme", examples: "meme\nmeme 1145", messages: { msg: "{quote}{time}\n{image}\n{title}", failed: "{quote}{time}\n获取失败:{data}", forbidden: "{quote}{time}\n此指令不允许在本群使用。" } }, randomcat: { description: "随机猫猫图。", messages: { msg: "{quote}{image}", failed: "{quote}{time}\n获取失败:{data}" } }, getqqinfo: { description: "获取 QQ 号的信息。", usage: "获取 QQ 号的信息。", examples: "getqqinfo 10001", messages: { msg: "{quote}{image}", failed: "{quote}{time}\n获取失败:{data}", command: "QQ 号不正确。" } }, msg2img: { description: "引用一个消息并使用此指令,即可将消息转图。", usage: "引用一条消息,/m。(不要带@)", messages: { msg: "{quote}{image}", failed: "{quote}{time}\n获取失败:{data}", null: "未引用任何消息。", matroska: "{quote}禁止套娃!" } }, slnews: { description: "抓取 NorthWood 的 Steam 最新新闻。" }, use: { description: "使用 TA !", usage: "use @用户", examples: "use @用户", messages: { command: "请 @ 一个用户。", msg: "{at} {desc}了 {at2} !" } } } };
37
+ module2.exports = { noApi: "未指定 API", noop: "无", unknownError: "未知错误。", failed: "{quote}{time}\n{error}", "failed-md": "**{time}**\n\n---\n\n{error}", commands: { na: { description: "NodeAsync Bot" }, cxgame: { description: "查询服务器当前人数。", messages: { msg: "{time}{list}\n进服指南请在群公告中查看。", "msg-md": "*{time}*\n\n---\n{list}\n\n---\n\n进服指南请在群公告中查看。", list: "【{name} 服务器 {count}】\n➣ {version}:{players}\n➣ {ne}{list}\n➣ 备注:{note}", "list-md": "## {name} 服务器 {count}\n\n- {version}:{players}\n- {ne}:{list}\n- 备注:{note}", listFailed: "【{name} 服务器 {count}】\n➣ 查询失败:{data}\n➣ 请稍后重试。\n➣ 备注:{note}", "listFailed-md": "## {name} 服务器 {count}\n\n- 查询失败:{data}\n- 请稍后重试。\n- 备注:{note}", timeout: "请求超时。", fewData: "服务端返回的数据过少。", close: "服务器已关闭。", host: "没有到主机的路由。", dns: "解析失败。" } }, status: { description: "查询机器人状态。", messages: { msg: "{time}\n--- 系统状态 ---\n系统名称:{name}\nCPU使用率:{cpu}\n内存使用率:{memory}\n--- 机器人状态 ---\n昨日收/发消息数量:{msgCount}\n机器人版本:{version}\n运行时间:{online}", "msg-md": "*{time}*\n\n---\n\n## 系统状态\n\n- 系统名称:{name}\n- CPU使用率:{cpu}\n- 内存使用率:{memory}\n\n## 机器人状态\n\n- 昨日收/发消息数量:{msgCount}\n- 机器人版本:{version}\n- 运行时间:{online}" } }, random: { description: "随机数生成器。", usage: "缺少参数时默认生成 0-10000 的随机数。\n使用示例:", examples: "random 1 128 生成1到128范围的随机数", messages: { msg: "{time}\n生成了一个随机数:{data}", "msg-md": "*{time}*\n\n---\n\n生成了一个随机数:{data}" } }, info: { description: "查询机器人信息。", messages: { msg: "{time}\n--- NodeAsync {version} ---\n私有机器人,服务器专用。\n--- 开发者 ---\n德二吹风机(3112836258)\n--- 其他 ---\nNode.js 版本:{nodeVersion}\nKoishi 版本:{koishiVersion}\n开源地址:https://github.com/ccd2s/node-async-bot-all\n官网:https://www.tasaed.top", "msg-md": "*{time}*\n\n---\n\n## NodeAsync {version}\n\n私有机器人,服务器专用。\n\n## 开发者\n\n- 德二吹风机(3112836258)\n\n## 其他\n\n- Node.js 版本:{nodeVersion}\n- Koishi 版本:{koishiVersion}\n- 开源地址:https://github.com/ccd2s/node-async-bot-all\n- 官网:https://www.tasaed.top" } }, rw: { description: "随机名言名句。", messages: null }, randomba: { description: "随机BA图。", messages: { msg: "{quote}{image}" } }, centerservertest: { description: "查看中心服务器状态。", messages: { msg: "{time}{list}", "msg-md": "*{time}*\n\n---\n{list}", list: "== {name} ==\n状态:{status}\n存活率:{uptime}\n检测时间:{time}", "list-md": "## {name}\n\n- 状态:{status}\n- 存活率:{uptime}\n- 检测时间:{time}", listFailed: "== {name} ==\n查看失败:{data}", "listFailed-md": "## {name}\n\n查看失败:{data}", statusLive: "✅ 正常", statusDie: "❌ 故障", dataFail: "未能获取到此服务器的状态信息。" } }, meme: { description: "群友的怪话!", usage: "不带参数时随机查看\n带参数时为查看指定 meme", examples: "meme\nmeme 1145", messages: { msg: "{quote}{time}\n{image}\n{title}", "msg-qq": "{quote}{image}\n{time}\n{title}" } }, randomcat: { description: "随机猫猫图。", messages: { msg: "{quote}{image}" } }, getqqinfo: { description: "获取 QQ 号的信息。", usage: "获取 QQ 号的信息。", examples: "getqqinfo 10001", messages: { msg: "{quote}{image}", failed: "{quote}{time}\n获取失败:{data}", command: "QQ 号不正确。" } }, msg2img: { description: "引用一个消息并使用此指令,即可将消息转图。", usage: "引用一条消息,/m。(不要带@)", messages: { msg: "{quote}{image}", failed: "{quote}{time}\n获取失败:{data}", null: "未引用任何消息。", matroska: "{quote}禁止套娃!" } }, slnews: { description: "抓取 NorthWood 的 Steam 最新新闻。" }, use: { description: "使用 TA !", usage: "use @用户", examples: "use @用户", messages: { command: "请 @ 一个用户。", msg: "{at} {desc}了 {at2} !" } } } };
38
38
  }
39
39
  });
40
40
 
@@ -136,22 +136,19 @@ function getHongKongTime() {
136
136
  return `${dateObj.year}-${dateObj.month}-${dateObj.day} ${dateObj.hour}:${dateObj.minute}:${dateObj.second}`;
137
137
  }
138
138
  __name(getHongKongTime, "getHongKongTime");
139
- async function readInfoFile(ctx) {
140
- let info;
139
+ async function readInfo(ctx) {
141
140
  try {
142
- const aPath = import_path.default.resolve(__dirname, "..") + import_path.default.sep + "res" + import_path.default.sep + "info.txt";
143
- info = await import_fs.default.promises.readFile(aPath, "utf8");
144
141
  const deps = await ctx.installer.getDeps();
145
- info = info.toString().replace(
146
- "&version;",
147
- (await ctx.database.get("botData", "version"))[0].data
148
- ).replace("&kVersion;", deps.koishi.resolved).replace("&nVersion;", process.versions.node);
142
+ return {
143
+ version: (await ctx.database.get("botData", "version"))[0].data,
144
+ koishiVersion: deps.koishi.resolved,
145
+ nodeVersion: process.versions.node
146
+ };
149
147
  } catch (error) {
150
- info = error.message;
148
+ return error?.message ?? "Unknown error";
151
149
  }
152
- return info;
153
150
  }
154
- __name(readInfoFile, "readInfoFile");
151
+ __name(readInfo, "readInfo");
155
152
  function formatTimestampDiff(start, end) {
156
153
  const diff = Math.abs(end - start);
157
154
  const hours = Math.floor(diff / 3600);
@@ -232,50 +229,6 @@ async function request(url, options = {}, timeout = 8e3, log) {
232
229
  }
233
230
  }
234
231
  __name(request, "request");
235
- async function readUserCardFile(userInfo) {
236
- let card;
237
- try {
238
- const aPath = import_path.default.resolve(__dirname, "..") + import_path.default.sep + "res" + import_path.default.sep + "userCard.html";
239
- card = await import_fs.default.promises.readFile(aPath, "utf8");
240
- let sex_so;
241
- let sex;
242
- if (userInfo.sex == "male") {
243
- sex = "♂";
244
- sex_so = "sex-male";
245
- } else if (userInfo.sex == "female") {
246
- sex = "♀";
247
- sex_so = "sex-female";
248
- } else {
249
- sex = "猫娘";
250
- sex_so = "sex-unknown";
251
- }
252
- card = card.toString().replace("{avatarUrl}", userInfo.avatar_url).replace("{nickname}", userInfo.nickname).replace("{sex}", sex).replace("{sex-so}", sex_so).replace("{age}", String(userInfo.age)).replace("{longNick}", userInfo.long_nick == "" ? "<无>" : `“ ${userInfo.long_nick} ”`).replace("{qq}", userInfo.qq).replace("{qqLevel}", String(userInfo.qq_level)).replace("{qid}", userInfo.qid == "" ? "<无>" : userInfo.qid).replace("{location}", userInfo.location == "" ? "<无>" : userInfo.location).replace("{email}", userInfo.email == "" ? "<无>" : userInfo.email).replace("{regTime}", userInfo.reg_time).replace("{lastUpdated}", userInfo.last_updated);
253
- } catch (error) {
254
- card = error.message;
255
- }
256
- return card;
257
- }
258
- __name(readUserCardFile, "readUserCardFile");
259
- async function readUserMsgFile(userName, userAvatar, msg, inversion, replyUserName, replyMsg) {
260
- let html;
261
- try {
262
- const aPath = import_path.default.resolve(__dirname, "..") + import_path.default.sep + "res" + import_path.default.sep + "userMsg.html";
263
- html = await import_fs.default.promises.readFile(aPath, "utf8");
264
- html = html.toString().replace("{userData.avatarUrl}", userAvatar).replace("{userData.username}", userName).replace("{userData.message}", msg).replace("{replyData.username}", replyUserName).replace("{replyData.message}", replyMsg).replace(
265
- /<at\s+(?:id=["']([^"']*)["']\s+name=["']([^"']*)["']|name=["']([^"']*)["']\s+id=["']([^"']*)["'])\s*\/?>/g,
266
- (match, id1, name1, name2, id2) => {
267
- const name3 = name1 || name2 || id1 || id2 || match;
268
- return `@${name3}`;
269
- }
270
- ).replace('<at type="all"/>', "@全体成员");
271
- if (inversion) html = html.replace("//// ", "");
272
- if (replyUserName != void 0) html = html.replace("/**/", "//// ");
273
- } catch (error) {
274
- html = error.message;
275
- }
276
- return html;
277
- }
278
- __name(readUserMsgFile, "readUserMsgFile");
279
232
  async function queryA2S(host, log) {
280
233
  try {
281
234
  const playerResponse = await (0, import_steam_server_query.queryGameServerInfo)(host);
@@ -366,12 +319,15 @@ async function getServer(ctx, session) {
366
319
  if (server == void 0) {
367
320
  msg = {
368
321
  "time": time,
369
- "data": session.text("noApi"),
322
+ "error": "查询失败:" + session.text("noApi"),
370
323
  "success": 2
371
324
  };
372
325
  log.warn("Sent:");
373
326
  log.warn(msg);
374
- return msg;
327
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi2.h)("qq:markdown", {
328
+ content: session?.text("failed-md", msg)
329
+ }) : session?.text("failed", msg));
330
+ return 1;
375
331
  }
376
332
  let count = 0;
377
333
  let list = "";
@@ -388,12 +344,14 @@ async function getServer(ctx, session) {
388
344
  "count": count,
389
345
  "players": info.players,
390
346
  "version": info.version,
391
- "bots": info.bots,
392
- "note": note ?? session.text("noop")
347
+ "list": info.bots,
348
+ "note": note ?? session.text("noop"),
349
+ "name": "A2S",
350
+ "ne": "机器人"
393
351
  };
394
352
  log.info(`Server ${count}:`);
395
353
  log.info(temp);
396
- list = list + "\n" + session.text(".listA2S", temp);
354
+ list = list + "\n" + session.text(session?.bot.adapterName == "qq" ? ".list-md" : ".list", temp);
397
355
  } else {
398
356
  let err;
399
357
  if (info.error.toString().includes("Timeout reached. Possible reasons: You are being rate limited; Timeout too short; Wrong server host configured")) {
@@ -404,11 +362,12 @@ async function getServer(ctx, session) {
404
362
  const temp = {
405
363
  "count": count,
406
364
  "data": err,
407
- "note": note
365
+ "note": note,
366
+ "name": "A2S"
408
367
  };
409
368
  log.error(`Server ${count}:`);
410
369
  log.error(temp);
411
- list = list + "\n" + session.text(".listFailedA2S", temp);
370
+ list = list + "\n" + session.text(session?.bot.adapterName == "qq" ? ".listFailed-md" : ".listFailed", temp);
412
371
  }
413
372
  } else {
414
373
  const host = api.split(":");
@@ -420,22 +379,27 @@ async function getServer(ctx, session) {
420
379
  "count": count,
421
380
  "players": serverInfo.data.players.online + "/" + serverInfo.data.players.max,
422
381
  "version": serverInfo.data.version.name,
423
- "note": note ?? session.text("noop")
382
+ "note": note ?? session.text("noop"),
383
+ "ne": "玩家列表",
384
+ "list": "[]",
385
+ "name": "MC"
424
386
  };
425
387
  log.info(`Server ${count}:`);
426
388
  log.info(temp);
427
- list = list + "\n" + session.text(".listNoPlayer", temp);
389
+ list = list + "\n" + session.text(session?.bot.adapterName == "qq" ? ".list-md" : ".list", temp);
428
390
  } else {
429
391
  const temp = {
430
392
  "count": count,
431
393
  "players": serverInfo.data.players.online + "/" + serverInfo.data.players.max,
432
394
  "version": serverInfo.data.version.name,
433
395
  "list": serverInfo.data.players.sample.map((item2) => item2.name).join(", "),
434
- "note": note ?? session.text("noop")
396
+ "note": note ?? session.text("noop"),
397
+ "ne": "玩家列表",
398
+ "name": "MC"
435
399
  };
436
400
  log.info(`Server ${count}:`);
437
401
  log.info(temp);
438
- list = list + "\n" + session.text(".list", temp);
402
+ list = list + "\n" + session.text(session?.bot.adapterName == "qq" ? ".list-md" : ".list", temp);
439
403
  }
440
404
  } else {
441
405
  let err = serverInfo.data;
@@ -455,11 +419,12 @@ async function getServer(ctx, session) {
455
419
  const temp = {
456
420
  "count": count,
457
421
  "data": err,
458
- "note": note
422
+ "note": note,
423
+ "name": "MC"
459
424
  };
460
425
  log.error(`Server ${count}:`);
461
426
  log.error(temp);
462
- list = list + "\n" + session.text(".listFailed", temp);
427
+ list = list + "\n" + session.text(session?.bot.adapterName == "qq" ? ".listFailed-md" : ".listFailed", temp);
463
428
  }
464
429
  }
465
430
  }
@@ -468,15 +433,23 @@ async function getServer(ctx, session) {
468
433
  "list": list,
469
434
  "success": 0
470
435
  };
436
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi2.h)("qq:markdown", {
437
+ content: session?.text(".msg-md", msg)
438
+ }) : session?.text(".msg", msg));
439
+ return 0;
471
440
  } else {
472
441
  msg = {
473
442
  "time": time,
443
+ "error": "此指令不允许在本群使用。",
474
444
  "success": 1
475
445
  };
476
446
  log.info("Sent:");
477
447
  log.info(msg);
448
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi2.h)("qq:markdown", {
449
+ content: session?.text("failed-md", msg)
450
+ }) : session?.text("failed", msg));
451
+ return 1;
478
452
  }
479
- return msg;
480
453
  }
481
454
  __name(getServer, "getServer");
482
455
  async function getStatus(ctx, session) {
@@ -490,6 +463,8 @@ async function getStatus(ctx, session) {
490
463
  msg = {
491
464
  "time": time,
492
465
  "data": vMsg["data"],
466
+ "error": "状态获取失败。",
467
+ "quote": import_koishi2.h.quote(session.messageId),
493
468
  "success": 1
494
469
  };
495
470
  } else {
@@ -541,19 +516,20 @@ async function getInfo(ctx, session) {
541
516
  log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
542
517
  const time = getHongKongTime();
543
518
  let msg;
544
- let data = await readInfoFile(ctx);
545
- if (!data.includes("&time;")) {
546
- log.error("Error: " + data);
519
+ let data = await readInfo(ctx);
520
+ if (typeof data == "string") {
521
+ log.error("Error:", data);
547
522
  msg = {
548
523
  "time": time,
549
524
  "data": data,
525
+ "error": "读取信息失败。",
526
+ "quote": import_koishi2.h.quote(session.messageId),
550
527
  "success": 1
551
528
  };
552
529
  } else {
553
- data = data.replace("&time;", time);
554
530
  msg = {
555
531
  "time": time,
556
- "data": data,
532
+ ...data,
557
533
  "success": 0
558
534
  };
559
535
  }
@@ -570,7 +546,8 @@ async function getRandomWord(ctx, session) {
570
546
  if (ctx.config.rwAPI == void 0) {
571
547
  msg = {
572
548
  "time": time,
573
- "data": session.text("noApi"),
549
+ "error": session.text("noApi"),
550
+ "quote": import_koishi2.h.quote(session.messageId),
574
551
  "success": 2
575
552
  };
576
553
  log.warn("Sent:");
@@ -582,7 +559,8 @@ async function getRandomWord(ctx, session) {
582
559
  log.debug(response.data);
583
560
  msg = {
584
561
  "time": time,
585
- "data": response.data.data,
562
+ "error": response.data.data,
563
+ "quote": import_koishi2.h.quote(session.messageId),
586
564
  "success": 0
587
565
  };
588
566
  log.debug("Sent:");
@@ -596,7 +574,8 @@ async function getRandomWord(ctx, session) {
596
574
  }
597
575
  msg = {
598
576
  "time": time,
599
- "data": err,
577
+ "error": err,
578
+ "quote": import_koishi2.h.quote(session.messageId),
600
579
  "success": 1
601
580
  };
602
581
  log.warn("Sent:");
@@ -608,7 +587,6 @@ __name(getRandomWord, "getRandomWord");
608
587
  async function getBlueArchive(ctx, session) {
609
588
  const log = ctx.logger("ba");
610
589
  log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
611
- const time = getHongKongTime();
612
590
  if (ctx.config.baAPI == void 0) {
613
591
  await session.send(session.text(".msg", { "quote": import_koishi2.h.quote(session.messageId), "image": session.text("noApi") }));
614
592
  return 1;
@@ -622,116 +600,6 @@ async function getBlueArchive(ctx, session) {
622
600
  return 0;
623
601
  }
624
602
  __name(getBlueArchive, "getBlueArchive");
625
- async function centerServerTest(ctx, session) {
626
- const log = ctx.logger("centerServerTest");
627
- log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
628
- const time = getHongKongTime();
629
- let msg;
630
- let list = "";
631
- const timeFormatter = new Intl.DateTimeFormat("zh-CN", {
632
- timeZone: "Asia/Shanghai",
633
- year: "numeric",
634
- month: "2-digit",
635
- day: "2-digit",
636
- hour: "2-digit",
637
- minute: "2-digit",
638
- second: "2-digit",
639
- hour12: false
640
- });
641
- const response = await request("https://status.scpslgame.com/api/status-page/heartbeat/nw", {}, ctx.config.timeout, log);
642
- if (response.success) {
643
- log.debug(response.data);
644
- for (const server of ctx.config.slTest) {
645
- const lastTime = response.data.heartbeatList[server.id].at(-1);
646
- if (lastTime) {
647
- const uptime24 = (response.data.uptimeList[server.id + "_24"] * 100).toFixed(2) + "%";
648
- const status2 = lastTime?.status == 1 ? session.text(".statusLive") : session.text(".statusDie");
649
- const testTime = timeFormatter.format(/* @__PURE__ */ new Date(lastTime?.time.replace(" ", "T") + "Z"));
650
- list = list + "\n" + session.text(".list", {
651
- "name": server.name,
652
- "status": status2,
653
- "uptime": uptime24,
654
- "time": testTime
655
- });
656
- } else {
657
- list = list + "\n" + session.text(".listFailed", {
658
- "name": server.name,
659
- "data": session.text(".dataFail")
660
- });
661
- }
662
- }
663
- msg = {
664
- "data": { "list": list, "time": time },
665
- "success": ".msg"
666
- };
667
- log.debug("Sent:");
668
- log.debug(msg);
669
- } else {
670
- let err;
671
- if (response.code) {
672
- err = response.isJson ? response.error["data"] : response.error;
673
- } else {
674
- err = response.error.message;
675
- }
676
- msg = {
677
- "data": { "data": err, "time": time },
678
- "success": ".failed"
679
- };
680
- log.warn("Sent:");
681
- log.warn(msg);
682
- }
683
- return msg;
684
- }
685
- __name(centerServerTest, "centerServerTest");
686
- async function getMeme(ctx, session, count) {
687
- const log = ctx.logger("getMeme");
688
- log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
689
- let msg;
690
- const time = getHongKongTime();
691
- if (ctx.config.memesAPI[`${session.event.guild?.id}`] == void 0) {
692
- msg = {
693
- "time": time,
694
- "quote": import_koishi2.h.quote(session.messageId),
695
- "success": ".forbidden"
696
- };
697
- log.warn("Sent:");
698
- log.warn(msg);
699
- await session.send(session.text(msg["success"], msg));
700
- return 0;
701
- }
702
- const api = count ? ctx.config.memesAPI[`${session.event.guild?.id}`] + `&type=1&count=${count}` : ctx.config.memesAPI[`${session.event.guild?.id}`];
703
- const response = await request(api, {}, ctx.config.timeout, log);
704
- if (response.success) {
705
- msg = {
706
- "time": time,
707
- "title": response.data.data.title,
708
- "image": import_koishi2.h.image(response.data.data.image),
709
- "quote": import_koishi2.h.quote(session.messageId),
710
- "success": ".msg"
711
- };
712
- log.debug("Sent:");
713
- log.debug(msg);
714
- } else {
715
- let err;
716
- if (response.code) {
717
- err = response.isJson ? response.error["data"] : response.error;
718
- } else {
719
- err = response.error.message;
720
- }
721
- msg = {
722
- "time": time,
723
- "data": err,
724
- "quote": import_koishi2.h.quote(session.messageId),
725
- "success": ".failed"
726
- };
727
- log.warn("Sent:");
728
- log.warn(msg);
729
- }
730
- const status2 = await session.send(session.text(msg["success"], msg));
731
- if (!status2) await session.send(session.text(msg["success"], msg));
732
- return 0;
733
- }
734
- __name(getMeme, "getMeme");
735
603
  async function getCat(ctx, session) {
736
604
  const log = ctx.logger("cat");
737
605
  log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
@@ -744,17 +612,27 @@ async function getCat(ctx, session) {
744
612
  const response = await request(ctx.config.catAPI, {}, ctx.config.timeout, log);
745
613
  if (response.success) {
746
614
  log.debug(response.data);
747
- const status2 = await session.send(session.text(".msg", { "quote": import_koishi2.h.quote(session.messageId), "image": import_koishi2.h.image(response.data[0].url) }));
748
- if (!status2) await session.send(session.text(".msg", { "quote": import_koishi2.h.quote(session.messageId), "image": import_koishi2.h.image(response.data[0].url) }));
615
+ const msg = { "quote": import_koishi2.h.quote(session.messageId), "image": import_koishi2.h.image(response.data[0].url) };
616
+ await session.send(session.text(".msg", msg));
749
617
  log.debug("Sent:");
750
618
  log.debug(response.data[0].url);
751
619
  } else {
752
620
  if (response.code) {
753
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "data": response.isJson ? response.error["error"] : response.error, "time": time }));
621
+ const msg = {
622
+ "quote": import_koishi2.h.quote(session.messageId),
623
+ "data": response.isJson ? "获取失败:" + response.error["error"] : "获取失败:" + response.error,
624
+ "time": time
625
+ };
626
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi2.h)("qq:markdown", {
627
+ content: session?.text("failed-md", msg)
628
+ }) : session?.text("failed", msg));
754
629
  log.warn("Sent:");
755
630
  log.warn(response.error);
756
631
  } else {
757
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "data": response.error.message, "time": time }));
632
+ const msg = { "quote": import_koishi2.h.quote(session.messageId), "data": "获取失败:" + response.error.message, "time": time };
633
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi2.h)("qq:markdown", {
634
+ content: session?.text("failed-md", msg)
635
+ }) : session?.text("failed", msg));
758
636
  log.warn("Sent:");
759
637
  log.warn(response.error);
760
638
  }
@@ -762,120 +640,6 @@ async function getCat(ctx, session) {
762
640
  return 0;
763
641
  }
764
642
  __name(getCat, "getCat");
765
- async function getQQInfo(ctx, session, qq) {
766
- const log = ctx.logger("getQQInfo");
767
- log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
768
- const time = getHongKongTime();
769
- if (ctx.config.qqAPI == void 0) {
770
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "data": "未指定 API", "time": time }));
771
- log.warn("未指定 API");
772
- return 1;
773
- }
774
- const response = await request(ctx.config.qqAPI + `?qq=${qq}`, {}, ctx.config.timeout, log);
775
- if (response.success) {
776
- const fullHtml = await readUserCardFile(response.data);
777
- log.debug(fullHtml);
778
- const page = await ctx.puppeteer.page();
779
- try {
780
- await page.setViewport({
781
- width: 450,
782
- height: 650,
783
- deviceScaleFactor: 2
784
- });
785
- await page.setContent(fullHtml, { timeout: ctx.config.htmlTimeout, waitUntil: "networkidle0" });
786
- const { width, height } = await page.evaluate(() => ({
787
- width: document.body.scrollWidth,
788
- height: document.body.scrollHeight
789
- }));
790
- await page.setViewport({ width, height, deviceScaleFactor: 2 });
791
- const image = await page.screenshot({ type: "png", omitBackground: true });
792
- await session.send(session.text(".msg", { "quote": import_koishi2.h.quote(session.messageId), "image": import_koishi2.h.image(image, "image/png") }));
793
- } catch (err) {
794
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "time": time, "data": "图片渲染失败" }));
795
- log.error("图片渲染失败:", err);
796
- return 1;
797
- } finally {
798
- if (page && !page.isClosed()) await page.close();
799
- }
800
- log.debug("Sent: Image");
801
- } else {
802
- if (response.code) {
803
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "data": response.isJson ? response.error["error"] : response.error, "time": time }));
804
- log.warn("Sent:");
805
- log.warn(response.error);
806
- } else {
807
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "data": response.error.message, "time": time }));
808
- log.warn("Sent:");
809
- log.warn(response.error);
810
- }
811
- }
812
- return 0;
813
- }
814
- __name(getQQInfo, "getQQInfo");
815
- async function getMsg(ctx, session, inversion) {
816
- const log = ctx.logger("getMsg");
817
- log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
818
- log.debug(`inversion: ${inversion}`);
819
- const time = getHongKongTime();
820
- if (!session.quote || !session.quote.user) {
821
- await session.send(session.text(".null"));
822
- log.warn("未引用任何信息");
823
- return 1;
824
- }
825
- if (session.quote.user.id == session.event.selfId) {
826
- await session.send(session.text(".matroska", { "quote": import_koishi2.h.quote(session.messageId) }));
827
- log.debug("套娃");
828
- return 1;
829
- }
830
- const user = await session.bot.getUser(session.quote.user.id, session.channelId);
831
- const msg = session.quote.content;
832
- const quoteMsg = session.quote.quote?.content;
833
- const quoteUser = session.quote.quote?.user?.name;
834
- log.debug(msg);
835
- if (!user.name || !user.avatar) {
836
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "time": time, "data": "获取用户信息失败。" }));
837
- log.error("获取用户信息失败");
838
- return 1;
839
- }
840
- const page = await ctx.puppeteer.page();
841
- const html = await readUserMsgFile(user.name, user.avatar, msg, inversion, quoteUser, quoteMsg);
842
- log.debug(html);
843
- try {
844
- await page.setViewport({
845
- width: 450,
846
- height: 1,
847
- deviceScaleFactor: 2
848
- });
849
- await page.setContent(html, { timeout: ctx.config.htmlTimeout, waitUntil: "networkidle0" });
850
- const { width, height } = await page.evaluate(() => ({
851
- width: document.body.scrollWidth + 50,
852
- height: document.body.scrollHeight
853
- }));
854
- await page.setViewport({ width, height, deviceScaleFactor: 2 });
855
- const element = await page.$("#target-element");
856
- if (element) {
857
- const image = await element.screenshot({
858
- type: "png",
859
- omitBackground: true
860
- // 使得 CSS 中未定义的背景部分透明
861
- });
862
- await session.send(session.text(".msg", { "quote": import_koishi2.h.quote(session.messageId), "image": import_koishi2.h.image(image, "image/png") }));
863
- log.debug("Sent: Image");
864
- } else {
865
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "time": time, "data": "未找到目标元素。" }));
866
- log.error("未找到目标元素");
867
- return 1;
868
- }
869
- } catch (err) {
870
- await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "time": time, "data": "图片渲染失败" }));
871
- log.error("图片渲染失败:", err);
872
- return 1;
873
- } finally {
874
- if (page && !page.isClosed()) await page.close();
875
- }
876
- return 0;
877
- }
878
- __name(getMsg, "getMsg");
879
643
  async function getNewsMsg(ctx, type) {
880
644
  const log = ctx.logger("getNewsMsg");
881
645
  const response = await request(ctx.config.newsAPI, {}, ctx.config.timeout, log);
@@ -930,16 +694,9 @@ async function getNewsMsg(ctx, type) {
930
694
  }
931
695
  }
932
696
  __name(getNewsMsg, "getNewsMsg");
933
- async function getUse(ctx, session, qq, desc) {
934
- const log = ctx.logger("getUse");
935
- log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
936
- await session.send(session.text(".msg", { "at": import_koishi2.h.at(session.event.user?.id), "at2": import_koishi2.h.at(qq), "desc": desc ?? "使用" }));
937
- return 0;
938
- }
939
- __name(getUse, "getUse");
940
697
 
941
698
  // package.json
942
- var version = "2.29.0";
699
+ var version = "2.31.0";
943
700
 
944
701
  // src/index.ts
945
702
  var inject = ["database", "installer", "puppeteer", "cron"];
@@ -970,18 +727,9 @@ var Config = import_koishi3.Schema.intersect([
970
727
  import_koishi3.Schema.object({
971
728
  baAPI: import_koishi3.Schema.array(String).default(["https://rba.kanostar.top/portrait"]).description("随机BA图 API")
972
729
  }).description("随机BA图"),
973
- import_koishi3.Schema.object({
974
- steamAPI: import_koishi3.Schema.string().default("https://api.tasaed.top/get/steamid/").description("转换 Steam ID API")
975
- }).description("转换 Steam ID"),
976
- import_koishi3.Schema.object({
977
- memesAPI: import_koishi3.Schema.dict(String).role("table").description("群友 meme API")
978
- }).description("群友 meme"),
979
730
  import_koishi3.Schema.object({
980
731
  catAPI: import_koishi3.Schema.string().default("https://api.thecatapi.com/v1/images/search").description("随机猫猫图 API")
981
732
  }).description("随机猫猫图"),
982
- import_koishi3.Schema.object({
983
- qqAPI: import_koishi3.Schema.string().default("https://uapis.cn/api/v1/social/qq/userinfo").description("获取 QQ 信息 API")
984
- }).description("获取 QQ 信息"),
985
733
  import_koishi3.Schema.object({
986
734
  slNews: import_koishi3.Schema.array(String).default([""]).description("{platform}:{channelId}"),
987
735
  newsAPI: import_koishi3.Schema.string().default("https://api.steampowered.com/ISteamNews/GetNewsForApp/v2/?appid=700330&count=1").description("新闻 API")
@@ -989,26 +737,20 @@ var Config = import_koishi3.Schema.intersect([
989
737
  import_koishi3.Schema.object({
990
738
  specialMsg: import_koishi3.Schema.array(String).default([]).description("特殊消息"),
991
739
  reactionId: import_koishi3.Schema.array(Number).default([]).description("回应表情 ID")
992
- }).description("特殊消息回应"),
993
- import_koishi3.Schema.object({
994
- slTest: import_koishi3.Schema.array(import_koishi3.Schema.object({
995
- id: import_koishi3.Schema.string().description("服务器 ID"),
996
- name: import_koishi3.Schema.string().description("服务器 名称")
997
- })).default([{ "id": "1", "name": "中心 鲁贝 1" }, { "id": "19", "name": "中心 斯特拉斯堡 1" }, { "id": "3", "name": "Steam 认证 API" }]).description("测试中心服务器")
998
- }).description("测试中心服务器")
740
+ }).description("特殊消息回应")
999
741
  ]).description("基础设置");
1000
742
  async function startReaction(session) {
1001
- await session.bot.createReaction(session.channelId, session.messageId, `face|424`);
743
+ if (session.bot.createReaction) await session.bot.createReaction(session.channelId, session.messageId, `face|424`);
1002
744
  }
1003
745
  __name(startReaction, "startReaction");
1004
746
  async function endReaction(session) {
1005
- await session.bot.deleteReaction(session.channelId, session.messageId, `face|424`);
1006
- await session.bot.createReaction(session.channelId, session.messageId, `face|144`);
747
+ if (session.bot.deleteReaction) await session.bot.deleteReaction(session.channelId, session.messageId, `face|424`);
748
+ if (session.bot.createReaction) await session.bot.createReaction(session.channelId, session.messageId, `face|144`);
1007
749
  }
1008
750
  __name(endReaction, "endReaction");
1009
751
  async function endReactionFailed(session) {
1010
- await session.bot.deleteReaction(session.channelId, session.messageId, `face|424`);
1011
- await session.bot.createReaction(session.channelId, session.messageId, `face|41`);
752
+ if (session.bot.deleteReaction) await session.bot.deleteReaction(session.channelId, session.messageId, `face|424`);
753
+ if (session.bot.createReaction) await session.bot.createReaction(session.channelId, session.messageId, `face|38`);
1012
754
  }
1013
755
  __name(endReactionFailed, "endReactionFailed");
1014
756
  function apply(ctx) {
@@ -1063,14 +805,9 @@ ${import_koishi3.h.image(outMsg.data, "image/png")}`);
1063
805
  na.subcommand("cxGame").action(async ({ session }) => {
1064
806
  await startReaction(session);
1065
807
  const cx = await getServer(ctx, session);
1066
- if (cx["success"] == 0) {
1067
- await session?.send(session?.text(".msg", cx));
808
+ if (cx == 0) {
1068
809
  await endReaction(session);
1069
- } else if (cx["success"] == 1) {
1070
- await session?.send(session?.text(".forbidden", cx));
1071
- await endReactionFailed(session);
1072
- } else if (cx["success"] == 2) {
1073
- await session?.send(session?.text(".failed", cx));
810
+ } else {
1074
811
  await endReactionFailed(session);
1075
812
  }
1076
813
  });
@@ -1078,27 +815,37 @@ ${import_koishi3.h.image(outMsg.data, "image/png")}`);
1078
815
  await startReaction(session);
1079
816
  const status2 = await getStatus(ctx, session);
1080
817
  if (status2["success"] == 0) {
1081
- await session?.send(session?.text(".msg", status2));
818
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi3.h)("qq:markdown", {
819
+ content: session?.text(".msg-md", status2)
820
+ }) : session?.text(".msg", status2));
1082
821
  await endReaction(session);
1083
822
  } else {
1084
- await session?.send(session?.text(".failed", status2));
823
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi3.h)("qq:markdown", {
824
+ content: session?.text("failed-md", status2)
825
+ }) : session?.text("failed", status2));
1085
826
  await endReactionFailed(session);
1086
827
  }
1087
828
  });
1088
829
  na.subcommand("random [最小数:number] [最大数:number]").alias("随机数").action(async ({ session }, min, max) => {
1089
830
  await startReaction(session);
1090
831
  const random2 = await getRandom(ctx, session, min, max);
1091
- await session?.send(session?.text(".msg", random2));
832
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi3.h)("qq:markdown", {
833
+ content: session?.text(".msg-md", random2)
834
+ }) : session?.text(".msg", random2));
1092
835
  await endReaction(session);
1093
836
  });
1094
837
  na.subcommand("info").action(async ({ session }) => {
1095
838
  await startReaction(session);
1096
839
  const info = await getInfo(ctx, session);
1097
840
  if (info["success"] == 0) {
1098
- await session?.send(session?.text(".msg", info));
841
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi3.h)("qq:markdown", {
842
+ content: session?.text(".msg-md", info)
843
+ }) : session?.text(".msg", info));
1099
844
  await endReaction(session);
1100
845
  } else {
1101
- await session?.send(session?.text(".failed", info));
846
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi3.h)("qq:markdown", {
847
+ content: session?.text("failed-md", info)
848
+ }) : session?.text("failed", info));
1102
849
  await endReactionFailed(session);
1103
850
  }
1104
851
  });
@@ -1106,10 +853,14 @@ ${import_koishi3.h.image(outMsg.data, "image/png")}`);
1106
853
  await startReaction(session);
1107
854
  const rw = await getRandomWord(ctx, session);
1108
855
  if (rw["success"] == 0) {
1109
- await session?.send(session?.text(".msg", rw));
856
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi3.h)("qq:markdown", {
857
+ content: session?.text("failed-md", rw)
858
+ }) : session?.text("failed", rw));
1110
859
  await endReaction(session);
1111
860
  } else {
1112
- await session?.send(session?.text(".failed", rw));
861
+ await session?.send(session?.bot.adapterName == "qq" ? (0, import_koishi3.h)("qq:markdown", {
862
+ content: session?.text("failed-md", rw)
863
+ }) : session?.text("failed", rw));
1113
864
  await endReactionFailed(session);
1114
865
  }
1115
866
  });
@@ -1118,46 +869,11 @@ ${import_koishi3.h.image(outMsg.data, "image/png")}`);
1118
869
  await getBlueArchive(ctx, session);
1119
870
  await endReaction(session);
1120
871
  });
1121
- na.subcommand("centerServerTest").alias("测测中心服务器").action(async ({ session }) => {
1122
- await startReaction(session);
1123
- const msg = await centerServerTest(ctx, session);
1124
- await session?.send(session?.text(msg.success, msg.data));
1125
- await endReaction(session);
1126
- });
1127
- na.subcommand("meme [序号:posint]").alias("memes").action(async ({ session }, count) => {
1128
- await startReaction(session);
1129
- await getMeme(ctx, session, count);
1130
- await endReaction(session);
1131
- });
1132
872
  na.subcommand("randomCat").alias("随机猫猫图").alias("随机猫猫").action(async ({ session }) => {
1133
873
  await startReaction(session);
1134
874
  await getCat(ctx, session);
1135
875
  await endReaction(session);
1136
876
  });
1137
- na.subcommand("getQQInfo <QQ号:string>").alias("获取QQ信息").action(async ({ session }, qq) => {
1138
- await startReaction(session);
1139
- if (qq == void 0 || isNaN(Number(qq))) {
1140
- await endReactionFailed(session);
1141
- return session?.text(".command");
1142
- }
1143
- await getQQInfo(ctx, session, qq);
1144
- await endReaction(session);
1145
- });
1146
- na.subcommand("msg2img").option("inversion", "-i").alias("消息转图").alias("m").action(async ({ session, options }) => {
1147
- await startReaction(session);
1148
- await getMsg(ctx, session, options?.inversion);
1149
- await endReaction(session);
1150
- });
1151
- na.subcommand("use <user:user> [方法:string]").alias("u").action(async ({ session }, user, desc) => {
1152
- await startReaction(session);
1153
- const qq = user?.split(":")?.[1];
1154
- if (qq == void 0 || isNaN(Number(qq))) {
1155
- await endReactionFailed(session);
1156
- return session?.text(".command");
1157
- }
1158
- await getUse(ctx, session, qq, desc);
1159
- await endReaction(session);
1160
- });
1161
877
  }
1162
878
  __name(apply, "apply");
1163
879
  // Annotate the CommonJS export names for ESM import in node:
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-node-async-bot-all",
3
3
  "description": "NodeAsync Bot插件(自用)",
4
- "version": "2.29.0",
4
+ "version": "2.31.0",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "contributors": [
package/res/info.txt DELETED
@@ -1,10 +0,0 @@
1
- &time;
2
- --- NodeAsync &version; ---
3
- 私有机器人,服务器专用。
4
- --- 开发者 ---
5
- 德二吹风机(3112836258)
6
- --- 其他 ---
7
- Node.js 版本:&nVersion;
8
- Koishi 版本:&kVersion;
9
- 开源地址:https://github.com/ccd2s/node-async-bot-all
10
- 官网:https://www.tasaed.top
package/res/userCard.html DELETED
@@ -1,242 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="zh-CN">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>UserCard</title>
7
- <style>
8
- /* 全局重置 */
9
- * {
10
- box-sizing: border-box;
11
- margin: 0;
12
- padding: 0;
13
- }
14
-
15
- body {
16
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
17
- background-color: #f0f2f5;
18
- display: flex;
19
- justify-content: center;
20
- align-items: flex-start; /* 顶部对齐 */
21
- min-height: 100vh;
22
- padding: 20px;
23
- }
24
-
25
- /* 卡片容器 */
26
- .card {
27
- width: 400px; /* 固定宽度,配合 puppeteer 视口 */
28
- background: #ffffff;
29
- border-radius: 16px;
30
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
31
- overflow: hidden;
32
- position: relative;
33
- }
34
-
35
- /* 顶部背景图/颜色 */
36
- .card-header-bg {
37
- height: 120px;
38
- background: linear-gradient(135deg, #00C6FF 0%, #0072FF 100%);
39
- }
40
-
41
- /* 个人信息主要区域 */
42
- .profile-main {
43
- padding: 0 24px;
44
- margin-top: -50px; /* 让头像上浮 */
45
- text-align: center;
46
- }
47
-
48
- /* 头像容器 */
49
- .avatar-container {
50
- position: relative;
51
- display: inline-block;
52
- padding: 4px;
53
- background: #fff;
54
- border-radius: 50%;
55
- box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
56
- }
57
-
58
- .avatar {
59
- width: 90px;
60
- height: 90px;
61
- border-radius: 50%;
62
- object-fit: cover;
63
- display: block;
64
- }
65
-
66
- /* VIP 徽章 */
67
- .vip-badge {
68
- position: absolute;
69
- bottom: 5px;
70
- right: 5px;
71
- background: #FFD700;
72
- color: #d63031;
73
- font-size: 10px;
74
- font-weight: bold;
75
- padding: 2px 6px;
76
- border-radius: 8px;
77
- border: 2px solid #fff;
78
- }
79
-
80
- .nickname-row {
81
- margin-top: 12px;
82
- display: flex;
83
- align-items: center;
84
- justify-content: center;
85
- gap: 8px;
86
- }
87
-
88
- .nickname {
89
- font-size: 22px;
90
- font-weight: 700;
91
- color: #333;
92
- }
93
-
94
- /* 性别图标 */
95
- .sex-icon {
96
- font-size: 14px;
97
- padding: 2px 6px;
98
- border-radius: 4px;
99
- color: white;
100
- }
101
-
102
- .sex-male {
103
- background-color: #007bff;
104
- }
105
-
106
- .sex-female {
107
- background-color: #ff6b81;
108
- }
109
-
110
- .sex-unknown {
111
- background-color: #ff6be1;
112
- }
113
-
114
- .long-nick {
115
- margin-top: 8px;
116
- color: #666;
117
- font-size: 14px;
118
- font-style: italic;
119
- margin-bottom: 24px;
120
- }
121
-
122
- /* 详细信息列表 */
123
- .info-list {
124
- padding: 0 24px 24px 24px;
125
- }
126
-
127
- .info-item {
128
- display: flex;
129
- justify-content: space-between;
130
- padding: 12px 0;
131
- border-bottom: 1px solid #f0f0f0;
132
- font-size: 14px;
133
- }
134
-
135
- .info-item:last-child {
136
- border-bottom: none;
137
- }
138
-
139
- .label {
140
- color: #888;
141
- font-weight: 500;
142
- }
143
-
144
- .value {
145
- color: #333;
146
- font-weight: 600;
147
- text-align: right;
148
- max-width: 220px;
149
- white-space: nowrap;
150
- overflow: hidden;
151
- text-overflow: ellipsis;
152
- }
153
-
154
- /* 标签样式 (如 VIP 等级) */
155
- .tag {
156
- display: inline-block;
157
- padding: 2px 8px;
158
- border-radius: 12px;
159
- font-size: 12px;
160
- margin-left: 5px;
161
- }
162
-
163
- .tag-vip {
164
- background-color: #fff3cd;
165
- color: #856404;
166
- }
167
-
168
- .tag-level {
169
- background-color: #e2e3e5;
170
- color: #383d41;
171
- }
172
-
173
- /* 底部时间戳 */
174
- .footer {
175
- background-color: #f8f9fa;
176
- padding: 12px 24px;
177
- font-size: 12px;
178
- color: #adb5bd;
179
- text-align: center;
180
- border-top: 1px solid #eee;
181
- }
182
-
183
- </style>
184
- </head>
185
- <body>
186
-
187
- <div class="card" id="card-element">
188
- <!-- 顶部背景 -->
189
- <div class="card-header-bg"></div>
190
-
191
- <!-- 主要信息 -->
192
- <div class="profile-main">
193
- <div class="avatar-container">
194
- <img src="{avatarUrl}" alt="Avatar" class="avatar">
195
- </div>
196
-
197
- <div class="nickname-row">
198
- <span class="nickname">{nickname}</span>
199
- <!-- 性别: 男 -->
200
- <span class="sex-icon {sex-so}">{sex} | {age} 岁</span>
201
- </div>
202
-
203
- <div class="long-nick">{longNick}</div>
204
- </div>
205
-
206
- <!-- 详细数据列表 -->
207
- <div class="info-list">
208
- <div class="info-item">
209
- <span class="label">QQ账号</span>
210
- <span class="value">{qq}</span>
211
- </div>
212
- <div class="info-item">
213
- <span class="label">QQ等级</span>
214
- <span class="value">
215
- <span class="tag tag-level">LV {qqLevel}</span>
216
- </span>
217
- </div>
218
- <div class="info-item">
219
- <span class="label">个性域名 (QID)</span>
220
- <span class="value">{qid}</span>
221
- </div>
222
- <div class="info-item">
223
- <span class="label">所在地</span>
224
- <span class="value">{location}</span>
225
- </div>
226
- <div class="info-item">
227
- <span class="label">电子邮箱</span>
228
- <span class="value">{email}</span>
229
- </div>
230
- <div class="info-item">
231
- <span class="label">注册时间</span>
232
- <span class="value">{regTime}</span>
233
- </div>
234
- </div>
235
-
236
- <div class="footer">
237
- 数据更新于: {lastUpdated}
238
- </div>
239
- </div>
240
-
241
- </body>
242
- </html>
package/res/userMsg.html DELETED
@@ -1,110 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>UserMsg</title>
6
- <style>
7
- * { box-sizing: border-box; margin: 0; padding: 0; }
8
-
9
- body {
10
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
11
- background: transparent;
12
- padding: 20px;
13
- //// transform: rotate(180deg);
14
- }
15
-
16
- .message-card {
17
- display: flex;
18
- flex-direction: row;
19
- align-items: flex-start;
20
- width: 100%;
21
- background: #ffffff;
22
- padding: 15px;
23
- box-shadow: 0 4px 12px rgba(0,0,0,0.1);
24
- border-radius: 8px;
25
- }
26
-
27
- .avatar {
28
- width: 50px;
29
- height: 50px;
30
- border-radius: 50%;
31
- object-fit: cover;
32
- flex-shrink: 0;
33
- margin-right: 15px;
34
- border: 1px solid #eee;
35
- }
36
-
37
- .content {
38
- flex: 1;
39
- display: flex;
40
- flex-direction: column;
41
- min-width: 0;
42
- }
43
-
44
- .user-name {
45
- font-weight: bold;
46
- font-size: 14px;
47
- color: #333;
48
- margin-bottom: 6px;
49
- }
50
-
51
- .reply-block {
52
- background: #f7f8fa;
53
- border-left: 3px solid #b9bbbe;
54
- padding: 6px 10px;
55
- border-radius: 0 4px 4px 0;
56
- margin-bottom: 8px;
57
- /**/display:none;
58
- }
59
-
60
- .reply-user {
61
- font-size: 12px;
62
- font-weight: 600;
63
- color: #555;
64
- margin-bottom: 3px;
65
- }
66
-
67
- .reply-text {
68
- font-size: 13px;
69
- color: #777;
70
- display: -webkit-box;
71
- -webkit-line-clamp: 2;
72
- -webkit-box-orient: vertical;
73
- overflow: hidden;
74
- text-overflow: ellipsis;
75
- word-break: break-all;
76
- }
77
-
78
- .text-bubble {
79
- font-size: 15px;
80
- line-height: 1.5;
81
- color: #444;
82
- background: #f2f3f5;
83
- padding: 10px 14px;
84
- border-radius: 0 12px 12px 12px;
85
-
86
- white-space: pre-wrap;
87
- word-wrap: break-word;
88
- overflow-wrap: break-word;
89
- word-break: break-all;
90
- width: fit-content;
91
- }
92
- </style>
93
- </head>
94
- <body>
95
- <div id="target-element" class="message-card">
96
- <img src="{userData.avatarUrl}" class="avatar" alt="Avatar" />
97
- <div class="content">
98
- <div class="user-name">{userData.username}</div>
99
-
100
- <!-- 新增的回复块 -->
101
- <div class="reply-block">
102
- <div class="reply-user">@{replyData.username}</div>
103
- <div class="reply-text">{replyData.message}</div>
104
- </div>
105
-
106
- <div class="text-bubble">{userData.message}</div>
107
- </div>
108
- </div>
109
- </body>
110
- </html>