Files
tg-spam-guard/services/stats_service.py
T
2026-07-06 19:26:00 +08:00

46 lines
1.8 KiB
Python

"""统计服务:统一 TG 命令和 Web API 的统计口径"""
from __future__ import annotations
from datetime import datetime, time, timedelta
from db.models import Action, Ban, Message
def day_range(day: str | None = None) -> tuple[str, datetime, datetime]:
"""返回 (YYYY-MM-DD, start, end)。day 为空则取今天。"""
if day:
target = datetime.strptime(day, "%Y-%m-%d").date()
else:
target = datetime.now().date()
start = datetime.combine(target, time.min)
end = start + timedelta(days=1)
return target.strftime("%Y-%m-%d"), start, end
async def get_daily_stats(day: str | None = None) -> dict:
"""获取单日统计。"""
day_str, start, end = day_range(day)
msg_count = await Message.filter(created_at__gte=start, created_at__lt=end).count()
spam_count = await Message.filter(created_at__gte=start, created_at__lt=end, is_spam=True).count()
ban_count = await Ban.filter(created_at__gte=start, created_at__lt=end).count()
total_bans = await Ban.all().count()
join_count = await Action.filter(action="JOIN", created_at__gte=start, created_at__lt=end).count()
leave_count = await Action.filter(action="LEAVE", created_at__gte=start, created_at__lt=end).count()
delete_count = await Action.filter(action="DELETE", created_at__gte=start, created_at__lt=end).count()
unban_count = await Action.filter(action="UNBAN", created_at__gte=start, created_at__lt=end).count()
return {
"date": day_str,
"messages": msg_count,
"spam_messages": spam_count,
"bans": ban_count,
"today_bans": ban_count,
"total_bans": total_bans,
"joins": join_count,
"leaves": leave_count,
"deleted": delete_count,
"unbans": unban_count,
"chat_count": msg_count,
}