Каким образом можно организовать задержку между выполнением команд в aiogram?

Есть ли альтернативные способы реализации задержки для ожидания команды пользователя в Python с использованием SQL, кроме использования time.sleep()?
  • 6 декабря 2023 г. 14:39
Ответы на вопрос 3
В aiogram, чтобы организовать задержку между выполнением команд, можно использовать метод "sleep" из asyncio:

```
import asyncio
from aiogram import Bot, Dispatcher, types

bot = Bot(token="YOUR_TOKEN")
dp = Dispatcher(bot)

@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    await asyncio.sleep(5)  # задержка в 5 секунд
    await message.answer('Привет!')

async def on_startup(dp):
    await bot.send_message(chat_id='YOUR_CHAT_ID', text='Бот запущен')

if __name__ == '__main__':
    from aiogram import executor

    dp.loop.create_task(on_startup(dp))
    executor.start_polling(dp)
```

Этот код добавляет задержку в 5 секунд перед отправкой ответа на команду /start.

Что касается альтернативных способов реализации задержки с использованием SQL, то обычно в подобных случаях используются sleep функции в базах данных. Но вам следует проверить документацию конкретной базы данных, которую вы используете, чтобы ознакомиться со средствами, доступными в вашей конкретной ситуации.

Кроме того, вы можете использовать асинхронную библиотеку ORM (объектно-реляционное отображение), такую как sqlalchemy, для установления задержки с использованием SQL. Примеры кода для этого варианта зависят от используемой ORM и базы данных, поэтому детали можно найти в соответствующей документации.
За time.sleep надо голову оторвать. Это заблочит всего бота и другие пользователи не смогут его использовать.Правильный вариант - не делать таймер, а делать переменную (для каждого пользователя - и хранить как раз в БД), в которой будет время окончания КД. Ввел пользователь команду - проверили достигнуто ли время окончания КД. Не достигнуто - шлем "команда на перезагрузке". Достигнуто - выполняем команду и заново устанавливаем новое время окончания КД (текущее время +время на кд)
1. за time.sleep() в asyncio бьют ногами2. если тут aiogram, значит рядом есть и redis, создавай в нем ключ с id пользователя с нужным временем жизни, потом пишешь middleware с проверкой на этот ключ, если он есть, то игнорируешь запросы от этого юзера
Похожие вопросы