ciurca
ciurca

Reputation: 13

Discord.py on_raw_reaction_remove member not found (remove role on reaction remove)

I get a member not found error when trying to remove a role on reaction remove (on_raw_reaction_remove).

It works to add the role to the member, but it can't remove the role afterwards.

My guess is that it can't properly get the ID for the member, but I don't really know how to fix it.

@client.event
async def on_raw_reaction_add(payload):
    message_id = payload.message_id
    if message_id == xxxx:  #ID depends on message
        guild_id = payload.guild_id
        guild = discord.utils.find(lambda g : g.id == guild_id, client.guilds)

        if payload.emoji.name == 'xxx':
            role = discord.utils.get(guild.roles, name="xxx")
        elif payload.emoji.name == 'xxxx':
            role = discord.utils.get(guild.roles, name="xxx")
        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.")

@client.event
async def on_raw_reaction_remove(payload):
    message_id = payload.message_id
    if message_id == xxxx:  #ID depends on message
        guild_id = payload.guild_id
        guild = client.get_guild(payload.guild_id)

        if payload.emoji.name == 'wexxed':
            role = discord.utils.get(guild.roles, name="xxxx")
        elif payload.emoji.name == 'xxxx':
            role = discord.utils.get(guild.roles, name="xxx")
        else:
            role = discord.utils.get(guild.roles, name = payload.emoji.name)
        
        if role is not None:
            member = guild.get_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.")
            

Upvotes: 1

Views: 2926

Answers (1)

MrSpaar
MrSpaar

Reputation: 3994

payload.member only works with on_raw_reaction_add(), so, instead of using it, you have to fetch the user:

from discord.utils import get

@client.event
async def on_raw_reaction_remove(payload):
    guild = await client.fetch_guild(payload.guild_id)
    member = get(guild.members, id=payload.user_id)
    (...)

PS: If you have discord.py 1.5.0 and didn't set up your Intents, you should look at this answer, or else, your events won't work right.

Upvotes: 4

Related Questions