None of my discord.js guildmember events are emitting, my user caches are basically empty, and my functions are timing out?
Discord is now enforcing privileged intents
What are intents?
Maintaining a stateful application can be difficult when it comes to the amount of data you're expected to process, especially at scale. Gateway Intents are a system to help you lower that computational burden.
Gateway intents allow you to pick and choose what events you choose to "subscribe" to so that you don't have to use up storage on events you're not using. This feature was introduced to discord.js in v12
What are privileged intents?
Some intents are defined as "Privileged" due to the sensitive nature of the data. Those intents are:
GUILD_PRESENCES
GUILD_MEMBERS
As of October 27th, these intents have been turned off by default.
Some problems you might be facing because of this
GUILD_PRESENCES
- member and user caches are empty (or very close to it) on startup
Guild.memberCount
returns count as of ready- All events involving
Presences
do not trigger (presenceUpdate
) - Some
Presence
data returnsnull
orundefined
- All
GuildMembers
appear to the bot as offline. client.login()
times out if you specified thefetchAllMembers
option in yourClientOptions
GUILD_MEMBERS
- member and user caches are empty (or very close to it) on startup
GuildMemberManager.fetch()
andUserManager.fetch()
methods time out- All events involving
GuildMembers
do not trigger (guildMemberAdd
,guildMemberRemove
,guildMemberUpdate
,guildMemberSpeaking
, andguildMembersChunk
)
How do I enable intents?
Through the Discord Developer Portal:
Firstly, you must manually enable the intents from the Discord Developer site. Go to applications, select your app, and find the "bot" tab on the sidebar. Then you can scroll down until you see this:
As shown in the screenshot, your bot will require verification if in more than 75 guilds.
If your bot is verified:
Once your bot is verified, you won't be able to manually flip the intent switches in the Developer Portal. To request whitelisted access to an additional privileged gateway intent for a verified bot, please send our support team a ticket here!
Make sure to include your bot's ID, which intents you're requesting, a basic description of your use case for the requested intent, and screenshots or video of that use case in action (or code snippets, if not user facing!).
Through the discord.js module:
Once you have either/both intents checked off, you just have to enable them through discord.js. The discord.js intents guide thoroughly explains how to do this, but I will paraphrase it here.
You don't need to go through these steps if you want every intent. Discord enables all intents (except these two, obviously) by default. As long as you checked off both intents in the Developer Portal, you can stop here if you don't care about blocking any other intents. If you do, just remember intents are only supported by discord.js v12+, so you might have to upgrade.
One of the ClientOptions
(ClientOptions
is a typedef of potential options to pass when creating your client) is ws
(yet another typedef of potential websocket options). In there, you'll find the intents
property.
intents
accepts a IntentsResolvable
, which can be a string or an array of strings of an intent(s) (such as 'GUILD_PRESENCES'
. All available intents), a bitfield (a number corresponding to an intent(s)), an instance of the Intents
class.
Examples:
// 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) }});
Resources:
- Discord.js Official Guide - Gateway Intents
- Discord Developer Documentation - Gateway Intents
- Gateway Update FAQ
- Discord API Github - Issue 1363 - Privileged Intents
- Discord Blog - The Future of Bots on Discord
TL;DR
To fix this issue, go to:
Discord Developer Portal > Applications > Your Application > Bot > Check both/either intent(s) (screenshot above)
Everytime I run the discord bot, it says that the number of online members is undefined
Since you are restarting the bot the data is not cached, you firstly need to fetch the members with <Guild>.members.fetch
method.
Else it means you didn't activate intents, refer here.
Example for your case:
await myGuild.members.fetch();
var onlineCount = myGuild.members.cache.filter(member => member.presence?.status != "offline").size;
Related Topics
How to Disable Scrolling Temporarily
JavaScript: Do I Need to Put This.Var For Every Variable in an Object
How to Do String Interpolation in JavaScript
Looping Through Array and Removing Items, Without Breaking For Loop
Accessing the Web Page'S Http Headers in JavaScript
How to Get Image Size (Height & Width) Using JavaScript
Difference Between a Function Call and Function Reference
Client on Node.Js: Uncaught Referenceerror: Require Is Not Defined
How to Update Nested State Properties in React
Benefits of Using 'Object.Create' For Inheritance
Window.Close and Self.Close Do Not Close the Window in Chrome
Is It an Anti-Pattern to Use Async/Await Inside of a New Promise() Constructor
_Proto_ Vs. Prototype in JavaScript
Deleting Array Elements in JavaScript - Delete VS Splice
How to Append Something to an Array
Pretty-Print Json Using JavaScript
Choosing and Activating the Right Controls on an Ajax-Driven Site