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

如何阻止Discord机器人执行用户回复中的命令?

解决Discord机器人误执行用户回复命令的问题

嘿,这个问题我之前做Discord机器人的时候也碰到过,给你几个实用的解决办法,都是我实测有效的:

方案1:临时标记用户的「回答状态」(最推荐)

核心思路就是:当机器人发起提问时,给这个用户打个标记,告诉机器人“接下来这个用户的消息是回答,不是命令”。等用户回复后,处理完存数据库的逻辑,再取消这个标记,让后续消息恢复正常命令检测。

你可以用一个Set来维护正在回答问题的用户ID(内存级临时存储,重启机器人会清空,适合大多数场景),代码示例如下:

// 全局维护一个集合,记录正在回答问题的用户ID
const answeringUsers = new Set();

client.on('messageCreate', async (message) => {
  // 第一步:先检查用户是否处于「回答状态」
  if (answeringUsers.has(message.author.id)) {
    // 直接把回复存入数据库,不触发命令检测
    await saveToDatabase(message.content); // 替换成你实际的存库函数
    message.reply(`"${message.content}"已添加到数据库`);
    
    // 取消回答状态,允许用户后续正常使用命令
    answeringUsers.delete(message.author.id);
    
    // 继续发起下一轮提问(如果需要的话)
    message.reply("Cats or Dogs?");
    
    // 这里一定要return,跳过后面的命令检测逻辑
    return;
  }

  // 第二步:处理正常的命令逻辑
  if (!message.content.startsWith(config.prefix)) return;
  const commandName = message.content.slice(config.prefix.length).split(' ')[0];

  if (commandName === 'question') {
    // 用户触发了提问命令,标记为「回答状态」
    answeringUsers.add(message.author.id);
    message.reply("Cats or Dogs?");
  }

  // 其他命令的处理逻辑...
});

这个方案的好处是:完全不需要改动你现有的命令检测和存库逻辑,只需要加一层状态判断,代码侵入性极低,而且效率很高。

方案2:持久化「回答状态」(适合机器人重启后需要保留状态的场景)

如果你的机器人需要重启后还能记住用户的回答状态,那可以把状态存在数据库里(比如给用户表加一个is_answering布尔字段)。

大致逻辑是:

  • 用户触发?question命令时,把数据库中该用户的is_answering设为true
  • 收到用户消息时,先查数据库看该用户是否处于回答状态:
    • 是:存回复,然后把is_answering设为false
    • 否:正常执行命令检测

代码示例(假设用SQL数据库):

client.on('messageCreate', async (message) => {
  // 从数据库获取用户状态
  const user = await db.query('SELECT is_answering FROM users WHERE id = ?', [message.author.id]);
  
  if (user.is_answering) {
    await saveToDatabase(message.content);
    message.reply(`"${message.content}"已添加到数据库`);
    // 更新状态为false
    await db.query('UPDATE users SET is_answering = false WHERE id = ?', [message.author.id]);
    message.reply("Cats or Dogs?");
    return;
  }

  // 正常命令检测
  if (message.content.startsWith(config.prefix)) {
    const commandName = message.content.slice(config.prefix.length).split(' ')[0];
    if (commandName === 'question') {
      await db.query('UPDATE users SET is_answering = true WHERE id = ?', [message.author.id]);
      message.reply("Cats or Dogs?");
    }
    // 其他命令...
  }
});

关于你提到的思路补充

你说的第一个思路“将用户回复转为‘answer’类型变量”,其实本质就是通过上面的状态标记来实现——让机器人识别这条消息的用途是“回答”而非“命令”,从而跳过命令检测流程,直接处理存库逻辑。

第二个思路“修改现有问答系统机制”,上面的方案其实就是对问答机制的小调整,不需要大改整体结构,就能解决问题。

内容的提问来源于stack exchange,提问作者Khang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:37:51