если член получает определенную роль, я хочу добавить валюту, однако если член имеет эту роль и получает другую, он снова дает ему валюту

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

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 ответа

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

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)) {

Разобрался, похоже, долгий путь, но работает.

 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;
                    }
                }
            }      
        }
Другие вопросы по тегам