feat: Implement new bot architecture including handlers, services, analysis modules, and comprehensive tests.
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from time import perf_counter
|
||||
from typing import Any
|
||||
|
||||
from loguru import logger
|
||||
|
||||
|
||||
def _safe_attr(obj: Any, attr: str, default: Any = None) -> Any:
|
||||
try:
|
||||
return getattr(obj, attr, default)
|
||||
except Exception:
|
||||
return default
|
||||
|
||||
|
||||
class CommandTrace:
|
||||
"""Small helper for structured command logs."""
|
||||
|
||||
def __init__(self, command: str, message: Any):
|
||||
self.command = command
|
||||
self.user_id = _safe_attr(_safe_attr(message, "from_user"), "id", "unknown")
|
||||
self.chat_id = _safe_attr(_safe_attr(message, "chat"), "id", "unknown")
|
||||
self.start = perf_counter()
|
||||
self.status = "ok"
|
||||
self.note = ""
|
||||
|
||||
def set_status(self, status: str, note: str = "") -> None:
|
||||
self.status = status
|
||||
self.note = note
|
||||
|
||||
def emit(self) -> None:
|
||||
elapsed_ms = (perf_counter() - self.start) * 1000.0
|
||||
note_part = f" note={self.note}" if self.note else ""
|
||||
logger.info(
|
||||
"bot command command={} status={} user_id={} chat_id={} elapsed_ms={:.1f}{}",
|
||||
self.command,
|
||||
self.status,
|
||||
self.user_id,
|
||||
self.chat_id,
|
||||
elapsed_ms,
|
||||
note_part,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user