【问题标题】:if a member gets a specific role I want to add currency however if a member has that role and gets another it gives them the currency again如果成员获得特定角色,我想添加货币但是如果成员具有该角色并获得另一个角色,它将再次给他们货币
【发布时间】:2020-02-29 03:28:34
【问题描述】:

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

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;
        }
    }
});

【问题讨论】:

    标签: javascript discord patreon


    【解决方案1】:

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

    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;
        }
    }
    

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

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

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

    if (newRoles.includes(roleIdB)) {
    

    【讨论】:

    • 我可能应该提到这一点,我使用打字稿,打字稿真的不喜欢那样。当我将其更改为 newRoles.includes 时,我收到一条错误消息,指出类型 'Collection' 上不存在 Property 'includes'。
    • 我尝试绕过 TS 并收到 TypeError 的错误消息:oldMember.roles.includes is not a function
    • 是的,正如我在回答中以粗体提到的那样,您需要先弄清楚如何将roles 转换为数组。如果没有更多关于您正在使用的数据结构类型的知识,我真的无法推荐如何做到这一点。
    • 我想通了!这似乎是一个漫长的过程,但它确实有效。
    【解决方案2】:

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

     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;
                        }
                    }
                }      
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 2020-12-05
      • 2021-06-29
      • 2021-06-16
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      相关资源
      最近更新 更多