mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b0e53bc8c8 | |||
| 2267bc8f14 | |||
| 607a0927bc | |||
| 7b3ca9eb2a | |||
| 37c12e439c | |||
| 504579710e |
@@ -62,13 +62,22 @@ alc.command.add(
|
|||||||
Args(Arg('rank', ValidRank, notice='TETR.IO 段位')),
|
Args(Arg('rank', ValidRank, notice='TETR.IO 段位')),
|
||||||
help_text='查询 TETR.IO 段位信息',
|
help_text='查询 TETR.IO 段位信息',
|
||||||
),
|
),
|
||||||
|
Subcommand(
|
||||||
|
'config',
|
||||||
|
Option(
|
||||||
|
'--default-template',
|
||||||
|
Arg('template', Template),
|
||||||
|
alias=['-DT', 'DefaultTemplate'],
|
||||||
|
),
|
||||||
|
),
|
||||||
dest='TETRIO',
|
dest='TETRIO',
|
||||||
help_text='TETR.IO 游戏相关指令',
|
help_text='TETR.IO 游戏相关指令',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
alc.shortcut('(?i:io)(?i:绑|绑定|bind)', {'command': 'tstats TETR.IO bind', '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:查询|查|query|stats)', {'command': 'tstats TETR.IO query', 'humanized': 'io查'})
|
||||||
|
alc.shortcut('(?i:io)(?i:配置|配|config)', {'command': 'tstats TETR.IO config', 'humanized': 'io配置'})
|
||||||
|
|
||||||
alc.shortcut(
|
alc.shortcut(
|
||||||
'fkosk', {'command': 'tstats TETR.IO query', 'args': ['我'], 'fuzzy': False, 'humanized': 'An Easter egg!'}
|
'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'))
|
add_block_handlers(alc.assign('TETRIO.query'))
|
||||||
|
|
||||||
from . import bind, query, rank # noqa: F401, E402
|
from . import bind, config, query, rank # noqa: F401, E402
|
||||||
|
|||||||
@@ -15,8 +15,3 @@ class TETRIOHistoricalData(MappedAsDataclass, Model):
|
|||||||
api_type: Mapped[Literal['User Info', 'User Records']] = mapped_column(String(16), index=True)
|
api_type: Mapped[Literal['User Info', 'User Records']] = mapped_column(String(16), index=True)
|
||||||
data: Mapped[SuccessModel] = mapped_column(PydanticType(get_model=[SuccessModel.__subclasses__], models=set()))
|
data: Mapped[SuccessModel] = mapped_column(PydanticType(get_model=[SuccessModel.__subclasses__], models=set()))
|
||||||
update_time: Mapped[datetime] = mapped_column(DateTime, index=True)
|
update_time: Mapped[datetime] = mapped_column(DateTime, index=True)
|
||||||
|
|
||||||
|
|
||||||
class TETRIOUserConfig(MappedAsDataclass, Model):
|
|
||||||
id: Mapped[int] = mapped_column(init=False, primary_key=True)
|
|
||||||
query_template: Mapped[Literal['v1', 'v2']] = mapped_column(String(2))
|
|
||||||
|
|||||||
20
nonebot_plugin_tetris_stats/games/tetrio/config.py
Normal file
20
nonebot_plugin_tetris_stats/games/tetrio/config.py
Normal file
@@ -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()
|
||||||
@@ -5,6 +5,7 @@ from sqlalchemy import JSON, DateTime, String
|
|||||||
from sqlalchemy.orm import Mapped, MappedAsDataclass, mapped_column
|
from sqlalchemy.orm import Mapped, MappedAsDataclass, mapped_column
|
||||||
|
|
||||||
from .api.typing import Rank
|
from .api.typing import Rank
|
||||||
|
from .typing import Template
|
||||||
|
|
||||||
|
|
||||||
class IORank(MappedAsDataclass, Model):
|
class IORank(MappedAsDataclass, Model):
|
||||||
@@ -26,3 +27,8 @@ class IORank(MappedAsDataclass, Model):
|
|||||||
index=True,
|
index=True,
|
||||||
)
|
)
|
||||||
file_hash: Mapped[str | None] = mapped_column(String(128), index=True)
|
file_hash: Mapped[str | None] = mapped_column(String(128), index=True)
|
||||||
|
|
||||||
|
|
||||||
|
class TETRIOUserConfig(MappedAsDataclass, Model):
|
||||||
|
id: Mapped[int] = mapped_column(primary_key=True)
|
||||||
|
query_template: Mapped[Template] = mapped_column(String(2))
|
||||||
@@ -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_orm import get_session
|
||||||
from nonebot_plugin_session import EventSession # type: ignore[import-untyped]
|
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_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 nonebot_plugin_user import get_user # type: ignore[import-untyped]
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
from zstandard import ZstdDecompressor
|
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_info import NeverPlayedLeague, NeverRatedLeague, RatedLeague
|
||||||
from .api.schemas.user_records import SoloModeRecord, UserRecordsSuccess
|
from .api.schemas.user_records import SoloModeRecord, UserRecordsSuccess
|
||||||
from .constant import GAME_TYPE, TR_MAX, TR_MIN
|
from .constant import GAME_TYPE, TR_MAX, TR_MIN
|
||||||
from .model import IORank
|
from .models import IORank, TETRIOUserConfig
|
||||||
from .typing import Template
|
from .typing import Template
|
||||||
|
|
||||||
UTC = timezone.utc
|
UTC = timezone.utc
|
||||||
@@ -55,7 +56,8 @@ driver = get_driver()
|
|||||||
|
|
||||||
|
|
||||||
@alc.assign('TETRIO.query')
|
@alc.assign('TETRIO.query')
|
||||||
async def _(
|
async def _( # noqa: PLR0913
|
||||||
|
user: NBUser,
|
||||||
event: Event,
|
event: Event,
|
||||||
matcher: Matcher,
|
matcher: Matcher,
|
||||||
target: At | Me,
|
target: At | Me,
|
||||||
@@ -76,6 +78,10 @@ async def _(
|
|||||||
),
|
),
|
||||||
game_platform=GAME_TYPE,
|
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:
|
if bind is None:
|
||||||
await matcher.finish('未查询到绑定信息')
|
await matcher.finish('未查询到绑定信息')
|
||||||
message = UniMessage(CANT_VERIFY_MESSAGE)
|
message = UniMessage(CANT_VERIFY_MESSAGE)
|
||||||
@@ -84,13 +90,18 @@ async def _(
|
|||||||
|
|
||||||
|
|
||||||
@alc.assign('TETRIO.query')
|
@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(
|
async with trigger(
|
||||||
session_persist_id=await get_session_persist_id(event_session),
|
session_persist_id=await get_session_persist_id(event_session),
|
||||||
game_platform=GAME_TYPE,
|
game_platform=GAME_TYPE,
|
||||||
command_type='query',
|
command_type='query',
|
||||||
command_args=[],
|
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()
|
await (await make_query_result(account, template or 'v1')).finish()
|
||||||
|
|
||||||
|
|
||||||
@@ -394,6 +405,7 @@ async def make_query_image_v2(player: Player) -> bytes:
|
|||||||
total=league.gamesplayed,
|
total=league.gamesplayed,
|
||||||
wins=league.gameswon,
|
wins=league.gameswon,
|
||||||
),
|
),
|
||||||
|
decaying=league.decaying,
|
||||||
)
|
)
|
||||||
if isinstance(league, RatedLeague)
|
if isinstance(league, RatedLeague)
|
||||||
else None,
|
else None,
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ from .api.schemas.user import User
|
|||||||
from .api.tetra_league import full_export
|
from .api.tetra_league import full_export
|
||||||
from .api.typing import Rank
|
from .api.typing import Rank
|
||||||
from .constant import GAME_TYPE, RANK_PERCENTILE
|
from .constant import GAME_TYPE, RANK_PERCENTILE
|
||||||
from .model import IORank
|
from .models import IORank
|
||||||
|
|
||||||
UTC = timezone.utc
|
UTC = timezone.utc
|
||||||
|
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ alc.command.add(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
alc.shortcut('(?i:top)(?i:绑|绑定|bind)', {'command': 'tstats TOP bind', 'humanized': 'top绑定'})
|
alc.shortcut('(?i:top)(?i:绑定|绑|bind)', {'command': 'tstats TOP bind', 'humanized': 'top绑定'})
|
||||||
alc.shortcut('(?i:top)(?i:查|查询|query|stats)', {'command': 'tstats TOP query', 'humanized': 'top查'})
|
alc.shortcut('(?i:top)(?i:查询|查|query|stats)', {'command': 'tstats TOP query', 'humanized': 'top查'})
|
||||||
|
|
||||||
add_block_handlers(alc.assign('TOP.query'))
|
add_block_handlers(alc.assign('TOP.query'))
|
||||||
|
|
||||||
|
|||||||
@@ -56,8 +56,8 @@ alc.command.add(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
alc.shortcut('(?i:tos|茶服)(?i:绑|绑定|bind)', {'command': 'tstats TOS bind', 'humanized': '茶服绑定'})
|
alc.shortcut('(?i:tos|茶服)(?i:绑定|绑|bind)', {'command': 'tstats TOS bind', 'humanized': '茶服绑定'})
|
||||||
alc.shortcut('(?i:tos|茶服)(?i:查|查询|query|stats)', {'command': 'tstats TOS query', 'humanized': '茶服查'})
|
alc.shortcut('(?i:tos|茶服)(?i:查询|查|query|stats)', {'command': 'tstats TOS query', 'humanized': '茶服查'})
|
||||||
|
|
||||||
add_block_handlers(alc.assign('TOS.query'))
|
add_block_handlers(alc.assign('TOS.query'))
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ class TetraLeague(BaseModel):
|
|||||||
|
|
||||||
statistic: TetraLeagueStatistic
|
statistic: TetraLeagueStatistic
|
||||||
|
|
||||||
|
decaying: bool
|
||||||
|
|
||||||
|
|
||||||
class Sprint(BaseModel):
|
class Sprint(BaseModel):
|
||||||
time: str
|
time: str
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = 'nonebot-plugin-tetris-stats'
|
name = 'nonebot-plugin-tetris-stats'
|
||||||
version = '1.2.12'
|
version = '1.2.14'
|
||||||
description = '一款基于 NoneBot2 的用于查询 Tetris 相关游戏数据的插件'
|
description = '一款基于 NoneBot2 的用于查询 Tetris 相关游戏数据的插件'
|
||||||
authors = ['scdhh <wallfjjd@gmail.com>']
|
authors = ['scdhh <wallfjjd@gmail.com>']
|
||||||
readme = 'README.md'
|
readme = 'README.md'
|
||||||
|
|||||||
Reference in New Issue
Block a user