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

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

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

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

JavaScript

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

Q&A

1回答

579閲覧

JavaScriptでDiscoord.js V13のbotを作っているが、リアクションを取得するためのCollectorが反応しない。

megaeLe

総合スコア0

Discord

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

JavaScript

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

0グッド

1クリップ

投稿2022/08/10 14:26

前提

Discordでゲームの集団戦イベントの補助をするためのbotを作っています。
作業環境はGlitchを用いたオンラインで、APIはDiscord.js V13系統です。

先週ぐらいにプログラミングを学び始めたビギナーなので用語の誤用、理解不足が多いかもしれません。

インテントは以下の通りです。
Intents.FLAGS.GUILDS,
Intents.FLAGS.GUILD_MESSAGES,
Intents.FLAGS.GUILD_MESSAGE_REACTIONS,
Intents.FLAGS.GUILD_VOICE_STATES,
Intents.FLAGS.GUILD_MEMBERS,
Intents.FLAGS.GUILD_PRESENCES

また、npmの情報をPackage.jsonからコピペします。
"dependencies": {
"express": "^4.17.1",
"discord.js": "^13.6.4",
"node-cron": "^2.0.1",
"querystring": "^0.2.0",
"urlsearchparams": "^0.1.1",
"@discordjs/collection": "^1.0.1",
"@discordjs/builders": "^1.1.0"
},
"engines": {
"node": "16.x"  
(実際のバージョンは16.12.なんとか、V13をフルで使うための最低要件が16.6以降となっていたので大丈夫ですよね……?)

実現したいこと

botが提示した選択肢に対するユーザーからのリアクションを待ち受ける方式で応答型のやり取りを行う。

今のところ、手順としては
1.特定のコマンド「!コマンド」をif文で認識させる
2.bot側から定型文を送信する
3.送信後、botが即時選択肢のリアクションをつける("1⃣","2⃣","3⃣"等)
4.ユーザーからのリアクションを取得しする
5.リアクションに応じた次のメニューを提示する
6.次のメニューに対し3~5を行う
といったようにやり取りを繰り返し、ユーザーに最適な補助を実施する……というものを想定しています。

発生している問題・エラーメッセージ

3までは問題なく動作しているが、4に関してリアクションの取得ができない。
ひとまず試験的に終了処理を「リアクションが1つつく」or「時間切れ」としているが、どちらの結果も帰ってこない。
以上から「createReactionCollector」が動作せず、リアクションの取得が開始できていないと推測している。

エラーメッセージ なし。あってくれた方がうれしかった……

該当のソースコード

JavaScript

1client.on('messageCreate', async message => { 2//~一部略、if文で「!コマンド」を取得し、ユーザー情報を取得する等~ 3 4text="質問文"; 5client.channels.cache.get(ChannelId).send(text).then((question) => { 6 question.react('1⃣'); 7 question.react('2⃣'); 8 //簡単のため、2択の応答でテスト中 9 10 const filter = (reaction, user) => { 11 return["1⃣","2⃣"].includes(reaction.emoji.name) && !user.bot; 12 }; 13 //"1⃣","2⃣"かつbot以外からのリアクション(最終的にはコマンド実行ユーザーにするが簡単のため以下略) 14 15 const collector = question.createReactionCollector(filter, { max: 1, time: 5000}); 16 //リアクションが1個つくor5秒経過までリアクションを集める 17 18 collector.on('end', (collected, reason) => { 19 if (reason === 'time') { 20 sendRep(ChannelId,"時間切れ"); 21 } else { 22   let userReaction = collected.array()[0]; 23   let emoji = userReaction.emoji.name; 24   //リアクションの種類を取得 25 26    if (emoji === '1⃣') { 27    sendRep(ChannelId, "1!"); 28    } else if (emoji === '2⃣') { 29    sendRep(ChannelId, "2!"); 30    //"1⃣","2⃣"に対して応答 31 } else { 32    sendRep(ChannelId, "不正なリアクションです"); 33    //フィルターで弾かれるはずだけど一応…… 34 } 35 } 36 }); 37 }); 38 });

試したこと

https://brianmorrison.me/blog/discord-bot-reaction-collectors
上記コードはこちらのサイトを参考にしました。

その他、下記のサイトを参考にmessage.awaitReactionsを用いた方法を試しました。
しかし、.then内で「var」、「let」等、値の定義ができない、関数は使えるものの、これから取得する値が使えない等の理由から今回の目的には不向きではないかと判断しました。
なお、message.awaitReactionsでリアクションを取得した場合はコンソールへの出力やDiscordへのメッセージ送信(までできました。
=実現したいことの5まではできたが6を作れなかった。
https://scrapbox.io/discordjs-japan/%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%95%E3%82%8C%E3%82%8B%E3%81%AE%E3%82%92%E5%BE%85%E3%81%A1%E5%8F%97%E3%81%91%E3%81%A6%E5%87%A6%E7%90%86%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

書き方が少し間違っていますね
.createReactionCollector({ filter, max: 1, time: 500 });
としてみてください

投稿2023/05/11 05:31

kinji2532

総合スコア57

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問