我正在写我的第一个机器人,但是审核日志有一些问题。
我想创建审核日志,该日志将发送信息,从服务器踢出成员。
我在互联网上发现了一些东西,但是它确实工作异常。当我踢我的考试帐户时,没关系,这表明我踢了他。但是,当我想独自离开时,日志显示我正在踢这个测试帐户。而且,当我的朋友踢这个帐户时,可以说他踢了他,也可以,但是当我再次独自离开时,它说这个朋友踢了他。我不知道如何修理。
这是我的代码:
bot.on('guildMemberRemove', async member => {
const kanal = bot.channels.cache.get("698649855727501402");
const fetchedLogs = await member.guild.fetchAuditLogs({
limit: 1,
type: 'MEMBER_KICK',
});
const kickLog = fetchedLogs.entries.first();
if (!kickLog) return kanal.send(`${member.user.tag} left the guild, most likely of their own will.`);
const { executor, target } = kickLog;
if (target.id === member.id) {
kanal.send(`${member.user.tag} left the guild; kicked by ${executor.tag}?`);
} else {
kanal.send(`${member.user.tag} left the guild, audit log fetch was inconclusive.`);
}
});
答案 0 :(得分:0)
您得到的行为是由于您始终总是获取审核日志,并且始终使用最新条目所引起。当您自己离开时,根本不会生成审核日志条目。另外,每次获取时,最新的获取条目将是相同的踢,而不会出现新的踢。
为避免这种情况,您应该比较某人离开的时间以及何时生成您获取的日志。但是请注意,不必立即生成审核日志。
下面的代码片段应允许您执行所需的操作-它检查是否在提取之前的5秒钟内创建了获取的踢球日志。该时间窗口应该足够长,以解决延迟等问题,但是您可以随意减小它的时间。
const logs = await member.guild.fetchAuditLogs({ limit: 1, type: 'MEMBER_KICK' });
const log = logs.entries.first();
if (!log) return;
if (Date.now() - log.createdTimestamp < 5000) {
kanal.send(`${member.user.tag} was kicked by ${log.executor.tag}.`);
} else {
kanal.send(`${member.user.tag} left the guild.`);
}