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

IT技术 javascript discord discord.js
2021-01-14 04:18:42

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

首先, my guildMemberAdd, guildMemberRemove, 和guildMemberUpdateevents 只是停止了任何操作。没有出现错误,当我调试我的代码时,我意识到在发生相应的操作时甚至没有发出事件。

// 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 Intents 是一个帮助您降低计算负担的系统。

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

什么是特权意图?

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

  • GUILD_PRESENCES
  • GUILD_MEMBERS

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

您可能因此而面临的一些问题

  1. GUILD_PRESENCES

    • 成员用户缓存在启动时为空(或非常接近)
    • Guild.memberCount 返回计数为准备好
    • 所有涉及的事件Presences都不会触发 ( presenceUpdate)
    • 一些Presence数据返回nullundefined
    • GuildMembers对机器人而言,所有这些都显示为离线。
    • client.login()如果您fetchAllMembersClientOptions
  2. GUILD_MEMBERS

如何启用意图?

通过Discord 开发者门户

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

意图

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

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

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

通过 discord.js module:

一旦你勾选了其中一个/两个意图,你只需要通过 discord.js 启用它们。discord.js意图指南详细地介绍了如何做到这一点,但我会在这里意译。

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

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

intents接受一个IntentsResolvable,它可以是一个字符串或一个意图的字符串数组(例如'GUILD_PRESENCES'所有可用的意图),一个位域(一个与意图相对应的数字),一个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; 博士

要解决此问题,请访问:

Discord 开发者门户>应用程序> 您的应用程序 > Bot > 检查两者/任一意图(上面的屏幕截图)