Приложение не отвечает "discord.py" py-cord
Сам бот чистит сообщения в канале без проблем, но одновременно пишет "Приложение не отвечает" Ошибок никаких не вылазит.
@bot.slash_command(name='clear', description='Очистить сообщения в канале')
async def clear(ctx, purge: int = 100):
if purge > 100:
embed=discord.Embed(title="Большое число", description="Введите другое", color=0x7020BF)
await ctx.send(embed=embed)
return
if purge < 2:
embed=discord.Embed(title="От 2 до 100", description="Введите другое", color=0x7020BF)
await ctx.send(embed=embed)
return
else:
await ctx.channel.purge(limit = purge)
Ответы (2 шт):
Во-первых, можно сделать так, что сделает код меньше.
@bot.slash_command(name='clear', description='Очистить сообщения в канале')
async def clear(ctx, purge: int = 100):
if purge > 100 or purge < 2:
embed=discord.Embed(title="Неверное использование команды.", description="Введите число от 2 до 100.", color=0x7020BF)
await ctx.send(embed=embed)
return
Во-вторых, пишет "Приложение не отвечает" т.к. вы не отправляете сообщение, а это на сколько я знаю - обязательно.
else:
await ctx.channel.purge(limit = purge)
embed=discord.Embed(title=f"Вы удалили {purge} сообщений", color=0x7020BF)
await ctx.send(embed=embed)
return
Поскольку дискорд обрабатывает команды интерактивно,

необходимо что-то делать с контекстом выполнения команды.
Либо его можно удалить (await ctx.delete()):
@bot.slash_command(name='test_slash_command', description='Удаляет контекст и выводит сообщение "Успешный тест!"')
async def __test(ctx):
await ctx.delete()
await ctx.send('Успешный тест!')
Результат:

Либо отправить ответ сразу (await ctx.respond()):
@bot.slash_command(name='test_slash_command', description='Отвечает "Успешный тест!"')
async def __test(ctx):
await ctx.respond('Успешный тест!')
Результат:

Если не сделать что-то с контекстом, то дискорд не дождавшись ответа от бота, выдаст ошибку. Например, вот такая команда, которая ничего не возвращает, а просто осуществляет вывод в консоль
@bot.slash_command(name='test_slash_command', description='Выполняет print(\'Команда выполнена!\')')
async def __test(ctx):
print('Команда выполнена!')
Действительно выведет сообщение в консоль, но вот обработка команды в дискорде будет выглядеть так:

Выглядит так, будто при выполнении произошла ошибка, но на деле это просто дискорд не получил ответа от бота. Однако это может произойти даже если команда подразумевает ответ. Например, если идут какие-то долгие вычисления, дискорд может просто не дождаться ответа и команда не выполнится. В таких случаях контекст стоит либо удалять, как показано в примере выше, либо использовать метод контекста defer().
Из описания следует, что он нужен как раз для таких ситуаций: "Откладывает ответ на взаимодействие. Обычно это используется, когда взаимодействие подтверждено, а дополнительное действие будет выполнено позже."
import asyncio
. . .
@bot.slash_command(name='test_slash_command', description='Имитирует 5-секундное вычисление и выводит "Команда выполнена!"')
async def __test(ctx):
await ctx.defer()
await asyncio.sleep(5)
await ctx.respond('Команда выполнена!')
Результат:

Разумеется, использовать метод await ctx.defer() имеет смысл только если вы собираетесь что-то отвечать на команду. Если же никакого ответа не подразумевается, то лучше просто удалять контекст. Иначе бот просто бесконечно будет "думать" как на скрине выше.
Вам по аналогии с последним примером, прежде чем выполнять какие-либо действия, необходимо любым, из вышеперечисленных способов, сообщить дискорду, что бот обработал команду.
