Вот более общий подход. Мы поддерживаем отображение имен реакций на имена ролей, затем всякий раз, когда кто-то реагирует, мы ищем его реакцию в словаре и получаем соответствующую роль:
emoji_role_map = {
"1\N{COMBINING ENCLOSING KEYCAP}": "LoL", # This is the default :one:
"my_custom_emoji": "WoW"
}
@commands.Cog.listener()
async def on_raw_reaction_add(self, payload):
botroom = self.bot.get_channel(572943295039406101)
if not payload.guild_id:
# In this case, the reaction was added in a DM channel with the bot
return
if payload.message_id != 573104280299372556: # ID of the message you want reactions added to.
return
guild = self.bot.get_guild(payload.guild_id) # You need the guild to get the member who reacted
member = guild.get_member(payload.user_id) # Now you have the key part, the member who should receive the role
role_name = emoji_role_map.get(payload.emoji.name)
if role_name: # None if not found
role = discord.utils.get(guild.roles, name=role)
await member.add_roles(role, reason='Reaction role')
У этого есть несколько преимуществ: вы можете загрузить эту карту из любого места, чтобы вы могли отделить логику предоставления ролей от реальных смайликов и ролей, теперь вы можете настроить ее на нескольких серверах, и она будет работать до тех пор, пока имена совпадают, и теперь вы можете использовать смайлики по умолчанию для получения ролей, которые вы не могли использовать в своей системе.