Например:
Бот спросил ваше имя и будет ждать ответа на вопрос 60 секунд, если ответа нет он прощается, если ответ есть удаляет задачу.
Изначально я реализовал это через Asyncio -> create_task, если ответ получен завершаю задачу.
Мой код:
async def cancel_wait(task_id):
for task in asyncio.all_tasks():
if task.get_name() == task_id:
task.cancel()
# Ранее я запустил задачу так
@dp.message_handler(commands=['start'])
async def start_bot(message: types.Message, state: FSMContext):
await User.name.set()
asyncio.create_task(wait_message(message, state), name=message.from_user.id)
await message.answer(text="Привет")
# callback
async def wait_message(message: types.Message, state: FSMContext):
await asyncio.sleep(60)
await state.finish()
await message.answer("Жаль, что ты так и не ответил...")
Но я не уверен что это правильная реализация, к тому же если бота перезапустить то все таски сбросятся...