我的discord.js行业协会成员事件没有发出,我的用户缓存基本上是空的,我的函数超时了吗? [英] None of my discord.js guildmember events are emitting, my user caches are basically empty, and my functions are timing out?
问题描述
我的代码几周来一直工作得很好,但有几个事件和函数随机停止工作!
首先,我的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]:成员未及时到达。
同样,我确信我的语法是正确的,因为它已经完美地工作了一段时间,而且我最近没有更新任何会影响此代码的内容。
推荐答案
🤖不一致现在强制实施特权意图
意图是什么?
当涉及到预计要处理的数据量时,维护有状态应用程序可能会很困难,尤其是在规模上。网关意图是帮助您减轻计算负担的系统。网关意图允许您挑选和选择要订阅的事件,这样您就不必耗尽不使用的事件的存储空间。此功能是在V12中的discord.js中引入的
什么是特权意图?
由于数据的敏感性质,某些意图被定义为特权。这些意图是:
GUILD_PRESENCES
GUILD_MEMBERS
自10月27日起,默认情况下已关闭这些意图。
您可能因此而面临的一些问题
GUILD_PRESENCES
- member和user启动时缓存为空(或非常接近)
Guild.memberCount
退货计入就绪- 所有涉及
Presences
的事件不触发(presenceUpdate
) - 某些
Presence
数据返回null
或undefined
- 所有
GuildMembers
对机器人显示为脱机。 client.login()
如果您在ClientOptions
中指定了
fetchAllMembers
选项,则超时GUILD_MEMBERS
- member和user启动时缓存为空(或非常接近)
GuildMemberManager.fetch()
和UserManager.fetch()
方法超时- 所有涉及
GuildMembers
的事件不会触发(guildMemberAdd
、guildMemberRemove
、guildMemberUpdate
、guildMemberSpeaking
和guildMembersChunk
)
如何启用意图?
首先,您必须从Discorde开发人员站点手动启用意图。转到applications,选择您的应用程序,并在侧边栏上找到&bot&。然后您可以向下滚动,直到看到以下内容:如截图所示,如果超过75个公会,您的机器人将需要验证。
如果您的机器人已通过验证:
一旦您的机器人通过验证,您将无法在开发人员门户中手动翻转意图开关。要请求白名单访问经过验证的bot的其他特权网关意图,请向我们的支持团队发送工单here! 确保包括您的机器人ID、您请求的意图、所请求意图的用例的基本描述以及该用例的屏幕截图或视频(如果不是面向用户的,则为代码片段!)。
通过discord.js模块:
一旦您取消了其中一个/两个意图,您只需通过discord.js启用它们。discord.js intents guide详细说明了如何执行此操作,但我将在此处对其进行解释。
如果您想要所有意图,则不需要执行这些步骤。默认情况下,不一致会启用所有意图(显然,这两个意图除外)。只要您在开发人员门户中勾选了这两个意图,如果您不关心阻止任何其他意图,您可以停在这里。如果您这样做了,请记住,意图仅受discord.js V12+支持,因此您可能需要升级。
其中一个ClientOptions
(ClientOptions
是创建客户端时要传递的潜在选项的类型定义)是ws
(另一个潜在WebSocket选项的类型定义)。在那里,您将找到intents
属性。
intents
接受IntentsResolvable
,它可以是一个字符串或一个或多个意图字符串数组(如'GUILD_PRESENCES'
)。All available intents)、位域(与意图对应的数字)、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 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
要解决此问题,请转到:
Discord Developer Portal>;Applications>;您的应用程序>;Bot>;选中两者/任一意图(上面的屏幕截图)
这篇关于我的discord.js行业协会成员事件没有发出,我的用户缓存基本上是空的,我的函数超时了吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!