このコードから見受けられる問題としては3つあり、まず2行目のchannel
が指定されてないことです
この場合ではchannelがどのチャンネルなのかを明示する必要がありまず(とても雑に説明すると、どのチャンネルからメッセージを取得すればいいのか、プログラム側が分からないということです)
なのでメッセージを取得するチャンネルを指定するのですが、指定する方法はいくつもあるので、詳しくは指定したチャンネルにメッセージを送信する方法まとめを参照してください。(メッセージを送信する例にはなっていますがチャンネル指定部分に関しては同じなので、応用することができます)
ここでは、その中の一つとして、メッセージ(コマンド)が送信されたチャンネルを指定するすると、message.channel
のようになります(つまり今のコードにmessage.
を付け足すだけですね)
次に2つ目の問題点として、3行目でmsg
という変数を使っていますが、msg
は定義(用意)されていないため、アクセスできません
この処理だとmessage
のことだと思われるので、msg
をmessage
に修正すると解決すると思います
そして3つ目の問題点として、取得したmessages
を送信するメッセージに埋め込んでいる部分です
これはDiscord.jsにあるCollectionというもの(詳細)で、そのままでは文字の中に埋め込むことが出来ません
ここれではCollectionを埋め込める形にすればよいのですが、複雑なので結論から言うとmessages.map(m => m.content).join('\n')
とすると、各メッセージの内容を改行区切りで埋め込むことが出来ます。この処理の詳細についてはこちらが参考になると思います
これらをまとめるとコードはこのようになります(Discord.jsの読み込むなどの処理は省略されているものとして書いていますが、実際には必要です)
js
1client.on('message', async message => {
2 const messages = await message.channel.messages.fetch({ limit: 100 })
3 if (message.content === `c.fetch`){
4 client.channels.cache.get('出力先のチャンネルID').send(`
5 fetchしたメッセージはこれらの通りです:
6 ${messages.map(m => m.content).join('\n')}
7 `)
8 }
9})
そして質問の内容とは直接関係ないことですが、他に2箇所改善することができます
1つ目はメッセージを受信するたびに、メッセージの取得処理を実行していることになっていますが、c.fetch
というコマンドが送信された場合にしか使用しないのであれば、if文の中に移したほうが良いです
2つ目はチャンネルIDを指定して結果のメッセージを送信していますが、コマンドが送信されたチャンネルに送信するということであれば前出のmessage.channel
とすることができます(意図的にID指定している場合は別です)
最後にこれらもまとめるとこのようなコードになります
js
1client.on('message', async message => {
2 if (message.content === `c.fetch`){
3 const messages = await message.channel.messages.fetch({ limit: 100 })
4 message.channel.send(`
5 fetchしたメッセージはこれらの通りです:
6 ${messages.map(m => m.content).join('\n')}
7 `)
8 }
9})
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/20 02:44