teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

補足を追加

2020/04/19 22:20

投稿

yuta0801
yuta0801

スコア270

answer CHANGED
@@ -28,4 +28,26 @@
28
28
  `)
29
29
  }
30
30
  })
31
+ ```
32
+
33
+ ---
34
+
35
+ そして質問の内容とは直接関係ないことですが、他に2箇所改善することができます
36
+
37
+ 1つ目はメッセージを受信するたびに、メッセージの取得処理を実行していることになっていますが、`c.fetch`というコマンドが送信された場合にしか使用しないのであれば、if文の中に移したほうが良いです
38
+
39
+ 2つ目はチャンネルIDを指定して結果のメッセージを送信していますが、コマンドが送信されたチャンネルに送信するということであれば前出の`message.channel`とすることができます(意図的にID指定している場合は別です)
40
+
41
+ 最後にこれらもまとめるとこのようなコードになります
42
+
43
+ ```js
44
+ client.on('message', async message => {
45
+ if (message.content === `c.fetch`){
46
+ const messages = await message.channel.messages.fetch({ limit: 100 })
47
+ message.channel.send(`
48
+ fetchしたメッセージはこれらの通りです:
49
+ ${messages.map(m => m.content).join('\n')}
50
+ `)
51
+ }
52
+ })
31
53
  ```

1

書いている途中で誤って回答を投稿してしまったため編集で追加

2020/04/19 22:19

投稿

yuta0801
yuta0801

スコア270

answer CHANGED
@@ -1,7 +1,31 @@
1
- このコードから見受けられる問題としてはつあり、まず2行目の`channel`が定されてないことです
1
+ このコードから見受けられる問題としてはつあり、まず2行目の`channel`が定されてないことです
2
2
 
3
3
  この場合ではchannelがどのチャンネルなのかを明示する必要がありまず(とても雑に説明すると、どのチャンネルからメッセージを取得すればいいのか、プログラム側が分からないということです)
4
4
 
5
- なのでメッセージを取得するチャンネルを指定するのですが、
5
+ なのでメッセージを取得するチャンネルを指定するのですが、指定する方法はいくつもあるので、詳しくは[指定したチャンネルにメッセージを送信する方法まとめ](https://scrapbox.io/discordjs-japan/%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81)を参照してください。(メッセージを送信する例にはなっていますがチャンネル指定部分に関しては同じなので、応用することができます)
6
6
 
7
- https://scrapbox.io/discordjs-japan/指定たチャンネルにメッセージ送信する方法ま
7
+ ここでは、その中の一つとて、メッセージ(コマンド)が送信されたチャンネルを指定するする、`message.channel`のようになります(つまり今のコードに`message.`を付け足すだけですね)
8
+
9
+ 次に2つ目の問題点として、3行目で`msg`という変数を使っていますが、`msg`は定義(用意)されていないため、アクセスできません
10
+
11
+ この処理だと`message`のことだと思われるので、`msg`を`message`に修正すると解決すると思います
12
+
13
+ そして3つ目の問題点として、取得した`messages`を送信するメッセージに埋め込んでいる部分です
14
+
15
+ これはDiscord.jsにあるCollectionというもの([詳細](https://scrapbox.io/discordjs-japan/%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3))で、そのままでは文字の中に埋め込むことが出来ません
16
+
17
+ ここれではCollectionを埋め込める形にすればよいのですが、複雑なので結論から言うと`messages.map(m => m.content).join('\n')`とすると、各メッセージの内容を改行区切りで埋め込むことが出来ます。この処理の詳細については[こちら](https://scrapbox.io/discordjs-japan/Collection%E3%81%AE%E4%B8%BB%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9)が参考になると思います
18
+
19
+ これらをまとめるとコードはこのようになります(Discord.jsの読み込むなどの処理は省略されているものとして書いていますが、実際には必要です)
20
+
21
+ ```js
22
+ client.on('message', async message => {
23
+ const messages = await message.channel.messages.fetch({ limit: 100 })
24
+ if (message.content === `c.fetch`){
25
+ client.channels.cache.get('出力先のチャンネルID').send(`
26
+ fetchしたメッセージはこれらの通りです:
27
+ ${messages.map(m => m.content).join('\n')}
28
+ `)
29
+ }
30
+ })
31
+ ```