Discord编辑狙击命令重复调用时发送多个Embed问题求助
解决Discord机器人Edit Snipe命令重复发送Embed的问题
问题根源
你的代码存在两个核心问题导致重复发送Embed:
- 重复注册命令监听器:把
message命令监听器嵌套在了messageUpdate事件内部,每次有消息编辑就会新增一个message监听器,调用y!edit时所有已注册的监听器都会触发,自然发送多个Embed - 重复事件监听+逻辑混乱:存在两个
messageUpdate监听器,且命令里直接使用外层的oldMessage/newMessage,上下文完全混乱
修正后的完整代码
const editedMessages = new Discord.Collection(); // 统一处理消息编辑的存储逻辑 client.on("messageUpdate", (oldMessage, newMessage) => { // 内容无变化则不存储 if(oldMessage.content === newMessage.content) return; // 按频道ID存储最新编辑记录,旧记录会被覆盖 editedMessages.set(newMessage.channel.id, { old: oldMessage, new: newMessage }); }); // 全局仅注册一次命令监听器 client.on('message', message => { if (message.author.bot) return; const args = message.content.trim().split(/\s+/g); const command = args.shift().toLowerCase(); switch (command) { case 'y!edit': // 获取当前频道最新的编辑记录 const editRecord = editedMessages.get(message.channel.id); if (!editRecord) return message.reply('没有可狙击的编辑消息'); const edembed = new Discord.MessageEmbed() .setColor('#deffff') .setAuthor(editRecord.new.author.tag, editRecord.new.author.avatarURL({ dynamic: true })) .setDescription(`**旧消息:** ${editRecord.old.content} \n **新消息:** ${editRecord.new.content}`) .setFooter(`ID: ${editRecord.new.author.id}`) .setTimestamp(); message.channel.send({ embeds: [edembed] }).catch(err => console.error(err)); break; } });
关键修改说明
- 将
message命令监听器移至全局,仅注册一次,彻底避免重复触发 - 合并
messageUpdate监听器,每次消息编辑时用频道ID作为key存储最新的编辑记录(旧消息+新消息),自动覆盖旧记录,确保每个频道只保留最近一次编辑内容 - 修复命令判断逻辑:原代码判断
!message完全错误,改为判断从editedMessages取出的editRecord - 从存储的
editRecord中获取新旧消息内容,避免上下文混乱,确保每次调用命令仅获取当前频道最新的一条编辑记录
内容的提问来源于stack exchange,提问作者Chan
相关产品推荐
相关产品推荐

