Получение членов гильдии и их фильтрация (Discord.js )

#javascript #node.js #discord.js

#javascript #node.js #discord.js

Вопрос:

я новичок в Discord.js , и пытаюсь создать команду server info, как на картинке ниже. Я застрял в тот момент, когда мне нужно получить всех членов гильдии и отфильтровать их по текущему статусу и bot свойству. Я прочитал https://discordjs.guide/popular-topics/common-questions.html и там сказано, что мне нужно собрать всех членов гильдии:

 msg.guild.members.fetch().then(fetchedMembers => {
    const totalOnline = fetchedMembers.filter(member => member.presence.status === 'online');
    msg.channel.send(`There are currently ${totalOnline.size} members online in this guild!`);
});
  

Моя команда отправляется как вставка, и я добавляю количество отфильтрованных участников в переменную, а затем это значение вставляется в поле для вставки. Если я отправляю embed на канал прямо внутри блока then(), он работает, поля для вставки добавляются правильно. Но мне нужно добавить другую информацию о гильдии, такую как количество каналов, владелец, регион и т.д. Если я создаю поля из then() , вместо количества я получаю undefined .

P.S. извините за мой плохой английский, я не являюсь носителем языка

Ответ №1:

Причина, по которой вы получаете undefined , заключается в том, что fetch() это асинхронная функция, то есть она выполняется в фоновом режиме, и как только она завершена, вызывается обратный then вызов.

Вы не можете поместить его за пределы then() блока, потому что тогда ваш код будет выполняться до fetch() завершения и обновления переменной с результатом, кроме того, totalOnline переменная создается внутри этого блока, поэтому она не будет работать вне его в любом случае, поскольку это локальная переменная внутри этой области.

Эта статья может облегчить понимание: https://www.freecodecamp.org/news/async-await-javascript-tutorial /

Вы можете использовать дополнительную необходимую информацию внутри этой области. Например:

 msg.guild.members.fetch().then(fetchedMembers => {
    const totalOnline = fetchedMembers.filter(member => member.presence.status === 'online');
    msg.channel.send(`There are currently ${totalOnline.size} members online in ${msg.guild.name}!`);
});
  

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

1. Спасибо! Я собираюсь прочитать эту статью, я думаю, это должно помочь.

Ответ №2:

Что вы могли бы сделать вместо использования fetch() , так это просто присвоить переменную коллекции членов.

 // v12
let allmembers = message.guild.members.cache;

// v11
let allmembers = message.guild.members;
  

Как только у вас это будет, вы можете отфильтровать это и поместить во вставку или сообщение и т. Д.

 const totalOnline = allmembers.filter(member => member.presence.status === 'online');

message.channel.send(`There are currently ${totalOnline.size} members online in ${message.guild.name}!`);
  

Ответ №3:

Ответ для discord.js v13 :

 let members = (await guild.members.fetch())
    .filter(m => m._roles.includes(ROLE_ID));

let member_ids = members.map(m => m.user.id);

let member_count = members.size();