41 lines
1.6 KiB
Python
41 lines
1.6 KiB
Python
"""统计服务:统一 TG 命令和 Web API 的统计口径"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from db.models import Action, Ban, Message
|
|
from services.time_utils import local_day_range
|
|
|
|
|
|
def day_range(day: str | None = None) -> tuple[str, datetime, datetime]:
|
|
"""返回当前应用时区的 (YYYY-MM-DD, start, end)。"""
|
|
return local_day_range(day)
|
|
|
|
|
|
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,
|
|
}
|