P2P地震情報APIとWolfxAPIを使ってすごい（当社比）地震情報Botを作ろう！

# この記事、なんか変？
実はこの記事、[これ](https://qiita.com/akikaki_san/items/d110ababd9687b7be6e7)の書き直し版です。
コードもパッケージも変わったので、見ていきましょう！

# はじめに

この記事では、誰でも簡単に地震情報Botを作れるという感じの雰囲気で行っていきますが、、
最低限の知識は必要です。
まぁ脳死で動かせるようにもしてますので！しかもなんとなんとコードの解説まで！
わかんないことがありましたら気軽にコメントお待ちしてます！

# どういうのが出来るの？

- 緊急地震速報（予報）の配信だったり... (※今の情報じゃないよ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594613/65800da3-36c5-36a7-2bce-ff47754fda46.png)

- 各地の震度情報の配信だったり...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594613/0c1ca93d-65ba-c3b7-51d1-267e013e8438.png)

- 津波情報とか... (※今の情報じゃないよ)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594613/4be4875c-4fc1-c6b1-e889-d96f05f6e653.png)


- もちろんEEWも！ (※今の情報じゃないよ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594613/ca0174c9-7dc2-7e50-8fa2-3d78f0e317c6.png)
↑なんか大丈夫なのこれ？

# 早速やっていこう！

早速やっていこう、とは言いましたがgithub貼り付けるだけなんですよね、、
これほんとにこんな記事でいいんですか（困惑）

## コード (github)
https://github.com/akikaki-bot/p2peqbot

## 簡単な動かし方

### 1. まずはコードをクローンもしくはダウンロードしよう。
どっちでもいいですが、とりあえず自分の環境にコードを移動させましょう！

- Cloneを使う
```bash
$ git clone https://github.com/akikaki-bot/p2peqbot
```

- Download ZIPを使う
`<> Code` ってところを押すとドロップダウンメニューが出てきます。
一番下にある`Download ZIP`ってところを押すとダウンロードが始まりますよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594613/b1504fb0-c1ce-b02e-aafa-ede3b6f9da01.png)

### 2.必要パッケージをインストールしましょう。

`npm`を使います。
```shell
$ npm i 
```

### 3.トークンを設定しよう。
`src/constants/token.example.ts`っていうファイルがあります。
それの`example`を取って`token.ts`というファイルにし、
```ts 
export const Token = "Your bot token"
```
となっているところの`Your bot token`をあなたのBotのトークンにしてください。

### 4.試しに動かしてみよう。

コンソールで
```shell
$ npm run prestart
```
っていう感じのコマンドを打って実行してみてください。

起動した的メッセージが出てきたら成功です。やったね！

### 5. このBotを本番駆動をしたい！

scriptを用意しておきました！えらーい！
- 初回起動の場合
```shell
$ npm run buildStart
```
を実行してみてください。するとトランスパイルされたファイルが入る`dist`フォルダが生成されます。

- 2回目以降の起動の場合
2回目以降の場合、トランスパイルをスキップできます。
```shell
$ npm run production
```

## -- その他設定 --

### 6. ステータスをカスタマイズしたい！
`src/client/index.ts`のL42らへんにある、`displayText`っていう定数をいじってみてください。

### 7. どうやってチャンネルを登録するの？
`/help`にも書いてありますが、`/register`を実行してみてくださいね。

### 8. helpのスラッシュコマンドがおかしくない？
すいません、ちょっとこれは私のBotに合わせちゃってるので各自で書き直してみてください。
スラッシュコマンドのIDは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594613/0dc33979-c18f-93f0-cd95-04fc5d20a255.png)
スラッシュコマンドの説明の部分を右クリでコピーできますよ！

# コードの解説 ( 必要そうなところだけ )

みんな気になるでしょ？早速見ていきましょう。

:::note
興味ねーよって人はもうここで見るのをやめても大丈夫です。
お疲れさまでした！！！見てくれてありがとうございました！！！
:::

## ファイル構成

`src/client` - このBotが送受信する情報をここで処理しています。
`src/components` - まぁこれは、、、おまけみたいなやつです。たぶん。
`src/constants` - 定数等を保管しています。
`src/utils` - 情報をいい感じに処理する`resolve`シリーズが保管してあります。ちょっとこういうのすき。

## 命名ルール

`resolveﾎﾆｬﾆｬ` - 何かをもとに情報を整形するもの。
`ﾎﾆｬﾆｬvClient` - 情報を受信して、いい感じにするところ。
`ﾎﾆｬﾆｬSender` - 何かに送るためにある。
`ﾎﾆｬﾆｬManager` - 共通化されたマネージャー

## ChannelSendManagerについて

このBotはいろんな情報を複数のチャンネルに高速に送ることを目標にしています。
そんなBotのコードによく出てくる`ChannelSendManager`という謎のクラス。こいつは何？
実はですね、このクラスのおかげで高速に情報を送ることができています。

**...まぁ実際、コードがクッソ悲惨なことになってるんですが...** (抜粋)
```ts
        await Promise.all([
            GuildChannels.map(async guildData => {
                guildData.datas.map(async id => {
                    const catgoryMatched = this.data.sendCategory.some(v => v.type === id.type.type)
                    if( !catgoryMatched ) return;
                    const Channel = client.channels.resolve( id.channelId )
                    if(Channel?.isTextBased() && ( Channel instanceof ( TextChannel || NewsChannel ) || Channel.type === ChannelType.GuildAnnouncement) ){
                        const Message = await Channel.send({
                            embeds : [embed]
                        }).catch(err => console.log(err))
                        if(typeof Message !== "object") return;
                        if(Channel.type === ChannelType.GuildAnnouncement) {
                            if(Message.crosspostable) {
                                Message.crosspost()
                                .catch((err) => console.log(err))
                            }
                        }
                    }
                })
            })
        ])
```

まぁでも、共通化した結果にいるコードなので私は別に気にしてません。たぶん。

# 長いと思ったらもうこれでおしまいです
あれ？この記事そこまで需要なくない？

# スペシャルサンクス

**[S-Server-Developers](https://dev.shizen.lol/)** - 私が所属しているだけです。えへ

**[Wolfx API](https://api.wolfx.jp/)** - WebSocketでPLUM法とかいろんな奴に対応してる、タフなやつ。

**[P2P地震情報 API](https://www.p2pquake.net/)** - いつもお世話になっております。今後ともよろしくお願いいたします。

# おわり！

ありがとうございました！