mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
✨ 使用 zoneinfo 处理时区,并优化数据库查询逻辑
This commit is contained in:
@@ -1,12 +1,13 @@
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
from zoneinfo import ZoneInfo
|
||||||
|
|
||||||
from arclet.alconna import Alconna, Arg, ArgFlag, Args, CommandMeta, Option
|
from arclet.alconna import Alconna, Arg, ArgFlag, Args, CommandMeta, Option
|
||||||
from nonebot.adapters import Bot, Event
|
from nonebot.adapters import Bot, Event
|
||||||
from nonebot.matcher import Matcher
|
from nonebot.matcher import Matcher
|
||||||
from nonebot_plugin_alconna import At, on_alconna
|
from nonebot_plugin_alconna import At, on_alconna
|
||||||
from nonebot_plugin_orm import get_session
|
from nonebot_plugin_orm import get_session
|
||||||
from sqlalchemy import select
|
from sqlalchemy import func, select
|
||||||
|
|
||||||
from ...db import query_bind_info
|
from ...db import query_bind_info
|
||||||
from ...utils.exception import NeedCatchError
|
from ...utils.exception import NeedCatchError
|
||||||
@@ -133,7 +134,7 @@ async def _(event: Event, matcher: Matcher, account: User):
|
|||||||
|
|
||||||
|
|
||||||
@alc.assign('rank')
|
@alc.assign('rank')
|
||||||
async def _(event: Event, matcher: Matcher, rank: Rank):
|
async def _(matcher: Matcher, rank: Rank):
|
||||||
if rank == 'z':
|
if rank == 'z':
|
||||||
await matcher.finish('暂不支持查询未知段位')
|
await matcher.finish('暂不支持查询未知段位')
|
||||||
try:
|
try:
|
||||||
@@ -141,13 +142,25 @@ async def _(event: Event, matcher: Matcher, rank: Rank):
|
|||||||
except NeedCatchError as e:
|
except NeedCatchError as e:
|
||||||
await matcher.finish(str(f'段位信息获取失败\n{e}'))
|
await matcher.finish(str(f'段位信息获取失败\n{e}'))
|
||||||
async with get_session() as session:
|
async with get_session() as session:
|
||||||
data = (
|
latest_data = (
|
||||||
await session.scalars(select(IORank).where(IORank.rank == rank).order_by(IORank.id.desc()).limit(5))
|
await session.scalars(select(IORank).where(IORank.rank == rank).order_by(IORank.id.desc()).limit(1))
|
||||||
).all()
|
).one()
|
||||||
latest_data = data[0]
|
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'
|
message = f'{rank.upper()} 段 分数线 {latest_data.tr_line:.2f} TR, {latest_data.player_count} 名玩家\n'
|
||||||
if len(data) > 1:
|
if compare_data.id != latest_data.id:
|
||||||
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 "→"}'
|
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:
|
else:
|
||||||
message += '暂无对比数据'
|
message += '暂无对比数据'
|
||||||
avg = get_metrics(pps=latest_data.avg_pps, apm=latest_data.avg_apm, vs=latest_data.avg_vs)
|
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'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'
|
f'ADPM: {max_vs.adpm} ( {max_vs.vs}vs ) By: {latest_data.high_vs[0]["name"].upper()}\n'
|
||||||
'\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)
|
await matcher.finish(message)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user