Авто выдача ролей по эмоджи

Что я дела не так? я нашел статью (https://question-it.com/questions/1160222/discordpy-kak-dat-konkretnuju-rol-pri-dobavlenii-reaktsii-na-konkretnoe-soobschenie)

@client.event
async def on_raw_reaction_add(payload):
    channel = client.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)
    guild = client.get_guild(payload.guild_id)
    reaction = discord.utils.get(message.reactions, emoji=payload.emoji.name)

    # only work if it is the client
    if payload.member.id == client.user.id:
        return

    if payload.message_id == 750089806872314038 and reaction.emoji == '✅':
        role = discord.utils.get(guild.roles, name='ROLE NAME HERE')
        await payload.member.add_roles(role)
        await reaction.remove(payload.member)

но тут написано @client.event а у меня @bot.event мой код выглядит так

@bot.event
async def on_raw_reaction_add(payload):
    channel = bot.get_channel(payload.channel_id)
    message = await channel.fetch_message(payload.message_id)
    guild = bot.get_guild(payload.guild_id)
    reaction = discord.utils.get(message.reactions, emoji=payload.emoji.name)

    # only work if it is the client
    if payload.member.id == bot.user.id:
        return

    if payload.message_id == 877636512682880 and reaction.emoji == '✅ ':
        role = discord.utils.get(guild.roles, name='? drugalek')
        await payload.member.add_roles(role)
        await reaction.remove(payload.member)

но он не работает


Ответы (2 шт):

Автор решения: denisnumb

Для работы с участниками серверов боту нужно выдать намерения (intents)

bot = commands.Bot(command_prefix='!', intents = discord.Intents.all())

В этой строке у вас стоит пробел после эмоджи:

if payload.message_id == 877636512682880 and reaction.emoji == '✅ ':

Этот пробел мешает правильно сравнить значения строк. Правильно не так '✅ ', а так '✅'.


Ну и вполне возможно, что ошибка в id сообщения

if payload.message_id == 877636512682880

У вас точно указан id именно того сообщения, с которого нужно считывать реакцию?


Точно ли здесь указано правильное название роли?

name='? drugalek'

Вместо этого можете взять id роли и получить ее объект так:

roleid = # id роли
role = discord.utils.get(guild.roles, id=roleid)

id объектов discord можно получать нажав правой кнопкой мыши на объект - Копировать ID.

Для этого в настройках нужно включить режим разработчика

→ Ссылка
Автор решения: Jagern Jagern
@bot.event
async def on_raw_reaction_add(payload):
    if payload.channel_id == channel_id:
        member = payload.member
        guild = bot.get_guild(guild_ID)
        emoji=payload.emoji
        if payload.emoji.name == 'emoji':
            role = member.guild.get_role(role_id)
            await member.add_roles(role)

guild_ID-это id сервера

→ Ссылка