94 lines
3.1 KiB
Python
94 lines
3.1 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 ) |