mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
86 lines
3.3 KiB
Python
86 lines
3.3 KiB
Python
from asyncio import gather
|
|
from hashlib import md5
|
|
from urllib.parse import urlencode
|
|
|
|
from arclet.alconna import Arg, ArgFlag
|
|
from nepattern import parser # type: ignore[import-untyped]
|
|
from nonebot_plugin_alconna import Args, Subcommand
|
|
from nonebot_plugin_alconna.uniseg import UniMessage
|
|
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 # type: ignore[import-untyped]
|
|
from nonebot_plugin_userinfo import BotUserInfo, UserInfo # type: ignore[import-untyped]
|
|
|
|
from ...db import BindStatus, create_or_update_bind, trigger
|
|
from ...utils.host import HostPage, get_self_netloc
|
|
from ...utils.image import get_avatar
|
|
from ...utils.render import Bind, render
|
|
from ...utils.render.schemas.base import Avatar, People
|
|
from ...utils.screenshot import screenshot
|
|
from . import alc, command, get_player
|
|
from .api import Player
|
|
from .constant import GAME_TYPE
|
|
|
|
command.add(
|
|
Subcommand(
|
|
'bind',
|
|
Args(
|
|
Arg(
|
|
'account',
|
|
parser(get_player),
|
|
notice='TETR.IO 用户名 / ID',
|
|
flags=[ArgFlag.HIDDEN],
|
|
)
|
|
),
|
|
help_text='绑定 TETR.IO 账号',
|
|
)
|
|
)
|
|
|
|
alc.shortcut(
|
|
'(?i:io)(?i:绑定|绑|bind)',
|
|
command='tstats TETR.IO bind',
|
|
humanized='io绑定',
|
|
)
|
|
|
|
|
|
@alc.assign('TETRIO.bind')
|
|
async def _(nb_user: User, account: Player, event_session: EventSession, bot_info: UserInfo = BotUserInfo()): # noqa: B008
|
|
async with trigger(
|
|
session_persist_id=await get_session_persist_id(event_session),
|
|
game_platform=GAME_TYPE,
|
|
command_type='bind',
|
|
command_args=[],
|
|
):
|
|
user, user_info = await gather(account.user, account.get_info())
|
|
async with get_session() as session:
|
|
bind_status = await create_or_update_bind(
|
|
session=session,
|
|
user=nb_user,
|
|
game_platform=GAME_TYPE,
|
|
game_account=user.unique_identifier,
|
|
)
|
|
if bind_status in (BindStatus.SUCCESS, BindStatus.UPDATE):
|
|
netloc = get_self_netloc()
|
|
async with HostPage(
|
|
await render(
|
|
'v1/binding',
|
|
Bind(
|
|
platform='TETR.IO',
|
|
status='unknown',
|
|
user=People(
|
|
avatar=f'http://{netloc}/host/resource/tetrio/avatars/{user.ID}?{urlencode({"revision": avatar_revision})}'
|
|
if (avatar_revision := (await account.avatar_revision)) is not None and avatar_revision != 0
|
|
else Avatar(type='identicon', hash=md5(user.ID.encode()).hexdigest()), # noqa: S324
|
|
name=user.name.upper(),
|
|
),
|
|
bot=People(
|
|
avatar=await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg'),
|
|
name=bot_info.user_name,
|
|
),
|
|
command='io查我',
|
|
),
|
|
)
|
|
) as page_hash:
|
|
await UniMessage.image(raw=await screenshot(f'http://{netloc}/host/{page_hash}.html')).finish()
|