Назначить роль discord, когда пользователь реагирует на сообщение в определенном канале

#python #python-3.x #discord #discord.py

#python #python-3.x #Discord #discord.py

Вопрос:

Я хочу, чтобы пользователю назначалась роль, когда он выбирает определенную реакцию в моем канале discord с приветствиями и ролями. Я искал везде и не могу найти код на python, который работает с самой последней версией discord.py . Вот что у меня есть до сих пор:

 import discord

client = discord.Client()

TOKEN = os.getenv('METABOT_DISCORD_TOKEN')


@client.event
async def on_reaction_add(reaction, user):
    role_channel_id = '700895165665247325'
    if reaction.message.channel.id != role_channel_id:
        return
    if str(reaction.emoji) == "<:WarThunder:745425772944162907>":
        await client.add_roles(user, name='War Thunder')


print("Server Running")

client.run(TOKEN)
  

Комментарии:

1. Что не так с программой? Вы получаете ошибки при добавлении реакции или код просто ничего не делает?

2. Я не получаю никаких кодов ошибок, но да, код просто ничего не делает.

Ответ №1:

Использовать on_raw_reaction_add вместо on_reaction_add , As on_reaction_add будет работать, только если сообщение находится в кэше бота, в то время как on_raw_reaction_add будет работать независимо от состояния внутреннего кэша сообщений.

Все идентификаторы, идентификаторы ролей, идентификаторы каналов, идентификаторы сообщений …, являются целыми числами, а не строкой, поэтому ваш код не работает, поскольку он сравнивает INT с STR.

Также вам нужно получить роль, вы не можете просто передать имя роли

Ниже приведен рабочий код

 @client.event
async def on_raw_reaction_add(payload):
    if payload.channel_id == 123131 and payload.message_id == 12121212: #channel and message IDs should be integer:
        if str(payload.emoji) == "<:WarThunder:745425772944162907>":
            role = discord.utils.get(payload.member.guild.roles, name='War Thunder')
            await payload.member.add_roles(role)
  

Редактировать: для on_raw_reaction_remove

 @client.event
async def on_raw_reaction_remove(payload):
    if payload.channel_id == 123131 and payload.message_id == 12121212: #channel and message IDs should be integer:
        if str(payload.emoji) == "<:WarThunder:745425772944162907>":
            #we can't use payload.member as its not a thing for on_raw_reaction_remove
            guild = bot.get_guild(payload.guild_id)
            member = guild.get_member(payload.user_id)
            role = discord.utils.get(guild.roles, name='War Thunder')
            await member.add_roles(role)
  

Комментарии:

1. Понял. Теперь, чтобы удалить роль при удалении реакции, разве мне не нужно просто использовать on_raw_reaction_remove? Тем не менее, этот код не работает: py async def on_raw_reaction_remove(payload): # channel and message IDs should be integer: if payload.channel_id == 700895165665247325 and payload.message_id == 756577133165543555: if str(payload.emoji) != "<:WarThunder:745425772944162907>": role = discord.utils.get(payload.member.guild.roles, name='War Thunder') await payload.member.remove_roles(role)

2. Я получаю эту ошибку при удалении моей реакции на сообщение: line 25, in on_raw_reaction_remove guild = bot.get_guild(payload.guild_id) AttributeError: module 'discord.ext.commands.bot' has no attribute 'get_guild'