🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Discord

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

JavaScript

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

Q&A

解決済

1回答

3723閲覧

Discordのbot(server.js)で計算クイズを作りたい

kei0005

総合スコア19

Discord

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

JavaScript

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

0グッド

0クリップ

投稿2021/01/07 17:00

編集2021/01/07 17:25

前提・実現したいこと

DiscordのbotをJavaScript(server.js)で作ろうとしています。

具体的には、
botがランダムな計算問題を出題する

回答者が正解すれば再度ランダムな計算問題を出題する
の動きをするように設計したいです。

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

if文の中で計算問題の答え(var ans_convertと定義)を出しておき、回答者のdiscord上の回答と一致したら次の問題に行くようにしたいのですが、下記のようなエラーが発生し、Discord上ではどんな入力でも正解となってしまいます
(sendMsg(ans_convert)しようとしたときに、ans_convertが未定義だよというエラー)

DiscordAPIError: Cannot send an empty message at /rbd/pnpm-volume/52872b23-6ab3-4b15-be7a-8668464d4907/node_modules/.registry.npmjs.org/discord.js/11.6.4/node_modules/discord.js/src/client/rest/RequestHandlers/Sequential.js:85:15 at /rbd/pnpm-volume/52872b23-6ab3-4b15-be7a-8668464d4907/node_modules/.registry.npmjs.org/snekfetch/3.6.4/node_modules/snekfetch/src/index.js:215:21 at processTicksAndRejections (internal/process/task_queues.js:88:5) { name: 'DiscordAPIError', message: 'Cannot send an empty message', path: '/api/v7/channels/769246390768369697/messages', code: 50006, method: 'POST' }

該当のソースコード

汚いコードで申し訳ありませんが…

JavaScript

1//discordBotのseerver.jsの必要部分のみ抜粋 2var nowQuiz = 0; 3var ans = 0; 4var ans_convert = 0; 5if (message.content.match(/クイズ/)){ 6 nowQuiz++; 7 sendMsg(message.channel.id, 'クイズをするよ'); 8 sendMsg(message.channel.id, '参加者は ' + message.author.username); 9 sendMsg(message.channel.id, "割り算は整数部分だけ答えればOK!"); 10 11 var num1 = Math.floor( Math.random() * 100 ); 12 var num2 = Math.floor( Math.random() * 100 ); 13 var operator = ['+', '-', '×', '÷'] 14 var chooseOperator = Math.floor( Math.random() * 4 ); 15 16 sendMsg(message.channel.id, nowQuiz + "問目: " + num1 + operand[chooseOperator] + num2 + ' = ?'); 17 18 if(chooseOperator == 0){//足し算 19 var ans = num1 + num2; 20 }else if(chooseOperator == 1){//引き算 21 var ans = num1 - num2; 22 }else if(chooseOperator == 2){//掛け算 23 var ans = num1 * num2; 24 }else if(chooseOperator == 3){//割り算 25 var ans = Math.floor(num1 / num2); //整数部分のみ 26 } 27 var ans_convert = RegExp(ans); //正規表現で使用できるように変換 28 return; 29 } 30 31 //このif文でans_convertが引き継がれない 32 //どんな回答でもif文を通り、OK!と表示されてしまう 33 if (nowQuiz==1 && message.content.match(ans_convert)){ 34 sendMsg(message.channel.id, "OK!"); 35 nowQuiz++; //2問目 36 sendMsg(message.channel.id, ans_convert); //ここで上記のエラー発生 37 38 //以下、同様の処理 39 40 return; 41 }

試したこと

nowQuizの値はif文を超えて引継ぎが出来ているようです。
(if (nowQuiz==1 && message.content.match(ans_convert))文内でsendMsg(nowQuiz)を実行するとちゃんと正しい値が返ってきます)

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

package.jsonの中身を記載します

{
"//1": "describes your app and its dependencies",
"//2": "https://docs.npmjs.com/files/package.json",
"//3": "updating this file will download and update your packages",
"name": "hello-express",
"version": "0.0.1",
"description": "A simple Node app built on Express, instantly up and running.",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.17.1",
"discord.js": "^11.6.4",
"querystring": "^0.2.0"
},
"engines": {
"node": "12.x"
},
"repository": {
"url": "https://glitch.com/edit/#!/hello-express"
},
"license": "MIT",
"keywords": [
"node",
"glitch",
"express"
]
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

一刻も早く var をやめて letconst に置き換えろ

あと変数のスコープは if ブロックの中で閉じています。if ブロックの中で宣言した変数は if ブロックの中でしか通用しません。

追記:
「変数のスコープはブロックの中で閉じている」というよりは「変数宣言はブロックの中で閉じている」と言ったほうが適切でしたね。なので nowQuiz についての説明は以上です。次に正解の記録ですが、「if の外に変数があればよい」ので

JavaScript

1... 2 let ans = 0 3 if(chooseOperator == 0){//足し算 4 ans = num1 + num2 5 }else if(chooseOperator == 1){//引き算 6 ans = num1 - num2 7 }else if(chooseOperator == 2){//掛け算 8 ans = num1 * num2 9 }else if(chooseOperator == 3){//割り算 10 ans = Math.floor(num1 / num2) //整数部分のみ 11 } 12...

とすれば問題なく正解をキャッチできます。宣言は外にありますから let ans に代入することが出来ます。

var は変数のスコープを破壊する厄介者です。一刻も早く使用をやめて letconst に乗り換えてください

投稿2021/01/07 17:35

編集2021/01/07 17:55
A_kirisaki

総合スコア2853

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

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

kei0005

2021/01/07 17:44 編集

回答ありがとうございます。2つほど質問があり恐縮ですが、 ①変数のスコープは if ブロックの中で閉じているのであれば、どのようにして正解の値を記録し、Discord上の回答者の回答と一致しているかどうかを判定すればよいでしょうか。 ②変数nowQuizのスコープがifブロックの中で閉じずに他のifブロックへ越境しているのはなぜなのか、見当は付きますでしょうか
kei0005

2021/01/08 05:20

問題が無事解消されました この度はありがとうございます
kei0005

2021/01/08 05:20

var, let, constの使い分けもちゃんとできるようになる必要がありそうですね
A_kirisaki

2021/01/08 05:22

var は使わないでください!心からのお願いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問