我的 discord.js 公会成员事件都没有发出,我的用户缓存基本上是空的,我的函数超时了?

Posted

技术标签:

【中文标题】我的 discord.js 公会成员事件都没有发出,我的用户缓存基本上是空的,我的函数超时了?【英文标题】:None of my discord.js guildmember events are emitting, my user caches are basically empty, and my functions are timing out? 【发布时间】:2022-01-20 01:30:59 【问题描述】:

我的代码已经运行好几个星期了,但是一些事件和函数随机停止工作!

首先,我的guildMemberAddguildMemberRemoveguildMemberUpdate 事件只是停止做任何事情。没有出现任何错误,当我调试我的代码时,我意识到发生相应操作时甚至没有发出事件。

// 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 Intent 是一个帮助您减轻计算负担的系统。

网关 Intent 允许您选择要“订阅”的事件,这样您就不必为不使用的事件耗尽存储空间。此功能在 v12 中被引入 discord.js

什么是特权意图?

由于数据的敏感性,某些意图被定义为“特权”。这些意图是:

GUILD_PRESENCES GUILD_MEMBERS

截至 10 月 27 日,这些意图已默认关闭。

因此您可能会遇到一些问题

    GUILD_PRESENCES

    member 和 user 缓存在启动时为空(或非常接近) Guild.memberCount 返回准备就绪时的计数 涉及Presences 的所有事件都不会触发 (presenceUpdate) 一些Presence 数据返回nullundefined 所有GuildMembers 在机器人看来都是离线的。 如果您在 ClientOptions 中指定了 fetchAllMembers 选项,client.login() 将超时

    GUILD_MEMBERS

    member 和 user 缓存在启动时为空(或非常接近) GuildMemberManager.fetch()UserManager.fetch() 方法超时 涉及GuildMembers 的所有事件都不会触发(guildMemberAddguildMemberRemoveguildMemberUpdateguildMemberSpeakingguildMembersChunk

如何启用意图?

通过Discord Developer Portal:

首先,您必须从 Discord 开发者网站手动启用意图。转到applications,选择您的应用程序,然后在侧边栏上找到“机器人”选项卡。然后你可以向下滚动直到你看到这个:

如屏幕截图所示,如果您的机器人在超过 75 个公会中,则需要验证。

如果您的机器人已通过验证:

验证您的机器人后,您将无法在 Developer Portal 中手动翻转意图开关。要为经过验证的机器人请求对额外特权网关意图的白名单访问,请向我们的支持团队发送工单here! 确保包含您的机器人 ID、您请求的意图、所请求意图的用例的基本描述,以及该用例的屏幕截图或视频(或代码 sn-ps,如果不是面向用户的话!) .

通过 discord.js 模块:

一旦您选中了一个/两个意图,您只需通过 discord.js 启用它们。 discord.js intents guide 详尽地解释了如何做到这一点,但我将在这里解释一下。

如果您想要每个意图,则无需执行这些步骤。默认情况下,Discord 会启用所有意图(显然这两个除外)。只要您在 Developer Portal 中检查了这两个意图,如果您不关心阻止任何其他意图,则可以在此处停止。如果您这样做,请记住仅 discord.js v12+ 支持意图,因此您可能需要升级。

ClientOptions 之一(ClientOptions 是创建客户端时要传递的潜在选项的 typedef)是 ws(又一个潜在 websocket 选项的 typedef)。在那里,您会找到 intents 属性。

intents 接受一个IntentsResolvable,它可以是一个字符串或一个意图的字符串数组(例如'GUILD_PRESENCES'.All available intents),一个位域(一个对应于一个意图的数字( s)),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 > 你的应用程序 > 机器人 > 检查两个/任何一个意图(上面的屏幕截图)

【讨论】:

以上是关于我的 discord.js 公会成员事件都没有发出,我的用户缓存基本上是空的,我的函数超时了?的主要内容,如果未能解决你的问题,请参考以下文章

我的 discord.js 公会成员事件都没有发出,我的用户缓存基本上是空的,我的函数超时了?

我的 discord.js 公会成员事件都没有发出,我的用户缓存基本上是空的,我的函数超时了?

我的 discord.js 公会成员事件都没有发出,我的用户缓存基本上是空的,我的函数超时了?

Discord.js 如何感知公会成员何时更改活动

Discord.js 让所有成员陷入公会问题

如何获取大型公会 discord.js 的所有成员