koishi-plugin-node-async-bot-all 2.21.0 → 2.22.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
@@ -23,6 +23,27 @@ export interface APIUserInfo {
23
23
  reg_time: string;
24
24
  last_updated: string;
25
25
  }
26
+ export interface APINews {
27
+ appnews: AppNews;
28
+ }
29
+ interface AppNews {
30
+ appid: number;
31
+ newsitems: NewsItem[];
32
+ count: number;
33
+ }
34
+ interface NewsItem {
35
+ gid: string;
36
+ title: string;
37
+ url: string;
38
+ is_external_url: boolean;
39
+ author: string;
40
+ contents: string;
41
+ feedlabel: string;
42
+ date: number;
43
+ feedname: string;
44
+ feed_type: number;
45
+ appid: number;
46
+ }
26
47
  export declare function getServer(ctx: Context, session: Session): Promise<Object>;
27
48
  export declare function getStatus(ctx: Context, session: Session): Promise<Object>;
28
49
  export declare function getRandom(ctx: Context, session: Session, min: number, max: number): Promise<Object>;
@@ -34,3 +55,9 @@ export declare function getMeme(ctx: Context, session: Session, count: number):
34
55
  export declare function getCat(ctx: Context, session: Session): Promise<Number>;
35
56
  export declare function getQQInfo(ctx: Context, session: Session, qq: string): Promise<number>;
36
57
  export declare function getMsg(ctx: Context, session: Session): Promise<number>;
58
+ export declare function getNewsMsg(ctx: Context, type: number): Promise<{
59
+ success: boolean;
60
+ data: string;
61
+ msg?: string;
62
+ }>;
63
+ export {};
package/lib/fun.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { HttpResponse } from "./index";
2
2
  import { Context } from "koishi";
