質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

6237閲覧

Discord.js でサーバーのテキストメッセージを取得したい

SAAT

総合スコア14

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/04/18 11:00

Discord.jsでサーバーのテキストメッセージを取得したく、

js

1client.on('message', async message => { 2 const messages = await channel.messages.fetch({ limit: 100 }) 3 if (msg.content === `c.fetch`){ 4 client.channels.cache.get('出力先のチャンネルID').send(` 5 fetchしたメッセージはこれらの通りです: 6 ${messages} 7 `) 8 } 9})

というコードを書いたのですが何も起きませんでした。
どこを変えればうまく出力できるでしょうか。お教えください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このコードから見受けられる問題としては3つあり、まず2行目のchannelが指定されてないことです

この場合ではchannelがどのチャンネルなのかを明示する必要がありまず(とても雑に説明すると、どのチャンネルからメッセージを取得すればいいのか、プログラム側が分からないということです)

なのでメッセージを取得するチャンネルを指定するのですが、指定する方法はいくつもあるので、詳しくは指定したチャンネルにメッセージを送信する方法まとめを参照してください。(メッセージを送信する例にはなっていますがチャンネル指定部分に関しては同じなので、応用することができます)

ここでは、その中の一つとして、メッセージ(コマンド)が送信されたチャンネルを指定するすると、message.channelのようになります(つまり今のコードにmessage.を付け足すだけですね)

次に2つ目の問題点として、3行目でmsgという変数を使っていますが、msgは定義(用意)されていないため、アクセスできません

この処理だとmessageのことだと思われるので、msgmessageに修正すると解決すると思います

そして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/19 21:57

編集2020/04/19 22:20
yuta0801

総合スコア270

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SAAT

2020/04/20 02:44

とても詳しい説明をありがとうございます 何が原因で取得できなかったのか理解することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問