Изменение состояния бота по истечению времени
Есть бот, который имитирует автомат, при отправке сигнала запуска пользователь должен отправить потдверждающий сигнал в течении определенного промежутка времени, иначе бот должен ответить, что подтверждение не получено.
То есть, мы отправляет боту сигнал 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, 'Молодец что вы успели нажать')