From 7e3c4840d3b6784bd6e67b2664deb7dc0f0fc7a7 Mon Sep 17 00:00:00 2001 From: Last2014 Date: Tue, 1 Jul 2025 16:59:45 +0900 Subject: [PATCH] =?UTF-8?q?dotenv=E3=82=92=E5=BB=83=E6=AD=A2=E3=81=97confi?= =?UTF-8?q?g.ts=E3=81=B8=E3=83=BB=E5=A4=A9=E6=B0=97=E3=81=AE=E5=88=86?= =?UTF-8?q?=E5=89=B2=E6=95=B0=E3=82=92config=E3=81=A7=E5=A4=89=E6=9B=B4?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=83=BB?= =?UTF-8?q?=E3=83=87=E3=83=90=E3=83=83=E3=82=B0=E7=94=A8=E3=81=AE=E3=82=B5?= =?UTF-8?q?=E3=83=B3=E3=83=97=E3=83=AB=E3=83=AD=E3=82=B0=E3=82=92.gitignor?= =?UTF-8?q?e=E3=81=AB=E8=BF=BD=E5=8A=A0=E3=83=BB=E5=9C=B0=E9=9C=87?= =?UTF-8?q?=E6=83=85=E5=A0=B1=E8=A7=A3=E6=9E=90=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + examples/config.ts | 17 ++++ logexample | 166 --------------------------------- main.ts | 4 +- package.json | 1 - scripts/earthquakeNotice.ts | 50 +++++----- scripts/followBack.ts | 12 +-- scripts/timeNotice.ts | 9 +- scripts/weatherNotice.ts | 160 +++++++++++++++---------------- types/config.d.ts | 17 ++++ types.d.ts => types/types.d.ts | 0 11 files changed, 147 insertions(+), 292 deletions(-) create mode 100644 examples/config.ts delete mode 100644 logexample create mode 100644 types/config.d.ts rename types.d.ts => types/types.d.ts (100%) diff --git a/.gitignore b/.gitignore index 1d5e061..ae6ef8c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ /.env.local /node_modules/ /package-lock.json +/config.ts + +log* diff --git a/examples/config.ts b/examples/config.ts new file mode 100644 index 0000000..b8829b5 --- /dev/null +++ b/examples/config.ts @@ -0,0 +1,17 @@ +import type { configTypes } from "types/config"; + +const config: configTypes = { + earthquake: { + reconnectTimes: 5000, + websocketUrl: "wss://api.p2pquake.net/v2/ws", + areasCsvUrl: "https://raw.githubusercontent.com/p2pquake/epsp-specifications/master/epsp-area.csv", + }, + weather: { + splitCount: 4, + }, + + apiToken: "TOKEN_EXAMPLE", + uwuzuServer: "uwuzu.example.com", +}; + +export default config; diff --git a/logexample b/logexample deleted file mode 100644 index db1b0d1..0000000 --- a/logexample +++ /dev/null @@ -1,166 +0,0 @@ -地震情報サーバーに接続します -P2P地震情報に接続中 -サーバーが起動しました -P2P地震情報に接続しました -受信したメッセージ: { - _id: '6862177ac5875700073d7010', - areas: [ - { id: 900, peer: 211 }, { id: 250, peer: 266 }, { id: 70, peer: 4 }, - { id: 905, peer: 13 }, { id: 150, peer: 16 }, { id: 460, peer: 48 }, - { id: 125, peer: 19 }, { id: 601, peer: 8 }, { id: 275, peer: 28 }, - { id: 231, peer: 69 }, { id: 205, peer: 15 }, { id: 405, peer: 14 }, - { id: 411, peer: 12 }, { id: 425, peer: 60 }, { id: 416, peer: 11 }, - { id: 570, peer: 1 }, { id: 301, peer: 5 }, { id: 351, peer: 8 }, - { id: 410, peer: 5 }, { id: 270, peer: 122 }, { id: 225, peer: 26 }, - { id: 475, peer: 33 }, { id: 130, peer: 14 }, { id: 455, peer: 14 }, - { id: 430, peer: 15 }, { id: 230, peer: 15 }, { id: 420, peer: 14 }, - { id: 241, peer: 60 }, { id: 215, peer: 14 }, { id: 115, peer: 13 }, - { id: 560, peer: 12 }, { id: 665, peer: 14 }, { id: 465, peer: 23 }, - { id: 550, peer: 4 }, { id: 240, peer: 8 }, { id: 105, peer: 7 }, - { id: 525, peer: 15 }, { id: 210, peer: 3 }, { id: 310, peer: 4 }, - { id: 620, peer: 2 }, { id: 100, peer: 14 }, { id: 575, peer: 4 }, - { id: 315, peer: 4 }, { id: 480, peer: 6 }, { id: 300, peer: 6 }, - { id: 200, peer: 6 }, { id: 641, peer: 3 }, { id: 302, peer: 10 }, - { id: 705, peer: 2 }, { id: 625, peer: 2 }, { id: 535, peer: 20 }, - { id: 415, peer: 17 }, { id: 515, peer: 3 }, { id: 651, peer: 6 }, - { id: 10, peer: 26 }, { id: 55, peer: 9 }, { id: 701, peer: 7 }, - { id: 20, peer: 2 }, { id: 345, peer: 3 }, { id: 335, peer: 1 }, - { id: 545, peer: 5 }, { id: 325, peer: 10 }, { id: 45, peer: 1 }, - { id: 350, peer: 4 }, { id: 901, peer: 2 }, { id: 600, peer: 14 }, - { id: 151, peer: 3 }, { id: 670, peer: 4 }, { id: 581, peer: 5 }, - { id: 330, peer: 4 }, { id: 355, peer: 7 }, { id: 135, peer: 7 }, - { id: 152, peer: 5 }, { id: 242, peer: 4 }, { id: 440, peer: 1 }, - { id: 120, peer: 15 }, { id: 646, peer: 2 }, { id: 65, peer: 8 }, - { id: 60, peer: 1 }, { id: 35, peer: 2 }, { id: 320, peer: 6 }, - { id: 110, peer: 2 }, { id: 220, peer: 1 }, { id: 400, peer: 2 }, - { id: 656, peer: 1 }, { id: 530, peer: 2 }, { id: 50, peer: 3 }, - { id: 490, peer: 8 }, { id: 605, peer: 5 }, { id: 645, peer: 1 }, - { id: 541, peer: 2 }, { id: 450, peer: 1 }, { id: 675, peer: 2 }, - { id: 142, peer: 9 }, { id: 685, peer: 1 }, { id: 576, peer: 1 }, - { id: 30, peer: 2 }, { id: 15, peer: 3 }, { id: 615, peer: 2 }, - { id: 305, peer: 1 }, - ... 13 more items - ], - code: 555, - created_at: '2025/06/30 13:50:02.640', - expire: '2025/06/30 13:55:02', - hop: 4, - time: '2025/06/30 13:50:02.634', - uid: '2025/06/30 13:55:02', - ver: '20150406' -} -震度情報を受信しました -{"_id":"6862177ac5875700073d7010","areas":[{"id":900,"peer":211},{"id":250,"peer":266},{"id":70,"peer":4},{"id":905,"peer":13},{"id":150,"peer":16},{"id":460,"peer":48},{"id":125,"peer":19},{"id":601,"peer":8},{"id":275,"peer":28},{"id":231,"peer":69},{"id":205,"peer":15},{"id":405,"peer":14},{"id":411,"peer":12},{"id":425,"peer":60},{"id":416,"peer":11},{"id":570,"peer":1},{"id":301,"peer":5},{"id":351,"peer":8},{"id":410,"peer":5},{"id":270,"peer":122},{"id":225,"peer":26},{"id":475,"peer":33},{"id":130,"peer":14},{"id":455,"peer":14},{"id":430,"peer":15},{"id":230,"peer":15},{"id":420,"peer":14},{"id":241,"peer":60},{"id":215,"peer":14},{"id":115,"peer":13},{"id":560,"peer":12},{"id":665,"peer":14},{"id":465,"peer":23},{"id":550,"peer":4},{"id":240,"peer":8},{"id":105,"peer":7},{"id":525,"peer":15},{"id":210,"peer":3},{"id":310,"peer":4},{"id":620,"peer":2},{"id":100,"peer":14},{"id":575,"peer":4},{"id":315,"peer":4},{"id":480,"peer":6},{"id":300,"peer":6},{"id":200,"peer":6},{"id":641,"peer":3},{"id":302,"peer":10},{"id":705,"peer":2},{"id":625,"peer":2},{"id":535,"peer":20},{"id":415,"peer":17},{"id":515,"peer":3},{"id":651,"peer":6},{"id":10,"peer":26},{"id":55,"peer":9},{"id":701,"peer":7},{"id":20,"peer":2},{"id":345,"peer":3},{"id":335,"peer":1},{"id":545,"peer":5},{"id":325,"peer":10},{"id":45,"peer":1},{"id":350,"peer":4},{"id":901,"peer":2},{"id":600,"peer":14},{"id":151,"peer":3},{"id":670,"peer":4},{"id":581,"peer":5},{"id":330,"peer":4},{"id":355,"peer":7},{"id":135,"peer":7},{"id":152,"peer":5},{"id":242,"peer":4},{"id":440,"peer":1},{"id":120,"peer":15},{"id":646,"peer":2},{"id":65,"peer":8},{"id":60,"peer":1},{"id":35,"peer":2},{"id":320,"peer":6},{"id":110,"peer":2},{"id":220,"peer":1},{"id":400,"peer":2},{"id":656,"peer":1},{"id":530,"peer":2},{"id":50,"peer":3},{"id":490,"peer":8},{"id":605,"peer":5},{"id":645,"peer":1},{"id":541,"peer":2},{"id":450,"peer":1},{"id":675,"peer":2},{"id":142,"peer":9},{"id":685,"peer":1},{"id":576,"peer":1},{"id":30,"peer":2},{"id":15,"peer":3},{"id":615,"peer":2},{"id":305,"peer":1},{"id":580,"peer":1},{"id":706,"peer":1},{"id":140,"peer":1},{"id":445,"peer":4},{"id":143,"peer":3},{"id":650,"peer":1},{"id":25,"peer":2},{"id":340,"peer":1},{"id":660,"peer":2},{"id":510,"peer":1},{"id":470,"peer":1},{"id":661,"peer":1},{"id":265,"peer":1}],"code":555,"created_at":"2025/06/30 13:50:02.640","expire":"2025/06/30 13:55:02","hop":4,"time":"2025/06/30 13:50:02.634","uid":"2025/06/30 13:55:02","ver":"20150406"} -=== 地震速報検知 === -時刻: 2025/06/30 13:50:02.634 -コード: 555 -対象地域: [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object] -📊 震度情報が更新されました -受信したメッセージ: { - _id: '686217a9c5875700073d7011', - areas: [ - { id: 10, peer: 26 }, { id: 15, peer: 3 }, { id: 20, peer: 2 }, - { id: 25, peer: 2 }, { id: 30, peer: 2 }, { id: 35, peer: 2 }, - { id: 45, peer: 1 }, { id: 50, peer: 3 }, { id: 55, peer: 9 }, - { id: 60, peer: 1 }, { id: 65, peer: 9 }, { id: 70, peer: 4 }, - { id: 100, peer: 14 }, { id: 105, peer: 7 }, { id: 110, peer: 2 }, - { id: 115, peer: 13 }, { id: 120, peer: 15 }, { id: 125, peer: 19 }, - { id: 130, peer: 14 }, { id: 135, peer: 7 }, { id: 140, peer: 1 }, - { id: 142, peer: 9 }, { id: 143, peer: 3 }, { id: 150, peer: 16 }, - { id: 151, peer: 3 }, { id: 152, peer: 5 }, { id: 200, peer: 6 }, - { id: 205, peer: 15 }, { id: 210, peer: 3 }, { id: 215, peer: 14 }, - { id: 220, peer: 1 }, { id: 225, peer: 26 }, { id: 230, peer: 15 }, - { id: 231, peer: 69 }, { id: 240, peer: 8 }, { id: 241, peer: 60 }, - { id: 242, peer: 4 }, { id: 250, peer: 267 }, { id: 265, peer: 1 }, - { id: 270, peer: 122 }, { id: 275, peer: 28 }, { id: 300, peer: 6 }, - { id: 301, peer: 5 }, { id: 302, peer: 10 }, { id: 305, peer: 1 }, - { id: 310, peer: 4 }, { id: 315, peer: 4 }, { id: 320, peer: 5 }, - { id: 325, peer: 10 }, { id: 330, peer: 4 }, { id: 335, peer: 1 }, - { id: 340, peer: 1 }, { id: 345, peer: 3 }, { id: 350, peer: 4 }, - { id: 351, peer: 8 }, { id: 355, peer: 7 }, { id: 400, peer: 2 }, - { id: 405, peer: 14 }, { id: 410, peer: 5 }, { id: 411, peer: 12 }, - { id: 415, peer: 17 }, { id: 416, peer: 11 }, { id: 420, peer: 14 }, - { id: 425, peer: 61 }, { id: 430, peer: 15 }, { id: 440, peer: 1 }, - { id: 445, peer: 4 }, { id: 450, peer: 1 }, { id: 455, peer: 14 }, - { id: 460, peer: 48 }, { id: 465, peer: 23 }, { id: 470, peer: 1 }, - { id: 475, peer: 32 }, { id: 480, peer: 6 }, { id: 490, peer: 8 }, - { id: 510, peer: 1 }, { id: 515, peer: 3 }, { id: 525, peer: 15 }, - { id: 530, peer: 2 }, { id: 535, peer: 20 }, { id: 541, peer: 2 }, - { id: 545, peer: 5 }, { id: 550, peer: 4 }, { id: 560, peer: 12 }, - { id: 570, peer: 1 }, { id: 575, peer: 4 }, { id: 576, peer: 1 }, - { id: 580, peer: 1 }, { id: 581, peer: 5 }, { id: 600, peer: 14 }, - { id: 601, peer: 8 }, { id: 605, peer: 5 }, { id: 615, peer: 2 }, - { id: 620, peer: 2 }, { id: 625, peer: 2 }, { id: 641, peer: 3 }, - { id: 645, peer: 1 }, { id: 646, peer: 2 }, { id: 650, peer: 1 }, - { id: 651, peer: 6 }, - ... 13 more items - ], - code: 555, - created_at: '2025/06/30 13:50:49.437', - expire: '2025/06/30 13:53:48', - hop: 11, - time: '2025/06/30 13:50:49.434', - uid: '2025/06/30 13:53:48', - ver: '20150406' -} -震度情報を受信しました -{"_id":"686217a9c5875700073d7011","areas":[{"id":10,"peer":26},{"id":15,"peer":3},{"id":20,"peer":2},{"id":25,"peer":2},{"id":30,"peer":2},{"id":35,"peer":2},{"id":45,"peer":1},{"id":50,"peer":3},{"id":55,"peer":9},{"id":60,"peer":1},{"id":65,"peer":9},{"id":70,"peer":4},{"id":100,"peer":14},{"id":105,"peer":7},{"id":110,"peer":2},{"id":115,"peer":13},{"id":120,"peer":15},{"id":125,"peer":19},{"id":130,"peer":14},{"id":135,"peer":7},{"id":140,"peer":1},{"id":142,"peer":9},{"id":143,"peer":3},{"id":150,"peer":16},{"id":151,"peer":3},{"id":152,"peer":5},{"id":200,"peer":6},{"id":205,"peer":15},{"id":210,"peer":3},{"id":215,"peer":14},{"id":220,"peer":1},{"id":225,"peer":26},{"id":230,"peer":15},{"id":231,"peer":69},{"id":240,"peer":8},{"id":241,"peer":60},{"id":242,"peer":4},{"id":250,"peer":267},{"id":265,"peer":1},{"id":270,"peer":122},{"id":275,"peer":28},{"id":300,"peer":6},{"id":301,"peer":5},{"id":302,"peer":10},{"id":305,"peer":1},{"id":310,"peer":4},{"id":315,"peer":4},{"id":320,"peer":5},{"id":325,"peer":10},{"id":330,"peer":4},{"id":335,"peer":1},{"id":340,"peer":1},{"id":345,"peer":3},{"id":350,"peer":4},{"id":351,"peer":8},{"id":355,"peer":7},{"id":400,"peer":2},{"id":405,"peer":14},{"id":410,"peer":5},{"id":411,"peer":12},{"id":415,"peer":17},{"id":416,"peer":11},{"id":420,"peer":14},{"id":425,"peer":61},{"id":430,"peer":15},{"id":440,"peer":1},{"id":445,"peer":4},{"id":450,"peer":1},{"id":455,"peer":14},{"id":460,"peer":48},{"id":465,"peer":23},{"id":470,"peer":1},{"id":475,"peer":32},{"id":480,"peer":6},{"id":490,"peer":8},{"id":510,"peer":1},{"id":515,"peer":3},{"id":525,"peer":15},{"id":530,"peer":2},{"id":535,"peer":20},{"id":541,"peer":2},{"id":545,"peer":5},{"id":550,"peer":4},{"id":560,"peer":12},{"id":570,"peer":1},{"id":575,"peer":4},{"id":576,"peer":1},{"id":580,"peer":1},{"id":581,"peer":5},{"id":600,"peer":14},{"id":601,"peer":8},{"id":605,"peer":5},{"id":615,"peer":2},{"id":620,"peer":2},{"id":625,"peer":2},{"id":641,"peer":3},{"id":645,"peer":1},{"id":646,"peer":2},{"id":650,"peer":1},{"id":651,"peer":6},{"id":656,"peer":1},{"id":660,"peer":2},{"id":661,"peer":1},{"id":665,"peer":14},{"id":670,"peer":4},{"id":675,"peer":2},{"id":685,"peer":1},{"id":701,"peer":7},{"id":705,"peer":2},{"id":706,"peer":1},{"id":900,"peer":211},{"id":901,"peer":2},{"id":905,"peer":13}],"code":555,"created_at":"2025/06/30 13:50:49.437","expire":"2025/06/30 13:53:48","hop":11,"time":"2025/06/30 13:50:49.434","uid":"2025/06/30 13:53:48","ver":"20150406"} -=== 地震速報検知 === -時刻: 2025/06/30 13:50:49.434 -コード: 555 -対象地域: [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object] -📊 震度情報が更新されました -受信したメッセージ: { - _id: '68621858c5875700073d7012', - areas: [ - { id: 10, peer: 26 }, { id: 15, peer: 3 }, { id: 20, peer: 2 }, - { id: 25, peer: 2 }, { id: 30, peer: 2 }, { id: 35, peer: 2 }, - { id: 45, peer: 1 }, { id: 50, peer: 3 }, { id: 55, peer: 9 }, - { id: 60, peer: 1 }, { id: 65, peer: 9 }, { id: 70, peer: 4 }, - { id: 100, peer: 13 }, { id: 105, peer: 7 }, { id: 110, peer: 2 }, - { id: 115, peer: 13 }, { id: 120, peer: 15 }, { id: 125, peer: 19 }, - { id: 130, peer: 14 }, { id: 135, peer: 7 }, { id: 140, peer: 1 }, - { id: 142, peer: 9 }, { id: 143, peer: 3 }, { id: 150, peer: 16 }, - { id: 151, peer: 3 }, { id: 152, peer: 5 }, { id: 200, peer: 6 }, - { id: 205, peer: 15 }, { id: 210, peer: 3 }, { id: 215, peer: 14 }, - { id: 220, peer: 1 }, { id: 225, peer: 26 }, { id: 230, peer: 15 }, - { id: 231, peer: 69 }, { id: 240, peer: 8 }, { id: 241, peer: 60 }, - { id: 242, peer: 4 }, { id: 250, peer: 264 }, { id: 265, peer: 1 }, - { id: 270, peer: 123 }, { id: 275, peer: 28 }, { id: 300, peer: 5 }, - { id: 301, peer: 5 }, { id: 302, peer: 10 }, { id: 305, peer: 1 }, - { id: 310, peer: 4 }, { id: 315, peer: 4 }, { id: 320, peer: 5 }, - { id: 325, peer: 9 }, { id: 330, peer: 4 }, { id: 335, peer: 1 }, - { id: 340, peer: 1 }, { id: 345, peer: 3 }, { id: 350, peer: 4 }, - { id: 351, peer: 8 }, { id: 355, peer: 7 }, { id: 400, peer: 2 }, - { id: 405, peer: 14 }, { id: 410, peer: 5 }, { id: 411, peer: 12 }, - { id: 415, peer: 17 }, { id: 416, peer: 12 }, { id: 420, peer: 14 }, - { id: 425, peer: 60 }, { id: 430, peer: 14 }, { id: 440, peer: 1 }, - { id: 445, peer: 4 }, { id: 450, peer: 1 }, { id: 455, peer: 14 }, - { id: 460, peer: 48 }, { id: 465, peer: 22 }, { id: 470, peer: 1 }, - { id: 475, peer: 32 }, { id: 480, peer: 6 }, { id: 490, peer: 8 }, - { id: 510, peer: 1 }, { id: 515, peer: 3 }, { id: 525, peer: 15 }, - { id: 530, peer: 2 }, { id: 535, peer: 20 }, { id: 541, peer: 2 }, - { id: 545, peer: 5 }, { id: 550, peer: 4 }, { id: 560, peer: 12 }, - { id: 570, peer: 1 }, { id: 575, peer: 4 }, { id: 576, peer: 1 }, - { id: 580, peer: 1 }, { id: 581, peer: 5 }, { id: 600, peer: 14 }, - { id: 601, peer: 8 }, { id: 605, peer: 5 }, { id: 615, peer: 2 }, - { id: 620, peer: 2 }, { id: 625, peer: 2 }, { id: 641, peer: 3 }, - { id: 645, peer: 1 }, { id: 646, peer: 2 }, { id: 650, peer: 1 }, - { id: 651, peer: 6 }, - ... 13 more items - ], - code: 555, - created_at: '2025/06/30 13:53:44.508', - expire: '2025/06/30 13:56:43', - hop: 6, - time: '2025/06/30 13:53:44.505', - uid: '2025/06/30 13:56:43', - ver: '20150406' -} -震度情報を受信しました -{"_id":"68621858c5875700073d7012","areas":[{"id":10,"peer":26},{"id":15,"peer":3},{"id":20,"peer":2},{"id":25,"peer":2},{"id":30,"peer":2},{"id":35,"peer":2},{"id":45,"peer":1},{"id":50,"peer":3},{"id":55,"peer":9},{"id":60,"peer":1},{"id":65,"peer":9},{"id":70,"peer":4},{"id":100,"peer":13},{"id":105,"peer":7},{"id":110,"peer":2},{"id":115,"peer":13},{"id":120,"peer":15},{"id":125,"peer":19},{"id":130,"peer":14},{"id":135,"peer":7},{"id":140,"peer":1},{"id":142,"peer":9},{"id":143,"peer":3},{"id":150,"peer":16},{"id":151,"peer":3},{"id":152,"peer":5},{"id":200,"peer":6},{"id":205,"peer":15},{"id":210,"peer":3},{"id":215,"peer":14},{"id":220,"peer":1},{"id":225,"peer":26},{"id":230,"peer":15},{"id":231,"peer":69},{"id":240,"peer":8},{"id":241,"peer":60},{"id":242,"peer":4},{"id":250,"peer":264},{"id":265,"peer":1},{"id":270,"peer":123},{"id":275,"peer":28},{"id":300,"peer":5},{"id":301,"peer":5},{"id":302,"peer":10},{"id":305,"peer":1},{"id":310,"peer":4},{"id":315,"peer":4},{"id":320,"peer":5},{"id":325,"peer":9},{"id":330,"peer":4},{"id":335,"peer":1},{"id":340,"peer":1},{"id":345,"peer":3},{"id":350,"peer":4},{"id":351,"peer":8},{"id":355,"peer":7},{"id":400,"peer":2},{"id":405,"peer":14},{"id":410,"peer":5},{"id":411,"peer":12},{"id":415,"peer":17},{"id":416,"peer":12},{"id":420,"peer":14},{"id":425,"peer":60},{"id":430,"peer":14},{"id":440,"peer":1},{"id":445,"peer":4},{"id":450,"peer":1},{"id":455,"peer":14},{"id":460,"peer":48},{"id":465,"peer":22},{"id":470,"peer":1},{"id":475,"peer":32},{"id":480,"peer":6},{"id":490,"peer":8},{"id":510,"peer":1},{"id":515,"peer":3},{"id":525,"peer":15},{"id":530,"peer":2},{"id":535,"peer":20},{"id":541,"peer":2},{"id":545,"peer":5},{"id":550,"peer":4},{"id":560,"peer":12},{"id":570,"peer":1},{"id":575,"peer":4},{"id":576,"peer":1},{"id":580,"peer":1},{"id":581,"peer":5},{"id":600,"peer":14},{"id":601,"peer":8},{"id":605,"peer":5},{"id":615,"peer":2},{"id":620,"peer":2},{"id":625,"peer":2},{"id":641,"peer":3},{"id":645,"peer":1},{"id":646,"peer":2},{"id":650,"peer":1},{"id":651,"peer":6},{"id":656,"peer":1},{"id":660,"peer":2},{"id":661,"peer":1},{"id":665,"peer":14},{"id":670,"peer":4},{"id":675,"peer":2},{"id":685,"peer":1},{"id":701,"peer":7},{"id":705,"peer":2},{"id":706,"peer":1},{"id":900,"peer":211},{"id":901,"peer":2},{"id":905,"peer":12}],"code":555,"created_at":"2025/06/30 13:53:44.508","expire":"2025/06/30 13:56:43","hop":6,"time":"2025/06/30 13:53:44.505","uid":"2025/06/30 13:56:43","ver":"20150406"} -=== 地震速報検知 === -時刻: 2025/06/30 13:53:44.505 -コード: 555 -対象地域: [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object] -📊 震度情報が更新されました diff --git a/main.ts b/main.ts index 77dfe1a..b8bde0b 100644 --- a/main.ts +++ b/main.ts @@ -4,7 +4,7 @@ import * as cron from "node-cron"; // 機能読み込み import timeNotice from "./scripts/timeNotice.js"; import weatherNotice from "./scripts/weatherNotice.js"; -import earthquakeNotice from "./scripts/earthquakeNotice.js" +import earthquakeNotice from "./scripts/earthquakeNotice.js"; // フォローバック機能読み込み import followBack from "./scripts/followBack.js"; @@ -22,7 +22,7 @@ cron.schedule("0 * * * *", () => { cron.schedule("1 7 * * *", () => { setTimeout(() => { weatherNotice(); - }, 100) + }, 100); }); // コンソールで表示 diff --git a/package.json b/package.json index 68c7a98..598087c 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "@types/dotenv": "^6.1.1", "@types/node-cron": "^3.0.11", "date-fns": "^4.1.0", - "dotenv": "^17.0.0", "node-cron": "^4.1.1", "tsx": "^4.20.3", "typescript": "^5.8.3", diff --git a/scripts/earthquakeNotice.ts b/scripts/earthquakeNotice.ts index 8fa6def..c171db0 100644 --- a/scripts/earthquakeNotice.ts +++ b/scripts/earthquakeNotice.ts @@ -1,11 +1,10 @@ import WebSocket from "ws"; -import * as dotenv from "dotenv"; -dotenv.config(); +import config from "../config.js"; class P2PEarthquakeClient { private ws: WebSocket | null = null; - private reconnectInterval: number = 5000; + private reconnectInterval: number = config.earthquake.reconnectTimes; private reconnectTimer: NodeJS.Timeout | null = null; private isConnecting: boolean = false; @@ -21,7 +20,7 @@ class P2PEarthquakeClient { console.log("P2P地震情報に接続中"); try { - this.ws = new WebSocket("wss://api.p2pquake.net/v2/ws"); + this.ws = new WebSocket(config.earthquake.websocketUrl); this.ws.on("open", () => { console.log("P2P地震情報に接続しました"); @@ -119,9 +118,7 @@ class P2PEarthquakeClient { // 地名オブジェクトマッピング async function areaMap(): Promise> { - const res = await fetch( - "https://raw.githubusercontent.com/p2pquake/epsp-specifications/master/epsp-area.csv", - ); + const res = await fetch(config.earthquake.areasCsvUrl); const text = await res.text(); @@ -244,42 +241,39 @@ async function event(earthquakeInfo: any): Promise { } // 最大震度 - let maxScale; + let maxScale: string = "最大深度:"; - if (earthquakeInfo.earthquake.maxScale === -1) { + if ( + earthquakeInfo.earthquake.maxScale === -1 || + earthquakeInfo.earthquake.maxScale === null + ) { maxScale = "最大震度情報なし"; } else if (earthquakeInfo.earthquake.maxScale === 10) { - maxScale = "震度1"; + maxScale += "震度1"; } else if (earthquakeInfo.earthquake.maxScale === 20) { - maxScale = "震度2"; + maxScale += "震度2"; } else if (earthquakeInfo.earthquake.maxScale === 30) { - maxScale = "震度3"; + maxScale += "震度3"; } else if (earthquakeInfo.earthquake.maxScale === 40) { - maxScale = "震度4"; + maxScale += "震度4"; } else if (earthquakeInfo.earthquake.maxScale === 45) { - maxScale = "震度5弱"; + maxScale += "震度5弱"; } else if (earthquakeInfo.earthquake.maxScale === 50) { - maxScale = "震度5強"; + maxScale += "震度5強"; } else if (earthquakeInfo.earthquake.maxScale === 55) { - maxScale = "震度6弱"; + maxScale += "震度6弱"; } else if (earthquakeInfo.earthquake.maxScale === 60) { - maxScale = "震度6強"; + maxScale += "震度6強"; } else if (earthquakeInfo.earthquake.maxScale === 70) { - maxScale = "震度7"; + maxScale += "震度7"; } // 対象地域 let areas: string = ""; if (earthquakeInfo.points !== null) { - const areaMaps: any = await areaMap(); - const areaNames: Array = Array.from( - new Set( - earthquakeInfo.points.map((i: any) => { - areaMaps[i.addr].filter(Boolean); - }), - ), + new Set(earthquakeInfo.points.map((i: any) => i.addr).filter(Boolean)), ); areas = `対象地域:${areaNames.join("・")}`; @@ -297,7 +291,7 @@ async function event(earthquakeInfo: any): Promise { 【地震発生】 時刻:${earthquakeInfo.time} ${description} - 最大深度:${maxScale} + ${maxScale} ${areas} 国内の津波:${domesticTsunami} `); @@ -328,10 +322,10 @@ async function event(earthquakeInfo: any): Promise { } async function ueuse(text: string) { - const res = await fetch(`https://${process.env.SERVER}/api/ueuse/create`, { + const res = await fetch(`https://${config.uwuzuServer}/api/ueuse/create`, { method: "POST", body: JSON.stringify({ - token: process.env.TOKEN, + token: config.apiToken, text: text, }), }); diff --git a/scripts/followBack.ts b/scripts/followBack.ts index 884eb19..9eaa4a5 100644 --- a/scripts/followBack.ts +++ b/scripts/followBack.ts @@ -1,13 +1,11 @@ -import * as dotenv from "dotenv"; +import type * as types from "types/types"; -import type * as types from "../types"; - -dotenv.config(); +import config from "../config.js"; export default async function followBack() { // フォロワーを取得 const resMe = await fetch( - `https://${process.env.SERVER}/api/me?token=${process.env.TOKEN}`, + `https://${config.uwuzuServer}/api/me?token=${config.apiToken}`, { method: "GET", // uwuzu.netで/api/meのPOSTが死んでいるため簡易的にGET @@ -25,11 +23,11 @@ export default async function followBack() { const followerItem = followers[i]; const resFollow = await fetch( - `https://${process.env.SERVER}/api/users/follow`, + `https://${config.uwuzuServer}/api/users/follow`, { method: "POST", body: JSON.stringify({ - token: process.env.TOKEN, + token: config.apiToken, userid: followerItem, }), }, diff --git a/scripts/timeNotice.ts b/scripts/timeNotice.ts index ec54431..45a3253 100644 --- a/scripts/timeNotice.ts +++ b/scripts/timeNotice.ts @@ -1,9 +1,8 @@ -import * as dotenv from "dotenv"; import { format } from "date-fns"; -import type * as types from "../types"; +import type * as types from "types/types"; -dotenv.config(); +import config from "../config.js"; export default async function timeNotice() { // 現在時刻を取得 @@ -11,11 +10,11 @@ export default async function timeNotice() { // 投稿 const resUeuse = await fetch( - `https://${process.env.SERVER}/api/ueuse/create`, + `https://${config.uwuzuServer}/api/ueuse/create`, { method: "POST", body: JSON.stringify({ - token: process.env.TOKEN, + token: config.apiToken, text: `${now}になりました`, }), }, diff --git a/scripts/weatherNotice.ts b/scripts/weatherNotice.ts index 068c606..5d17d96 100644 --- a/scripts/weatherNotice.ts +++ b/scripts/weatherNotice.ts @@ -1,17 +1,17 @@ -import * as dotenv from "dotenv"; import { cityList } from "../src/weatherId.js"; -import type * as types from "../types"; -dotenv.config(); +import type * as types from "types/types.js"; + +import config from "../config.js"; export default async function weatherNotice() { // 仮投稿 const resUeuse = await fetch( - `https://${process.env.SERVER}/api/ueuse/create`, + `https://${config.uwuzuServer}/api/ueuse/create`, { method: "POST", body: JSON.stringify({ - token: process.env.TOKEN, + token: config.apiToken, text: ` 本日の天気 ※タイムラインが埋まるため返信に記載しています @@ -24,102 +24,96 @@ export default async function weatherNotice() { console.log(JSON.stringify(ueuseData)); - // 3分割処理 + + // インデックス + const splitCount = config.weather.splitCount; const total = cityList.length; - const firstLength = Math.trunc(total / 3); - const secondLength = Math.trunc((total - firstLength) / 2); - const thirdLength = total - firstLength - secondLength; + const chunkSizes = Array(splitCount).fill(0).map((_, i) => + Math.floor((total + i) / splitCount) + ); - // インデックス作成 - const firstStart = 0; - const firstEnd = firstStart + firstLength; - const secondStart = firstEnd; - const secondEnd = secondStart + secondLength; - const thirdStart = secondEnd; - const thirdEnd = total; + // 分割インデックス + let start = 0; + const ranges = chunkSizes.map(size => { + const range = [start, start + size]; + start += size; + return range; + }); - let weatherResults = ["", "", ""]; + // 配列作成 + const weatherResults = Array(splitCount).fill(""); - // 投稿1 - for (let i = firstStart; i < firstEnd; i++) { - const res = await fetch( - `https://weather.tsukumijima.net/api/forecast/city/${cityList[i]}`, - ); - const data = await res.json(); - const today = data.forecasts[0]; + // 天気取得 + for (let chunkIndex = 0; chunkIndex < splitCount; chunkIndex++) { + const [chunkStart, chunkEnd] = ranges[chunkIndex]; - const weather = today.telop ?? "取得できませんでした"; - const maxTemp = today.temperature.max?.celsius ?? "取得できませんでした"; - const minTemp = today.temperature.min?.celsius ?? "取得できませんでした"; - const chanceOfRain = data.chanceOfRain?.["T06_12"] ?? "取得できませんでした"; + for (let i = chunkStart; i < chunkEnd; i++) { + const res = await fetch( + `https://weather.tsukumijima.net/api/forecast/city/${cityList[i]}`, + ); - weatherResults[0] += ` - 【${data.location.city}】\n - 天気:${weather}\n - 最高気温:${maxTemp}℃\n - 最低気温:${minTemp}℃\n - 降水確率:${chanceOfRain}\n - `; + const data = await res.json(); + const today = data.forecasts[0]; + + // 天気 + const weather = today.telop ?? "取得できませんでした"; + + // 最高気温 + let maxTemp: string; + + if (today.temperature.max.celsius !== null) { + maxTemp = `${today.temperature.max.celsius}℃`; + } else { + maxTemp = "取得できませんでした"; + } + + // 最低気温 + let minTemp: string; + + if (today.temperature.min.celsius !== null) { + minTemp = `${today.temperature.min.celsius}℃`; + } else { + minTemp = "取得できませんでした"; + } + + // 降水確率 + let chanceOfRain: string; + + if ( + today.chanceOfRain.T06_12 !== null || + today.chanceOfRain.T06_12 !== "--%" + ) { + chanceOfRain = `${today.chanceOfRain.T06_12}%`; + } else { + chanceOfRain = "取得できませんでした"; + } + + weatherResults[chunkIndex] += ` + 【${data.location.city}】 + 天気:${weather} + 最高気温:${maxTemp} + 最低気温:${minTemp} + 降水確率:${chanceOfRain} + `; + } } - // 投稿2 - for (let i = secondStart; i < secondEnd; i++) { - const res = await fetch( - `https://weather.tsukumijima.net/api/forecast/city/${cityList[i]}`, - ); - const data = await res.json(); - const today = data.forecasts[0]; - - const weather = today.telop ?? "取得できませんでした"; - const maxTemp = today.temperature.max?.celsius ?? "取得できませんでした"; - const minTemp = today.temperature.min?.celsius ?? "取得できませんでした"; - const chanceOfRain = data.chanceOfRain?.["T06_12"] ?? "取得できませんでした"; - - weatherResults[1] += ` - 【${data.location.city}】\n - 天気:${weather}\n - 最高気温:${maxTemp}℃\n - 最低気温:${minTemp}℃\n - 降水確率:${chanceOfRain}\n - `; - } - - // 投稿3 - for (let i = thirdStart; i < thirdEnd; i++) { - const res = await fetch( - `https://weather.tsukumijima.net/api/forecast/city/${cityList[i]}`, - ); - const data = await res.json(); - const today = data.forecasts[0]; - - const weather = today.telop ?? "取得できませんでした"; - const maxTemp = today.temperature.max?.celsius ?? "取得できませんでした"; - const minTemp = today.temperature.min?.celsius ?? "取得できませんでした"; - const chanceOfRain = data.chanceOfRain?.["T06_12"] ?? "取得できませんでした"; - - weatherResults[2] += ` - 【${data.location.city}】\n - 天気:${weather}\n - 最高気温:${maxTemp}℃\n - 最低気温:${minTemp}℃\n - 降水確率:${chanceOfRain}\n - `; - } - - // 3分割投稿 - for (let i = 0; i < 3; i++) { + // 分割投稿 + for (let i = 0; i < splitCount; i++) { const resReply = await fetch( - `https://${process.env.SERVER}/api/ueuse/create`, + `https://${config.uwuzuServer}/api/ueuse/create`, { method: "POST", body: JSON.stringify({ - token: process.env.TOKEN, + token: config.apiToken, text: weatherResults[i], replyid: ueuseData.uniqid }), }, ); + const replyData: types.ueuseCreateApi = await resReply.json(); + console.log(JSON.stringify(replyData)); } } diff --git a/types/config.d.ts b/types/config.d.ts new file mode 100644 index 0000000..9758284 --- /dev/null +++ b/types/config.d.ts @@ -0,0 +1,17 @@ +interface earthquakeTypes { + reconnectTimes: number; + websocketUrl: string; + areasCsvUrl: string; +} + +interface weatherTypes { + splitCount: number; +} + +export interface configTypes { + earthquake: earthquakeTypes; + weather: weatherTypes; + + apiToken: string; + uwuzuServer: string; +} diff --git a/types.d.ts b/types/types.d.ts similarity index 100% rename from types.d.ts rename to types/types.d.ts