Closed3

Discord.js + Heroku によるdiscordbot運用のtips

dioibdioib

開発物

身内のサーバー専用で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を使って再起動を手動で設定し、そのアットランダムな再起動のタイミングをコントロールできる。
dioibdioib

バグ

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();
  }
}

原因:不明。公式でも切断で並べられて処理がかかれてるあたり、どっちかがイレギュラーな書き方というわけではないよう

dioibdioib

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。

このスクラップは6ヶ月前にクローズされました