この記事、なんか変?
実はこの記事、これの書き直し版です。
コードもパッケージも変わったので、見ていきましょう!
はじめに
この記事では、誰でも簡単に地震情報Botを作れるという感じの雰囲気で行っていきますが、、
最低限の知識は必要です。
まぁ脳死で動かせるようにもしてますので!しかもなんとなんとコードの解説まで!
わかんないことがありましたら気軽にコメントお待ちしてます!
どういうのが出来るの?
早速やっていこう!
早速やっていこう、とは言いましたがgithub貼り付けるだけなんですよね、、
これほんとにこんな記事でいいんですか(困惑)
コード (github)
簡単な動かし方
1. まずはコードをクローンもしくはダウンロードしよう。
どっちでもいいですが、とりあえず自分の環境にコードを移動させましょう!
- Cloneを使う
$ git clone https://github.com/akikaki-bot/p2peqbot
2.必要パッケージをインストールしましょう。
npm
を使います。
$ npm i
3.トークンを設定しよう。
src/constants/token.example.ts
っていうファイルがあります。
それのexample
を取ってtoken.ts
というファイルにし、
export const Token = "Your bot token"
となっているところのYour bot token
をあなたのBotのトークンにしてください。
4.試しに動かしてみよう。
コンソールで
$ npm run prestart
っていう感じのコマンドを打って実行してみてください。
起動した的メッセージが出てきたら成功です。やったね!
5. このBotを本番駆動をしたい!
scriptを用意しておきました!えらーい!
- 初回起動の場合
$ npm run buildStart
を実行してみてください。するとトランスパイルされたファイルが入るdist
フォルダが生成されます。
- 2回目以降の起動の場合
2回目以降の場合、トランスパイルをスキップできます。
$ npm run production
-- その他設定 --
6. ステータスをカスタマイズしたい!
src/client/index.ts
のL42らへんにある、displayText
っていう定数をいじってみてください。
7. どうやってチャンネルを登録するの?
/help
にも書いてありますが、/register
を実行してみてくださいね。
8. helpのスラッシュコマンドがおかしくない?
すいません、ちょっとこれは私のBotに合わせちゃってるので各自で書き直してみてください。
スラッシュコマンドのIDは
スラッシュコマンドの説明の部分を右クリでコピーできますよ!
コードの解説 ( 必要そうなところだけ )
みんな気になるでしょ?早速見ていきましょう。
興味ねーよって人はもうここで見るのをやめても大丈夫です。
お疲れさまでした!!!見てくれてありがとうございました!!!
ファイル構成
src/client
- このBotが送受信する情報をここで処理しています。
src/components
- まぁこれは、、、おまけみたいなやつです。たぶん。
src/constants
- 定数等を保管しています。
src/utils
- 情報をいい感じに処理するresolve
シリーズが保管してあります。ちょっとこういうのすき。
命名ルール
resolveホニャニャ
- 何かをもとに情報を整形するもの。
ホニャニャvClient
- 情報を受信して、いい感じにするところ。
ホニャニャSender
- 何かに送るためにある。
ホニャニャManager
- 共通化されたマネージャー
ChannelSendManagerについて
このBotはいろんな情報を複数のチャンネルに高速に送ることを目標にしています。
そんなBotのコードによく出てくるChannelSendManager
という謎のクラス。こいつは何?
実はですね、このクラスのおかげで高速に情報を送ることができています。
...まぁ実際、コードがクッソ悲惨なことになってるんですが... (抜粋)
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 - 私が所属しているだけです。えへ
Wolfx API - WebSocketでPLUM法とかいろんな奴に対応してる、タフなやつ。
P2P地震情報 API - いつもお世話になっております。今後ともよろしくお願いいたします。
おわり!
ありがとうございました!