Как telegram bot понять что ему не ответили и отправить повторное или другое сообщение (aiogram)

У меня есть диалог бота с пользователем. Вопрос 1 -> Любой ответ -> Вопрос 2 -> ... Но если ответ не получен какое-то время, то мне нужно задать его повторно

@dp.message_handler(commands='start')  # Стартовое сообщение
async def get_start(message: types.Message):

    await message.answer("Первый ответ")
    await Question.Q1.set() #Изменение статуса что бы продолжить диалог при любом ответе


@dp.message_handler(state=Question.Q1)  # Второй вопрос
async def get_question_one(message: types.Message, state: FSMContext):

    await message.answer("Понял")
    await message.answer("Ответ второй")
    await Question.Q2.set() 

Но второй вопрос отправится только если пользователь хоть что-то напишет на первый, а мне нужно, что бы второй вопрос отправился и если пользователь бездействует предположим 40 сек.

И еще, если на вопрос не ответили, но пропустить его нельзя, то отправить повторно перефразировав его

Не думаю что супер сложный вопрос, но уже столько времени на это потратил и не нашел, что подумал, может кто-то сталкивался с таким и знает решение ))


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

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

Штош. Импортируем asyncio и сразу после первого вопроса делаем слип на 40 сек, а после проверяем какой сейчас стейт, если всё ещё текущий, то пишем то-то иначе игнор.
Вот код

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State
import asyncio

from data import config

bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


class Question(StatesGroup):
    Q1 = State()
    Q2 = State()


@dp.message_handler(commands='start')
async def get_start(message: types.Message, state: FSMContext):
    await message.answer("Вот такой вот первый вопрос...")
    await Question.Q1.set()

    await asyncio.sleep(40)
    if await state.get_state() == "Question:Q1":
        await message.answer("Что-то ты долго думаешь...\nВот тебе второй вопрос...")


@dp.message_handler(state=Question.Q1)
async def get_question_one(message: types.Message):
    await message.answer("Вот такой вот второй вопрос...")
    await Question.Q2.set()


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Вот пример работы, первый старт это если ждать, второй это если что-то написать.

введите сюда описание изображения

→ Ссылка