なぜボットを起動した後に送信されたメッセージにしか反応しないか
実はDiscord APIは非常に部分的な情報しかくれず、その都度IDをもとに完全な情報を取得する必要がある
つまりこの挙動が無いとclient.on('messageReactionAdd', reaction => reaction.message.content)のように書けない
なぜならDiscord API側からは、リアクションが付与されたメッセージのIDしか取得できないから、リアクション対象のメッセージ、のように関連するデータに自由にアクセスすることができない
実際にはIDから対象のメッセージを取得することもできるけど、これはイベントとは違って実行回数にも制限があるので、とりあえず全部取得するということはできない
そのため自分が知っている情報が来たら、それをイベントとして実行するが、そうではなかったら無視する挙動をする
つまり起動後に送信されたメッセージというのは、イベントを通じてメッセージ本体を記録しているということになる
これがv12からAPIにも明示的に追加されたキャッシュ(cache)というものの意味
新規に送信されたメッセージとかのイベントの他に、fetchメソッドで取得されたものもキャッシュされる
ただ実際には稀に不完全でも良いから全てのイベントを自分で処理してどうするかを決めたいという場合もある
例えば、リアクションに反応させたいメッセージのIDがあるけど、メッセージ本体を使わないからfetchしたくないときとか
ただ量が多くない特定のIDなら、単にfetchしたほうが楽なので、特に大量に、複雑なことをするときなどに使う
そういうときのためにDiscord.js v12からpartialという仕組みが追加された これは文字通り"部分的な"情報しかないときでもイベントを発生させるというもの
つまり直接アクセスできる情報がかなり少ないことがあるので注意が必要
Messageとかに.partialというプロパティがあるのは、この”部分的”であるかのフラグ
そして.fetch()が完全なデータを取得を取得するためのメソッドになる
注意としてはpertialを有効にすると、そのイベントの全ての箇所に影響するから、全箇所問題なく実行できるか確認する必要がある