Files
AstrBot/dashboard/routes/stat.py
T
2024-10-04 00:11:04 +08:00

62 lines
2.3 KiB
Python

import traceback, psutil, time, datetime
from .. import Route, Response, logger
from quart import Quart, request
from type.types import Context
from astrbot.db import BaseDatabase
from type.config import VERSION
class StatRoute(Route):
def __init__(self, context: Context, app: Quart, db_helper: BaseDatabase) -> None:
super().__init__(context, app)
self.routes = {
'/stat/get': ('GET', self.get_stat),
'/stat/version': ('GET', self.get_version),
}
self.db_helper = db_helper
self.register_routes()
def format_sec(self, sec: int):
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
return f"{h}小时{m}{s}秒"
async def get_version(self):
return Response().ok({
"version": VERSION
}).__dict__
async def get_stat(self):
offset_sec = request.args.get('offset_sec', 86400)
offset_sec = int(offset_sec)
try:
stat = self.db_helper.get_base_stats(offset_sec)
now = int(time.time())
start_time = now - offset_sec
message_time_based_stats = []
idx = 0
for bucket_end in range(start_time, now, 1800):
cnt = 0
while idx < len(stat.platform) and stat.platform[idx].timestamp < bucket_end:
cnt += stat.platform[idx].count
idx += 1
message_time_based_stats.append([bucket_end, cnt])
stat_dict = stat.__dict__
stat_dict.update({
"platform": self.db_helper.get_grouped_base_stats(offset_sec).platform,
"message_count": self.db_helper.get_total_message_count() or 0,
"platform_count": len(self.context.platforms),
"message_time_series": message_time_based_stats,
"running": self.format_sec(int(time.time() - self.context._start_running)),
"memory": {
"process": psutil.Process().memory_info().rss >> 20,
"system": psutil.virtual_memory().total >> 20
}
})
return Response().ok(stat_dict).__dict__
except Exception as e:
logger.error(traceback.format_exc())
return Response().error(e.__str__()).__dict__