Discord.jsでBotを趣味で作っています。(NikkoBot)
タイムアウトされているかを判別するために3時間くらいかけたのでここに残せば皆さんが無駄な時間をかけないで済むかなあと思ったのでここに置いておきます。
実は初の記事投稿です。びっくり仰天。
#環境
- Node.js v17.3.0
- Discord.js v13.4.0
#そもそも「タイムアウト」って何者?
「タイムアウト」とは最近のDiscordのアップデートで追加されたものです。
機能としては
- テキストチャンネルで発言やリアクション(絵文字)の追加ができなくなる。
- ボイスチャンネルやステージチャンネルに接続できなくなる。
- ボイスチャンネルやステージチャンネルに接続していた場合自動的に退出させられる。
などがあります。
サーバー管理Bot (Dyno, MEE6) の機能がが進化して公式によって実装された物と考えてください。
以下の画像は私のフレンドがタイムアウトされる様子です。
かわいそうですね。
※プライバシー保護のためアイコンを編集で隠しています。
#本題
※Javascriptの知識がある程度あることを前提にしています。
※事前にDiscordのBotを作っていることを前提にしています。
※最近実装されたばかりの機能なので今後変わるかもしれません。
Discord.jsにはタイムアウトがいつ解除されるかというプロパティしかありません。
(.communicationDisabledUntilTimestamp)
これを使って判別を行います。
解除される時間を取得することができるので
今の時間より大きいならタイムアウトされている
という風に考えることができます。
なので以下のコードを書くことで実装できます。
new Date().getTime() < message.member.communicationDisabledUntilTimestamp
//例:
//もし今の時間が 90 で解除される時間が 120 ならタイムアウトされている。
//もし今の時間が 150 で解除される時間が 120 ならタイムアウトされていない。
すごそう!
if文を書くなら以下のように書きます。
if (new Date().getTime() < message.member.communicationDisabledUntilTimestamp) {
//実行する内容...
};
これで万事OK!
※実際はミリ秒までの数字なので何度も確認して実装してください。
#おまけ
ギルドメンバーをタイムアウトさせるときはtimeout()
を使えばいいみたいです。
こっちは簡単なのになあ...
(.timeout())
message.member.timeout(60 * 1000, "メッセージを送ってきたから");
//メッセージを送ってきた人を60秒タイムアウトする鬼畜コード
#URL集