S
S
Soneiko2020-12-05 15:28:13
Python
Soneiko, 2020-12-05 15:28:13

Auto-assignment not working?

The problem is that adding a role on click works.

@commands.Cog.listener()
    async def on_raw_reaction_add(self, payload):
        if payload.message_id == list.GAMEPOST_ID:
            channel = self.client.get_channel(payload.channel_id) # получаем объект канала
            guild = await self.client.fetch_guild(payload.guild_id)
            emoji = str(payload.emoji)
            role = discord.utils.get(guild.roles, id = list.GAMEROLES[emoji])
            await payload.member.add_roles(role)
            print('[ROLE] User {0.display_name} has been granted with role {1.name}'.format(payload.member, role))


And with almost identical code, deleting a role causes an error
@commands.Cog.listener()
    async def on_raw_reaction_remove(self, payload):
        if payload.message_id == list.GAMEPOST_ID:
            channel = self.client.get_channel(payload.channel_id) # получаем объект канала
            guild = await self.client.fetch_guild(payload.guild_id)
            emoji = str(payload.emoji)
            role = discord.utils.get(guild.roles, id = list.GAMEROLES[emoji])
            await payload.member.remove_roles(role)
            print('[ROLE] Role {1.name} has been remove for user {0.display_name}'.format(payload.member, role))


And here is the actual error
spoiler

Ignoring exception in on_raw_reaction_remove
Traceback (most recent call last):
File "D:\Programs\Python 3.9.2\lib\site-packages\discord\client.py", line 333, in _run_event
await coro(*args, **kwargs)
File "d:\Warden\Project\Python\client\cogs\roles.py", line 90, in on_raw_reaction_remove
await payload.member.remove_roles(role)
AttributeError: 'NoneType' object has no attribute 'remove_roles'

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
Maxim Nevzorov, 2020-12-05
@Soneiko

memberThe y attribute RawReactionActionEventis only populated when a reaction is added: https://discordpy.readthedocs.io/en/stable/api.htm...
8UBq1A8.png
You can use the fetch_memberand functions get_memberto get members by ID:

@commands.Cog.listener()
    async def on_raw_reaction_remove(self, payload):
        if not (guild := self.client.get_guild(payload.guild_id)):
            # Удаление реакции произошло вне сервера
            return
        if not (member := guild.get_member(payload.user_id)):
            # Реакция удалена, но её автора во время удаления не было на сервере
            return 
        if payload.message_id == list.GAMEPOST_ID:
            channel = self.client.get_channel(payload.channel_id) # получаем объект канала
            emoji = str(payload.emoji)
            role = guild.get_role(list.GAMEROLES[emoji])
            await member.remove_roles(role)
            print('[ROLE] Role {1.name} has been remove for user {0.display_name}'.format(member, role))

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question