如何检测用户何时收到角色?

时间:2021-07-21 15:38:41

标签: discord.js

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

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

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

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

2 个答案:

答案 0 :(得分:1)

这很简单,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 意图

答案 1 :(得分: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