From 718e97ed457b3f7298bfae9fb5b9b11b958b2951 Mon Sep 17 00:00:00 2001 From: Last2014 Date: Sat, 2 Aug 2025 19:39:50 +0900 Subject: [PATCH] =?UTF-8?q?v7.2@uwuzu1.5.4=E3=82=92=E3=83=AA=E3=83=AA?= =?UTF-8?q?=E3=83=BC=E3=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++++ checks/version.ts | 26 ++++++++------ examples/config.ts | 1 + package.json | 7 +++- scripts/commands/follow.ts | 19 ++++------ scripts/commands/help.ts | 28 +++++++++++++++ scripts/commands/info.ts | 26 ++++++++++++++ scripts/commands/main.ts | 28 +++++++++++++-- scripts/commands/report.ts | 69 ++++++++++++++++++++++++++++++++++++ scripts/commands/unfollow.ts | 18 ++++------ scripts/earthquakeNotice.ts | 29 ++++++++++----- scripts/timeNotice.ts | 1 + scripts/weatherNotice.ts | 2 ++ types/config.d.ts | 1 + 14 files changed, 215 insertions(+), 47 deletions(-) create mode 100644 scripts/commands/help.ts create mode 100644 scripts/commands/info.ts create mode 100644 scripts/commands/report.ts diff --git a/README.md b/README.md index 6cc4eaa..0d513ee 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,13 @@ Automatic notification bot for uwuzu - Earthquake occurs - Tsunami forecast - Weather notification +- Commands that users can use freely + - About BOT + - Command Help + - Report to the operator + - Follow back + - Unfollow + - Weather Repost - Startup requirements check - Check package existence - Required package version check diff --git a/checks/version.ts b/checks/version.ts index 24f690b..11b3130 100644 --- a/checks/version.ts +++ b/checks/version.ts @@ -1,35 +1,41 @@ -import * as fs from "fs"; import config from "../config.js"; +import { readFileSync, writeFileSync, existsSync } from "fs"; export default async function VersionCheck() { - const nowVersion: string = JSON.parse(fs.readFileSync("package.json", "utf-8")).version; + const packageJson = JSON.parse(readFileSync("package.json", "utf-8")); // 初期化 - if (!fs.existsSync("logs/version.txt")) { - fs.writeFileSync( + if (!existsSync("logs/version.txt")) { + writeFileSync( "logs/version.txt", - nowVersion, + packageJson.version, "utf-8", ); } // 最終起動バージョン取得 - const oldVersion = fs.readFileSync("logs/version.txt", "utf-8"); + const oldVersion = readFileSync("logs/version.txt", "utf-8"); - if (oldVersion !== nowVersion) { + if (oldVersion !== packageJson.version) { try { - fs.writeFileSync( + writeFileSync( "logs/version.txt", - nowVersion, + packageJson.version, "utf-8", ); + const releaseUrl = `${packageJson.repository.url}/releases/tag/${packageJson.tag}`; + await fetch(`https://${config.uwuzu.host}/api/ueuse/create`, { method: "POST", body: JSON.stringify({ token: config.uwuzu.apiToken, - text: `${nowVersion}にBOTがアップデートされました!`, + text: ` + ${packageJson.version}にBOTがアップデートされました! + リリース内容:${releaseUrl} + `, }), + cache: "no-store", }); } catch (err) { console.log("アップデート通知にエラーが発生しました: ", err); diff --git a/examples/config.ts b/examples/config.ts index d8d07bd..570a2bc 100644 --- a/examples/config.ts +++ b/examples/config.ts @@ -24,6 +24,7 @@ const config: configTypes = { // 緊急時設定 emergency: { function: true, // 緊急時のコンソール表示 + report: false, // reportコマンド mail: { function: true, // 緊急時のメール送信 host: "smtp.example.com", // SMTPサーバー diff --git a/package.json b/package.json index abd300c..7f3a399 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "notice-uwuzu", - "version": "v7.1.1(LTS)@uwuzu1.5.4", + "version": "v7.2@uwuzu1.5.4", + "tag": "v7.2", "description": "Notice Bot for uwuzu", "main": "dist/main.js", "scripts": { @@ -10,6 +11,10 @@ "dev": "tsx main.ts", "clean": "tsc && node dist/scripts/clean/main.js" }, + "repository": { + "type": "git", + "url": "https://gitea.last2014.com/last2014/noticeUwuzu" + }, "keywords": [ "uwuzu", "bot", diff --git a/scripts/commands/follow.ts b/scripts/commands/follow.ts index 85a7cb2..2acc9e2 100644 --- a/scripts/commands/follow.ts +++ b/scripts/commands/follow.ts @@ -1,5 +1,6 @@ import { ueuse } from "types/types.js"; import config from "../../config.js"; +import { Reply } from "./main.js"; export default async function Follow(data: ueuse) { const followReq = await fetch(`https://${config.uwuzu.host}/api/users/follow`, { @@ -8,6 +9,7 @@ export default async function Follow(data: ueuse) { token: config.uwuzu.apiToken, userid: data.account.userid, }), + cache: "no-store", }); const followRes = await followReq.json(); @@ -15,18 +17,9 @@ export default async function Follow(data: ueuse) { console.log("フォロー: ", followRes); - const noticeReq = await fetch(`https://${config.uwuzu.host}/api/ueuse/create`, { - method: "POST", - body: JSON.stringify({ - token: config.uwuzu.apiToken, - text: ` - ${data.account.username}さんをフォローしました - `, - replyid: data.uniqid, - }), - }); + const notice = await Reply(` + ${data.account.username}さんをフォローしました + `, data.uniqid); - const noticeRes = await noticeReq.json(); - - console.log("フォロー通知: ", noticeRes); + console.log("フォロー通知: ", notice); } diff --git a/scripts/commands/help.ts b/scripts/commands/help.ts new file mode 100644 index 0000000..86860ef --- /dev/null +++ b/scripts/commands/help.ts @@ -0,0 +1,28 @@ +import { ueuse } from "types/types.js"; +import { readFileSync } from "fs"; +import { Reply } from "./main.js"; + +const helps = { + "info": "このBOTについての概要を返信するコマンドです。", + "help": "このコマンドです。コマンドの概要を返信します。", + "follow": "コマンド送信者をフォローします。", + "unfollow": "コマンド送信者をフォロー解除します。", + "weather": "天気を返信します。7:00に投稿されるものとは異なり再取得します。", +} as { [key: string]: string }; + +export default async function Help(data: ueuse) { + const packageJson = JSON.parse(readFileSync("package.json", "utf-8")); + + const helpMsg = + Object.entries(helps) + .map(([command, message]) => + `\`/${command}\`:${message}` + ).join('\n'); + + const ueuse = await Reply(` + ${helpMsg} + 機能を見る:${packageJson.repository.url}/wiki + `, data.uniqid); + + console.log("ヘルプ:", ueuse); +} diff --git a/scripts/commands/info.ts b/scripts/commands/info.ts new file mode 100644 index 0000000..03e86b4 --- /dev/null +++ b/scripts/commands/info.ts @@ -0,0 +1,26 @@ +import { ueuse } from "types/types.js"; +import { readFileSync } from "fs"; +import { Reply } from "./main.js"; + +export default async function Info(data: ueuse) { + const packageJson = JSON.parse(readFileSync("package.json", "utf-8")); + const releaseUrl = `${packageJson.repository.url}/releases/tag/${packageJson.tag}`; + + let editor = ""; + + if (packageJson.author.name !== "Last2014") { + editor = `\nEdited by ${packageJson.author.name}`; + } + + const ueuse = await Reply(` + バージョン:${packageJson.version} + リリース詳細:${releaseUrl} + + コマンドのヘルプをお探しですか? + \`/help\`をご利用ください。 + + Created by Last2014${editor} + `, data.uniqid); + + console.log("概要:", ueuse); +} diff --git a/scripts/commands/main.ts b/scripts/commands/main.ts index 0e6fe37..3387dd3 100644 --- a/scripts/commands/main.ts +++ b/scripts/commands/main.ts @@ -5,9 +5,12 @@ import type { ueuse } from "types/types.js"; const initialFile: Array = []; // コマンド読み込み +import Info from "./info.js"; import Follow from "./follow.js"; import UnFollow from "./unfollow.js"; import Weather from "./weather.js"; +import Help from "./help.js"; +import Report from "./report.js"; // 初期化 if (!fs.existsSync("logs/alreadyCommands.json")) { @@ -31,7 +34,7 @@ function cutAfterChar(str: string, char: string) { return str.substring(index + 1); } -async function Reply(text: string, reply: string) { +export async function Reply(text: string, reply: string) { const req = await fetch(`https://${config.uwuzu.host}/api/ueuse/create`, { method: "POST", body: JSON.stringify({ @@ -39,6 +42,7 @@ async function Reply(text: string, reply: string) { text: text, replyid: reply, }), + cache: "no-store", }); const res = await req.json(); @@ -63,6 +67,7 @@ export default async function Commands() { body: JSON.stringify({ token: config.uwuzu.apiToken, }), + cache: "no-store", } ); @@ -79,7 +84,11 @@ export default async function Commands() { break; } - if (data.text.charAt(0) === "!") { + if ( + data.text.charAt(0) === "!" || + data.text.charAt(0) === "!" || + data.abi === "ignore" + ) { break; } @@ -89,6 +98,21 @@ export default async function Commands() { const commandName = cutAfterChar(data.text, "/"); switch (commandName) { + case "": + alreadyAdd(data.uniqid); + break; + case "info": + alreadyAdd(data.uniqid); + Info(data); + break; + case "help": + alreadyAdd(data.uniqid); + Help(data); + break; + case "report": + alreadyAdd(data.uniqid); + Report(data); + break; case "follow": alreadyAdd(data.uniqid); Follow(data); diff --git a/scripts/commands/report.ts b/scripts/commands/report.ts new file mode 100644 index 0000000..38794f9 --- /dev/null +++ b/scripts/commands/report.ts @@ -0,0 +1,69 @@ +import { ueuse } from "types/types.js"; +import { Reply } from "./main.js"; +import config from "config.js"; +import sendMail from "../../src/mailer.js"; + +export default async function Report(data: ueuse) { + if ( + data.abi === "none" || + data.abi === "" + ) { + console.log("報告(内容なし):", await Reply(` + 追記に内容を記入してください。 + (このユーズはもう利用できません。他のユーズで\`/report\`をまたご利用ください。) + `, data.uniqid)); + return; + } + + if (data.abi === "ignore") { + return; + } + + if (!config.emergency.mail.function) { + console.log("報告(メールオフ):", await Reply(` + BOTの運営者によってメール送信機能が無効化されています。 + そのため報告機能はご利用いただけません。 + `, data.uniqid)); + return; + } + + if (!config.emergency.report) { + console.log("報告(機能オフ):", await Reply(` + BOTの運営者によって報告機能が無効化されています。 + そのため報告機能はご利用いただけません。 + `, data.uniqid)); + return; + } + + try { + sendMail({ + to: config.emergency.mail.to, + subject: "【報告】BOT利用者からの報告", + text: ` + ※noticeUwuzu自動送信によるメールです + 【報告】 + BOT管理者さん、noticeUwuzu自動送信メールです。 + @${data.account.userid}@${config.uwuzu.host}から/reportコマンドを利用した報告がありました。 + 報告元ユーズ:https://${config.uwuzu.host}/!${data.uniqid} + 下記が内容となります。 + ${data.abi} + `, + }); + + console.log("報告(完了):", await Reply(` + 報告が完了しました。 + 運営者は報告者、ユーズのURL、内容を確認できます。 + 場合によっては運営者、BOTからブロックされる可能性があります。 + `, data.uniqid)); + + return; + } catch (err) { + console.log("/reportエラー:", err); + + console.log("報告(エラー):", await Reply(` + 報告に失敗しました。 + `, data.uniqid)); + + return; + } +} diff --git a/scripts/commands/unfollow.ts b/scripts/commands/unfollow.ts index 6a4f1cd..25120bc 100644 --- a/scripts/commands/unfollow.ts +++ b/scripts/commands/unfollow.ts @@ -1,5 +1,6 @@ import { ueuse } from "types/types.js"; import config from "../../config.js"; +import { Reply } from "./main.js"; export default async function UnFollow(data: ueuse) { const unfollowReq = await fetch(`https://${config.uwuzu.host}/api/users/unfollow`, { @@ -8,24 +9,17 @@ export default async function UnFollow(data: ueuse) { token: config.uwuzu.apiToken, userid: data.account.userid, }), + cache: "no-store", }); const unfollowRes = await unfollowReq.json(); console.log("フォロー解除: ", unfollowRes); - const noticeReq = await fetch(`https://${config.uwuzu.host}/api/ueuse/create`, { - method: "POST", - body: JSON.stringify({ - token: config.uwuzu.apiToken, - text: ` - ${data.account.username}さんをフォロー解除しました - `, - replyid: data.uniqid, - }), - }); - const noticeRes = await noticeReq.json(); + const notice = await Reply(` + ${data.account.username}さんをフォロー解除しました + `, data.uniqid); - console.log("フォロー解除通知: ", noticeRes); + console.log("フォロー解除通知: ", notice); } diff --git a/scripts/earthquakeNotice.ts b/scripts/earthquakeNotice.ts index c71a083..019890e 100644 --- a/scripts/earthquakeNotice.ts +++ b/scripts/earthquakeNotice.ts @@ -73,7 +73,7 @@ class P2PEarthquakeClient { event(message); } else { console.log(`未対応の情報を受信しました(コード: ${message.code})`); - console.log(`受信メッセージ:${message}`); + console.log("受信メッセージ:", message); } } @@ -137,7 +137,7 @@ async function areaMap(): Promise> { // 情報受信 async function event(earthquakeInfo: any): Promise { - console.log(`受信メッセージ:${earthquakeInfo}`); + console.log("受信メッセージ:", earthquakeInfo); // ----処理---- // 緊急地震速報の場合 @@ -289,12 +289,12 @@ async function event(earthquakeInfo: any): Promise { to: config.emergency.mail.to, subject: "【警告】震度6強以上の地震を受信しました", text: ` - ※noticeUwuzu自動送信によるメールです - 【警告】 - BOT管理者さん、noticeUwuzu自動送信メールです。 - 震度6強以上の地震を受信したため警告メールが送信されました。 - 物理、システム的にサーバーがダウンする可能性があります。 - ご自身の身をお守りください。 + ※noticeUwuzu自動送信によるメールです + 【警告】 + BOT管理者さん、noticeUwuzu自動送信メールです。 + 震度6強以上の地震を受信したため警告メールが送信されました。 + 物理、システム的にサーバーがダウンする可能性があります。 + ご自身の身をお守りください。 ` }); @@ -314,6 +314,8 @@ async function event(earthquakeInfo: any): Promise { ), ); areas = `対象地域:${areaNames.join("・")}`; + } else { + areas = "対象地域:不明"; } // 詳細 @@ -324,6 +326,8 @@ async function event(earthquakeInfo: any): Promise { earthquakeInfo.comments.freeFormComment !== undefined ) { description = `この地震について:${earthquakeInfo.comments.freeFormComment}`; + } else { + description = ""; } // 深さ @@ -340,6 +344,8 @@ async function event(earthquakeInfo: any): Promise { } else { depth = `深さ:${String(earthquakeInfo.earthquake.hypocenter.depth)}km`; } + } else { + depth = "深さ:不明"; } // マグニチュード @@ -350,10 +356,12 @@ async function event(earthquakeInfo: any): Promise { earthquakeInfo.earthquake.hypocenter.magnitude !== undefined ) { if (earthquakeInfo.earthquake.hypocenter.magnitude === -1) { - depth = "マグニチュード:不明"; + magnitude = "マグニチュード:不明"; } else { magnitude = `マグニチュード:M${String(earthquakeInfo.earthquake.hypocenter.magnitude)}`; } + } else { + magnitude = "マグニチュード:不明"; } ueuse(` @@ -417,6 +425,8 @@ async function event(earthquakeInfo: any): Promise { immediate = "### 津波が直ちに襲来します"; } else if (!data.immediate) { immediate = "津波は直ちには襲来しません"; + } else { + immediate = "津波の襲来が直後かの情報がありません"; } // 第1波 @@ -481,6 +491,7 @@ async function ueuse(text: string) { token: config.uwuzu.apiToken, text: text, }), + cache: "no-store", }); const resData = await res.json(); diff --git a/scripts/timeNotice.ts b/scripts/timeNotice.ts index eac5745..9e91613 100644 --- a/scripts/timeNotice.ts +++ b/scripts/timeNotice.ts @@ -35,6 +35,7 @@ export default async function timeNotice() { token: config.uwuzu.apiToken, text: `${format(new Date(), "HH:mm")}になりました`, }), + cache: "no-store", }, ); diff --git a/scripts/weatherNotice.ts b/scripts/weatherNotice.ts index 209b26e..eae8b76 100644 --- a/scripts/weatherNotice.ts +++ b/scripts/weatherNotice.ts @@ -19,6 +19,7 @@ export async function weatherNotice() { ※タイムラインが埋まるため返信に記載しています `, }), + cache: "no-store", }, ); @@ -114,6 +115,7 @@ export async function weatherReply(uniqid: string) { text: weatherResults[i], replyid: uniqid, }), + cache: "no-store", }, ); diff --git a/types/config.d.ts b/types/config.d.ts index 110152b..806eccd 100644 --- a/types/config.d.ts +++ b/types/config.d.ts @@ -31,6 +31,7 @@ interface emergencyMailTypes { interface emergencyTypes { function: Boolean; mail: emergencyMailTypes; + report: Boolean; } interface uwuzuTypes {