javascript - 我的 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]:成员没有及时到达。
同样,我确定我的语法是正确的,因为它已经完美运行了一段时间,而且我最近没有更新任何会影响此代码的内容。
解决方案
Discord 现在正在执行特权意图
什么是意图?
当涉及到您希望处理的数据量时,维护有状态的应用程序可能会很困难,尤其是在规模上。网关意图是一个帮助您降低计算负担的系统。
网关意图允许您挑选和选择您选择“订阅”的事件,这样您就不必用尽您不使用的事件的存储空间。此功能在 v12 中被引入 discord.js
什么是特权意图?
由于数据的敏感性,一些意图被定义为“特权”。这些意图是:
GUILD_PRESENCES
GUILD_MEMBERS
截至 10 月 27 日,这些意图已默认关闭。
您可能因此而面临的一些问题
GUILD_PRESENCES
- 启动时成员和用户缓存为空(或非常接近)
Guild.memberCount
返回准备好的计数- 所有涉及的事件
Presences
都不会触发 (presenceUpdate
) - 一些
Presence
数据返回null
或undefined
- 对机器人来说,所有这些都
GuildMembers
显示为离线。 client.login()
如果您fetchAllMembers
在您的ClientOptions
GUILD_MEMBERS
- 启动时成员和用户缓存为空(或非常接近)
GuildMemberManager.fetch()
和UserManager.fetch()
方法超时- 所有涉及的事件
GuildMembers
都不会触发 (guildMemberAdd
,guildMemberRemove
,guildMemberUpdate
,guildMemberSpeaking
, 和guildMembersChunk
)
如何启用意图?
首先,您必须从 Discord Developer 站点手动启用意图。转到应用程序,选择您的应用程序,然后在侧边栏上找到“机器人”选项卡。然后你可以向下滚动直到你看到这个:
如屏幕截图所示,如果超过 75 个公会,您的机器人将需要验证。
如果您的机器人经过验证:
验证您的机器人后,您将无法在 Developer Portal 中手动翻转意图开关。要为经过验证的机器人请求对额外特权网关意图的白名单访问,请在此处向我们的支持团队发送票证!确保包括您的机器人 ID、您请求的意图、所请求意图的用例的基本描述,以及该用例的屏幕截图或视频(或代码片段,如果不是面向用户的话!)。
通过 discord.js 模块:
一旦你选中了一个/两个意图,你只需要通过 discord.js 启用它们。discord.js意图指南彻底解释了如何做到这一点,但我会在这里解释一下。
如果您想要每个意图,则无需执行这些步骤。Discord 默认启用所有意图(显然这两个除外)。只要您在 Developer Portal 中检查了这两个意图,如果您不关心阻止任何其他意图,则可以在此处停止。如果您这样做,请记住仅 discord.js v12+ 支持意图,因此您可能需要升级。
其中一个ClientOptions
(ClientOptions
是创建客户端时要传递的潜在选项的 typedef)是ws
(另一个潜在的 websocket 选项的 typedef)。在那里,您会找到该intents
物业。
intents
接受 a 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 官方指南 - 网关意图
- Discord 开发者文档 - 网关意图
- 网关更新常见问题
- Discord API Github - 问题 1363 - 特权意图
- Discord 博客 - Discord 上机器人的未来
TL;博士
要解决此问题,请访问:
Discord 开发者门户>应用程序> 您的应用程序 > 机器人 > 检查两者/任何一个意图(上面的屏幕截图)
推荐阅读
- excel - Excel VBA 将多个工作簿合并到一张工作表中
- powershell - 如何将下载的 CSV 数据从 Invoke-RestMethod 传输到 Import-CSV?
- database - 如何在postgresql中高效地遍历节点?
- javascript - 在内容安全策略中添加 url
- codeigniter - (CI 4)如何在控制器内重定向?
- google-bigquery - BigQuery:在函数内定义变量
- php - 使用 php mailer 通过 Gmail 发送 - SMTP 错误
- haskell - 证明一个新的单子实例的单子定律(可能的列表)
- javascript - 通过 jquery 将伪元素 CSS 添加到特定 id 也被应用于其他元素
- reactjs - 水平滚动后失去样式