如何获得创建了多少角色,审计日志(discord.js)



我想检查3秒后创建了多少角色,但是filtered.size日志未定义,我如何才能完成这一点?


wait(3000)
const logs = await guild.fetchAuditLogs({ type: 'ROLE_CREATE', });
if( !logs) return;

const entry = logs.entries;
const filtered = entry.filter(e => e.createdAt = Date.now());
console.log(filtered.size);

注意:这段代码是为@discordjs/collection v0.7.0和discordjs v13.8.1编写的


<Collection>.entries不是属性

一个Discord.js集合是一个带有一些额外功能的Map。如文档中所述,存在一个称为entries()的函数。因此,出现了两个问题。

  • 由于Collection上不存在entries属性,因此您的代码返回一个函数。代码试图在函数上运行filter,结果返回undefined,因为Function.filter()不起作用。
  • 即使log被更新为<Collection>.entries作为一个函数,这仍然会返回一个错误,因为.entries(...).filter不是一个函数(在Runkit上演示)

解决方案

使用内置的filter函数

在Collection文档中,有一个名为filter的函数,其工作原理与Array.filter()相似。因此,可以跳过创建过滤器。如果仍然保留entry变量,则只需将.entries转换为.entries()。它看起来像这样:

// Skip creating the entry variable
const filtered = logs.filter(e => e.createdAt === Date.now());
// Or, if you'd like to keep the variable
const entry = logs.entries();
const filtered = entry.filter(e => e.createdAt === Date.now());

同样,在使用filter(...)时,您使用的是单个=,它将日志的createdAt属性设置为Date.now()。为了解决这个问题,我使用了===,它只选择createdAt属性为严格的条目set toDate.now().

.entries转换为函数并将其排序为Array

首先,我们需要将entries改为entries()。之后,我们将使用Array.from将从Collection.entries()返回的IterableIterator转换为可以过滤的Array。之后,我们将使用与上述解决方案中相同的filter函数。

const entry = logs.entries();
const filtered = Array.from(entry).filter(e => e.createdAt === Date.now());

最新更新