サーバーを稼働しているときに一定間隔でDiscordにメッセージを送るシステム
だいたい1時間ぐらいでメッセージを送ってくる物を想定している。
自宅サーバーでは突然のシャットダウン等あり得るためサーバーのステータス確認・データが正しく蓄積されているか・エラーはないか・HDD容量は足りているか・・・など定期的に確認したいケースが多々ある。
Discordであれば外出先からも確認ができる。
極めて簡単に実装できるのがメリットだ。
これに関しては私の記事の冒頭で画像付きで説明しているので参照していただきたい。
既に自分用のチャンネルが有る場合はチャンネル新規作成は飛ばしても良い。
【Discord Bot】Vue.jsでDiscordへメッセージを送る機能を実装する
一定間隔でDiscordにメッセージを送ることを「繰り返す」必要があるためJavaScriptでよく使うsetTimeout
関数ではダメだ。これは1回しか実行されない。
そこで使うのがsetInterval
関数。こちらは設定した関数を指定間隔で無限に実行してくれる。
引数で指定した時間を「待ってから」関数が実行される
たとえば1時間に設定した場合実行した直後は何も送信されない。最初の送信は実行後1時間後になる。
設定した時間は僅かに遅延がある。正確な計測用途では使えないので注意。
Discordのサーバーにデータをpost
するために必要。httpアクセスを担当する。興味があれば調べてみてほしい。
インストール
npm i axios
import axios from 'axios'
const webhook_url = "https://discordapp.com/api/webhooks/ここにIDみたいなやつ"
const message = {
content: "testです\r改行しました\r\\rで改行します"
}
console.log("Start")
setInterval(()=>{
axios.post(webhook_url, message).then((msg) => {
console.log("送信しました")
}).catch((e)=>{
console.log("送信失敗しました")
})
},5000)
console.log("END")
Start
END
送信しました
送信しました
axios.post
の第一引数にurl、第2引数に送るメッセージを入れるがこれは連想配列型である必要がある。
そして、実際に送りたい内容は contentキーの値として入れてやる必要がある。
これはDiscord側のフォーマット指定によるもの。
オマケ:\r
で改行できる。円マークを直接使いたい場合は\
でエスケープする。
実行結果を見るとStartとEndが即座に表示されたあとにメッセージが送信されている。つまりsetIntervalは非同期ということだ。
例えばデータを蓄積し続けているサーバでは処理がブロックされると受信が間に合わずデータの欠落も考えられる。このsetInterval
は内部で非同期に実行されるため処理をブロックしないことはありがたい。
プログラムを止めるまで3秒毎に送られてくる。
送るメッセージが連想配列{}
になっているかチェック。
さらに{ content: 送るメッセージ }
になっているかチェック
サーバー側にsetInterval
の間隔内で蓄積したエラーメッセージを添えて送ると良さげに思う。
データファイルに追記されたエラーメッセージを拾う方法等も次回共有できればやりたい。