You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:52:38