0

我想做的是在成员获得特定角色时给他们一定数量的货币。我的问题是,如果成员具有特定角色之一获得另一个角色,例如管理员,这不是特定角色之一,他们会再次获得货币。我知道我缺少一些东西,我只是不知道它是什么。

client.on("guildMemberUpdate", (oldMember, newMember) => {
    var roleIdB = '660416964195385360';
    var roleIdC = '664340587021074462';
    var roleIdD = '662931802305855489';
    var roleIdE = '662931967272288297';
    var roleIdF = '664296178568921128';
    var patreon = new db.table(`patreon`);
    if (oldMember.displayName != newMember.displayName) {
        let channel = client.channels.find(channel => channel.id === "667588202093215749");
        let embed = new Discord.RichEmbed()
            .setColor([38, 92, 216])
            .setTitle(newMember.user.tag)
            .addField("Before", `${oldMember.displayName}`)
            .addField("After", `${newMember.displayName.toString()}`)
            .setDescription(`${oldMember.displayName}'s Name Changed`)
            .setTimestamp();
        channel.send(embed);
        return;
    }
    let channel = client.channels.find(channel => channel.id === "667588202093215749");
    if (oldMember.roles.size < newMember.roles.size) {
        const embed = new Discord.RichEmbed()
            .setColor([38, 92, 216])
            .setTimestamp()
            .setAuthor('**Role added!**')
            .setThumbnail(newMember.user.displayAvatarURL);
        for (const role of newMember.roles.map(x => x.id)) {
            if (!oldMember.roles.has(role)) {
                embed.addField(`${oldMember.displayName}`, `was given the        ${oldMember.guild.roles.get(role).name} role!`);
            }
        }
        channel.send({
            embed
        });
        if (newMember.roles.size < oldMember.roles.size) {
            const embed = new Discord.RichEmbed()
                .setColor([38, 92, 216])
                .setTimestamp()
                .setAuthor('**Role removed!**')
                .setThumbnail(newMember.user.displayAvatarURL);
            for (const role of oldMember.roles.map(x => x.id)) {
                if (!newMember.roles.has(role)) {
                    embed.addField(`${newMember.displayName}`, `was removed from the ${newMember.guild.roles.get(role).name} role!`);
                }
            }
            channel.send({
                embed
            });
            return;
        }
    }
    if (oldMember.roles.size < newMember.roles.size) {
        if (newMember.roles.has(roleIdB)) {
            patreon.add(newMember.id, 75000);
            return;
        }
        if (newMember.roles.has(roleIdC)) {
            patreon.add(newMember.id, 150000);
            return;
        }
        if (newMember.roles.has(roleIdD)) {
            patreon.add(newMember.id, 325000);
            return;
        }
        if (newMember.roles.has(roleIdE)) {
            patreon.add(newMember.id, 400000);
            return;
        }
        if (newMember.roles.has(roleIdF)) {
            patreon.add(newMember.id, 475000);
            return;
        }
    }
});
4

2 回答 2

0

您的问题是,每次他们的角色发生变化时,您都会在此处检查他们是否具有特定角色:

if (oldMember.roles.size < newMember.roles.size) {
    if (newMember.roles.has(roleIdB)) {
        patreon.add(newMember.id, 75000);
        return;
    }
    if (newMember.roles.has(roleIdC)) {
        patreon.add(newMember.id, 150000);
        return;
    }
    if (newMember.roles.has(roleIdD)) {
        patreon.add(newMember.id, 325000);
        return;
    }
    if (newMember.roles.has(roleIdE)) {
        patreon.add(newMember.id, 400000);
        return;
    }
    if (newMember.roles.has(roleIdF)) {
        patreon.add(newMember.id, 475000);
        return;
    }
}

与其查看成员的全部角色,不如先区分角色。即只看新的角色。如果roles是一个简单的数组,您可以像这样区分它们:

var newRoles = newMember.roles.filter(role => !oldMember.roles.includes(role));

然而看起来这roles实际上是一个更复杂的数据结构,所以仅靠上面是行不通的!弄清楚是否有一种方法可以roles变成一个数组。如果是这样,则使用上述方法获取仅包含新角色的数组,然后像这样使用它:

if (newRoles.includes(roleIdB)) {
于 2020-02-29T03:38:25.150 回答
0

我想通了,它看起来很长,但它有效。

 if (oldMember.roles.size < newMember.roles.size) {   

            for (const role of newMember.roles.map(x => x.id)) {
                if (!oldMember.roles.has(role)) {



                    if(!oldMember.roles.has(roleIdB)&&newMember.roles.has(roleIdB)) {
                        patreon.add(newMember.id, 75000)
                    }else
                    if(!oldMember.roles.has(roleIdC)&&newMember.roles.has(roleIdC)) {
                        patreon.add(newMember.id, 150000)
                    }else
                    if(!oldMember.roles.has(roleIdD)&&newMember.roles.has(roleIdD)) {
                        patreon.add(newMember.id, 325000)
                    }else
                    if(!oldMember.roles.has(roleIdE)&&newMember.roles.has(roleIdE)) {
                        patreon.add(newMember.id, 400000)
                    }else
                    if(!oldMember.roles.has(roleIdF)&&newMember.roles.has(roleIdF)) {
                        patreon.add(newMember.id, 475000)
                            return;
                    }
                }
            }      
        }
于 2020-02-29T06:53:59.073 回答