Этот вопрос закрыт для ответов, так как повторяет вопрос Discord.js как сделать выдачу ролей по реакции?
@negativelrr
Python one love

Как выдавать роль при нажатии на реакцию? Не работает?

Добрый вечер, я пытаюсь сделать что бы при вводе команды отправлялось сообщение и ставилась реакция, а те кто нажимают на реакцию получают роль, но при вводе команды ничего не происходит
Вот сам код)
Заранее спасибо за помощь
@client.command(pass_context=True)
	@commands.has_permissions(administrator=True)
	async def mp(self, ctx, payload):
		emb = discord.Embed(title=f'Праздник вазилина', description='Нажми на реакцию что бы получить роль', colour=discord.Color.purple())

		message = await ctx.send(embed=emb) # Возвращаем сообщение после отправки
		message.add_reaction('✅')
		
		member = utils.get(message.guild.members, id=payload.user_id) 

		emoji = str(payload.emoji) 
		roles = utils.get(message.guild.roles, id=config.ROLE[emoji],)


		await member.add_roles(roles)
		print('[SUCCESS] Пользователь {0.display_name} получил новую роль {1.name}'.format(member, role))

		
		await member.send('test')
  • Вопрос задан
  • 97 просмотров
Ответы на вопрос 1
Ваша команда принимает в качестве аргумента строку "payload". Так как вы пытаетесь получить реакцию в команде - её нужно там ждать.

Либо ловить все реакции на сообщении (сообщениях) созданной командой.

@client.command()  # Прекратите. Насиловать. Труп.
@commands.has_permsissions(administrator=True)
async def mp(ctx):  # self если мы находимся в модуле или подклассе Bot'а
    embed = discord.Embed(title="something here")
    msg = await ctx.send(embed=embed)
    client.react_role_msg = msg  # Что лучше - "monkey patch"'ить объект бота или использовать global - решайте сами. 
    # В идеале - лучше создать модуль (cog/extension) или создать подкласс commands.Bot и использовать его, с объявленной переменной на уровне класса

@client.listen()
async def on_raw_reaction_add(payload):
    if not getattr(client, "react_role_msg", None):  # react_role_msg еще не объявлен у объекта бота
        return
    if payload.message_id != client.react_role_msg.id:  # реакция проставлена на другом сообщении
        return
    if payload.emoji != "\N{WHITE HEAVY CHECK MARK}":  # Реакция не "✅"
        return
    if not payload.member:  # На тот случай если реакция пройдя все проверки выше окажется в личных сообщениях
        return
    await payload.member.add_roles(client.get_guild(398353602260405500).get_role(707803004268002512))
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы