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

Discord编辑狙击命令重复调用时发送多个Embed问题求助

解决Discord机器人Edit Snipe命令重复发送Embed的问题

问题根源

你的代码存在两个核心问题导致重复发送Embed:

  1. 重复注册命令监听器:把message命令监听器嵌套在了messageUpdate事件内部,每次有消息编辑就会新增一个message监听器,调用y!edit时所有已注册的监听器都会触发,自然发送多个Embed
  2. 重复事件监听+逻辑混乱:存在两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:10:37