koishi-plugin-node-async-bot-all 2.21.0 → 2.22.1
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 +27 -0
- package/lib/fun.d.ts +2 -1
- package/lib/index.d.ts +4 -0
- package/lib/index.js +102 -14
- package/package.json +5 -3
- package/res/slNews.html +71 -0
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("http://127.0.0.1:8080/tasa/index.old/v.json", {}, ctx.config.timeout, log);
|
|
818
|
+
if (response.success) {
|
|
819
|
+
if ((await ctx.database.get("botData", "newsId"))[0]?.data == response.data.appnews.newsitems[0].gid && type != 1) {
|
|
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: "NorthWood 发布了一个新闻(原文英语):" + 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.
|
|
860
|
+
var version = "2.22.1";
|
|
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,32 @@ 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
|
+
return `${outMsg.msg}
|
|
927
|
+
${(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("18 * * * *", 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
|
+
await ctx.broadcast(ctx.config.slNews, `${outMsg.msg}
|
|
943
|
+
${(0, import_koishi3.h)("image", { url: `data:image/jpg;base64,${outMsg.data}` })}`);
|
|
944
|
+
} else {
|
|
945
|
+
if (outMsg.data == "") return;
|
|
946
|
+
await ctx.broadcast(ctx.config.slNews, outMsg.data);
|
|
947
|
+
}
|
|
948
|
+
});
|
|
861
949
|
ctx.command("cxGame").action(async ({ session }) => {
|
|
862
950
|
const cx = await getServer(ctx, session);
|
|
863
951
|
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.
|
|
4
|
+
"version": "2.22.1",
|
|
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
|
}
|
package/res/slNews.html
ADDED
|
@@ -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>
|