Как сделать что бы роль по реакции на сообщения, ставилась игроку который написал запрос а не админу корый поставил реакцию?
у меня есть код для заявок, мне нужно его переделать под то, что бы роль выдавалась не админу который ставит реакцию, а игроку который написал команду до этого
@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 шт):
Как я понял Ваша задача заключается в том, что пользователь отправляет заявку, потом бот ставит ?/? (к примеру). А далее бот ждет, когда админ поставит реакцию на сообщение с заявкой. Если админ одобрил ?, то бот дает пользователю, отправивший заявку, роль или отклоняет заявку.
Чтобы роль добавлялась пользователю, который отправил сообщение, нужно получить этого пользователя. Когда нам в 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)