""" Middleware для отслеживания активности пользователей """ from typing import Callable, Dict, Any, Awaitable from aiogram import BaseMiddleware from aiogram.types import TelegramObject, Update, Message, CallbackQuery import logging from src.core.database import async_session_maker from src.core.activity_service import ActivityService logger = logging.getLogger(__name__) class ActivityMiddleware(BaseMiddleware): """Middleware для обновления last_activity при каждом взаимодействии""" async def __call__( self, handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], event: TelegramObject, data: Dict[str, Any] ) -> Any: # Получаем telegram_id из события telegram_id = None if isinstance(event, Message): telegram_id = event.from_user.id if event.from_user else None elif isinstance(event, CallbackQuery): telegram_id = event.from_user.id if event.from_user else None elif isinstance(event, Update): if event.message and event.message.from_user: telegram_id = event.message.from_user.id elif event.callback_query and event.callback_query.from_user: telegram_id = event.callback_query.from_user.id # Обновляем активность если есть telegram_id if telegram_id: try: async with async_session_maker() as session: # Обновляем активность await ActivityService.update_user_activity(session, telegram_id) # Проверяем, не был ли пользователь заблокирован за неактивность # Если был - реактивируем await ActivityService.reactivate_user(session, telegram_id) except Exception as e: logger.error(f"Ошибка в ActivityMiddleware для пользователя {telegram_id}: {e}") # Вызываем следующий обработчик return await handler(event, data)