diff --git a/nonebot_plugin_tetris_stats/game_data_processor/io_data_processor/__init__.py b/nonebot_plugin_tetris_stats/game_data_processor/io_data_processor/__init__.py index 60bdf1b..6a7cfaa 100644 --- a/nonebot_plugin_tetris_stats/game_data_processor/io_data_processor/__init__.py +++ b/nonebot_plugin_tetris_stats/game_data_processor/io_data_processor/__init__.py @@ -1,12 +1,13 @@ from datetime import timedelta from typing import Any +from zoneinfo import ZoneInfo from arclet.alconna import Alconna, Arg, ArgFlag, Args, CommandMeta, Option from nonebot.adapters import Bot, Event from nonebot.matcher import Matcher from nonebot_plugin_alconna import At, on_alconna from nonebot_plugin_orm import get_session -from sqlalchemy import select +from sqlalchemy import func, select from ...db import query_bind_info from ...utils.exception import NeedCatchError @@ -133,7 +134,7 @@ async def _(event: Event, matcher: Matcher, account: User): @alc.assign('rank') -async def _(event: Event, matcher: Matcher, rank: Rank): +async def _(matcher: Matcher, rank: Rank): if rank == 'z': await matcher.finish('暂不支持查询未知段位') try: @@ -141,13 +142,25 @@ async def _(event: Event, matcher: Matcher, rank: Rank): except NeedCatchError as e: await matcher.finish(str(f'段位信息获取失败\n{e}')) async with get_session() as session: - data = ( - await session.scalars(select(IORank).where(IORank.rank == rank).order_by(IORank.id.desc()).limit(5)) - ).all() - latest_data = data[0] + latest_data = ( + await session.scalars(select(IORank).where(IORank.rank == rank).order_by(IORank.id.desc()).limit(1)) + ).one() + compare_data = ( + await session.scalars( + select(IORank) + .where(IORank.rank == rank) + .order_by( + func.abs( + func.julianday(IORank.create_time) + - func.julianday(latest_data.create_time - timedelta(hours=24)) + ) + ) + .limit(1) + ) + ).one() message = f'{rank.upper()} 段 分数线 {latest_data.tr_line:.2f} TR, {latest_data.player_count} 名玩家\n' - if len(data) > 1: - message += f'对比 {(latest_data.create_time-data[-1].create_time).total_seconds()/3600:.2f} 小时前趋势: {f"↑{difference:.2f}" if (difference:=latest_data.tr_line-data[-1].tr_line) > 0 else f"↓{-difference:.2f}" if difference < 0 else "→"}' + if compare_data.id != latest_data.id: + message += f'对比 {(latest_data.create_time-compare_data.create_time).total_seconds()/3600:.2f} 小时前趋势: {f"↑{difference:.2f}" if (difference:=latest_data.tr_line-compare_data.tr_line) > 0 else f"↓{-difference:.2f}" if difference < 0 else "→"}' else: message += '暂无对比数据' avg = get_metrics(pps=latest_data.avg_pps, apm=latest_data.avg_apm, vs=latest_data.avg_vs) @@ -172,7 +185,7 @@ async def _(event: Event, matcher: Matcher, rank: Rank): f'APM: {latest_data.high_apm[1]} By: {latest_data.high_apm[0]["name"].upper()}\n' f'ADPM: {max_vs.adpm} ( {max_vs.vs}vs ) By: {latest_data.high_vs[0]["name"].upper()}\n' '\n' - f'数据更新时间: {(latest_data.create_time+timedelta(hours=8)).strftime("%Y-%m-%d %H:%M:%S")}' + f'数据更新时间: {latest_data.create_time.replace(tzinfo=ZoneInfo("UTC")).astimezone(ZoneInfo("Asia/Shanghai")).strftime("%Y-%m-%d %H:%M:%S")}' ) await matcher.finish(message)