Ни одно из моих discord.js происходят события членов гильдии, мои пользовательские кэши в основном пусты, а время ожидания моих функций истекло?

#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 года эти намерения по умолчанию отключены.

Из-за этого могут возникнуть некоторые проблемы, с которыми вы можете столкнуться

  1. GUILD_PRESENCES

    • кэши участников и пользователей пусты (или очень близки к этому) при запуске
    • Guild.memberCount возвращает количество по состоянию на готовность
    • Все события, связанные Presences с do not trigger ( presenceUpdate )
    • Некоторые Presence данные возвращают null или undefined
    • Все GuildMembers они отображаются для бота как автономные.
    • client.login() время ожидания истекло, если вы указали fetchAllMembers параметр в своем ClientOptions
  2. GUILD_MEMBERS

Как мне включить намерения?

Через портал разработчиков 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) }});
  

Ресурсы:


TL; DR

Чтобы устранить эту проблему, перейдите к:

Портал разработчика Discord> Приложения> Ваше приложение> Бот> Проверьте оба / оба намерения (скриншот выше)