discord.py Как обработать исключение когда у бота не хватает прав
Я хочу сделать команду clear, и если у бота не достаточно прав(manage_messages), то должно выводиться сообщение. Но у меня не получается обработать исключение. Вот код:
#CLEAR - only for premission MANAGE_MESSAGES
@commands.command()
@commands.has_permissions(manage_messages = True)
async def clear(self, ctx, amount: int):
await ctx.channel.purge(limit = amount+1)
await ctx.send(embed = discord.Embed(description = f':white_check_mark: Удалено {amount} сообщений(я)', colour = discord.Colour.green()), delete_after = 5)
@clear.error
async def clear_error(self, ctx, error):
if isinstance(error, commands.errors.MissingPermissions):
await ctx.reply('У тебя нету права управлять сообщениями, чтобы использовать эту команду')
if isinstance(error, commands.errors.MissingRequiredArgument):
await ctx.reply('Хм... А что мне собственно говоря чистить?')
if isinstance(error, commands.errors.BadArgument):
await ctx.reply('Я не в этой системе счисления работаю, дай мне НОРМАЛЬНОЕ число.')
if isinstance(error, commands.errors.Forbidden):
await ctx.reply('К сожалению у меня не достаточно прав для этой команды(')
Вот сама ошибка:
Ignoring exception in on_message
Traceback (most recent call last):
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\iterators.py", line 288, in next
return self.messages.get_nowait()
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\asyncio\queues.py", line 182, in get_nowait
raise QueueEmpty
asyncio.queues.QueueEmpty
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\channel.py", line 377, in purge
msg = await iterator.next()
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\iterators.py", line 290, in next
raise NoMoreItems()
discord.errors.NoMoreItems
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "D:\code\bot\cogs\moderation.py", line 13, in clear
await ctx.channel.purge(limit = amount+1)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\channel.py", line 383, in purge
await strategy(to_delete)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\channel.py", line 301, in delete_messages
await self._state.http.delete_messages(self.id, message_ids)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\http.py", line 248, in request
raise Forbidden(r, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke
await ctx.command.invoke(ctx)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 863, in invoke
await injected(*ctx.args, **ctx.kwargs)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 71, in wrapped
ret = await coro(*args, **kwargs)
File "D:\code\bot\cogs\moderation.py", line 23, in clear_error
if isinstance(error, commands.errors.Forbidden):
AttributeError: module 'discord.ext.commands.errors' has no attribute 'Forbidden'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\client.py", line 343, in _run_event
await coro(*args, **kwargs)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\bot.py", line 979, in on_message
await self.process_commands(message)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\bot.py", line 976, in process_commands
await self.invoke(ctx)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\bot.py", line 943, in invoke
await ctx.command.dispatch_error(ctx, exc)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 422, in dispatch_error
await injected(cog, ctx, error)
File "C:\Users\mp809\AppData\Local\Programs\Python\Python310\lib\site-packages\discord\ext\commands\core.py", line 77, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: module 'discord.ext.commands.errors' has no attribute 'Forbidden'
Ответы (1 шт):
Автор решения: Corrygan
→ Ссылка
У вас в ошибке и сказано, что не хватает прав.
discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
Просто вместо ctx.reply используйте ctx.send
@clear.error
async def clear_error(self, ctx, error):
if isinstance(error, commands.errors.MissingPermissions):
await ctx.send('У тебя нету права управлять сообщениями, чтобы использовать эту команду')
if isinstance(error, commands.errors.MissingRequiredArgument):
await ctx.send('Хм... А что мне собственно говоря чистить?')
if isinstance(error, commands.errors.BadArgument):
await ctx.send('Я не в этой системе счисления работаю, дай мне НОРМАЛЬНОЕ число.')
if isinstance(error, commands.errors.Forbidden):
await ctx.send('К сожалению у меня не достаточно прав для этой команды(')