Изменение состояния бота по истечению времени

Есть бот, который имитирует автомат, при отправке сигнала запуска пользователь должен отправить потдверждающий сигнал в течении определенного промежутка времени, иначе бот должен ответить, что подтверждение не получено.

То есть, мы отправляет боту сигнал 1. В течении 30 секунд мы должны отправить сигнал 2, тогда бот продолжит работу, иначе, бот отправляет нам письмо, что подтверждения не получено и возвращается в изначальное состояние. Не могу найти способ реализовать ожидание.

class dialog(StatesGroup):
    start = State()
    waiting = State()
    stopped = State()
    error = State()


@dp.message_handler(state=dialog.stopped, commands=['1'])
async def start_command(msg: types.Message):
    await dialog.waiting.set()
    await bot.send_message(msg.from_user.id, 'Автомат ожидает подтверждения запуска в течении 30 секунд')
    # как реализовать ожидания получения сигнала в течении 40 секунд - иначе сброс?



Ответы (1 шт):

Автор решения: oleksandrigo

Есть возможность что я накосячил, но вроде вот так

from asyncio import sleep

@dp.message_handler(state=dialog.stopped, commands=['1'])
async def start_command(msg: types.Message):
    await dialog.waiting.set()
    await bot.send_message(msg.from_user.id, 'Автомат ожидает подтверждения запуска в течении 30 секунд')
    await sleep(30)
    async with state.proxy() as data:
        if data["check_2"] is not True:
            await dialog.error.set()
            del data["check_2"]
            await bot.send_message(msg.from_user.id, '30 секунд прошло')


@dp.message_handler(state=dialog.waiting, commands=['2'])
async def check_2(msg: types.Message):
    async with state.proxy() as data:
        data["check_2"] = True
    await bot.send_message(msg.from_user.id, 'Молодец что вы успели нажать')
→ Ссылка