Как 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 шт):
Штош. Импортируем 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)
Вот пример работы, первый старт это если ждать, второй это если что-то написать.
