有没有办法让 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 事件区分角色更改和昵称更改,而不是检测其中任何一个?的主要内容,如果未能解决你的问题,请参考以下文章

不和谐机器人记录器

用户玩游戏时的事件处理程序

有没有办法让这个 C# 代码自动覆盖文件?

有没有办法让bmps透明?

有没有办法让 webview 显示 flash 内容?

有没有办法让 setTooltip() 区分大小写