если член получает указанную роль c, я хочу добавить валюту, однако, если член имеет эту роль и получает другую, он снова дает ему валюту - PullRequest
0 голосов
/ 29 февраля 2020

То, что я пытаюсь сделать, это дать члену определенное количество валюты, когда он получит определенную c роль. Моя проблема заключается в том, что если у участника одна из указанных c ролей получает другую роль, такую ​​как администратор, которая не является одной из указанных c ролей, он снова получает валюту. Я знаю, что я что-то упускаю, я просто не знаю, что это такое.

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

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Я понял, это похоже на длинный путь, но это работает.

 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;
                    }
                }
            }      
        }
0 голосов
/ 29 февраля 2020

Ваша проблема в том, что каждый раз, когда их роли меняются, вы проверяете, имеют ли они определенную роль c здесь:

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

Вместо того, чтобы рассматривать полные роли участника, diff роли в первую очередь. Т.е. смотреть только на новые роли. Если бы roles был простым массивом, вы могли бы различать их следующим образом:

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

Однако, похоже, что roles на самом деле является более сложной структурой данных, так что вышеперечисленное победило ' t работа! Выясните, есть ли способ превратить roles в массив. Если это так, то используйте вышеуказанный метод, чтобы получить массив только новых ролей, а затем используйте его так:

if (newRoles.includes(roleIdB)) {
...