python, aiogram. Есть ли метод, который улавливает, присылал ли пользователь сообщения после срабатывания функции?

Рейтинг: 0Ответов: 1Опубликовано: 20.07.2023

Бот отправляет пользователю inline клавиатуру с url, после чего пользователь может либо перейти по ссылке и прочитать статью, а во время её чтения бот пришлёт пользователю определённое сообщение и клавиатуру, либо продолжать беспрепятственно пользоваться ботом дальше, возвращаться в главное меню, вызывать другие кнопки, переходить в профиль и так далее. Условием, отправлять сообщение с клавиатурой или нет для бота как раз таки и выступает бездействие пользователя на протяжении 4 минут. Вот часть кода:

from keyboards.kb_articles import create_btn
from aiogram import types, Dispatcher
from asyncio import sleep


async def output_of_articles(message: types.Message):
    markup = await create_btn(message)
    await message.answer("Выбирай, что хочешь узнать в первую очередь:", reply_markup=markup)
    await sleep(240)
    if  # тут должно быть условие, которое проверяет, продолжил ли пользователь пользоваться 
# ботом, или читает статью
        await message.answer("Вы прочитали статью?")  #,reply_markup=клавиатура с дальнейшими 
# действиями в случае бездействия пользователя)

Я уже пробовал делать через FSM, но получается очень криво. Вылезает множество проблем если пользователь захочет просто дальше пользоваться ботом.

Chat GPT выдает решение через несуществующий "if not message.is_handled()" Конструкция if not message.is_handled() проверяет, были ли обработаны какие-то сообщения после.

Решение мне по сути подходило бы, если бы существовало, есть ли что-то похожее или как это можно обыграть по-другому?

Ответы

▲ 0

У меня была задача: в группе пользователь пишет вопрос, если в течении минуты на этот запрос не отвечают (reply message), отправляется уведомление в дискорд канал. Какой бы вариант предложил я:

@router.message() # фильтр
async def output_of_articles(message: types.Message, state: FSMContext):
markup = await create_btn(message)
await message.answer("Выбирай, что хочешь узнать в первую очередь:", reply_markup=markup)
await state.update_data(reply_status=False)
await sleep(240)
data = await state.get_data()
reply_status = data['reply_status']
if not reply_status:
await message.answer("Вы прочитали статью?")

Далее используем хендлер с фильтром который будет отлавливать действия пользователя(нажатие кнопки, сообщение и т.д. и менять reply_status)