Discord.js数字游戏消息收集器不响应用户输入问题求助
问题描述
我给自己设定了一个小挑战,将Python学习课程中编写的猜数字游戏转换为Discord机器人的JavaScript代码,计划使用SlashCommandBuilder、EmbedBuilder和子命令实现。
我编写了以下代码:
const { EmbedBuilder, SlashCommandBuilder } = require("discord.js"); function randInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; } module.exports = { data: new SlashCommandBuilder() .setName("numbergame") .setDescription("Play the number game!"), async execute(client, interaction) { const { member } = interaction; const correct_number = randInt(1, 100); let guess_count = 1; const embed = new EmbedBuilder() .setDescription(`Hey ${member.user.tag}! Welcome to my guessing game! I'm going to pick a number between 1 and 100. You have 1 minute to guess...`) .setColor('#2f3136') .setTimestamp() .setFooter({ text: `Requested by ${member.user.tag}`, iconURL: member.displayAvatarURL() }); const filter = m => !isNaN(m.content) && m.author.id === interaction.user.id; const collector = interaction.channel.createMessageCollector({ filter, time: 60000 }); await interaction.reply({ embeds: [embed]}); collector.on('collect', async m => { const guess = randInt(m.content); if (guess < correct_number) { embed.setDescription(`Wrong. You need to guess higher. You have guessed ${guess_count} times. What is your guess?`); guess_count++; } else if (guess > correct_number) { embed.setDescription(`Wrong. You need to guess lower. You have guessed ${guess_count} times. What is your guess?`); guess_count++; } else { collector.stop(); embed.setDescription(`Congrats! The right answer was ${correct_number}. It took you ${guess_count} guesses.`); } await interaction.editReply({ embeds: [embed] }); }); collector.on('end', collected => { if (collected.size === 0) { embed.setDescription(`Time's up! The right answer was ${correct_number}.`); interaction.editReply({ embeds: [embed] }); } }); } }
代码可正常运行,但存在问题:机器人无法响应我的任何输入,一分钟后会按预期显示正确答案并结束游戏。
编辑补充:我尝试将过滤器设置为() => true排查收集器是否工作,但问题依旧,无任何变化。
解决思路
1. 修复核心逻辑错误:错误调用randInt函数
你在收集用户输入后,错误地用randInt(m.content)处理用户猜测——你的randInt需要两个参数(min和max),但你只传了用户输入的字符串,这会导致max为undefined,最终计算出的guess值大概率是NaN,后续的大小比较逻辑全部失效,机器人自然不会有响应。
正确的做法是把用户输入的内容转为数字,同时增加有效性校验:
// 替换原来的const guess = randInt(m.content); const guess = parseInt(m.content, 10); // 校验输入是否为1-100之间的有效数字 if (isNaN(guess) || guess < 1 || guess > 100) { embed.setDescription(`请输入1-100之间的有效数字!你已经猜了${guess_count}次。`); await interaction.editReply({ embeds: [embed] }); return; }
2. 检查机器人权限
确保你的机器人在服务器中拥有读取消息历史和发送消息的权限,缺少这些权限会导致消息收集器无法正常捕获用户输入。
3. 验证消息收集器的作用范围
如果机器人是在私有频道(如私信)运行,需确认频道的消息收集逻辑是否正常;另外检查interaction.channel是否正确指向了用户发送命令的频道。
4. 调试收集器状态
可以在收集器的collect事件中添加日志,确认是否触发:
collector.on('collect', async m => { console.log(`收集到消息:${m.content},来自用户:${m.author.tag}`); // 后续逻辑... });
如果控制台没有输出,说明收集器根本没捕获到消息,重点排查权限和频道问题;如果有输出,再检查后续的数字转换和比较逻辑。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

