Skip to content

Commit 5d399fb

Browse files
✨ IO添加重新验证命令
1 parent ff30742 commit 5d399fb

File tree

3 files changed

+113
-2
lines changed

3 files changed

+113
-2
lines changed

nonebot_plugin_tetris_stats/games/tetrio/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def get_player(user_id_or_name: str) -> Player | MessageFormatError:
2323
)
2424

2525

26-
from . import bind, config, list, query, rank, record, unbind # noqa: A004, E402
26+
from . import bind, config, list, query, rank, record, unbind, verify # noqa: A004, E402
2727

2828
main_command.add(command)
2929

@@ -36,4 +36,5 @@ def get_player(user_id_or_name: str) -> Player | MessageFormatError:
3636
'rank',
3737
'record',
3838
'unbind',
39+
'verify',
3940
]
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
from asyncio import gather
2+
from hashlib import md5
3+
from secrets import choice
4+
5+
from nonebot_plugin_alconna import Subcommand
6+
from nonebot_plugin_alconna.uniseg import UniMessage
7+
from nonebot_plugin_orm import get_session
8+
from nonebot_plugin_uninfo import QryItrface, Uninfo
9+
from nonebot_plugin_uninfo import User as UninfoUser
10+
from nonebot_plugin_uninfo.orm import get_session_persist_id
11+
from nonebot_plugin_user import User
12+
from yarl import URL
13+
14+
from ...config.config import global_config
15+
from ...db import create_or_update_bind, query_bind_info, trigger
16+
from ...utils.host import get_self_netloc
17+
from ...utils.image import get_avatar
18+
from ...utils.lang import get_lang
19+
from ...utils.render import render_image
20+
from ...utils.render.schemas.base import Avatar, People
21+
from ...utils.render.schemas.bind import Bind
22+
from . import alc, command
23+
from .api import Player
24+
from .constant import GAME_TYPE
25+
26+
command.add(Subcommand('verify', help_text='解除绑定 TETR.IO 账号'))
27+
28+
alc.shortcut(
29+
'(?i:io)(?i:验证|verify)',
30+
command='tstats TETR.IO verify',
31+
humanized='io验证',
32+
)
33+
34+
try:
35+
from nonebot.adapters.discord import MessageCreateEvent
36+
37+
@alc.assign('TETRIO.verify')
38+
async def _(_: MessageCreateEvent, nb_user: User, event_session: Uninfo, interface: QryItrface):
39+
async with (
40+
trigger(
41+
session_persist_id=await get_session_persist_id(event_session),
42+
game_platform=GAME_TYPE,
43+
command_type='verify',
44+
command_args=[],
45+
),
46+
get_session() as session,
47+
):
48+
if (bind := await query_bind_info(session=session, user=nb_user, game_platform=GAME_TYPE)) is None:
49+
await UniMessage('您还未绑定 TETR.IO 账号').finish()
50+
if bind.verify is True:
51+
await UniMessage('您已经完成了验证.').finish()
52+
player = Player(user_id=bind.game_account, trust=True)
53+
user_info = await player.get_info()
54+
verify = (
55+
user_info.data.connections.discord is not None
56+
and user_info.data.connections.discord.id == event_session.user.id
57+
)
58+
if verify is False:
59+
await UniMessage('您未通过验证, 请确认目标 TETR.IO 账号绑定了当前 Discord 账号').finish()
60+
await create_or_update_bind(
61+
session=session,
62+
user=nb_user,
63+
game_platform=GAME_TYPE,
64+
game_account=bind.game_account,
65+
verify=verify,
66+
)
67+
user, avatar_revision = await gather(player.user, player.avatar_revision)
68+
await UniMessage.image(
69+
raw=await render_image(
70+
Bind(
71+
platform='TETR.IO',
72+
type='success',
73+
user=People(
74+
avatar=str(
75+
URL(f'http://{get_self_netloc()}/host/resource/tetrio/avatars/{user.ID}')
76+
% {'revision': avatar_revision}
77+
)
78+
if avatar_revision is not None and avatar_revision != 0
79+
else Avatar(type='identicon', hash=md5(user.ID.encode()).hexdigest()), # noqa: S324
80+
name=user.name.upper(),
81+
),
82+
bot=People(
83+
avatar=await get_avatar(
84+
(
85+
bot_user := await interface.get_user(event_session.self_id)
86+
or UninfoUser(id=event_session.self_id)
87+
),
88+
'Data URI',
89+
'../../static/logo/logo.svg',
90+
),
91+
name=bot_user.nick or bot_user.name or choice(list(global_config.nickname) or ['bot']),
92+
),
93+
prompt='io查我',
94+
lang=get_lang(),
95+
),
96+
)
97+
).finish()
98+
except ImportError:
99+
pass
100+
101+
102+
@alc.assign('TETRIO.verify')
103+
async def _(event_session: Uninfo):
104+
async with trigger(
105+
session_persist_id=await get_session_persist_id(event_session),
106+
game_platform=GAME_TYPE,
107+
command_type='verify',
108+
command_args=[],
109+
):
110+
await UniMessage('目前仅支持 Discord 账号验证').finish()

nonebot_plugin_tetris_stats/utils/typedefs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Number: TypeAlias = float | int
44
GameType: TypeAlias = Literal['IO', 'TOP', 'TOS']
55
BaseCommandType: TypeAlias = Literal['bind', 'unbind', 'query']
6-
TETRIOCommandType: TypeAlias = BaseCommandType | Literal['rank', 'config', 'list', 'record']
6+
TETRIOCommandType: TypeAlias = BaseCommandType | Literal['rank', 'config', 'list', 'record', 'verify']
77
AllCommandType: TypeAlias = BaseCommandType | TETRIOCommandType
88
Me: TypeAlias = Literal[
99
'我',

0 commit comments

Comments
 (0)