0
votes

I have made my discord bot give and remove roles on reacting and unreacting. How do I make it so that when the user reacts to a emoji while already having reacted to a different one before, the previous one gets removed? So that the roles won't stack up...?

Here is my code for adding a role:

@commands.Cog.listener()
    async def on_raw_reaction_add(self, payload):
        message_id = payload.message_id
        if message_id == 810784018953666580:
            guild_id = payload.guild_id
            guild = discord.utils.find(lambda g: g.id == guild_id, self.client.guilds)

            if payload.emoji.name == 'grey_B19FF9':
                role = guild.get_role(810471074500182036)
            elif payload.emoji.name == 'skyblue_11A7BB':
                role = guild.get_role(810471062449291296)
            else:
                role = discord.utils.get(guild.roles, name=payload.emoji.name)

            if role is not None:
                member = payload.member
                if member is not None:
                    await member.add_roles(role)
                    print("Done.")
                else:
                    print("Member not found.")
            else:
                print("Role not found")

and this is for removing the role:

@commands.Cog.listener()
    async def on_raw_reaction_remove(self, payload):
        message_id = payload.message_id
        if message_id == 810784018953666580:
            guild_id = payload.guild_id
            guild = discord.utils.find(lambda g: g.id == guild_id, self.client.guilds)

            if payload.emoji.name == 'grey_B19FF9':
                role = guild.get_role(810471074500182036)
            elif payload.emoji.name == 'skyblue_11A7BB':
                role = guild.get_role(810471062449291296)
            else:
                role = discord.utils.get(guild.roles, name=payload.emoji.name)

            if role is not None:
                guild = await self.client.fetch_guild(payload.guild_id)
                member = await guild.fetch_member(payload.user_id)
                if member is not None:
                    await member.remove_roles(role)
                    print("Done.")
                else:
                    print("Member not found.")
            else:
                print("Role not found")

any help would be much appreciated!

1

1 Answers

0
votes

What happens when this code runs ? I think the method remove_roles takes a list of roles so you should turn that role argument into a list before removing, same goes for add_roles

You should also look into member.roles to check the roles of a member, depending on what is inside that list, you should have enough information to be able to remove the role that you don't want