bot/models/analytics.py
2026-08-30 13:04:57 +00:00

51 lines
1.7 KiB
Python

import datetime
import html
import json
from typing import Any
from .user import User
class Analytics:
def __init__(self):
self.issued_at = datetime.datetime.now()
self.users = 0
self.groups: dict[str, int] = {}
def add(self, user: User) -> None:
self.users += 1
if not user.active_target or user.active_target["kind"] != "group":
return
group = user.active_target["name"]
self.groups[group] = self.groups.get(group, 0) + 1
def toDict(self) -> dict[str, Any]:
return {
"version": 3,
"issued_at": self.issued_at.isoformat(),
"users": self.users,
"groups": dict(sorted(self.groups.items())),
}
def append(self) -> None:
try:
with open("./web/analytics/data-v2.json", "r", encoding="utf-8") as file:
history: list[dict[str, Any]] = json.load(file)
except (FileNotFoundError, json.JSONDecodeError, OSError):
history = []
history.append(self.toDict())
with open("./web/analytics/data-v2.json", "w", encoding="utf-8") as file:
json.dump(history[-30:], file, ensure_ascii=False)
def text(self) -> str:
group_lines = [
f"{html.escape(group)}: <code>{count}</code>"
for group, count in sorted(self.groups.items())
]
groups = "\n".join(group_lines) if group_lines else "Нет зарегистрированных групп"
return (
f'<b>Аналитика за {self.issued_at.strftime("%d.%m")} 📊</b>\n'
f"Пользователи: <code>{self.users}</code>\n\n"
f"<b>Группы</b>\n{groups}"
)