Willesp
@Willesp
Пишу ботов для Telegram любой сложности

Как сделать время ожидания ответа на вопрос Aiogram, с использованием State?

Например: Бот спросил ваше имя и будет ждать ответа на вопрос 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("Жаль, что ты так и не ответил...")

Но я не уверен что это правильная реализация, к тому же если бота перезапустить то все таски сбросятся...
  • Вопрос задан
  • 3083 просмотра
Решения вопроса 1
@dp.message_handler(state=Add.test_state)
@dp.message_handler(commands=['start'])
async def start_bot(message: types.Message, state: FSMContext):
    if message.text == '/start':
        await message.answer(text="Отправь мне свое имя")
        await Add.test_state.set() # Ваш state
        await asyncio.sleep(5) # 5 сек спим
        try:
            data = await state.get_data()
            if data['get_name'] == 'true':
                pass
        except KeyError: 
            # Если пользователь не ответил или за это время state завершился, получаем KeyError
            await message.answer(f'Жаль, что ты не ответил')
            await state.finish()
    else:
        await state.update_data(get_name='true')
        await message.answer(f'Твое имя {message.text}')
        # Установите следующие состояние
        # Если вы завершите состояние, то тогда бот ответит  'Жаль, что ты не ответил'


Как отработало
60f69e24ad752236650893.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@SimpleMakc
используйте asyncio.sleep(60) а потом обработайте
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы