如何使用discord.js实现点击表情后仅删除单频道用户1分钟内新消息
问题原因分析
- 核心错误:在用户点击👎反应后,你为
client全局注册了永久生效的消息事件监听器,该监听器没有添加用户、频道、时间限制,会匹配所有服务器所有用户发送的所有消息,导致误删。 - 语法逻辑错误:
author.msg.content、userMessage.channel = await msg.delete()都是错误写法,完全不符合预期执行逻辑。 - 无效判断:原代码中
userMessage.content.startsWith('')条件永远为真,所有用户发的任意消息都会触发机器人发送山羊相关提问,若不需要请自行修改触发条件。
修复后代码(适配discord.js v13+,低版本可将
messageCreate改回message) client.on('messageCreate', async userMessage => { // 可自行修改触发条件,示例为仅当用户发送!goat指令时触发功能 if (!userMessage.content.startsWith('!goat')) return; if (userMessage.author.bot) return; // 过滤机器人自身发送的消息 const botMessage = await userMessage.channel.send('Who here likes goats?'); await botMessage.react("👍"); await botMessage.react("👎"); const reactionFilter = (reaction, user) => { return ["👍", "👎"].includes(reaction.emoji.name) && user.id === userMessage.author.id; }; try { const collected = await botMessage.awaitReactions({ filter: reactionFilter, max: 1, time: 60000, errors: ["time"] }); const reaction = collected.first(); if (reaction.emoji.name === "👎") { await userMessage.channel.send(`${userMessage.author}, how dare you. I guess no on here likes me. Hmmm, because of that I shall now eat all your messages! BAAAAAHAHAHHAHAHA!`); // 定义消息删除逻辑 const deleteHandler = async (msg) => { // 仅删除触发功能的用户、当前频道内的非机器人消息 if (msg.author.id === userMessage.author.id && msg.channel.id === userMessage.channel.id && !msg.author.bot) { try { await msg.delete(); } catch (err) { console.log('删除消息失败,大概率是机器人缺少删除消息权限:', err); } } }; // 注册临时监听器 client.on('messageCreate', deleteHandler); // 1分钟后自动移除监听器,停止删除 setTimeout(() => { client.off('messageCreate', deleteHandler); }, 60000); } else { await userMessage.reply("Thanks!"); } } catch (err) { await userMessage.channel.send("Hehe"); } });
修复说明
- 采用临时注册监听器+到期自动移除的逻辑,仅在用户点击👎后的1分钟内生效,不会永久留存
- 添加严格的删除校验规则,仅删除目标用户在当前频道发送的新消息,不会影响其他用户、其他频道的内容
- 修复了原有的语法逻辑错误,添加了机器人消息过滤、删除异常捕获逻辑
- 新增了触发指令过滤,避免所有消息都触发机器人回复,可自行修改
!goat为你需要的触发规则
内容的提问来源于stack exchange,提问作者user15194515
相关产品推荐
相关产品推荐

