Как можно временно приостановить выполнение асинхронной функции в библиотеке discord.py?

У меня возникла необходимость реализовать отложенную очистку сообщений в асинхронной функции. Ситуация следующая: я отправляю несколько сообщений и затем хочу удалить их все. Параметр 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 он практически такой же. Можете подсказать, как можно решить данную задачу?
  • 3 сентября 2024 г. 19:32
Ответы на вопрос 1
Для решения вашей задачи вам нужно подождать некоторое время после нажатия кнопки, а затем удалить сообщение. Вместо использования `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. После ожидания изначальное сообщение удаляется.

Теперь, при нажатии кнопки, вы сможете удалять нужные сообщения с задержкой, как вы и планировали.
Похожие вопросы