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

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

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

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

Q&A

解決済

1回答

1616閲覧

Discordのbotで、条件分岐が作りたい。

yamachann

総合スコア3

Discord

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

0グッド

0クリップ

投稿2021/08/08 17:15

前提・実現したいこと

Discordのbotで条件分岐が作りたいのですが、ユーザーが特定の文字列を送ると条件分岐が開始されてbotから質問が送られ、それに対してのユーザーの答えによって違った質問がbotから送られる。これが数回行われるようにしたいです。また、一定時間入力がなかった時に条件分岐のプログラムが終了するようにもしたいです。
下記のコードは今できているもので、ここに新たに埋め込みたいと思っています。(知識がなく、メンションやとある文字列に反応してメッセージを送るプログラムはネットから色々拾ってきてなんとか作った感じなのですが、条件分岐を埋め込むことができず、それに関しては全く何も書いてない感じです。)

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

①条件分岐の中で、ユーザーが数字を送った時にその数字が、ある値より高いか低いかで、botが送るメッセージが変わるようなものを一部(その他は数字ではなく文字列で)作りたいのですが(例えば1~100が選択肢だとして、50以上と以下で分けようとしたとき)どのようにやるのでしょうか。 ②まずそもそも条件分岐を作るやり方がわかりません。自分で思いついた方法はユーザーのメッセージを変数(?)にすることなのですが、それでうまくいくのかも、どうやるのかもわかりません。 ③時間制限を設けてプログラムを終了する方法がわかりません。

#該当のソースコード

const http = require('http'); const querystring = require('querystring'); const discord = require('discord.js'); const client = new discord.Client(); http.createServer(function(req, res){ if (req.method == 'POST'){ var data = ""; req.on('data', function(chunk){ data += chunk; }); req.on('end', function(){ if(!data){ res.end("No post data"); return; } var dataObject = querystring.parse(data); console.log("post:" + dataObject.type); if(dataObject.type == "wake"){ console.log("Woke up in post"); res.end(); return; } res.end(); }); } else if (req.method == 'GET'){ res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Discord Bot is active now\n'); } }).listen(3000); client.on('ready', message =>{ console.log('Bot準備完了~'); client.user.setPresence({ activity: { name: 'げーむ' } }); }); client.on('message', message =>{ if (message.author.id == client.user.id || message.author.bot){ return; } if(message.isMemberMentioned(client.user)){ let text = "~"; sendMsg(message.channel.id, text); return; } if (message.content.match(/~|~/)){ let text = "~"; sendMsg(message.channel.id, text); return; } }); if(process.env.DISCORD_BOT_TOKEN == undefined){ console.log('DISCORD_BOT_TOKENが設定されていません。'); process.exit(0); } client.login( process.env.DISCORD_BOT_TOKEN ); function sendReply(message, text){ message.reply(text) .then(console.log("リプライ送信: " + text)) .catch(console.error); } function sendMsg(channelId, text, option={}){ client.channels.get(channelId).send(text, option) .then(console.log("メッセージ送信: " + text + JSON.stringify(option))) .catch(console.error); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、discord.jsのバージョンをv12に更新しましょう!
今あなたが使っているのはdiscord.js v11なので、ステージチャンネルがあるサーバーでは機能しません。

v12にアップデートしたコードで書きます。

js

1const http = require('http'); 2const querystring = require('querystring'); 3const discord = require('discord.js'); 4const client = new discord.Client(); 5 6http.createServer(function(req, res){ 7 if (req.method == 'POST'){ 8 var data = ""; 9 req.on('data', function(chunk){ 10 data += chunk; 11 }); 12 req.on('end', function(){ 13 if(!data){ 14 res.end("No post data"); 15 return; 16 } 17 var dataObject = querystring.parse(data); 18 console.log("post:" + dataObject.type); 19 if(dataObject.type == "wake"){ 20 console.log("Woke up in post"); 21 res.end(); 22 return; 23 } 24 res.end(); 25 }); 26 } 27 else if (req.method == 'GET'){ 28 res.writeHead(200, {'Content-Type': 'text/plain'}); 29 res.end('Discord Bot is active now\n'); 30 } 31}).listen(3000); 32 33client.on('ready', () =>{ 34 console.log('Bot準備完了~'); 35 client.user.setPresence({ activity: { name: 'げーむ' } }); 36}); 37 38client.on('message', async message =>{ 39 if (message.author.bot) return; 40 if(message.mentions.has(client.user)){ 41 message.channel.send("~"); 42 return; 43 } 44 if (message.content.match(/~/)){ 45 message.channel.send("~"); 46 return; 47 } 48 if (message.content.match(/特定の文字列/) { 49 await message.reply("質問します"); 50 const filter = m => m.author.id === message.author.id; 51 message.channel.awaitMessages(filter, { time: 6000, /*6000ミリ秒、つまり1分の時間制限があります*/ max: 1}) 52 .then(collected => { 53 if (!collected.size) return message.reply("時間制限です"); 54 const msg = collected.first(); 55 const content = msg.content; 56 if (isNaN(Number(content))) return message.reply("数字ではありません");//isNaNという関数を用いて数字かどうか判定しています 57 const num = Number(content); 58 if (num >= 50) { 59 message.reply("それは50以上です"); 60 return; 61 } else { 62 message.reply("それは50未満です"); 63 } 64 }); 65 } 66}); 67 68if(process.env.DISCORD_BOT_TOKEN == undefined){ 69 console.log('DISCORD_BOT_TOKENが設定されていません。'); 70 process.exit(0); 71} 72 73client.login( process.env.DISCORD_BOT_TOKEN );

これでどうでしょうか。

投稿2021/08/09 02:27

Waki285

総合スコア2014

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

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

yamachann

2021/08/09 06:44

ご丁寧にありがとうございました。 無事動かすことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問