Closed3
Discord.js + Heroku によるdiscordbot運用のtips
開発物
身内のサーバー専用で24時間利用できるテキスト読み上げボット。
ユーザーのコマンド実行で、任意のテキストチャンネルの読み上げを、任意のボイスチャンネルで開始するbot。喋太郎、shovel の身内専用ver。
技術スタック
- discord.js : DiscordAPIを気安く使うためのnode.jsのライブラリ。
- Heroku:デプロイ先。無料枠。worker-dyno。
- aws-polly:1年間に限り1か月あたり500 万文字まで無料。
運用
- paper-trail:Heroku-Addon。ログの監視。
- heroku-scheduler:同じくHeroku-Addon。worker-dynoの無料枠では1日に1回必ず再起動が必要で時間はアットランダムに発生する。このschedulerを使って再起動を手動で設定し、そのアットランダムな再起動のタイミングをコントロールできる。
バグ
botが接続していたVCとの切断後に、勝手に再び接続してしまう
事象:botの利用を終了するときには、当然botを接続中のVoiceChannelから切断する必要がある。そのための処理として、VoiceConnectionクラスに対するVoiceConnectionのdisconnectメソッドで切断を行なっていた。
が、何がトリガーか、botが切断されたあと勝手にbotが再接続してしまうなどの不具合が発生した。
解決: voiceChannelクラスのleaveメソッドを使うことで上記の問題が発生しなくなった。
- →
頻度は減ったが発生する。 - → leave、disconnectメソッド実行時のVoiceConnectionオブジェクトがnullになっていて落ちている。leave、disconnectを実行する際に最新のVoiceConnectionオブジェクトを必ず取得するように修正。
// Before : VoiceConnectionのdisconnectメソッド
const client = new Discord.Client();
client.on("message", async (message) => {
if (message.content === "!bot切断") {
const connection = message.client.voice.connections.find(connection => connection.channel.id === message.member.voice.channel.id)
connection.disconnect()
}
}
// After : voiceChannelクラスのleave
const client = new Discord.Client();
client.on("message", async (message) => {
if (message.content === "!bot切断") {
message.member.voice.channel.leave();
}
}
原因:不明。公式でも切断で並べられて処理がかかれてるあたり、どっちかがイレギュラーな書き方というわけではないよう
Warningでherokuのupdate要求が吐かれる
事象:herokuのrestart時に必ずherokuのupdate要求を伝えるwarningがでるようになった。
解決:cliでherokuのupdate。update頻度高そう。checkとupdateをschedularで回しちゃってもいいかも
heroku login
heroku update
heroku --version
// -> heroku/7.49.1
原因:herokuのupdate。
このスクラップは2023/11/10にクローズされました