diff --git a/asciiart.txt b/asciiart.txt deleted file mode 100644 index 22b8f1a..0000000 --- a/asciiart.txt +++ /dev/null @@ -1,5 +0,0 @@ -# # ###### ##### ### ###### ####### # # # # # # ###### # # -## # # # # # # # # # # # # # # # # # -# ## # # # # # # ####### # # # # # # # # ## # # -# ## # # # # # # # # # # # # # # # -# # ###### # ### ###### ####### ###### # # ###### ###### ###### \ No newline at end of file diff --git a/package.json b/package.json index f458f50..bc440fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "earthquake-bot-for-mtweet", - "version": "1.0.2", + "version": "1.0.3", "type": "module", "main": "dist/index.js", "scripts": { diff --git a/src/earthquake/index.ts b/src/earthquake/index.ts index d550afb..b627c00 100644 --- a/src/earthquake/index.ts +++ b/src/earthquake/index.ts @@ -6,59 +6,61 @@ import { EOL } from "node:os"; import { WebSocket } from "ws"; import generateImage from "@/earthquake/generateImage"; -if (config.earthquake?.useHistoryData) { - console.log("過去の地震情報を配信します"); - const history = JSON.parse(readFileSync(`${import.meta.dirname}/../../260420.json`, "utf-8")); - history.reverse(); +export default function earthquake() { + if (config.earthquake?.useHistoryData) { + console.log("過去の地震情報を配信します"); + const history = JSON.parse(readFileSync(`${import.meta.dirname}/../../260420.json`, "utf-8")); + history.reverse(); - let i = 0; - setInterval(() => { - processMessage(history[i]); - i++; - }, 10 * 1000); -} else { - const connect = () => { - const WEBSOCKET_URL = config.debug - ? "wss://api-realtime-sandbox.p2pquake.net/v2/ws" - : "wss://api.p2pquake.net/v2/ws"; + let i = 0; + setInterval(() => { + processMessage(history[i]); + i++; + }, 10 * 1000); + } else { + const connect = () => { + const WEBSOCKET_URL = config.debug + ? "wss://api-realtime-sandbox.p2pquake.net/v2/ws" + : "wss://api.p2pquake.net/v2/ws"; - console.log("P2P地震情報のWebSocketに接続します"); - const socket = new WebSocket(WEBSOCKET_URL); + console.log("P2P地震情報のWebSocketに接続します"); + const socket = new WebSocket(WEBSOCKET_URL); - socket.addEventListener("open", () => { - console.log("P2P地震情報のWebSocketに接続しました"); - }); + socket.addEventListener("open", () => { + console.log("P2P地震情報のWebSocketに接続しました"); + }); - socket.addEventListener("close", (err) => { - const interval = config.earthquake.reconnectInterval; - console.log(`WebSocketが切断されました。${interval / 1000}秒後に再接続します:`, err.reason); - setTimeout(() => { - connect(); - }, interval); - }); + socket.addEventListener("close", (err) => { + const interval = config.earthquake.reconnectInterval; + console.log(`WebSocketが切断されました。${interval / 1000}秒後に再接続します:`, err.reason); + setTimeout(() => { + connect(); + }, interval); + }); - socket.addEventListener("error", (err) => { - console.error("WebSocketでエラーが発生しました:", err); - socket.close(); - }); + socket.addEventListener("error", (err) => { + console.error("WebSocketでエラーが発生しました:", err); + socket.close(); + }); - socket.addEventListener("message", async (event) => { - let message; + socket.addEventListener("message", async (event) => { + let message; - try { - message = typeof event.data === "string" - ? JSON.parse(event.data) - : event.data; - } catch (err) { - console.error("地震情報メッセージのパースでエラーが発生:", err); - return; - } + try { + message = typeof event.data === "string" + ? JSON.parse(event.data) + : event.data; + } catch (err) { + console.error("地震情報メッセージのパースでエラーが発生:", err); + return; + } - processMessage(message); - }); + processMessage(message); + }); + } + + connect(); } - - connect(); } const processMessage = async (message: any) => { diff --git a/src/index.ts b/src/index.ts index 40d21a9..e1e9592 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,10 +1,9 @@ import { readFileSync } from "node:fs"; import config from "@/lib/config"; import { styleText } from "node:util"; -import { Worker } from "node:worker_threads"; +import earthquake from "@/earthquake"; try { - console.log(readFileSync(`${import.meta.dirname}/../asciiart.txt`, "utf-8")); console.log(JSON.parse(readFileSync(`${import.meta.dirname}/../package.json`, "utf-8")).version); if (config.debug) { process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; @@ -16,7 +15,7 @@ try { } console.log(); - new Worker(`${import.meta.dirname}/earthquake/index.js`); + earthquake(); console.log("Botが起動しました"); } catch (err: any) { diff --git a/src/lib/client.ts b/src/lib/client.ts index 9879c1c..824dd95 100644 --- a/src/lib/client.ts +++ b/src/lib/client.ts @@ -11,18 +11,18 @@ type SuccessPosted = { post: { id: T; content: string; - zone: "normal" | string; + zone: "normal" | "free"; created_at: string; }; }; } -const BASE_URL = "https://collapse.jp/api/v3/bot"; +const BASE_URL = "https://collapse.jp/api/v3/bot/"; export const createPost = async (data: { text: string; - zone?: "normal" | string; - replyTarget?: "all" | string; + zone?: "normal" | "free"; + replyTarget?: "all" | "followers" | "mutual" | "mentioned" | "none"; replyid?: string; images?: [Blob, string][]; }, title: string) => { @@ -78,30 +78,25 @@ export const createPost = async (data: { const replyid = data.replyid === undefined && firstUniqid !== "" ? firstUniqid : data.replyid; - const reply = replyid !== undefined - ? `/${replyid}/reply` - : ""; - const url = new URL(`/posts${reply}`, BASE_URL); const body = new FormData(); body.append("content", data.text); - if (!replyid) { - body.append("zone", data.zone ?? "normal"); - body.append("reply_restriction", data.replyTarget ?? "all"); + body.append("zone", data.zone ?? "normal"); + body.append("reply_restriction", data.replyTarget ?? "all"); + if (replyid) { + body.append("reply_to_id", replyid); } if (data.images) { data.images.forEach(img => body.append("images", img[0], img[1])); } - const req = await fetch(url, { + const req = await fetch(new URL("posts", BASE_URL), { method: "POST", - body: JSON.stringify({ - content: data.text, - zone: data.zone ?? "normal", - reply_restriction: data.replyTarget ?? "all", - }), + body, headers: { "Authorization": `Bearer ${config.mtweet.token}`, + "Content-Type": "application/json", + "X-Idempotency-Key": String(process.hrtime.bigint()), }, }); @@ -114,7 +109,7 @@ export const createPost = async (data: { break; } - console.warn(`${title}の投稿に失敗しました (試行 ${attempt}/${config.post.maxRetries}):`, res.error.message); + console.warn(`${title}の投稿に失敗しました (試行 ${attempt}/${config.post.maxRetries}):`, `${res.error.message}(${res.error.code})`); if (attempt < config.post.maxRetries) { const interval = res.error.details?.retry_after ? res.error.details.retry_after * 1000