Как получить всех пользователей с ролью в Discord.js в массиве

#javascript #discord #discord.js

Вопрос:

Я пытаюсь собрать всех участников с определенной ролью. Например, на моем сервере discord есть роль гурдиана с идентификатором 872029521484873779. Мне нужен список всех имен пользователей в массиве, у которых на моем сервере есть роль gurdian. Мой код выглядит следующим образом

 let nameList= msg.guild.roles.cache.get('role_id').members.map(m=>m.user.tag);
 

Однако в результате он возвращает только одного пользователя в то nameList время как есть 9 пользователей с назначенной им ролью. Что я здесь делаю не так, что приводит ко мне только 1 пользователя, а не остальных 9 пользователей в списке в массиве. Я новичок в discord.js

Ответ №1:

Вашей ошибкой может быть простая путаница с идентификационными номерами. Число в вашем коде отличается от числа в вашем вопросе

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

1. Да, я также думаю, что это может быть так, потому что я протестировал их код на своем собственном сервере, и он отлично работает с моими идентификаторами ролей

2. нет, дело не в том, что я сделал это, чтобы проверить, но это была не эта проблема, которая заставляет меня задуматься. Я все же исправлю это в своем вопросе сейчас. Спасибо

Ответ №2:

Это происходит потому, что участники не кэшируются. Таким образом, вы видите только 1 человека, входящего в систему, потому что в кэше находится только 1 человек. Чтобы исправить это, вы можете извлечь все элементы , выполнив msg.guild.members.fetch() это, а затем использовать msg.guild.roles.cache.get("roleid").members.map(m => m.user.tag) для получения реального результата. Пожалуйста, обратите внимание, что вам понадобится GUILD_MEMBERS намерение, если вы находитесь на v13.

Получение членов гильдии сохранит их в кэше. Поэтому , когда вы это сделаете role.members , вы получите участников, у которых есть эта роль.

Если вы не выберете участников, информация будет неточной. Discord.js хранит пользователей в кэше. Это происходит всякий раз, когда кто-то отправляет сообщение, обновляет свой профиль или что-либо о себе, пока бот находится в Сети. Поэтому, если вы перезагрузите своего бота, в кэше никого не будет.

Почему fetch отличается от кэша?

Fetch получает информацию непосредственно из discord, в то время как кэш проверяет, хранится ли пользователь локально. Когда вы извлекаете участников, они также автоматически сохраняются в кэше.

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

1. Не могли бы вы подробнее рассказать о том, как msg.guild.members.fetch поможет вам получить идентификатор пользователя в следующей строке кода msg.guild ?? Я здесь совсем новичок и не мог понять, как это будет работать? Не могли бы вы показать точную реализацию этого.

2. Получение членов гильдии сохранит их в кэше. Поэтому, когда вы выполняете роль.участники, вы получаете участников, у которых есть эта роль. Если вы не выберете участников, информация будет неточной. Discord.js хранит пользователей в кэше. Это происходит всякий раз, когда кто-то отправляет сообщение, обновляет свой профиль или что-либо о себе, пока бот находится в Сети. Поэтому, если вы перезагрузите своего бота, в кэше никого не будет. Fetch получает информацию непосредственно из discord, в то время как кэш проверяет, хранится ли пользователь локально. Когда вы извлекаете участников, они также автоматически сохраняются в кэше.

3. Большое спасибо, что помогли мне. Я собираюсь отметить это как правильный ответ. Спасибо