Добавление ролей дважды в ответ на вопрос - PullRequest
0 голосов
/ 01 мая 2019

В настоящее время я создаю событие on_raw_reaction_add, в котором, если пользователь добавляет реакцию на сообщение, он назначает ему роль.У меня небольшая проблема: когда пользователь добавляет смайлик if payload.emoji.id !=, он добавляет две роли, а не роль к конкретной реакции.

Это происходит независимо от конкретных идентификаторов смайликов.

Помощь приветствуется.

Вот мой код:

@commands.Cog.listener()
async def on_raw_reaction_add(self, payload):  # Will be dispatched every time a user adds a reaction to a message the bot can se
    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

    if payload.emoji.id != 572943613554720789:
        lol = discord.utils.get(guild.roles, name="LoL")
        lol = discord.Object(559792606364565505)  # Pass the role's ID here
        await member.add_roles(lol, reason='Reaction role')  # Finally add the role to the member

    if payload.emoji.id != 572950778386317323:
        wow = discord.utils.get(guild.roles, name="WoW")
        wow = discord.Object(558650247413235712)  # Pass the role's ID here
        await member.add_roles(wow, reason='Reaction role')  # Finally add the role to the member  

1 Ответ

0 голосов
/ 01 мая 2019

Вот более общий подход. Мы поддерживаем отображение имен реакций на имена ролей, затем всякий раз, когда кто-то реагирует, мы ищем его реакцию в словаре и получаем соответствующую роль:

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') 

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

...