milharal-dev / nemli-nemlerei-bot

Um bot de discord para criar resumos baseado nas últimas mensagens de um canal
8 stars 1 forks source link

Tratar erro 403 e retornar uma mensagem de erro mais apropriada #43

Closed ryukinix closed 1 month ago

ryukinix commented 1 month ago

Atualmente o bot dev (experimental/pirata), quando usado em canais que não deve ser usado, retorna uma mensagem automática de erro:

image

Isso acontece porque temos um try/except genérico que captura qualquer coisa e manda pra lá esse erro, devemos por outro lado, tratar especialmente esse erro e dar uma mensagem melhor.

O stacktrace da exceção:

> File "/home/lerax/apps/nemli-nemlerei-bot/dev/nemli/commands/utility/summarize.py", line 46, in summarize_command
    messages = await channel.history(limit=message_count).flatten()  # type: ignore
                     │       │             └ 100
                     │       └ <function Messageable.history at 0x70084895f380>
                     └ <TextChannel id=1247560693125877903 name='geral' position=6 nsfw=False news=False category_id=1247560693125877901>

  File "/home/lerax/apps/nemli-nemlerei-bot/dev/.venv/lib/python3.12/site-packages/nextcord/iterators.py", line 114, in flatten
    return [element async for element in self]
                                         └ <nextcord.iterators.HistoryIterator object at 0x700845fc19a0>
  File "/home/lerax/apps/nemli-nemlerei-bot/dev/.venv/lib/python3.12/site-packages/nextcord/iterators.py", line 118, in __anext__
    return await self.next()
                 │    └ <function HistoryIterator.next at 0x700849198680>
                 └ <nextcord.iterators.HistoryIterator object at 0x700845fc19a0>
  File "/home/lerax/apps/nemli-nemlerei-bot/dev/.venv/lib/python3.12/site-packages/nextcord/iterators.py", line 321, in next
    await self.fill_messages()
          │    └ <function HistoryIterator.fill_messages at 0x7008491987c0>
          └ <nextcord.iterators.HistoryIterator object at 0x700845fc19a0>
  File "/home/lerax/apps/nemli-nemlerei-bot/dev/.venv/lib/python3.12/site-packages/nextcord/iterators.py", line 344, in fill_messages
    data = await self._retrieve_messages(self.retrieve)
                 │    │                  │    └ 100
                 │    │                  └ <nextcord.iterators.HistoryIterator object at 0x700845fc19a0>
                 │    └ <bound method HistoryIterator._retrieve_messages_before_strategy of <nextcord.iterators.HistoryIterator object at 0x700845fc1...
                 └ <nextcord.iterators.HistoryIterator object at 0x700845fc19a0>
  File "/home/lerax/apps/nemli-nemlerei-bot/dev/.venv/lib/python3.12/site-packages/nextcord/iterators.py", line 364, in _retrieve_messages_before_strategy
    data: List[MessagePayload] = await self.state.http.logs_from(
          │                            │    │     │    └ <function HTTPClient.logs_from at 0x70084886b560>
          │                            │    │     └ <nextcord.http.HTTPClient object at 0x7008487a5910>
          │                            │    └ <nextcord.state.ConnectionState object at 0x700848626390>
          │                            └ <nextcord.iterators.HistoryIterator object at 0x700845fc19a0>
          └ typing.List
  File "/home/lerax/apps/nemli-nemlerei-bot/dev/.venv/lib/python3.12/site-packages/nextcord/http.py", line 393, in request
    raise Forbidden(response, data)
          │         │         └ {'message': 'Missing Access', 'code': 50001}
          │         └ <ClientResponse(https://discord.com/api/v10/channels/1247560693125877903/messages?limit=100) [403 Forbidden]>
          │           <CIMultiDictPro...
          └ <class 'nextcord.errors.Forbidden'>

nextcord.errors.Forbidden: 403 Forbidden (error code: 50001): Missing Access

Ou seja, capturar a exceção nextcord.error.Forbidden e tratar nessa parte do código: https://github.com/milharal-dev/nemli-nemlerei-bot/blob/master/nemli/commands/utility/summarize.py#L96-L100

Eu queria que a mensagem, quando fosse causada pelo bot experimental, fosse algo como:

Esse bot experimental não pode ser usado nesse canal, é reservado aos desenvolvedores. Tente usar o @Nemli Nemlerei.