#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. Большое спасибо, что помогли мне. Я собираюсь отметить это как правильный ответ. Спасибо