Ошибка при добавлении ролей реакции в discord.py

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

Вопрос:

Я пытаюсь добавить роль в реакции, и, похоже, она работает нормально до того момента, когда я пытаюсь назначить или удалить роль, я получаю неопределенную ошибку, и я не знаю, как это отладить

Это мой код:

 # Events
    @self._client.event
    async def on_raw_reaction_add(payload: discord.RawReactionActionEvent):
        if payload.user_id == self._client.user.id:
            return
        await self.on_reaction_add(payload.message_id, payload.user_id,
                                   payload.channel_id, payload.guild_id, payload.emoji)

    @self._client.event
    async def on_raw_reaction_remove(payload: discord.RawReactionActionEvent):
        if payload.user_id == self._client.user.id:
            return
        await self.on_reaction_remove(payload.message_id, payload.user_id,
                                      payload.channel_id, payload.guild_id, payload.emoji)
# Other methods
async def on_reaction_add(self, message_id: int, user_id: int, channel_id: int, server_id: int, emoji: str):
    await self.on_reaction(message_id, user_id, channel_id, server_id, emoji, True)

async def on_reaction_remove(self, message_id: int, user_id: int, channel_id: int, server_id: int, emoji: str):
    await self.on_reaction(message_id, user_id, channel_id, server_id, emoji, False)

async def on_reaction(self, message_id: int, user_id: int, channel_id: int, server_id: int, emoji: str, add: bool):
    result = self._database.find_reaction_role(str(server_id), str(channel_id), str(message_id), emoji)
    print(result)
    if result is not None:
        server = await self._client.fetch_guild(server_id)  # type: discord.Guild

        role = server.get_role(int(result.role_id))  # type: discord.Role

        user = server.get_member(user_id)
        if user is None:
            user = await server.fetch_member(user_id)  # type: discord.Member

        if user is not None and role is not None:
            if add:
                await user.add_roles(role, reason="reaction")
            else:
                await user.remove_roles(role, reason="reaction")
 

В последней строке происходит сбой с этой ошибкой на консоли:

 ERROR: root: on_raw_reaction_add
 

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

1. Я не думаю, что вам следует использовать on_raw_reaction_ и on_reaction_ одновременно, я рекомендую использовать raw для ролей реакции, так как on_reaction_add работает только с кэшированными сообщениями

2. on_reaction-это внутренний метод, вызываемый из on_raw_reaction_add и on_raw_reaction_remove

3. да, но on_reaction_ также является событием, вызываемым при добавлении/удалении реакции, поэтому ошибка может заключаться в том, что оно вызывается дважды, один раз вашим кодом в raw_reaction_ и один раз через событие, но я не уверен

4. это не определено как событие, и оно не печатается дважды, так что я полагаю, что проблема здесь не в этом

Ответ №1:

Возможно, ошибка возникает из-за того, что у вас нет on_reaction_add и всех других функций внутри класса, и, возможно, отсутствует self параметр, это было бы моим предположением

Ответ №2:

Ошибка произошла из-за role = server.get_role(int(result.role_id)) того, что не возвращалась, я исправил ее, пройдя через server.fetch_roles

 @staticmethod
async def fetch_role(server: discord.Guild, role_id: int) -> discord.Role:
    roles = await server.fetch_roles()
    for role in roles:  # type: discord.Role
        if role.id == role_id:
            return role
 

Проблема с журналом заключалась в том, что я переопределял функцию ведения журнала и забыл