Как сделать что бы роль по реакции на сообщения, ставилась игроку который написал запрос а не админу корый поставил реакцию?

у меня есть код для заявок, мне нужно его переделать под то, что бы роль выдавалась не админу который ставит реакцию, а игроку который написал команду до этого

@client.command()
async def name( ctx, arg ):
await ctx.author.send( 'ваш никнейм ' + '```' + arg + '```' )
await ctx.author.send('Ожидайте пока админы одобрят вашу заявку')
my_channel = client.get_channel( 726560573688381541 )
await my_channel.send( 'Nickname:```' + arg + '```' 'User:' + ctx.author.mention )

@client.command()
async def on_raw_reaction_add(payload):
channel_id = payload.channel_id
if channel_id == 726560573688381541:
guild_id = payload.guild_id
guild = discord.utils.find(lambda g : g.id == guild_id, client.guilds)

if payload.emoji.name == 'added':
role = discord.utils.get(guild.roles, name='принят')
elif payload.emoji.name == 'otmena':
role = discord.utils.get(guild.roles, name='отклонен')
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.") 

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

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

Как я понял Ваша задача заключается в том, что пользователь отправляет заявку, потом бот ставит ?/? (к примеру). А далее бот ждет, когда админ поставит реакцию на сообщение с заявкой. Если админ одобрил ?, то бот дает пользователю, отправивший заявку, роль или отклоняет заявку.

Чтобы роль добавлялась пользователю, который отправил сообщение, нужно получить этого пользователя. Когда нам в on_raw_reaction_add возвращает payload - это объект типа RawReactionActionEvent, то мы можем из payload вытащить id сообщения, на которое поставили реакцию, и это сообщение и есть то самое, которое пользователь отправлял нам. Для этого нам нужен метод TextChannel.fetch_message, но для этого нам нужен объект текстово канала. Для этого нужно вызвать Bot.get_channel, а id канала у нас в payload.

Через цепочку получаем сообщение, а потом получаем автора сообщения, то есть пользователя, но не Админа. Далее как в Вашем коде.

Примерный код:

from discord.ext import commands
import discord as ds

bot = commands.Bot('!')

@bot.command()
async def name(ctx, member: ds.Member):
    await ctx.send(
        f'Ваш никнейм: ```{member.name}```' + \
         'Ожидайте пока Админы одобрят Вашу заявку!'
    )
    channel = bot.get_channel(726560573688381541)
    await channel.send(
        f'Nickname:```{member.name}```'
        f'User: {ctx.author.mention}'
    )

@bot.command()
async def on_raw_reaction_add(payload):
    if payload.user_id == ctx.bot.user.id:
        return

    channel = bot.get_channel(payload.channel_id)
    if channel.id != 726560573688381541:
        return

    guild = bot.get_guild(payload.guild_id)
    if str(payload.emoji) == '?':
        # role = guild.get_role(Вставтье id роли)
        role = ds.utils.get(guild.roles, name='принят')
    elif str(payload.emoji) == '?':
        # role = guild.get_role(Вставтье id роли)
        role = ds.utils.get(guild.roles, name='отклонен')
    else:
        role = ds.utils.get(guild.roles, name=payload.emoji.name)

    if role is None:
        print('Role not found.')
        return

    message = channel.fetch_message(payload.message_id)
    member = message.author
    await member.add_roles(role)

bot.run('Super secret token!', bot=True, reconnect=True)
→ Ссылка