Как мне отправить количество пользователей во всех гильдиях вместе взятых?

#javascript #discord.js

#javascript #discord.js

Вопрос:

Я использую message.client.guilds.members.cache.filter(member => !member.user.bot).size для вывода количества пользователей во всех гильдиях вместе взятых, но я получаю ошибку TypeError: Cannot read property 'cache' of undefined , но кэш работает в этом коде для кэширования всех гильдий message.client.guilds.cache.size . Итак, как я могу это исправить и вывести количество пользователей во всех гильдиях вместе взятых?

Комментарии:

1. можете ли вы console.log(message.client.guilds) и опубликовать его здесь?

2. @RanMarciano я получил 9

Ответ №1:

В вашем коде есть несколько ошибок. Прежде всего, message.client.guilds возвращает a GuildManager , у которого нет members свойства.

Чтобы получить всех участников в каждой гильдии, вам нужен способ перебора каждой гильдии, например Collection.prototype.each() метод.

 message.client.guilds.each((guild) =>
 // this function will be executed for every element (guild) in the collection
 console.log(`${guild.name} has ${guild.members.cache.size} members`)
);
 

Если вы хотите сложить все подсчеты вместе, вам следует использовать Collection.prototype.reduce()

 message.client.guilds.reduce((acc, guild) => acc   guild.members.cache.size, 0);
 

Разница между приведенным выше фрагментом и вторым фрагментом, который вы предоставили в своем коде:

 // this line is looking at the GuildMemberManager cache (`guild.members.cache`)
message.client.guilds.reduce((acc, guild) => acc   guild.members.cache.size, 0);
// this line is looking at the GuildManager cache (`client.guilds.cache`)
message.client.guilds.cache.size;
 

Вам нужно посмотреть оба кэша. Вышеупомянутое GuildManager не является коллекцией гильдий, поэтому любая попытка перебрать их не сработает.

 message.client.guilds.cache.reduce(
 (acc, guild) => acc   guild.members.cache.size,
 0
);
 

Кроме того, в этом подсчете будут учитываться только кэшированные участники из каждой гильдии, что очень редко бывает со всеми. Лучшим решением будет просмотр количества участников непосредственно из объекта guild, который не подвержен кэшированию.

 message.client.guilds.cache.reduce((acc, guild) => acc   guild.memberCount, 0);