Discord.js 机器人审计日志问题 (v12)

Posted

技术标签:

【中文标题】Discord.js 机器人审计日志问题 (v12)【英文标题】:Discord.js bot audit logs problems (v12) 【发布时间】:2020-07-26 02:31:19 【问题描述】:

我正在编写我的第一个机器人,但我在审核日志方面遇到了一些问题。

我想创建审核日志,它将发送信息,谁从服务器踢了一个成员。

我在互联网上找到了一些东西,但它的工作方式非常奇怪。踢我测试号的时候还好,说明我踢了他。但是当我想自己离开时,日志说我正在踢这个测试帐户。更何况,我朋友踢这个账号的时候,还好,说是他踢了他,但是当我再一个人离开的时候,却说是这个朋友踢了他。我不知道如何修复它。

这是我的代码:

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.`);
    
);

【问题讨论】:

如果你在这里发布你的代码会更好,你需要进一步澄清你的问题 我不知道你说的“澄清我的问题”是什么意思,你的意思是添加一些细节或者让它更透明? 【参考方案1】:

你得到的行为是因为你总是获取审计日志,并且总是使用最新的条目。当您自己离开时,根本不会生成审核日志条目。此外,每次抓取时,您获取的最新条目将是相同的踢,而不会出现新踢。

为避免这种情况,您应该比较某人离开的时间,以及您获取的日志是何时生成的。但请注意,审核日志不必立即生成(如果有的话)。

下面的代码段应该允许你做你想做的事 - 它检查获取的踢日志是否比你的获取早 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.`);

【讨论】:

好的,我看到了问题,但还是无法解决。我怎样才能得到这个时间? 更新答案。 非常感谢!我是个白痴,我忘记了“Date.now()”,我用了 30 行高 :D 再一次,谢谢!

以上是关于Discord.js 机器人审计日志问题 (v12)的主要内容,如果未能解决你的问题,请参考以下文章

v12 不会删除机器人的反应,但 v13 会删除机器人的反应 (discord.js)

机器人不响应命令(discord.js v12)

Discord.js v12 角色查询

discord.js v12 Discord.EvaluatedPermissions :((

discord.js v12 用户信息命令

从数组 discord.js v12 访问项目