イベントとawaitメソッド、Collectorの性質の違い
Discord.jsのメッセージとリアクションがされるたびに処理を実行するためにある3つの方法の性質の違いについて書くyuta0801.icon
イベント
おなじみのmessageとmessageReactionAdd
「メッセージが送信されたら」「リアクションが押されたら」が最もシンプルに実装できる
ただ「されたら」に主眼が置かれていて、複雑な処理を組むのが難しい
例えば「メッセージが送信されたら、返信する」までは出来ても「その返信したメッセージにリアクションがついたら、それを消す」ようなことが簡単には書けない
待機中メッセージIDをリストに入れてmessageReactionAddで判定するような実装も出来るけど、処理が散らばってしまって、複雑で分かりにくいコードになってしまう
例外として非常に大量な処理をする場合はメソッドやCollectorを使うよりもパフォーマンスを期待できる
多くの関数や状態を生成せずに、1つのイベントハンドラで全て処理できる
そこそこDiscord.jsを使い込んでる人なら知っているawaitMessagesとawaitReactions
直接メッセージやチャンネルに対して、時間や個数などを指定して収集することができる
シンプルかつ自由度があって応用が効くが、結果を得られるのは条件が満たされたあとなので毎回実行するのには向かない
個数を1にして、完了したらもう一度実行することで繰り返し実行することも複雑になってしまうが一応実装できる
エラーにさせることで切り分けられるが、完了した理由を取得することができなく複数条件での分岐が難しい
実は内部ではCollectorを使っている
解説されているのも、使われているの一度も見たことがないcreateMessageCollectorとcreateReactionCollector
基本的な使い方はawait系メソッドと同じだが、収集されるたびに実行されるイベントや完了イベントを使える というよりawaitメソッドが内部ではCollectorを使うようになっている
収集する対象を制限できるfitlerがあるのはawaitメソッドと同じだが、collectイベントを使うことで収集されるたびに処理を実行できるので、処理したい条件に絞り込むという少し異なる使い方ができる
authorとして送信した人の情報が含まれるMessageと違って、MessageReactionはリアクションした人の情報を含まないのでReactionCollectorはcollectイベントでリアクションした人がわかるという特徴もある
決まったメッセージへのリアクションで処理を実行する場合は、イベントハンドラ内からif文を使ったりして分岐するとも出来るけど、collectorを使うことで関連する処理が一箇所にまとまって分かりやすくなるはず