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 +2 -25
- package/lib/fun.d.ts +6 -4
- package/lib/index.d.ts +1 -9
- package/lib/index.js +101 -385
- package/package.json +1 -1
- package/res/info.txt +0 -10
- package/res/userCard.html +0 -242
- package/res/userMsg.html +0 -110
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<
|
|
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
|
|
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
|
|
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,
|
|
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进服指南请在群公告中查看。",
|
|
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
|
|
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
|
-
|
|
146
|
-
"
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
148
|
+
return error?.message ?? "Unknown error";
|
|
151
149
|
}
|
|
152
|
-
return info;
|
|
153
150
|
}
|
|
154
|
-
__name(
|
|
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
|
-
"
|
|
322
|
+
"error": "查询失败:" + session.text("noApi"),
|
|
370
323
|
"success": 2
|
|
371
324
|
};
|
|
372
325
|
log.warn("Sent:");
|
|
373
326
|
log.warn(msg);
|
|
374
|
-
|
|
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
|
-
"
|
|
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(".
|
|
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(".
|
|
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(".
|
|
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
|
|
545
|
-
if (
|
|
546
|
-
log.error("Error:
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
748
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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|
|
|
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
|
|
1067
|
-
await session?.send(session?.text(".msg", cx));
|
|
808
|
+
if (cx == 0) {
|
|
1068
809
|
await endReaction(session);
|
|
1069
|
-
} else
|
|
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?.
|
|
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?.
|
|
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?.
|
|
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?.
|
|
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?.
|
|
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?.
|
|
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?.
|
|
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
package/res/info.txt
DELETED
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>
|