查找谁删除了消息

新手上路,请多包涵

我的 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);
});

谢谢!

原文由 pause 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 293
1 个回答

正如@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);
});

原文由 Epic Speedy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题