53 lines
2.3 KiB
Python
53 lines
2.3 KiB
Python
"""
|
|
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)
|