我的代码已经运行了好几个星期了,但是一些事件和功能随机停止了工作!
首先,我的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]:成员没有及时到达。
再次,我确定我的语法是正确的,因为它已经运行了一段时间了,并且我最近没有更新任何会影响此代码的内容。
答案 0 :(得分:28)
当涉及到您希望处理的数据量(尤其是大规模数据)时,维护有状态的应用程序可能会很困难。网关意图是一个可以帮助您减轻计算负担的系统。
网关意图使您可以选择要“订阅”的事件,这样就不必在不使用的事件上消耗存储空间。此功能已在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站点手动启用意图。转到applications,选择您的应用,然后在侧栏上找到“机器人”标签。然后,您可以向下滚动直到看到以下内容:
如屏幕截图所示,如果您的机器人超过75个行会,则需要进行验证。
如果您的漫游器已通过验证:
一旦您的漫游器通过了验证,您将无法在开发人员门户中手动翻转意图开关。要请求将白名单访问经过验证的漫游器的其他特权网关意图,请向我们的支持团队发送票证 here ! 确保包括您的机器人ID,要请求的意图,所请求意图的用例的基本描述以及该用例的屏幕截图或视频(如果不是面向用户,则为代码片段!)。 / p>
通过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)(一个位字段) (与意图对应的数字),即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 Developer Portal> Applications>您的应用程序> Bot>检查两个/两个意图(上面的截图)