有没有办法让 guildMemberUpdate 事件区分角色更改和昵称更改,而不是检测其中任何一个?
Posted
技术标签:
【中文标题】有没有办法让 guildMemberUpdate 事件区分角色更改和昵称更改,而不是检测其中任何一个?【英文标题】:Is there any way to make the guildMemberUpdate event distinguish between a Role change and nickname change instead of it detecting anyone of those? 【发布时间】:2021-10-27 11:18:20 【问题描述】:好的,所以我试图让事件 guildMembersUpdate 尝试分别检测角色更改和昵称更改,到目前为止,它会将它们检测为同一件事,例如,当用户角色更改时,它只会检测到它已经进行了某种更改并运行了一个功能,但是即使更改了用户昵称也不是我想要的,所以我如何使事件区分角色更改和昵称更改?
这是供参考的代码
module.exports = new Event("guildMemberUpdate", (oldMember, newMember)=>
let oldRoles = oldMember.roles
let newRoles = newMember.roles
if(oldRoles !== newRoles)
DO ACTION 1 //obvioulsy this is for example
else if(oldMember.nickname !== newMember.nickname)
DO ACTION 2 //obvioulsy this is for example
现在它不关心更改是什么,即使实际更改是昵称,也会执行操作 1,如果我将昵称条件放在第一位,角色条件放在它之后,只会执行昵称条件角色条件
【问题讨论】:
从您的else if
中删除else
。
@Domi 试过不行
提供更多信息:(1)你使用的discord库的链接,(2)解释“什么”不起作用,如果你删除else
另外:rolesA !== rolesB
可能不起作用,因为对象本身是相同的,但是它们的内容不同。
还要确保启用 Guild Members
意图 - 如 here 所述。
【参考方案1】:
确保启用 Guild Members
意图 - 如 here 所述。
不要尝试使用相等比较 (!==
) 检查更改的角色。相反,您可以检查更改后的roles
,如官方api文档here所示:
// Start by declaring a guildMemberUpdate listener
// This code should be placed outside of any other listener callbacks to prevent listener nesting
client.on('guildMemberUpdate', (oldMember, newMember) =>
// If the role(s) are present on the old member object but no longer on the new one (i.e role(s) were removed)
const removedRoles = oldMember.roles.cache.filter(role => !newMember.roles.cache.has(role.id));
// If the role(s) are present on the new member object but are not on the old one (i.e role(s) were added)
const addedRoles = newMember.roles.cache.filter(role => !oldMember.roles.cache.has(role.id));
if (addedRoles.size > 0 || removedRoles.size > 0)
console.log(`roles changed! added roles: $addedRoles.map(r => r.name), removed roles: $removedRoles.map(r => r.name)`);
if(oldMember.nickname !== newMember.nickname)
// ...
);
代码内部
触发事件的相关discord.js
代码为here。
GuildMember
类是 here。
【讨论】:
const removedRoles = oldMember.roles.cache.filter(role => !newMember.roles.cache.has(role.id)); ^ TypeError: Cannot read property 'cache' of undefined
我收到了这个错误
@Zenxy 您使用的是哪个库?哪个版本?
discord.js 库是 13.0.1
我只能猜测发生了什么:有没有机会,当一个新的公会成员加入公会等时会发生这种情况?在这种情况下,我会假设 oldMember
可能不会被填充等。也许你可以调试它(学习使用调试器,这很重要!),并找出究竟是什么值。如果您无法解释它们,然后返回结果的屏幕截图(将它们添加到您的初始问题中)。
所以根据我从您的评论中得到的信息,每当创建新成员(即用户的昵称更改或角色更改)时,都会发生此错误。如果这不是你想要的,你能详细说明一下吗?以上是关于有没有办法让 guildMemberUpdate 事件区分角色更改和昵称更改,而不是检测其中任何一个?的主要内容,如果未能解决你的问题,请参考以下文章