如何阻止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
相关产品推荐
相关产品推荐

