我的discord.js公会成员事件均未发出,我的用户缓存基本上为空,我的函数是否超时?

时间:2020-10-27 17:02:31

标签: javascript discord discord.js

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

首先,我的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 个答案:

答案 0 :(得分:28)

?Discord现在正在执行特权意图


什么是意图?

当涉及到您希望处理的数据量(尤其是大规模数据)时,维护有状态的应用程序可能会很困难。网关意图是一个可以帮助您减轻计算负担的系统。

网关意图使您可以选择要“订阅”的事件,这样就不必在不使用的事件上消耗存储空间。此功能已在v12中的discord.js中引入

什么是特权意图?

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

  • GUILD_PRESENCES
  • GUILD_MEMBERS

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

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

  1. GUILD_PRESENCES

    • memberuser缓存在启动时为空(或非常接近)
    • Guild.memberCount返回准备就绪的计数
    • 所有涉及Presences的事件都不会触发(presenceUpdate
    • 某些Presence数据返回nullundefined
    • 所有GuildMembers在漫游器中都显示为脱机状态。
    • 如果您在client.login()中指定了fetchAllMembers选项,则
    • ClientOptions超时
  2. GUILD_MEMBERS

如何启用意图?

通过Discord Developer Portal

首先,您必须从Discord Developer站点手动启用意图。转到applications,选择您的应用,然后在侧栏上找到“机器人”标签。然后,您可以向下滚动直到看到以下内容:

intents

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

如果您的漫游器已通过验证:

一旦您的漫游器通过了验证,您将无法在开发人员门户中手动翻转意图开关。要请求将白名单访问经过验证的漫游器的其他特权网关意图,请向我们的支持团队发送票证 here ! 确保包括您的机器人ID,要请求的意图,所请求意图的用例的基本描述以及该用例的屏幕截图或视频(如果不是面向用户,则为代码片段!)。 / p>

通过discord.js模块:

一旦您选中了两种意图,您只需要通过discord.js启用它们即可。 discord.js intents guide彻底解释了如何执行此操作,但我将在此处解释一下。

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

其中一个ClientOptionsClientOptions是创建客户端时要传递的潜在选项的typedef)是ws(还有另一个潜在的websocket选项的typedef)。在其中,您可以找到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) }});

资源:


TL; DR

要解决此问题,请转到:

Discord Developer Portal> Applications>您的应用程序> Bot>检查两个/两个意图(上面的截图)