Как сделать систему сессий в Aiogram боте?
У меня есть Aiogram бот, и я хочу сделать в нем систему сессий. Вкратце - когда человек пользуется ботом, он нажимает на кнопки и использует команды. В таком случае, активируется сессия, которая живет полчаса.
Главная проблема этой идеи, что я не знаю как реализовать подобное со стороны кода. Нельзя сделать старт сессии с старт-хендлера, ибо пользоваться ботом можно не сразу нажав на кнопку старт.
Есть ли у вас идеи, как сделать "теневой" message/query хэндлер, который будет отслеживать абсолютно все действия пользователя?
Ответы (1 шт):
В aiogram существуют миддлвари, которые срабатывают на какое-то событие(message, callback_query и т.п.).
Они делятся на 2 типа, Внешние и Внутренние. В нашем случае можно использовать внешние миддлвари.
Ниже код, написанный на aiogram v3.1.1:
from typing import Any, Awaitable, Callable, Dict
from aiogram import BaseMiddleware
# Пишем миддлварь
class TestMiddleware(BaseMiddleware):
async def __call__(self, handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], event: TelegramObject, data: Dict[str, Any]) -> Any:
# Здесь записываем нужные нам обработчики
return await handler(event,data) # возвращаем в случае, если хотим чтобы работал дальнейший код.
from aiogram import Dispatcher
dp = Dispatcher() # объявляем диспетчер
dp.message.outer_middleware(TestMiddleware()) # Объявляем для всех хэндлеров message внешний миддлварь
Таким образом можно внутри миддлвари записывать/читать нужные нам данные, например в базе данных время сессии.