【问题标题】:Finding who deleted the message查找谁删除了邮件
【发布时间】:2019-04-19 01:31:59
【问题描述】:

我的 discord.js 机器人被编程为记录已删除的消息。我有代码设置,但我想知道是否有办法查看谁删除了它?谢谢。

代码如下:

bot.on("messageDelete", (messageDelete) => {

  let DeleteEmbed = new Discord.RichEmbed()
  .setTitle("**DELETED MESSAGE**")
  .setColor("#fc3c3c")
  .addField("Author", messageDelete.author.tag, true)
  .addField("Channel", messageDelete.channel, true)
  .addField("Message", messageDelete.content)
  .setFooter(`Message ID: ${messageDelete.id} | Author ID: ${messageDelete.author.id}`);

  let DeleteChannel = messageDelete.guild.channels.find(x => x.name === "delete-log");
  DeleteChannel.send(DeleteEmbed);
});

谢谢!

【问题讨论】:

    标签: javascript json discord discord.js


    【解决方案1】:

    我认为实现这一目标的唯一方法是查看审核日志。

    client.on("messageDelete", async msg => {
      let logs = await msg.guild.fetchAuditLogs({type: 72});
      let entry = logs.entries.first();
    
      let embed = new Discord.RichEmbed()
        .setTitle("**DELETED MESSAGE**")
        .setColor("#fc3c3c")
        .addField("Author", msg.author.tag, true)
        .addField("Channel", msg.channel, true)
        .addField("Message", msg.content)
        .addField("Executor", entry.executor)
        .addField("Reason", entry.reason || "Unspecified")
        .setFooter(`Message ID: ${msg.id} | Author ID: ${msg.author.id}`);
    
      let channel = msg.guild.channels.find(x => x.name === 'delete-log');
      channel.send({embed});
    });
    

    【讨论】:

    • 这能保证工作吗?因为你只是抓住了第一个条目。我之前看到审核日志需要一段时间才能更新。
    • 是的,这行不通,它只会抓取审核日志中最近的人,而删除的消息不会赶上。
    • @pause 如果这不起作用,我认为没有办法做到这一点:消息对象不存储删除它的人,审计条目对象不存储删除它的消息被删除并且客户端在创建新的审计条目时不会发出任何事件:\
    【解决方案2】:

    除了通过审核日志外,没有其他方法可以做到这一点,这可能非常错误且难以处理。希望对你有一点帮助。

    【讨论】:

      【解决方案3】:

      这可以通过使用message.author.tag 来实现。有了这个,你甚至可以展示他们的头像。

      bot.on("messageDelete", async(message) => {
          let delEmbed = new discord.RichEmbed()
          .setAuthor(message.author.tag, message.author.avatarURL)
          .setThumbnail(message.author.avatarURL)
          .setColor("RANDOM")
          .setDescription("A message from a user was deleted!")
          .addField("Message", message.content)
          .setTimestamp();
      
          let loggingChannel = message.guild.channels.find(ch => ch.name === "logs")
          if(!loggingChannel) return;
          loggingChannel.send(delEmbed)
      })
      

      【讨论】:

      • TypeError: message.guild.channels.find is not a function
      • let loggingChannel = client.channels.cache.get("channel-id-here"); 工作
      • 那是消息作者,而不是发布删除的人。
      【解决方案4】:

      我编辑了这条消息,让它更漂亮:

      const Discord = require("discord.js);
      
      bot.on("messageDelete", async msg => {
      let logs = await msg.guild.fetchAuditLogs({type: 72});
      let entry = logs.entries.first();
      
      let embed = new Discord.RichEmbed()
        .setTitle("**DELETED MESSAGE**")
        .setColor("#fc3c3c")
        .setAuthor(msg.author.tag, msg.author.avatarURL)
        .setDescription(`**Author:** ${msg.author.tag}\n**Channel:** ${msg.channel}\n**Message:** ${msg.content}\n**Executor**: ${entry.executor}`)
        .setFooter(`Message ID: ${msg.id}\nAuthor ID: ${msg.author.id}`)
        .setThumbnail(msg.author.avatarURL)
        .setTimestamp();
      let delchannel = msg.guild.channels.find(x => x.name === 'your-log-channel-name');
      delchannel.send(embed);
      });
      

      【讨论】:

      • 这里的实际问题是什么?
      • “我的 discord.js 机器人被编程为记录已删除的消息。我已经设置了代码,但我想知道是否有办法查看谁删除了它?谢谢。”执行者是删除消息的人
      【解决方案5】:

      正如@NintendoZaedus 正确指出的那样,没有一种流畅而准确的方法可以做到这一点。不过,我设法在某种程度上做到了这一点,并且尽可能少犯错误。

      请注意,在撰写本文时这些是不可能的,并且会返回“未知”:

      • 查看哪个机器人删除了一条消息,因为 Discord 不会记录机器人的消息删除情况
      • 查看作者是否删除了自己的消息(Discord 也不记录此消息)
      • 100% 确定删除的消息是否与提取的审核日志匹配,因为 Discord 未在审核日志中包含消息 ID
      // If discord.js isn't defined, add this, if it is, don't.
      const Discord = require("discord.js");
      
      bot.on("messageDelete", async (messageDelete) => {
        // Add latency as audit logs aren't instantly updated, adding a higher latency will result in slower logs, but higher accuracy.
        await Discord.Util.delayFor(900);
      
        // Fetch a couple audit logs than just one as new entries could've been added right after this event was emitted.
        const fetchedLogs = await messageDelete.guild.fetchAuditLogs({
          limit: 6,
          type: 'MESSAGE_DELETE'
        }).catch(console.error);
      
        const auditEntry = fetchedLogs.entries.find(a =>
          // Small filter function to make use of the little discord provides to narrow down the correct audit entry.
          a.target.id === messageDelete.author.id &&
          a.extra.channel.id === messageDelete.channel.id &&
          // Ignore entries that are older than 20 seconds to reduce false positives.
          Date.now() - a.createdTimestamp < 20000
        );
      
        // If entry exists, grab the user that deleted the message and display username + tag, if none, display 'Unknown'. 
        const executor = auditEntry.executor ? auditEntry.executor.tag : 'Unknown';
      
        // Finally, prepare the embed and send the log. (using similar code posted by thread author but improved)
      
        // <Discord>.MessageEmbed for v12, <Discord>.RichEmbed for older.
        const DeleteEmbed = new Discord.MessageEmbed()
          .setTitle("DELETED MESSAGE")
          .setColor("#fc3c3c")
          .addField("Author", messageDelete.author.tag, true)
          // New field for user which deleted the message.
          .addField("Deleted By", executor, true)
          .addField("Channel", messageDelete.channel, true)
          // Messages can be empty too, but I won't be going over how to include embeds/attachments, just displaying 'None' instead to avoid undefined/null.
          .addField("Message", messageDelete.content || "None")
          .setFooter(`Message ID: ${messageDelete.id} | Author ID: ${messageDelete.author.id}`);
      
        const DeleteChannel = messageDelete.guild.channels.find(x => x.name === "delete-log");
        DeleteChannel.send(DeleteEmbed);
      });
      

      【讨论】:

        猜你喜欢
        • 2017-05-03
        • 2020-01-21
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        • 2013-05-10
        • 1970-01-01
        • 2014-12-09
        • 2014-03-07
        相关资源
        最近更新 更多