【问题标题】:How to detect when user receives a role?如何检测用户何时收到角色?
【发布时间】:2021-09-29 00:09:28
【问题描述】:

我今天早上刚开始尝试学习如何编写我的第一个 Discord 机器人,所以我对 discord.js 非常缺乏经验,但我熟悉 JavaScript。但是,我已经搜索了几个小时,试图找到一种方法来在我的服务器中的用户接收或失去角色时调用函数。

在我的服务器中,我添加了 Patreon 机器人,它为成为赞助人的用户分配角色。我想创建一个自定义机器人,当用户收到赞助人角色时,它会在我的常规频道中发布“万岁用户名”。

我找不到任何示例来说明如何检测用户何时获得或失去角色。是否可以简单地使用事件来做到这一点?或者我是否可能需要定期迭代所有用户并在检查更改时维护他们当前角色的列表?

抱歉,我的问题不包含任何代码或示例,但我没有取得任何进展,我正在向 SO 社区寻求指导。

【问题讨论】:

    标签: discord.js


    【解决方案1】:

    您想使用事件guildMemberUpdate

    您可以将 oldMember 状态与 newMember 状态进行比较,看看哪些角色发生了变化。

    这不是最优雅的解决方案,但可以完成工作。

    client.on('guildMemberUpdate', (oldMember, newMember) => {
        // Roles
        const oldRoles = oldMember.roles.cache,
              newRoles = newMember.roles.cache;
    
        // Has Role?
        const oldHas = oldRoles.has('role-id'),
              newHas = newRoles.has('role-id');
    
        // Check if removed or added
        if (oldHas && !newHas) {
            // Role has been removed
        } else if (!oldHas && newHas) {
            // Role has been added
        }
    });
    

    https://discord.js.org/#/docs/main/stable/class/Client?scrollTo=e-guildMemberUpdate

    【讨论】:

      【解决方案2】:

      Client#guildMemberUpdate 很简单。这里有一些简单的代码可以帮助你

      (这是我能想到的最短的代码)

      client.on('guildMemberUpdate', async (oldMember, newMember) => {
      if(oldMember.roles.cache.has('patreonRoleId')) return;
      if(newMember.roles.cache.has('patreonRoleId')) {
      //code here to run if member received role
      //Warning: I didn’t test it as I had no time.
      }
      })
      

      要查看删除的角色,只需将逻辑 NOT 运算符 (!) 放在两个 if 语句的前面,如下所示:

      if(!oldMember.roles.cache.has('patreonRoleId'))
      
      if(!newMember.roles.cache.has('patreonRoleId'))
      

      注意:确保您已从开发者门户启用 guildMembers 意图

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 2023-01-08
        • 1970-01-01
        • 2021-08-16
        相关资源
        最近更新 更多