This commit is contained in:
52
src/middlewares/activity.py
Normal file
52
src/middlewares/activity.py
Normal file
@@ -0,0 +1,52 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user