0

What I am trying to do is give a member a set amount of currency when they get a specific role. My problem is if a member has one of the specific roles gets another role like admin, which is not one of the specific roles, they get the currency again. I know there is something I am missing, I just don't know what it is.

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;
        }
    }
});
mudeki
  • 33
  • 5

2 Answers2

0

Your issue is that every time their roles change, you are checking to see if they have a specific role here:

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

Instead of looking at the entirety of the member's roles, diff the roles first. I.e. only look at roles that are new. If roles were a simple array, you could diff them like so:

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

However it appears that roles is in fact a more complex data structure, so the above alone won't work! Figure out if there is a way you can turn roles into an array. If so, then use the above method to get an array of just the new roles, and then use it like so:

if (newRoles.includes(roleIdB)) {
  • I probably should have mentioned this, I use typescript and typescript really doesn't like that. When I change it to newRoles.includes I get an error message of Property 'includes' does not exist on type 'Collection'. – mudeki Feb 29 '20 at 04:08
  • I tried bypassing TS and I got an error message of TypeError: oldMember.roles.includes is not a function – mudeki Feb 29 '20 at 04:10
  • Yeah so, as I mentioned in bold in my answer, you will need to figure out how to transform `roles` to an array first. Without more knowledge about what type of data structures you are working with, I can't really recommend how to do that. – JoshuaCWebDeveloper Feb 29 '20 at 04:15
  • 1
    I figured it out! This seems like the long way around but it does work. – mudeki Feb 29 '20 at 06:50
0

I figured it out, it looks like the long way but it works.

 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;
                    }
                }
            }      
        }
mudeki
  • 33
  • 5