From 607a0927bc89747a2717b18f81376545fd85398e Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Mon, 10 Jun 2024 11:57:01 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20TETR.IO=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8F=AF=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../games/tetrio/__init__.py | 15 +++++++++++--- .../games/tetrio/config.py | 20 +++++++++++++++++++ .../games/tetrio/query.py | 17 +++++++++++++--- 3 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 nonebot_plugin_tetris_stats/games/tetrio/config.py diff --git a/nonebot_plugin_tetris_stats/games/tetrio/__init__.py b/nonebot_plugin_tetris_stats/games/tetrio/__init__.py index 1657a0a..d1dab40 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/__init__.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/__init__.py @@ -62,13 +62,22 @@ alc.command.add( Args(Arg('rank', ValidRank, notice='TETR.IO 段位')), help_text='查询 TETR.IO 段位信息', ), + Subcommand( + 'config', + Option( + '--default-template', + Arg('template', Template), + alias=['-DT', 'DefaultTemplate'], + ), + ), dest='TETRIO', help_text='TETR.IO 游戏相关指令', ) ) -alc.shortcut('(?i:io)(?i:绑|绑定|bind)', {'command': 'tstats TETR.IO bind', 'humanized': 'io绑定'}) -alc.shortcut('(?i:io)(?i:查|查询|query|stats)', {'command': 'tstats TETR.IO query', 'humanized': 'io查'}) +alc.shortcut('(?i:io)(?i:绑定|绑|bind)', {'command': 'tstats TETR.IO bind', 'humanized': 'io绑定'}) +alc.shortcut('(?i:io)(?i:查询|查|query|stats)', {'command': 'tstats TETR.IO query', 'humanized': 'io查'}) +alc.shortcut('(?i:io)(?i:配置|配|config)', {'command': 'tstats TETR.IO config', 'humanized': 'io配置'}) alc.shortcut( 'fkosk', {'command': 'tstats TETR.IO query', 'args': ['我'], 'fuzzy': False, 'humanized': 'An Easter egg!'} @@ -76,4 +85,4 @@ alc.shortcut( add_block_handlers(alc.assign('TETRIO.query')) -from . import bind, query, rank # noqa: F401, E402 +from . import bind, config, query, rank # noqa: F401, E402 diff --git a/nonebot_plugin_tetris_stats/games/tetrio/config.py b/nonebot_plugin_tetris_stats/games/tetrio/config.py new file mode 100644 index 0000000..03ff5c0 --- /dev/null +++ b/nonebot_plugin_tetris_stats/games/tetrio/config.py @@ -0,0 +1,20 @@ +from nonebot_plugin_alconna.uniseg import UniMessage +from nonebot_plugin_orm import async_scoped_session +from nonebot_plugin_user import User # type: ignore[import-untyped] +from sqlalchemy import select + +from . import alc +from .models import TETRIOUserConfig +from .typing import Template + + +@alc.assign('TETRIO.config') +async def _(user: User, session: async_scoped_session, template: Template): + config = (await session.scalars(select(TETRIOUserConfig).where(TETRIOUserConfig.id == user.id))).one_or_none() + if config is None: + config = TETRIOUserConfig(id=user.id, query_template=template) + session.add(config) + else: + config.query_template = template + await session.commit() + await UniMessage('配置成功').finish() diff --git a/nonebot_plugin_tetris_stats/games/tetrio/query.py b/nonebot_plugin_tetris_stats/games/tetrio/query.py index 6f80499..d78253f 100644 --- a/nonebot_plugin_tetris_stats/games/tetrio/query.py +++ b/nonebot_plugin_tetris_stats/games/tetrio/query.py @@ -19,6 +19,7 @@ from nonebot_plugin_localstore import get_data_file # type: ignore[import-untyp from nonebot_plugin_orm import get_session from nonebot_plugin_session import EventSession # type: ignore[import-untyped] from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped] +from nonebot_plugin_user import User as NBUser # type: ignore[import-untyped] from nonebot_plugin_user import get_user # type: ignore[import-untyped] from sqlalchemy import select from zstandard import ZstdDecompressor @@ -46,7 +47,7 @@ from .api.schemas.tetra_league import TetraLeagueSuccess from .api.schemas.user_info import NeverPlayedLeague, NeverRatedLeague, RatedLeague from .api.schemas.user_records import SoloModeRecord, UserRecordsSuccess from .constant import GAME_TYPE, TR_MAX, TR_MIN -from .models import IORank +from .models import IORank, TETRIOUserConfig from .typing import Template UTC = timezone.utc @@ -55,7 +56,8 @@ driver = get_driver() @alc.assign('TETRIO.query') -async def _( +async def _( # noqa: PLR0913 + user: NBUser, event: Event, matcher: Matcher, target: At | Me, @@ -76,6 +78,10 @@ async def _( ), game_platform=GAME_TYPE, ) + if template is None: + template = await session.scalar( + select(TETRIOUserConfig.query_template).where(TETRIOUserConfig.id == user.id) + ) if bind is None: await matcher.finish('未查询到绑定信息') message = UniMessage(CANT_VERIFY_MESSAGE) @@ -84,13 +90,18 @@ async def _( @alc.assign('TETRIO.query') -async def _(account: Player, event_session: EventSession, template: Template | None = None): +async def _(user: NBUser, account: Player, event_session: EventSession, template: Template | None = None): async with trigger( session_persist_id=await get_session_persist_id(event_session), game_platform=GAME_TYPE, command_type='query', command_args=[], ): + async with get_session() as session: + if template is None: + template = await session.scalar( + select(TETRIOUserConfig.query_template).where(TETRIOUserConfig.id == user.id) + ) await (await make_query_result(account, template or 'v1')).finish()