M
M
Michalitch2021-12-16 09:18:11
Python
Michalitch, 2021-12-16 09:18:11

Why does not add a role by reaction?

the code
import discord
from discord import utils
import config


class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))

    async def on_raw_reaction_add(self, payload: discord.RawReactionActionEvent):
        if payload.message_id == config.POST_ID:
            channel = self.get_channel(payload.channel_id)  # получаем объект канала
            message = await channel.fetch_message(payload.message_id)  # получаем объект сообщения
            member = utils.get(message.guild.members,
                               id=payload.user_id)  # получаем объект пользователя который поставил реакцию

            try:
                emoji = str(payload.emoji)  # эмоджик который выбрал юзер
                role = utils.get(message.guild.roles, id=config.ROLES[emoji])  # объект выбранной роли (если есть)

                if len([i for i in member.roles if i.id not in config.EXCROLES]) <= config.MAX_ROLES_PER_USER:
                    await member.add_roles(role)
                    print('[SUCCESS] User {0.display_name} has been granted with role {1.name}'.format(member, role))
                else:
                    await message.remove_reaction(payload.emoji, member)
                    print('[ERROR] Too many roles for user {0.display_name}'.format(member))

            except KeyError:
                print('[ERROR] KeyError, no role found for ' + emoji)
            except Exception as e:
                print(repr(e))

    async def on_raw_reaction_remove(self, payload: discord.RawReactionActionEvent):
        channel = self.get_channel(payload.channel_id)  # получаем объект канала
        message = await channel.fetch_message(payload.message_id)  # получаем объект сообщения
        member = utils.get(message.guild.members,
                           id=payload.user_id)  # получаем объект пользователя который поставил реакцию

        try:
            emoji = str(payload.emoji)  # эмоджик который выбрал юзер
            role = utils.get(message.guild.roles, id=config.ROLES[emoji])  # объект выбранной роли (если есть)

            await member.remove_roles(role)
            print('[SUCCESS] Role {1.name} has been remove for user {0.display_name}'.format(member, role))

        except KeyError:
            print('[ERROR] KeyError, no role found for ' + emoji)
        except Exception as e:
            print(repr(e))


# RUN
intents = discord.Intents(messages=True, guilds=True)
intents.reactions = True
intents.members = True
client = MyClient(intents=intents)
client.run('BOT_TOKEN')


61bada209bd42798461780.png

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vindicar, 2021-12-16
@Mikhalitch

Removing a role works, but adding doesn't?
The first thing that catches your eye is that when you delete a role, the ID of the post on which the reaction was set is not checked.
Is the ID set correctly? Like an integer?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question