Files
remnawave-minishop/bot/middlewares/action_logger_middleware.py
T
2025-05-14 08:11:59 +00:00

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 )