#javascript #node.js #discord.js
#javascript #Discord #discord.js
Вопрос:
Мой код работал нормально в течение нескольких недель, но несколько событий и функций случайно перестали работать!
Во-первых, мои guildMemberAdd
, guildMemberRemove
, и guildMemberUpdate
события просто перестали что-либо делать. Никаких ошибок не появляется, и когда я отлаживал свой код, я понял, что событие даже не генерируется, когда выполняется соответствующее действие.
// const client = new Discord.Client();
client.on('guildMemberAdd', (member) => // not triggering!
client.channels.cache.get('channel-id').send(`${member.tag} joined!`); // not sending!
Во-вторых, при попытке получить участника из GuildMemberManager
кэша он всегда возвращает undefined
:
const member = message.guild.members.cache.get(targetID); // undefined
Когда я затем попытался отобразить каждого участника в кэше участников этой гильдии, он показал только меня и моего бота вместо обычных 100 участников.
Затем я попытался получить каждого члена моей гильдии, используя GuildMemberManager.fetch()
:
const members = await message.guild.members.fetch();
Но я получил эту ошибку:
[GUILD_MEMBERS_TIMEOUT]: участники не прибыли вовремя.
Опять же, я уверен, что мой синтаксис правильный, так как он работает отлично некоторое время, и я недавно не обновлял ничего, что могло бы повлиять на этот код.
Ответ №1:
Discord теперь применяет привилегированные намерения
Каковы намерения?
Поддержание приложения с отслеживанием состояния может быть затруднено, когда речь идет о количестве данных, которые вы должны обрабатывать, особенно в масштабе. Gateway Intents — это система, которая поможет вам снизить эту вычислительную нагрузку.
Намерения шлюза позволяют вам выбирать, на какие события вы хотите «подписаться», чтобы вам не приходилось использовать хранилище для событий, которые вы не используете. Эта функция была введена Discord в 2020 году и поддерживалась discord.js в версии v12.
Что такое привилегированные намерения?
Некоторые намерения определяются как «привилегированные» из-за конфиденциального характера данных. Эти намерения:
GUILD_PRESENCES
GUILD_MEMBERS
По состоянию на 27 октября 2020 года эти намерения по умолчанию отключены.
Из-за этого могут возникнуть некоторые проблемы, с которыми вы можете столкнуться
-
GUILD_PRESENCES
- кэши участников и пользователей пусты (или очень близки к этому) при запуске
Guild.memberCount
возвращает количество по состоянию на готовность- Все события, связанные
Presences
с do not trigger (presenceUpdate
) - Некоторые
Presence
данные возвращаютnull
илиundefined
- Все
GuildMembers
они отображаются для бота как автономные. client.login()
время ожидания истекло, если вы указалиfetchAllMembers
параметр в своемClientOptions
-
GUILD_MEMBERS
- кэши участников и пользователей пусты (или очень близки к этому) при запуске
GuildMemberManager.fetch()
иUserManager.fetch()
время ожидания методов истекло- Все события, связанные
GuildMembers
с этим, не запускаются (guildMemberAdd
,guildMemberRemove
,guildMemberUpdate
,guildMemberSpeaking
, иguildMembersChunk
)
Как мне включить намерения?
Через портал разработчиков Discord:
Во-первых, вы должны вручную включить намерения с сайта разработчика Discord. Перейдите в приложения, выберите свое приложение и найдите вкладку «бот» на боковой панели. Затем вы можете прокручивать вниз, пока не увидите это:
Как показано на скриншоте, вашему боту потребуется проверка, если в более чем 75 гильдиях.
Если ваш бот проверен:
Как только ваш бот будет проверен, вы не сможете вручную переключать переключатели намерений на портале разработчика. Чтобы запросить доступ из белого списка к дополнительному привилегированному намерению шлюза для проверенного бота, пожалуйста, отправьте запрос в нашу службу поддержки здесь! Обязательно укажите идентификатор вашего бота, какие намерения вы запрашиваете, базовое описание вашего варианта использования для запрошенного намерения, а также скриншоты или видео этого варианта использования в действии (или фрагменты кода, если не обращены к пользователю!).).
Через discord.js модуль:
Как только вы отметите одно / оба намерения, вам просто нужно включить их через discord.js . discord.js руководство по намерениям подробно объясняет, как это сделать, но я перефразирую его здесь.
Вам не нужно выполнять эти шаги, если вам нужны все намерения.Discord по умолчанию включает все намерения (кроме этих двух, очевидно). Пока вы отметили оба намерения на портале разработчика, вы можете остановиться здесь, если вас не волнует блокировка любых других намерений. Если вы это сделаете, просто помните, что намерения поддерживаются только discord.js v12 , так что вам, возможно, придется обновиться.
Одним из ClientOptions
( ClientOptions
является typedef потенциальных опций для передачи при создании вашего клиента) является ws
(еще один typedef потенциальных опций websocket). Там вы найдете intents
свойство.
intents
принимает a IntentsResolvable
, который может быть строкой или массивом строк намерения (например , 'GUILD_PRESENCES'
. Все доступные намерения), битовое поле (число, соответствующее намерениям), экземпляр Intents
класса.
Примеры:
// using a string
const client = new Discord.Client({ ws: { intents: 'GUILD_PRESENCES' }});
// using an array
const client = new Discord.Client({ ws: { intents: ['GUILD_PRESENCES', 'GUILD_MEMBERS'] }});
// using a bitfield value
const client = new Discord.Client({ ws: { intents: 32509 }));
// using Intents class
const client = new Discord.Client({ ws: { intents: Discord.Intents.PRIVILEDGED }});
const client = new Discord.Client({ ws: { intents: new Discord.Intents(Discord.Intents.ALL) }});
Ресурсы:
- Discord.js Официальное руководство — Gateway Intents
- Документация разработчика Discord — Намерения шлюза
- Часто задаваемые вопросы об обновлении шлюза
- Discord API Github — Проблема 1363 — Привилегированные намерения
- Блог Discord — будущее ботов на Discord
TL; DR
Чтобы устранить эту проблему, перейдите к:
Портал разработчика Discord> Приложения> Ваше приложение> Бот> Проверьте оба / оба намерения (скриншот выше)