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