У меня возникла необходимость реализовать отложенную очистку сообщений в асинхронной функции. Ситуация следующая: я отправляю несколько сообщений и затем хочу удалить их все. Параметр inter.send("Example", delete_after = 20) не подходит в данном случае. Я использую функцию inter.channel.purge(limit = 3). Я попробовал применить asyncio.sleep(10), но это не дало результата.
Первое сообщение содержит кнопки, и если пользователь не нажимает на них в течение 3 минут, сообщение удаляется. Однако мне нужно удалить это сообщение спустя 10 секунд после того, как была нажата кнопка. Я не знаю, как это реализовать, поэтому решил использовать метод с inter.channel.purge(limit = 3).
Вот код функции:
```python
@bot.slash_command(name = "setting", description = "Для настройки голосового канала")
async def Setting_Channel(inter):
view = Set_Channel()
await inter.send("Настройте канал, для дальнейшего присоединения пользователей", view = view, delete_after = 180)
await view.wait()
if view.value == 1:
await inter.send("Starcraft", delete_after = 10)
await inter.channel.purge(limit = 3)
elif view.value == 2:
await inter.send("LoL", delete_after = 10)
elif view.value == 3:
await inter.send("Over", delete_after = 10)
```
Этот код написан на disnake, но в discord.py он практически такой же. Можете подсказать, как можно решить данную задачу?
Для решения вашей задачи вам нужно подождать некоторое время после нажатия кнопки, а затем удалить сообщение. Вместо использования `inter.channel.purge(limit=3)`, вы можете использовать метод удаления конкретных сообщений с помощью `message.delete()`. Это позволит вам точно контролировать, какое сообщение удалять и когда.
Вот пример, как это можно реализовать:
```python
@bot.slash_command(name="setting", description="Для настройки голосового канала")
async def Setting_Channel(inter):
view = Set_Channel()
# Отправляем начальное сообщение с кнопками
initial_message = await inter.send("Настройте канал, для дальнейшего присоединения пользователей", view=view, delete_after=180)
await view.wait()
# В зависимости от нажатой кнопки выполняем действия
if view.value in [1, 2, 3]:
channel_message = ""
# Определяем текст сообщения
if view.value == 1:
channel_message = "Starcraft"
elif view.value == 2:
channel_message = "LoL"
elif view.value == 3:
channel_message = "Over"
# Отправляем сообщение, а затем ждем 10 секунд перед его удалением
new_message = await inter.send(channel_message, delete_after=10)
# Ждем 10 секунд
await asyncio.sleep(10)
# Удаляем изначальное сообщение (через 10 секунд после нажатия на кнопку)
await initial_message.delete()
# Здесь вы можете также удалить новое сообщение, если это необходимо
# await new_message.delete() # Если хотите удалить новое сообщение
```
### Что происходит в этом коде:
1. Основное сообщение отправляется с кнопками и ожидает нажатия.
2. После нажатия кнопки в зависимости от значения `view.value` создается текст сообщения.
3. Новое сообщение отправляется в канал.
4. С помощью `await asyncio.sleep(10)` приостанавливается выполнение функции на 10 секунд.
5. После ожидания изначальное сообщение удаляется.
Теперь, при нажатии кнопки, вы сможете удалять нужные сообщения с задержкой, как вы и планировали.