From 6e9ea20d33ca49226f8c3abb9b3857a2f2ccd333 Mon Sep 17 00:00:00 2001 From: Last2014 Date: Sat, 16 May 2026 18:45:13 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20=E5=9C=B0=E9=9C=87=E3=81=AE=E9=9C=87?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E5=B8=83=E7=94=BB=E5=83=8F=E7=94=9F=E6=88=90?= =?UTF-8?q?=20/=20Chg:=20=E9=9C=87=E5=BA=A6=E5=88=86=E5=B8=83=E7=94=BB?= =?UTF-8?q?=E5=83=8F=E3=81=AE=E3=82=BA=E3=83=BC=E3=83=A0=E3=83=AC=E3=83=99?= =?UTF-8?q?=E3=83=AB=E3=82=928=E3=81=8B=E3=82=899=E3=81=B8=20/=20Chg:=20?= =?UTF-8?q?=E9=9C=87=E5=BA=A6=E5=88=86=E5=B8=83=E7=94=BB=E5=83=8F=E3=81=AE?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=9D=A1=E4=BB=B6=E3=82=92=E9=9C=87=E6=BA=90?= =?UTF-8?q?=E3=81=A8=E4=BD=8D=E7=BD=AE=E3=81=8C=E5=AD=98=E5=9C=A8=E3=81=99?= =?UTF-8?q?=E3=82=8B=E3=81=B8=E5=A4=89=E6=9B=B4=20/=20Feat:=20=E9=9C=87?= =?UTF-8?q?=E5=BA=A6=E5=88=86=E5=B8=83=E7=94=BB=E3=81=AB=E5=85=A8=E3=82=BF?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=81=8C=E5=9F=8B=E3=81=BE=E3=82=8B=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=20/=20Feat:=20=E9=9C=87=E5=BA=A6=E5=88=86=E5=B8=83?= =?UTF-8?q?=E7=94=BB=E5=83=8F=E3=81=AE=E9=9C=87=E6=BA=90=E3=81=8C=E3=82=BF?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E5=8D=98=E4=BD=8D=E3=81=A7=E4=B8=AD=E5=A4=AE?= =?UTF-8?q?=E3=81=AB=E3=81=AA=E3=82=8B=E6=A9=9F=E8=83=BD=20/=20Feat:=20?= =?UTF-8?q?=E9=9C=87=E5=BA=A6=E5=88=86=E5=B8=83=E7=94=BB=E5=83=8F=E3=81=A7?= =?UTF-8?q?=E6=AC=A0=E3=81=91=E3=81=A6=E3=81=84=E3=82=8B=E3=82=BF=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=8C=E6=8F=8F=E7=94=BB=E3=81=95=E3=82=8C=E3=82=8B?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=20/=20Chg:=20=E9=9C=87=E5=BA=A6=E5=88=86?= =?UTF-8?q?=E5=B8=83=E7=94=BB=E5=83=8F=E3=81=AE=E3=82=A2=E3=82=BB=E3=83=83?= =?UTF-8?q?=E3=83=88=E3=82=92=E4=B8=A6=E5=88=97=E3=81=AB=E5=8F=96=E5=BE=97?= =?UTF-8?q?=20/=20Feat:=20=E9=9C=87=E5=BA=A6=E5=88=86=E5=B8=83=E7=94=BB?= =?UTF-8?q?=E5=83=8F=E3=81=AE=E3=82=A2=E3=82=BB=E3=83=83=E3=83=88=E3=81=AE?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E3=81=8C=E4=B8=AD=E5=A4=AE=E5=9F=BA=E6=BA=96?= =?UTF-8?q?=E3=81=AB=E3=81=AA=E3=82=8B=E6=A9=9F=E8=83=BD=20/=20Chg:=20?= =?UTF-8?q?=E9=9C=87=E5=BA=A6=E5=88=86=E5=B8=83=E7=94=BB=E5=83=8F=E3=81=AE?= =?UTF-8?q?=E9=9C=87=E6=BA=90=E3=81=AE=E3=82=A2=E3=82=BB=E3=83=83=E3=83=88?= =?UTF-8?q?=E3=81=AB=E7=B8=81=E5=8F=96=E3=82=8A=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=20/=20Chg:=20=E9=9C=87=E5=BA=A6=E5=88=86=E5=B8=83=E7=94=BB?= =?UTF-8?q?=E5=83=8F=E3=81=AE=E9=9C=87=E5=BA=A6=E3=81=A7=E3=81=AF=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=82=A2=E3=82=BB=E3=83=83=E3=83=88=E3=82=92=E6=8B=A1?= =?UTF-8?q?=E5=A4=A7=20/=20Chg:=20=E3=83=A6=E3=83=BC=E3=82=BA=E3=81=AE?= =?UTF-8?q?=E5=88=86=E5=89=B2=E3=81=AE=E6=A1=88=E5=86=85=E6=96=87=E3=82=92?= =?UTF-8?q?=E5=A4=AA=E5=AD=97=E3=81=AB=20/=20Del:=20=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E9=9C=87=E5=BA=A6=E3=81=8C=E4=B8=8D=E6=98=8E=E3=81=AA=E5=A0=B4?= =?UTF-8?q?=E5=90=88=E3=81=AB=E6=8A=95=E7=A8=BF=E3=81=99=E3=82=8B=E3=81=8B?= =?UTF-8?q?=E3=81=A9=E3=81=86=E3=81=8B=E3=81=AEconfig=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- config/example.yaml | 2 - .../generateImage/assets/epicenter.png | Bin 693 -> 559 bytes .../generateImage/assets/information.png | Bin 40107 -> 17023 bytes src/feature/earthquake/generateImage/index.ts | 140 +++++++++++++++--- src/feature/earthquake/index.ts | 92 +++++++----- src/lib/client.ts | 8 +- src/lib/config.ts | 1 - 8 files changed, 184 insertions(+), 61 deletions(-) diff --git a/.gitignore b/.gitignore index e53ee7c..f360113 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ /memory.json /config/** !/config/example.yaml -/src/feature/earthquake/generateImage/data.json +/src/feature/earthquake/generateImage/data*.json diff --git a/config/example.yaml b/config/example.yaml index 5059566..b31e541 100644 --- a/config/example.yaml +++ b/config/example.yaml @@ -12,8 +12,6 @@ earthquake: # 例: 30を指定すると、最大震度が震度3以上の地震発生情報のみを投稿します。 # 10(震度1), 20(震度2), 30(震度3), 40(震度4), 45(震度5弱), 50(震度5強), 55(震度6弱), 60(震度6強), 70(震度7)が有効です。 requireMaxScale: 30 - # 最大震度が不明な地震発生情報を投稿するかどうか boolean - canUnknownMaxScale: true # 過去のデバッグ用データを使用して地震情報を配信するかどうか boolean # デバッグ用途のみで使用してください。 useHistoryData: false diff --git a/src/feature/earthquake/generateImage/assets/epicenter.png b/src/feature/earthquake/generateImage/assets/epicenter.png index 515e6056c69aa38d93c856779e38e32210633883..ca8d7e878f55a63c3ca925cfc9f5354fb511b261 100644 GIT binary patch delta 524 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 BDVG2M literal 40107 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 XgR6B`S&|LDL!qs4M7>1qRM7teta=`h diff --git a/src/feature/earthquake/generateImage/index.ts b/src/feature/earthquake/generateImage/index.ts index 1d9ac3c..f065cc1 100644 --- a/src/feature/earthquake/generateImage/index.ts +++ b/src/feature/earthquake/generateImage/index.ts @@ -153,12 +153,12 @@ function getEdge(arr: T, property: keyof T[number]) { export default async function generateImage(message: any) { if ( - message.earthquake.hypocenter === undefined && + message.earthquake.hypocenter === undefined || message.points === undefined ) return "input_lack"; - const ZOOM_LEVEL = 8; + const ZOOM_LEVEL = 9; // タイル・地点取得 const tiles: { @@ -278,23 +278,120 @@ export default async function generateImage(message: any) { scale: number; }))[] = []; - // タイルのXYの各最大、最小を取得 - const tileXCount = getEdge(tiles, "tileX"); - const tileYCount = getEdge(tiles, "tileY"); + // タイルの幅、最大最小 + let tileXCount = getEdge(tiles, "tileX"); + let tileYCount = getEdge(tiles, "tileY"); + let xSize = tileXCount.most - tileXCount.least + 1; + let ySize = tileYCount.most - tileYCount.least + 1; - // タイルサイズ決定 + // タイルサイズ仮計算 let tileSize: number; - const xSize = tileXCount.most - tileXCount.least + 1; - const ySize = tileYCount.most - tileYCount.least + 1; + xSize = tileXCount.most - tileXCount.least + 1; + ySize = tileYCount.most - tileYCount.least + 1; + if (xSize > ySize) { tileSize = Math.round(WIDTH / xSize); } else { tileSize = Math.round(HEIGHT / ySize); } + // 全画面 + if (WIDTH - xSize * tileSize > 10) { + const requireTilesX = Math.ceil(WIDTH / tileSize); + const halfTilesX = Math.ceil(requireTilesX / 2); + + tileXCount = { + least: tileXCount.least - halfTilesX, + most: tileXCount.most + halfTilesX, + } + } + + if (HEIGHT - ySize * tileSize > 10) { + const requireTilesY = Math.ceil(HEIGHT / tileSize); + const halfTilesY = Math.ceil(requireTilesY / 2); + + tileYCount = { + least: tileYCount.least - halfTilesY, + most: tileYCount.most + halfTilesY, + } + } + + // 震源を中心とする + const epicenterPosition = positions.filter(position => position.type === "epicenter")[0]; + if (!epicenterPosition) + return "input_lack"; + + const epicenterTile = tiles[epicenterPosition.tileIndex]; + if (!epicenterTile) + return "input_lack"; + + const leftPx = (epicenterTile.tileX - tileXCount.least) * tileSize + epicenterPosition.innerX; + const rightPx = xSize * tileSize - leftPx; + const topPx = (epicenterTile.tileY - tileYCount.least) * tileSize + epicenterPosition.innerY; + const bottomPx = ySize * tileSize - topPx; + + if (leftPx > rightPx) { + const leftTiles = epicenterTile.tileX - tileXCount.least; + tileXCount = { + ...tileXCount, + most: epicenterTile.tileX + leftTiles, + } + } else { + const rightTiles = tileXCount.most - epicenterTile.tileX; + tileXCount = { + ...tileXCount, + least: epicenterTile.tileX - rightTiles, + } + } + + if (topPx > bottomPx) { + const topTiles = epicenterTile.tileY - tileYCount.least; + tileYCount = { + ...tileYCount, + most: epicenterTile.tileY + topTiles, + } + } else { + const bottomTiles = tileYCount.most - epicenterTile.tileY; + tileYCount = { + ...tileYCount, + least: epicenterTile.tileY - bottomTiles, + } + } + + // タイルサイズ再計算 + xSize = tileXCount.most - tileXCount.least + 1; + ySize = tileYCount.most - tileYCount.least + 1; + + if (xSize > ySize) { + tileSize = Math.round(WIDTH / xSize); + } else { + tileSize = Math.round(HEIGHT / ySize); + } + + // 欠けているタイルを取得 + for (let xIndex = 0; xIndex < xSize; xIndex++) { + const itX = xIndex + tileXCount.least; + + for (let yIndex = 0; yIndex < ySize; yIndex++) { + const itY = yIndex + tileYCount.least; + + const itTile = tiles.filter(tile => tile.tileX === itX && tile.tileY === itY)[0]; + if (itTile) + continue; + + tiles.push({ + tileX: itX, + tileY: itY, + }); + } + } + // アセット - const assets: Record> = {} + const assets: Record; + size: number; + }> = {} const assetsList = [ "scales/10", "scales/20", @@ -309,15 +406,20 @@ export default async function generateImage(message: any) { "epicenter", ]; - assetsList.forEach(name => { - const asset = readFileSync(`${import.meta.dirname}/assets/${name}.png`); - + await Promise.all(assetsList.map(async name => { const key = name.split("/").at(-1); if (!key) return; - assets[key] = asset; - }); + const asset = readFileSync(`${import.meta.dirname}/assets/${name}.png`); + const assetMeta = await sharp(asset).metadata(); + const assetSize = assetMeta.width; + + assets[key] = { + buffer: asset, + size: assetSize, + } + })); // 各画像処理 await Promise.all(tiles.map(async (tile, index) => { @@ -371,9 +473,9 @@ export default async function generateImage(message: any) { compounds.push({ ...about, - input: asset, - top: Math.round(top + position.innerY * tileResizedSize), - left: Math.round(left + position.innerX * tileResizedSize), + input: asset.buffer, + top: Math.round(top + position.innerY * tileResizedSize - asset.size / 2), + left: Math.round(left + position.innerX * tileResizedSize - asset.size / 2), }); }); })); @@ -424,6 +526,4 @@ export default async function generateImage(message: any) { const buffer = await result.png().toBuffer(); return buffer; -} - -writeFileSync("result.png", await generateImage(JSON.parse(readFileSync(`${import.meta.dirname}/data.json`, "utf8")))); \ No newline at end of file +} \ No newline at end of file diff --git a/src/feature/earthquake/index.ts b/src/feature/earthquake/index.ts index 06055b8..649b0ee 100644 --- a/src/feature/earthquake/index.ts +++ b/src/feature/earthquake/index.ts @@ -7,6 +7,7 @@ import i18next from "i18next"; import { readFileSync } from "node:fs"; import { EOL } from "node:os"; import { WebSocket } from "ws"; +import generateImage from "@/feature/earthquake/generateImage"; await initI18n(); @@ -104,15 +105,6 @@ const processMessage = async (message: any) => { { console.log("地震発生情報を受信しました"); - if ( - (message.earthquake.maxScale === -1 || - message.earthquake.maxScale === undefined) && - !config.earthquake.canUnknownMaxScale - ) { - console.log("最大震度が不明であり、最大震度が不明な場合の投稿が許可されていないため、スキップします"); - break; - } - if ( message.earthquake.maxScale !== -1 && message.earthquake.maxScale < config.earthquake.requireMaxScale @@ -177,33 +169,61 @@ const processMessage = async (message: any) => { .join(EOL.repeat(2)) .trim(); - await createUeuse({ - text: i18next.t("earthquakeNotice", { - type: typeMessage[message.issue.type] ?? "地震情報", - occuredTime: format(new Date(message.earthquake.time), "yyyy年M月d日 H:mm"), - maxScale: scaleMessages[String(message.earthquake.maxScale)], - epicenter: message.earthquake.hypocenter.name === "" - ? "不明" - : message.earthquake.hypocenter.name, - magnitude: message.earthquake.hypocenter.magnitude === -1 - ? "不明" - : `M${message.earthquake.hypocenter.magnitude.toFixed(1)}`, - depth: message.earthquake.hypocenter.depth === 0 - ? "ごく浅い" - : (message.earthquake.hypocenter.depth === -1 - ? "不明" - : `${message.earthquake.hypocenter.depth}km`), - domesticTsunami: domesticTsunamiMessages[(message.earthquake.domesticTsunami ?? "Unknown")], - foreignTsunami: foreignTsunamiMessages[(message.earthquake.foreignTsunami ?? "Unknown")], - points: pointsMsg === "" - ? "" - : EOL.repeat(2) + pointsMsg, - source: message.issue.source ?? "不明", - comment: message.comments.freeFormComment === "" - ? "" - : EOL + message.comments.freeFormComment + EOL, - }), - }, "地震発生情報"); + let earthquakeUniqid: string | null = null; + + await Promise.allSettled([ + (async () => { + const ueuses = await createUeuse({ + text: i18next.t("earthquakeNotice", { + type: typeMessage[message.issue.type] ?? "地震情報", + occuredTime: format(new Date(message.earthquake.time), "yyyy年M月d日 H:mm"), + maxScale: scaleMessages[String(message.earthquake.maxScale)], + epicenter: message.earthquake.hypocenter.name === "" + ? "不明" + : message.earthquake.hypocenter.name, + magnitude: message.earthquake.hypocenter.magnitude === -1 + ? "不明" + : `M${message.earthquake.hypocenter.magnitude.toFixed(1)}`, + depth: message.earthquake.hypocenter.depth === 0 + ? "ごく浅い" + : (message.earthquake.hypocenter.depth === -1 + ? "不明" + : `${message.earthquake.hypocenter.depth}km`), + domesticTsunami: domesticTsunamiMessages[(message.earthquake.domesticTsunami ?? "Unknown")], + foreignTsunami: foreignTsunamiMessages[(message.earthquake.foreignTsunami ?? "Unknown")], + points: pointsMsg === "" + ? "" + : EOL.repeat(2) + pointsMsg, + source: message.issue.source ?? "不明", + comment: message.comments.freeFormComment === "" + ? "" + : EOL + message.comments.freeFormComment + EOL, + }), + }, "地震発生情報"); + + earthquakeUniqid = ueuses[0]?.uniqid ?? null; + })(), + (async () => { + const result = await generateImage(message); + + if (typeof result === "string") { + console.warn("情報が不足しているため、地震の画像生成ができませんでした"); + return; + } + + while (typeof (earthquakeUniqid as string | null) !== "string") {} + + await createUeuse({ + text: "この地震の震度分布画像を生成しました。", + media: { + photo: [ + result.toString("base64"), + ] + }, + reuseid: (earthquakeUniqid as unknown as string), + }, "震度分布画像"); + })(), + ]); } break; case 552: diff --git a/src/lib/client.ts b/src/lib/client.ts index a038d99..8fc050b 100644 --- a/src/lib/client.ts +++ b/src/lib/client.ts @@ -15,12 +15,15 @@ export default client; export const createUeuse = async (data: ApiMap["ueuse/create"]["body"], title: string) => { const mem = Memory.memory; - const excessedMessage = "👉返信に続きがあります。"; + const excessedMessage = "**👉返信に続きがあります。**"; let lines = data.text.split(EOL); let firstUniqid = ""; let count = 0; + type ExtractSuccess = T extends { success: true } ? T : never; + const results: ExtractSuccess[] = []; + while (lines.length > 0) { count++; let currentText = ""; @@ -76,6 +79,7 @@ export const createUeuse = async (data: ApiMap["ueuse/create"]["body"], title: s if (response.success) { success = true; postedUniqid = response.uniqid; + results.push(response); break; } @@ -99,4 +103,6 @@ export const createUeuse = async (data: ApiMap["ueuse/create"]["body"], title: s lines.shift(); } } + + return results; } \ No newline at end of file diff --git a/src/lib/config.ts b/src/lib/config.ts index 960c708..6b936d0 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -20,7 +20,6 @@ const schema = z.object({ z.literal(60), z.literal(70), ]), - canUnknownMaxScale: z.boolean(), useHistoryData: z.boolean(), reconnectInterval: z.number().positive(), }),