91 lines
3.5 KiB
Python
91 lines
3.5 KiB
Python
import logging
|
|
import json
|
|
from typing import Callable, Dict, Any, Awaitable, Union, Optional
|
|
|
|
from aiogram import BaseMiddleware
|
|
from aiogram.types import Update, Message, CallbackQuery, User
|
|
|
|
from db.database import log_user_action
|
|
from config.settings import Settings
|
|
|
|
|
|
class ActionLoggerMiddleware(BaseMiddleware):
|
|
|
|
def __init__(self, settings: Settings):
|
|
super().__init__()
|
|
self.settings = settings
|
|
|
|
async def __call__(self, handler: Callable[[Update, Dict[str, Any]],
|
|
Awaitable[Any]], event: Update,
|
|
data: Dict[str, Any]) -> Any:
|
|
|
|
event_user: Optional[User] = data.get("event_from_user")
|
|
bot: Optional[Bot] = data.get("bot")
|
|
|
|
user_id: Optional[int] = None
|
|
telegram_username: Optional[str] = None
|
|
telegram_first_name: Optional[str] = None
|
|
event_type: str = event.event_type
|
|
content: Optional[str] = None
|
|
is_admin_event_flag: bool = False
|
|
|
|
if event_user:
|
|
user_id = event_user.id
|
|
telegram_username = event_user.username
|
|
telegram_first_name = event_user.first_name
|
|
if user_id == self.settings.ADMIN_IDS:
|
|
is_admin_event_flag = True
|
|
|
|
raw_update_snippet = None
|
|
try:
|
|
|
|
raw_update_snippet = event.model_dump_json(exclude_none=True,
|
|
indent=None)[:1000]
|
|
except Exception:
|
|
raw_update_snippet = str(event)[:1000]
|
|
|
|
if event.message:
|
|
msg = event.message
|
|
if msg.text:
|
|
content = msg.text
|
|
if msg.text.startswith('/'):
|
|
event_type = "command"
|
|
elif msg.caption:
|
|
content = f"[{msg.content_type}] {msg.caption}"
|
|
else:
|
|
content = f"[{msg.content_type}]"
|
|
|
|
elif event.callback_query:
|
|
cb = event.callback_query
|
|
event_type = "callback_query"
|
|
content = cb.data
|
|
|
|
if user_id and event_type and content:
|
|
try:
|
|
await log_user_action(user_id=user_id,
|
|
telegram_username=telegram_username,
|
|
telegram_first_name=telegram_first_name,
|
|
event_type=event_type,
|
|
content=content[:1000],
|
|
raw_update_preview=raw_update_snippet,
|
|
is_admin_event=is_admin_event_flag)
|
|
except Exception as e_log:
|
|
logging.error(
|
|
f"ActionLoggerMiddleware: Failed to log event for user {user_id}: {e_log}",
|
|
exc_info=True)
|
|
elif user_id and event_type:
|
|
try:
|
|
await log_user_action(user_id=user_id,
|
|
telegram_username=telegram_username,
|
|
telegram_first_name=telegram_first_name,
|
|
event_type=event_type,
|
|
content="N/A",
|
|
raw_update_preview=raw_update_snippet,
|
|
is_admin_event=is_admin_event_flag)
|
|
except Exception as e_log:
|
|
logging.error(
|
|
f"ActionLoggerMiddleware: Failed to log event (no content) for user {user_id}: {e_log}",
|
|
exc_info=True)
|
|
|
|
return await handler(event, data)
|