我的discord.js服务器成员事件都没有触发,我的用户缓存基本上是空的,而且我的函数超时了?

26

我的代码已经运作很好几周了,但有些事件和函数突然间停止工作了!

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

62

Discord现在正在执行特权意图


什么是意图?

在处理大量数据时,尤其是在规模上,维护状态应用程序可能会很困难。网关意图是一个系统,可以帮助您降低计算负担。

网关意图允许您挑选并选择要“订阅”的事件,以便您不必使用未使用的事件来占用存储空间。此功能由Discord在2020年引入,并在discord.js v12中得到支持。

什么是特权意图?

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

  • GUILD_PRESENCES
  • GUILD_MEMBERS

截至2020年10月27日,默认情况下已关闭这些意图。

由此可能导致的一些问题

  1. GUILD_PRESENCES

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

如何启用意图?

通过Discord开发者门户

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

intents

如屏幕截图所示,如果您的机器人在超过75个服务器中,则需要进行验证。
如果您的机器人已经通过验证:
一旦您的机器人通过验证,您将无法在开发者门户手动翻转意图开关。要请求为已验证的机器人获得额外特权网关意图的白名单访问权限,请发送支持团队一个票证here!请确保包括您的机器人ID,您正在请求的意图,所请求意图用例的基本描述以及该用例的屏幕截图或视频(或代码片段,如果不是用户界面)。
通过discord.js模块:
一旦您勾选了任一/两个意图,您只需通过discord.js启用它们即可。 discord.js意图指南 全面解释了如何执行此操作,但我会在这里简述一下。
如果您想要每个意图,则无需执行以下步骤。 Discord默认启用所有意图(除了这两个,显然)。只要您在开发者门户中勾选了这两个意图,如果您不关心阻止其他意图,您可以在此处停止。如果您关心,请记住,意图仅受discord.js v12+支持,因此您可能需要升级。
其中之一 ClientOptionsClientOptions是在创建客户端时传递的潜在选项的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) }});

资源:


简述

要解决这个问题,请前往:

Discord开发者门户 > 应用程序 > 您的应用程序 > 机器人 > 检查两个/任一意图(如上图所示)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接