3
- import { APIUserInfo } from "./commands";
3
+ import { APINews, APIUserInfo } from "./commands";
4
4
  export type serverInfo = {
5
5
  players: string;
6
6
  protocol: number;
@@ -29,3 +29,4 @@ export declare function request<T = any>(url: string, options?: RequestInit, tim
29
29
  export declare function readUserCardFile(userInfo: APIUserInfo): Promise<string>;
30
30
  export declare function readUserMsgFile(userName: string, userAvatar: string, msg: string): Promise<string>;
31
31
  export declare function queryA2S(host: string, log: any): Promise<serverInfo>;
32
+ export declare function readNewsFile(info: APINews): Promise<string>;
package/lib/index.d.ts CHANGED
@@ -13,6 +13,9 @@ declare module 'koishi' {
13
13
  interface Tables {
14
14
  botData: botDataTables;
15
15
  }
16
+ interface Events {
17
+ "node-async/news"(): void;
18
+ }
16
19
  }
17
20
  interface botDataTables {
18
21
  id: string;
@@ -39,6 +42,7 @@ export interface Config {
39
42
  memesAPI: Dict<string>;
40
43
  catAPI: string;
41
44
  qqAPI: string;
45
+ slNews: string[];
42
46
  }
43
47
  export declare const Config: Schema<Config>;
44
48
  export declare function apply(ctx: Context): void;
package/lib/index.js CHANGED
@@ -60,6 +60,8 @@ var import_ping = __toESM(require("ping"));
60
60
  var import_steam_server_query = require("steam-server-query");
61
61
  var import_path = __toESM(require("path"));
62
62
  var import_koishi = require("koishi");
63
+ var import_html = __toESM(require("@bbob/html"));
64
+ var import_preset_html5 = __toESM(require("@bbob/preset-html5"));
63
65
  function getSystemName() {
64
66
  return import_os.default.type() + " " + import_os.default.release();
65
67
  }
@@ -303,11 +305,25 @@ async function queryA2S(host, log) {
303
305
  }
304
306
  }
305
307
  __name(queryA2S, "queryA2S");
308
+ async function readNewsFile(info) {
309
+ let html;
310
+ try {
311
+ const aPath = import_path.default.resolve(__dirname, "..") + import_path.default.sep + "res" + import_path.default.sep + "slNews.html";
312
+ html = await import_fs.default.promises.readFile(aPath, "utf8");
313
+ const content = (0, import_html.default)(info.appnews.newsitems[0].contents, (0, import_preset_html5.default)());
314
+ const date = Number(info.appnews.newsitems[0].date + "000");
315
+ html = html.toString().replace("{date}", new Date(date).toLocaleString()).replace("{title}", info.appnews.newsitems[0].title).replace("{content}", content);
316
+ } catch (error) {
317
+ html = error.message;
318
+ }
319
+ return html;
320
+ }
321
+ __name(readNewsFile, "readNewsFile");
306
322
 
307
323
  // src/commands.ts
308
324
  async function getServer(ctx, session) {
309
325
  const log = ctx.logger("cx");
310
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
326
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
311
327
  let msg;
312
328
  const time = getHongKongTime();
313
329
  const index = ctx.config.cxV3.findIndex((item) => item.id === session.event.guild?.id);
@@ -431,7 +447,7 @@ async function getServer(ctx, session) {
431
447
  __name(getServer, "getServer");
432
448
  async function getStatus(ctx, session) {
433
449
  const log = ctx.logger("status");
434
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
450
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
435
451
  const time = getHongKongTime();
436
452
  let msg;
437
453
  const vMsg = await getSystemUsage();
@@ -465,7 +481,7 @@ async function getStatus(ctx, session) {
465
481
  __name(getStatus, "getStatus");
466
482
  async function getRandom(ctx, session, min, max) {
467
483
  const log = ctx.logger("random");
468
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
484
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
469
485
  const time = getHongKongTime();
470
486
  let msg;
471
487
  let data;
@@ -488,7 +504,7 @@ async function getRandom(ctx, session, min, max) {
488
504
  __name(getRandom, "getRandom");
489
505
  async function getInfo(ctx, session) {
490
506
  const log = ctx.logger("info");
491
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
507
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
492
508
  const time = getHongKongTime();
493
509
  let msg;
494
510
  let data = await readInfoFile(ctx);
@@ -514,7 +530,7 @@ async function getInfo(ctx, session) {
514
530
  __name(getInfo, "getInfo");
515
531
  async function getRandomWord(ctx, session) {
516
532
  const log = ctx.logger("rw");
517
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
533
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
518
534
  let msg;
519
535
  const time = getHongKongTime();
520
536
  if (ctx.config.rwAPI == void 0) {
@@ -556,7 +572,7 @@ async function getRandomWord(ctx, session) {
556
572
  __name(getRandomWord, "getRandomWord");
557
573
  async function getBlueArchive(ctx, session) {
558
574
  const log = ctx.logger("ba");
559
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
575
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
560
576
  const time = getHongKongTime();
561
577
  if (ctx.config.baAPI == void 0) {
562
578
  await session.send(session.text(".msg", { "quote": import_koishi2.h.quote(session.messageId), "image": "未指定 API" }));
@@ -575,7 +591,7 @@ async function getBlueArchive(ctx, session) {
575
591
  __name(getBlueArchive, "getBlueArchive");
576
592
  async function serverTest(ctx, session) {
577
593
  const log = ctx.logger("serverTest");
578
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
594
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
579
595
  const time = getHongKongTime();
580
596
  const host = ctx.config.serverPing[`${session.event.guild?.id}`];
581
597
  if (host == void 0) {
@@ -612,7 +628,7 @@ async function serverTest(ctx, session) {
612
628
  __name(serverTest, "serverTest");
613
629
  async function getMeme(ctx, session, count) {
614
630
  const log = ctx.logger("getMeme");
615
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
631
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
616
632
  let msg;
617
633
  const time = getHongKongTime();
618
634
  if (ctx.config.memesAPI[`${session.event.guild?.id}`] == void 0) {
@@ -661,7 +677,7 @@ async function getMeme(ctx, session, count) {
661
677
  __name(getMeme, "getMeme");
662
678
  async function getCat(ctx, session) {
663
679
  const log = ctx.logger("cat");
664
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
680
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
665
681
  const time = getHongKongTime();
666
682
  if (ctx.config.catAPI == void 0) {
667
683
  await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "data": "未指定 API", "time": time }));
@@ -692,7 +708,7 @@ async function getCat(ctx, session) {
692
708
  __name(getCat, "getCat");
693
709
  async function getQQInfo(ctx, session, qq) {
694
710
  const log = ctx.logger("getQQInfo");
695
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
711
+ log.debug(`Got: {"form":"${session.platform}:${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
696
712
  const time = getHongKongTime();
697
713
  if (ctx.config.qqAPI == void 0) {
698
714
  await session.send(session.text(".failed", { "quote": import_koishi2.h.quote(session.messageId), "data": "未指定 API", "time": time }));
@@ -740,7 +756,7 @@ async function getQQInfo(ctx, session, qq) {
740
756
  __name(getQQInfo, "getQQInfo");
741
757
  async function getMsg(ctx, session) {
742
758
  const log = ctx.logger("getQQInfo");
743
- log.debug(`Got: {"form":"${session.event.guild?.id}","user":"${session.event.user?.id}","timestamp":${session.event.timestamp},"messageId":"${session.event.message?.id}"}`);
759
+ 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
760
  const time = getHongKongTime();
745
761
  if (!session.quote || !session.quote.user) {
746
762
  await session.send(session.text(".null"));
@@ -796,12 +812,55 @@ async function getMsg(ctx, session) {
796
812
  return 0;
797
813
  }
798
814
  __name(getMsg, "getMsg");
815
+ async function getNewsMsg(ctx, type) {
816
+ const log = ctx.logger("getNewsMsg");
817
+ const response = await request("https://api.steampowered.com/ISteamNews/GetNewsForApp/v2/?appid=700330&count=1", {}, ctx.config.timeout, log);
818
+ if (response.success) {
819
+ if ((await ctx.database.get("botData", "newsId"))[0]?.data == response.data.appnews.newsitems[0].gid) {
820
+ log.debug("无新闻");
821
+ return { success: false, data: "" };
822
+ }
823
+ const page = await ctx.puppeteer.page();
824
+ const html = await readNewsFile(response.data);
825
+ try {
826
+ await page.setViewport({
827
+ width: 800,
828
+ height: 800,
829
+ deviceScaleFactor: 2
830
+ });
831
+ await page.setContent(html, { waitUntil: "networkidle0" });
832
+ const { width, height } = await page.evaluate(() => ({
833
+ width: document.body.scrollWidth,
834
+ height: document.body.scrollHeight
835
+ }));
836
+ await page.setViewport({ width, height, deviceScaleFactor: 2 });
837
+ const image = await page.screenshot({
838
+ type: "png",
839
+ fullPage: true,
840
+ omitBackground: true
841
+ // 使得 CSS 中未定义的背景部分透明
842
+ });
843
+ if (type == 0) await ctx.database.upsert("botData", [
844
+ { id: "newsId", data: response.data.appnews.newsitems[0].gid }
845
+ ]);
846
+ return { success: true, data: Buffer.from(image).toString("base64"), msg: "NW 发布了一个新闻(原文英语):" + response.data.appnews.newsitems[0].title };
847
+ } catch (err) {
848
+ log.error("图片渲染失败:", err);
849
+ return { success: false, data: "图片渲染失败" };
850
+ } finally {
851
+ if (page && !page.isClosed()) await page.close();
852
+ }
853
+ } else {
854
+ return { success: false, data: "请求 Steam API 失败" };
855
+ }
856
+ }
857
+ __name(getNewsMsg, "getNewsMsg");
799
858
 
800
859
  // package.json
801
- var version = "2.21.0";
860
+ var version = "2.22.0";
802
861
 
803
862
  // src/index.ts
804
- var inject = ["database", "installer", "puppeteer"];
863
+ var inject = ["database", "installer", "puppeteer", "cron"];
805
864
  var name = "node-async-bot-all";
806
865
  var usage = "这是一个私有插件。";
807
866
  var Config = import_koishi3.Schema.intersect([
@@ -842,7 +901,10 @@ var Config = import_koishi3.Schema.intersect([
842
901
  }).description("随机猫猫图"),
843
902
  import_koishi3.Schema.object({
844
903
  qqAPI: import_koishi3.Schema.string().default("https://uapis.cn/api/v1/social/qq/userinfo").description("获取 QQ 信息 API")
845
- }).description("获取 QQ 信息")
904
+ }).description("获取 QQ 信息"),
905
+ import_koishi3.Schema.object({
906
+ slNews: import_koishi3.Schema.array(String).default([""]).description("{platform}:{channelId}")
907
+ }).description("SL新闻列表")
846
908
  ]).description("基础设置");
847
909
  function apply(ctx) {
848
910
  ctx.i18n.define("zh-CN", require_zh_CN());
@@ -858,6 +920,33 @@ function apply(ctx) {
858
920
  { id: "version", data: version }
859
921
  ]);
860
922
  });
923
+ ctx.command("slnews", "手动触发slnews发送到当前会话").action(async ({ session }) => {
924
+ const outMsg = await getNewsMsg(ctx, 1);
925
+ if (outMsg.success) {
926
+ if (outMsg.msg) session?.send(outMsg.msg);
927
+ return (0, import_koishi3.h)("image", { url: `data:image/jpg;base64,${outMsg.data}` });
928
+ } else {
929
+ if (outMsg.data == "") return "无可用新闻";
930
+ return outMsg.data;
931
+ }
932
+ });
933
+ ctx.cron("0 * * * *", async () => {
934
+ ctx.emit("node-async/news");
935
+ });
936
+ ctx.cron("5 * * * *", async () => {
937
+ ctx.emit("node-async/news");
938
+ });
939
+ ctx.on("node-async/news", async () => {
940
+ const outMsg = await getNewsMsg(ctx, 0);
941
+ if (outMsg.success) {
942
+ if (outMsg.msg) await ctx.broadcast(ctx.config.slNews, outMsg.msg);
943
+ await (0, import_koishi3.sleep)(100);
944
+ await ctx.broadcast(ctx.config.slNews, (0, import_koishi3.h)("image", { url: `data:image/jpg;base64,${outMsg.data}` }));
945
+ } else {
946
+ if (outMsg.data == "") return;
947
+ await ctx.broadcast(ctx.config.slNews, outMsg.data);
948
+ }
949
+ });
861
950
  ctx.command("cxGame").action(async ({ session }) => {
862
951
  const cx = await getServer(ctx, session);
863
952
  if (cx["success"] == 0) {
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.21.0",
4
+ "version": "2.22.0",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "contributors": [
@@ -33,11 +33,13 @@
33
33
  "peerDependencies": {
34
34
  "@koishijs/plugin-database-sqlite": "^4.6.0",
35
35
  "@koishijs/plugin-help": "^2.4.5",
36
- "koishi-plugin-puppeteer": "^3.9.0",
37
36
  "@koishijs/plugin-market": "^2.11.8",
38
- "koishi": "^4.18.7"
37
+ "koishi": "^4.18.7",
38
+ "koishi-plugin-puppeteer": "^3.9.0"
39
39
  },
40
40
  "dependencies": {
41
+ "@bbob/html": "^4.3.1",
42
+ "@bbob/preset-html5": "^4.3.1",
41
43
  "ping": "^1.0.0",
42
44
  "steam-server-query": "^1.1.3"
43
45
  }
@@ -0,0 +1,71 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <style>
6
+ body {
7
+ margin: 0;
8
+ padding: 0;
9
+ background-color: #1b2838; /* Steam 经典深蓝背景 */
10
+ font-family: "Motiva Sans", Arial, Helvetica, sans-serif;
11
+ color: #acb2b8;
12
+ display: flex;
13
+ justify-content: center;
14
+ }
15
+ .container {
16
+ width: 100%;
17
+ max-width: 800px;
18
+ background-color: #1b2838;
19
+ }
20
+ .content-padding {
21
+ padding: 30px;
22
+ }
23
+ .date {
24
+ color: #808589;
25
+ font-size: 13px;
26
+ text-transform: uppercase;
27
+ letter-spacing: 1px;
28
+ margin-bottom: 10px;
29
+ }
30
+ .title {
31
+ color: #ffffff;
32
+ font-size: 32px;
33
+ font-weight: bold;
34
+ line-height: 1.2;
35
+ margin-bottom: 20px;
36
+ text-shadow: 0 0 10px rgba(0,0,0,0.5);
37
+ }
38
+ .body-text {
39
+ font-size: 16px;
40
+ line-height: 1.6;
41
+ color: #d1d1d1;
42
+ }
43
+ .body-text p {
44
+ margin-bottom: 20px;
45
+ }
46
+ .update-box h3 {
47
+ color: #1a9fff;
48
+ margin-top: 0;
49
+ }
50
+ ul {
51
+ padding-left: 20px;
52
+ }
53
+ li {
54
+ margin-bottom: 10px;
55
+ }
56
+ </style>
57
+ <title>News</title>
58
+ </head>
59
+ <body>
60
+ <div class="container">
61
+ <div class="content-padding">
62
+ <div class="date">{date}</div>
63
+ <div class="title">{title}</div>
64
+
65
+ <div class="body-text">
66
+ {content}
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </body>
71
+ </html>