mirror of
https://github.com/baiqwerdvd/StarRailUID.git
synced 2025-05-06 11:43:44 +08:00
add AvatarDetail Model
This commit is contained in:
parent
10bbdcac3b
commit
c5a074a054
@ -2,6 +2,52 @@ from typing import Any, Dict, List, Union
|
|||||||
|
|
||||||
from msgspec import Struct
|
from msgspec import Struct
|
||||||
|
|
||||||
|
|
||||||
|
class AvatarDetailEquipment(Struct):
|
||||||
|
item_id: str
|
||||||
|
item_name: str
|
||||||
|
item_url: str
|
||||||
|
avatar_base_type: str
|
||||||
|
rarity: str
|
||||||
|
max_level: int
|
||||||
|
cur_level: int
|
||||||
|
target_level: int
|
||||||
|
|
||||||
|
|
||||||
|
class AvatarDetailSkill(Struct):
|
||||||
|
point_id: str
|
||||||
|
pre_point: str
|
||||||
|
point_type: int
|
||||||
|
anchor: str
|
||||||
|
item_url: str
|
||||||
|
max_level: int
|
||||||
|
cur_level: int
|
||||||
|
target_level: int
|
||||||
|
progress: str
|
||||||
|
min_level_limit: int
|
||||||
|
|
||||||
|
|
||||||
|
class AvatarDetailAvatar(Struct):
|
||||||
|
item_id: str
|
||||||
|
item_name: str
|
||||||
|
icon_url: str
|
||||||
|
damage_type: str
|
||||||
|
rarity: str
|
||||||
|
avatar_base_type: str
|
||||||
|
max_level: int
|
||||||
|
cur_level: int
|
||||||
|
target_level: int
|
||||||
|
vertical_icon_url: str
|
||||||
|
|
||||||
|
|
||||||
|
class AvatarDetail(Struct):
|
||||||
|
avatar: AvatarDetailAvatar
|
||||||
|
skills: List[AvatarDetailSkill]
|
||||||
|
skills_other: List[AvatarDetailSkill]
|
||||||
|
equipment: AvatarDetailEquipment
|
||||||
|
is_login: bool
|
||||||
|
|
||||||
|
|
||||||
################
|
################
|
||||||
# 抽卡记录相关 #
|
# 抽卡记录相关 #
|
||||||
################
|
################
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from gsuid_core.sv import SV
|
|
||||||
from gsuid_core.bot import Bot
|
from gsuid_core.bot import Bot
|
||||||
from gsuid_core.models import Event
|
|
||||||
from gsuid_core.logger import logger
|
from gsuid_core.logger import logger
|
||||||
|
from gsuid_core.models import Event
|
||||||
|
from gsuid_core.sv import SV
|
||||||
|
|
||||||
from ..utils.convert import get_uid
|
from ..utils.convert import get_uid
|
||||||
from ..utils.sr_prefix import PREFIX
|
from ..utils.sr_prefix import PREFIX
|
||||||
from .draw_roleinfo_card import get_role_img, get_detail_img
|
from .draw_roleinfo_card import get_detail_img, get_role_img
|
||||||
|
|
||||||
sv_get_info = SV('sr查询信息')
|
sv_get_info = SV('sr查询信息')
|
||||||
|
|
||||||
@ -40,4 +40,4 @@ async def send_detail_info(bot: Bot, ev: Event):
|
|||||||
logger.info(f'[sr查询信息]UID: {uid}')
|
logger.info(f'[sr查询信息]UID: {uid}')
|
||||||
await bot.logger.info('开始执行[sr查询信息]')
|
await bot.logger.info('开始执行[sr查询信息]')
|
||||||
await bot.send(await get_detail_img(uid))
|
await bot.send(await get_detail_img(uid))
|
||||||
return None
|
return None
|
||||||
|
@ -1,17 +1,30 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict, List, Union, Optional
|
from typing import Dict, List, Optional, Union
|
||||||
|
|
||||||
from PIL import Image, ImageDraw
|
from gsuid_core.logger import logger
|
||||||
from gsuid_core.utils.error_reply import get_error
|
from gsuid_core.utils.error_reply import get_error
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
|
from ..sruid_utils.api.mys.models import (
|
||||||
|
AvatarDetail,
|
||||||
|
AvatarListItem,
|
||||||
|
AvatarListItemDetail,
|
||||||
|
RoleBasicInfo,
|
||||||
|
Stats,
|
||||||
|
)
|
||||||
|
from ..utils.fonts.first_world import fw_font_28
|
||||||
|
from ..utils.fonts.starrail_fonts import (
|
||||||
|
sr_font_24,
|
||||||
|
sr_font_26,
|
||||||
|
sr_font_28,
|
||||||
|
sr_font_30,
|
||||||
|
sr_font_36,
|
||||||
|
sr_font_40,
|
||||||
|
)
|
||||||
|
from ..utils.image.convert import convert_img
|
||||||
from ..utils.mys_api import mys_api
|
from ..utils.mys_api import mys_api
|
||||||
from .utils import get_icon, wrap_list
|
from .utils import get_icon, wrap_list
|
||||||
from ..utils.image.convert import convert_img
|
|
||||||
from ..utils.fonts.starrail_fonts import sr_font_24, sr_font_26, sr_font_28, sr_font_30, sr_font_36, sr_font_40
|
|
||||||
from ..utils.fonts.first_world import fw_font_28
|
|
||||||
from ..sruid_utils.api.mys.models import Stats, RoleBasicInfo, AvatarListItem
|
|
||||||
from gsuid_core.logger import logger
|
|
||||||
|
|
||||||
TEXT_PATH = Path(__file__).parent / 'texture2D'
|
TEXT_PATH = Path(__file__).parent / 'texture2D'
|
||||||
|
|
||||||
@ -242,7 +255,7 @@ async def draw_role_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
return await convert_img(img)
|
return await convert_img(img)
|
||||||
|
|
||||||
async def _draw_detail_card(
|
async def _draw_detail_card(
|
||||||
avatar_detail, avatar, index, char_info
|
avatar_detail: AvatarDetail, avatar: AvatarListItemDetail, index: int, char_info: Image.Image
|
||||||
) -> Image.Image:
|
) -> Image.Image:
|
||||||
if str(avatar.rarity) == '5':
|
if str(avatar.rarity) == '5':
|
||||||
bg_color = (255, 240, 211)
|
bg_color = (255, 240, 211)
|
||||||
@ -261,7 +274,7 @@ async def _draw_detail_card(
|
|||||||
'lm',
|
'lm',
|
||||||
)
|
)
|
||||||
avatar_img.paste(element_icon, (195, 10), mask=element_icon)
|
avatar_img.paste(element_icon, (195, 10), mask=element_icon)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(270, 25),
|
(270, 25),
|
||||||
f'{avatar.level}',
|
f'{avatar.level}',
|
||||||
@ -269,7 +282,7 @@ async def _draw_detail_card(
|
|||||||
sr_font_24,
|
sr_font_24,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(325, 25),
|
(325, 25),
|
||||||
f'{avatar.rank}',
|
f'{avatar.rank}',
|
||||||
@ -277,76 +290,75 @@ async def _draw_detail_card(
|
|||||||
sr_font_24,
|
sr_font_24,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(380, 25),
|
(380, 25),
|
||||||
f"{avatar_detail['skills'][0]['cur_level']}",
|
f'{avatar_detail.skills[0].cur_level}',
|
||||||
first_color,
|
first_color,
|
||||||
sr_font_24,
|
sr_font_24,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(430, 25),
|
(430, 25),
|
||||||
f"{avatar_detail['skills'][1]['cur_level']}",
|
f'{avatar_detail.skills[1].cur_level}',
|
||||||
first_color,
|
first_color,
|
||||||
sr_font_24,
|
sr_font_24,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(485, 25),
|
(485, 25),
|
||||||
f"{avatar_detail['skills'][2]['cur_level']}",
|
f'{avatar_detail.skills[2].cur_level}',
|
||||||
first_color,
|
first_color,
|
||||||
sr_font_24,
|
sr_font_24,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(540, 25),
|
(540, 25),
|
||||||
f"{avatar_detail['skills'][3]['cur_level']}",
|
f'{avatar_detail.skills[3].cur_level}',
|
||||||
first_color,
|
first_color,
|
||||||
sr_font_24,
|
sr_font_24,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
if avatar.equip:
|
if avatar.equip:
|
||||||
|
|
||||||
equip_icon = (await get_icon(avatar.equip.icon)).resize((40, 40))
|
equip_icon = (await get_icon(avatar.equip.icon)).resize((40, 40))
|
||||||
avatar_img.paste(equip_icon, (580, 5), mask=equip_icon)
|
avatar_img.paste(equip_icon, (580, 5), mask=equip_icon)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(640, 25),
|
(640, 25),
|
||||||
f"{avatar.equip.rank}",
|
f'{avatar.equip.rank}',
|
||||||
first_color,
|
first_color,
|
||||||
sr_font_24,
|
sr_font_24,
|
||||||
'lm',
|
'lm',
|
||||||
)
|
)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(680, 25),
|
(680, 25),
|
||||||
f"Lv{avatar.equip.level}",
|
f'Lv{avatar.equip.level}',
|
||||||
first_color,
|
first_color,
|
||||||
sr_font_24,
|
sr_font_24,
|
||||||
'lm',
|
'lm',
|
||||||
)
|
)
|
||||||
|
|
||||||
avatar_draw.text(
|
avatar_draw.text(
|
||||||
(750, 25),
|
(750, 25),
|
||||||
f"{avatar.equip.name}",
|
f'{avatar.equip.name}',
|
||||||
first_color,
|
first_color,
|
||||||
sr_font_24,
|
sr_font_24,
|
||||||
'lm',
|
'lm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_info.paste(avatar_img, (15, 211 + 51 * index), mask=avatar_img)
|
char_info.paste(avatar_img, (15, 211 + 51 * index), mask=avatar_img)
|
||||||
|
|
||||||
return char_info
|
return char_info
|
||||||
|
|
||||||
async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
||||||
# 获取角色列表
|
# 获取角色列表
|
||||||
# avatar_list = await mys_api.get_avatar_list(sr_uid)
|
avatar_list = await mys_api.get_avatar_info(sr_uid, 1001)
|
||||||
avatar_list = await mys_api.get_avatar_info(sr_uid, '1001')
|
|
||||||
if isinstance(avatar_list, int):
|
if isinstance(avatar_list, int):
|
||||||
return get_error(avatar_list)
|
return get_error(avatar_list)
|
||||||
avatar_num = len(avatar_list.avatar_list)
|
avatar_num = len(avatar_list.avatar_list)
|
||||||
@ -354,7 +366,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
char_info = bg_img.copy()
|
char_info = bg_img.copy()
|
||||||
char_info = char_info.resize((1050, img_height))
|
char_info = char_info.resize((1050, img_height))
|
||||||
char_img_draw = ImageDraw.Draw(char_info)
|
char_img_draw = ImageDraw.Draw(char_info)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(50, 70),
|
(50, 70),
|
||||||
'sr角色练度统计',
|
'sr角色练度统计',
|
||||||
@ -362,7 +374,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_40,
|
sr_font_40,
|
||||||
'lm',
|
'lm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(50, 120),
|
(50, 120),
|
||||||
f'UID:{sr_uid} 共{avatar_num}名角色',
|
f'UID:{sr_uid} 共{avatar_num}名角色',
|
||||||
@ -370,7 +382,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_28,
|
sr_font_28,
|
||||||
'lm',
|
'lm',
|
||||||
)
|
)
|
||||||
|
|
||||||
title_img = Image.new('RGBA', (1020, 60), (0, 0, 0, 150))
|
title_img = Image.new('RGBA', (1020, 60), (0, 0, 0, 150))
|
||||||
char_info.paste(title_img, (15, 150), mask=title_img)
|
char_info.paste(title_img, (15, 150), mask=title_img)
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
@ -380,7 +392,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_26,
|
sr_font_26,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(220, 180),
|
(220, 180),
|
||||||
'属性',
|
'属性',
|
||||||
@ -388,7 +400,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_26,
|
sr_font_26,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(285, 180),
|
(285, 180),
|
||||||
'LV',
|
'LV',
|
||||||
@ -396,7 +408,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_26,
|
sr_font_26,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(340, 180),
|
(340, 180),
|
||||||
'星魂',
|
'星魂',
|
||||||
@ -404,7 +416,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_26,
|
sr_font_26,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(395, 180),
|
(395, 180),
|
||||||
'N',
|
'N',
|
||||||
@ -412,7 +424,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_26,
|
sr_font_26,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(445, 180),
|
(445, 180),
|
||||||
'B',
|
'B',
|
||||||
@ -420,7 +432,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_26,
|
sr_font_26,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(500, 180),
|
(500, 180),
|
||||||
'U',
|
'U',
|
||||||
@ -428,7 +440,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_26,
|
sr_font_26,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(555, 180),
|
(555, 180),
|
||||||
'T',
|
'T',
|
||||||
@ -436,7 +448,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
sr_font_26,
|
sr_font_26,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(745, 180),
|
(745, 180),
|
||||||
'光锥',
|
'光锥',
|
||||||
@ -445,12 +457,17 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
for index, avatar in enumerate(avatar_list.avatar_list):
|
for index, avatar in enumerate(avatar_list.avatar_list):
|
||||||
avatar_detail = await mys_api.get_avatar_detail(sr_uid, avatar.id)
|
avatar_detail = await mys_api.get_avatar_detail(sr_uid, str(avatar.id))
|
||||||
if isinstance(avatar_detail, int):
|
if isinstance(avatar_detail, int):
|
||||||
return get_error(avatar_detail)
|
return get_error(avatar_detail)
|
||||||
# 200
|
# 200
|
||||||
char_info = await _draw_detail_card(avatar_detail, avatar, index, char_info)
|
char_info = await _draw_detail_card(
|
||||||
|
avatar_detail,
|
||||||
|
avatar,
|
||||||
|
index,
|
||||||
|
char_info,
|
||||||
|
)
|
||||||
|
|
||||||
# 写底层文字
|
# 写底层文字
|
||||||
char_img_draw.text(
|
char_img_draw.text(
|
||||||
(525, img_height - 40),
|
(525, img_height - 40),
|
||||||
@ -459,7 +476,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]:
|
|||||||
fw_font_28,
|
fw_font_28,
|
||||||
'mm',
|
'mm',
|
||||||
)
|
)
|
||||||
|
|
||||||
res = await convert_img(char_info)
|
res = await convert_img(char_info)
|
||||||
logger.info('[查询练度统计]绘图已完成,等待发送!')
|
logger.info('[查询练度统计]绘图已完成,等待发送!')
|
||||||
return res
|
return res
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import List, TypeVar, Generator
|
from typing import Generator, List, TypeVar
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
from aiohttp import ClientSession
|
from aiohttp import ClientSession
|
||||||
from gsuid_core.data_store import get_res_path
|
from gsuid_core.data_store import get_res_path
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
T = TypeVar('T')
|
T = TypeVar('T')
|
||||||
|
|
||||||
|
@ -1,38 +1,39 @@
|
|||||||
import copy
|
import copy
|
||||||
import time
|
|
||||||
import random
|
import random
|
||||||
from string import digits, ascii_letters
|
import time
|
||||||
from typing import Any, Dict, Union, Literal, Optional
|
from string import ascii_letters, digits
|
||||||
|
from typing import Any, Dict, Literal, Optional, Union
|
||||||
|
|
||||||
import msgspec
|
import msgspec
|
||||||
from gsuid_core.utils.api.mys_api import _MysApi
|
|
||||||
from gsuid_core.utils.database.models import GsUser
|
|
||||||
|
|
||||||
# from gsuid_core.utils.api.mys.models import MysSign, SignList
|
# from gsuid_core.utils.api.mys.models import MysSign, SignList
|
||||||
from gsuid_core.utils.api.mys.tools import (
|
from gsuid_core.utils.api.mys.tools import (
|
||||||
mys_version,
|
|
||||||
_random_int_ds,
|
_random_int_ds,
|
||||||
generate_os_ds,
|
generate_os_ds,
|
||||||
get_web_ds_token,
|
get_web_ds_token,
|
||||||
|
mys_version,
|
||||||
)
|
)
|
||||||
|
from gsuid_core.utils.api.mys_api import _MysApi
|
||||||
|
from gsuid_core.utils.database.models import GsUser
|
||||||
|
|
||||||
from .api import srdbsqla
|
|
||||||
from ..sruid_utils.api.mys.api import _API
|
from ..sruid_utils.api.mys.api import _API
|
||||||
from ..sruid_utils.api.mys.models import (
|
from ..sruid_utils.api.mys.models import (
|
||||||
MysSign,
|
AbyssData,
|
||||||
|
AvatarDetail,
|
||||||
|
AvatarInfo,
|
||||||
|
DailyNoteData,
|
||||||
GachaLog,
|
GachaLog,
|
||||||
|
MonthlyAward,
|
||||||
|
MysSign,
|
||||||
|
RogueData,
|
||||||
|
RogueLocustData,
|
||||||
|
RoleBasicInfo,
|
||||||
|
RoleIndex,
|
||||||
SignInfo,
|
SignInfo,
|
||||||
SignList,
|
SignList,
|
||||||
AbyssData,
|
|
||||||
RogueData,
|
|
||||||
RoleIndex,
|
|
||||||
AvatarInfo,
|
|
||||||
MonthlyAward,
|
|
||||||
DailyNoteData,
|
|
||||||
RoleBasicInfo,
|
|
||||||
WidgetStamina,
|
WidgetStamina,
|
||||||
RogueLocustData,
|
|
||||||
)
|
)
|
||||||
|
from .api import srdbsqla
|
||||||
|
|
||||||
RECOGNIZE_SERVER = {
|
RECOGNIZE_SERVER = {
|
||||||
'1': 'prod_gf_cn',
|
'1': 'prod_gf_cn',
|
||||||
@ -285,28 +286,7 @@ class MysApi(_MysApi):
|
|||||||
data = msgspec.convert(data['data'], type=AvatarInfo)
|
data = msgspec.convert(data['data'], type=AvatarInfo)
|
||||||
# data = cast(AvatarInfo, data['data'])
|
# data = cast(AvatarInfo, data['data'])
|
||||||
return data
|
return data
|
||||||
|
|
||||||
async def get_avatar_list(
|
|
||||||
self, uid: str
|
|
||||||
):
|
|
||||||
data = await self.simple_mys_req(
|
|
||||||
'STAR_RAIL_AVATAR_LIST_URL',
|
|
||||||
uid,
|
|
||||||
params={
|
|
||||||
'game': 'hkrpg',
|
|
||||||
'uid': uid,
|
|
||||||
'region': RECOGNIZE_SERVER.get(str(uid)[0], 'prod_gf_cn'),
|
|
||||||
'lang': 'zh-cn',
|
|
||||||
'tab_from': 'TabOwned',
|
|
||||||
'page': '1',
|
|
||||||
'size': '100',
|
|
||||||
},
|
|
||||||
header=self._HEADER,
|
|
||||||
)
|
|
||||||
if isinstance(data, Dict):
|
|
||||||
data = data['data']
|
|
||||||
return data
|
|
||||||
|
|
||||||
async def get_avatar_detail(
|
async def get_avatar_detail(
|
||||||
self, uid: str, avatarid: str
|
self, uid: str, avatarid: str
|
||||||
):
|
):
|
||||||
@ -325,9 +305,9 @@ class MysApi(_MysApi):
|
|||||||
header=self._HEADER,
|
header=self._HEADER,
|
||||||
)
|
)
|
||||||
if isinstance(data, Dict):
|
if isinstance(data, Dict):
|
||||||
data = data['data']
|
data = msgspec.convert(data['data'], type=AvatarDetail)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
async def get_sign_list(self, uid) -> Union[SignList, int]:
|
async def get_sign_list(self, uid) -> Union[SignList, int]:
|
||||||
is_os = self.check_os(uid)
|
is_os = self.check_os(uid)
|
||||||
if is_os:
|
if is_os:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user