|
| 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() |
0 commit comments