diff --git a/StarRailUID/sruid_utils/api/mys/models.py b/StarRailUID/sruid_utils/api/mys/models.py index f422fed..a25ea40 100644 --- a/StarRailUID/sruid_utils/api/mys/models.py +++ b/StarRailUID/sruid_utils/api/mys/models.py @@ -2,6 +2,52 @@ from typing import Any, Dict, List, Union 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 + + ################ # 抽卡记录相关 # ################ diff --git a/StarRailUID/starrailuid_roleinfo/__init__.py b/StarRailUID/starrailuid_roleinfo/__init__.py index 22f3158..f403b52 100644 --- a/StarRailUID/starrailuid_roleinfo/__init__.py +++ b/StarRailUID/starrailuid_roleinfo/__init__.py @@ -1,13 +1,13 @@ import re -from gsuid_core.sv import SV from gsuid_core.bot import Bot -from gsuid_core.models import Event 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.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查询信息') @@ -40,4 +40,4 @@ async def send_detail_info(bot: Bot, ev: Event): logger.info(f'[sr查询信息]UID: {uid}') await bot.logger.info('开始执行[sr查询信息]') await bot.send(await get_detail_img(uid)) - return None \ No newline at end of file + return None diff --git a/StarRailUID/starrailuid_roleinfo/draw_roleinfo_card.py b/StarRailUID/starrailuid_roleinfo/draw_roleinfo_card.py index ad5b6eb..df8e2fd 100644 --- a/StarRailUID/starrailuid_roleinfo/draw_roleinfo_card.py +++ b/StarRailUID/starrailuid_roleinfo/draw_roleinfo_card.py @@ -1,17 +1,30 @@ import asyncio 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 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 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' @@ -242,7 +255,7 @@ async def draw_role_card(sr_uid: str) -> Union[bytes, str]: return await convert_img(img) async def _draw_detail_card( - avatar_detail, avatar, index, char_info + avatar_detail: AvatarDetail, avatar: AvatarListItemDetail, index: int, char_info: Image.Image ) -> Image.Image: if str(avatar.rarity) == '5': bg_color = (255, 240, 211) @@ -261,7 +274,7 @@ async def _draw_detail_card( 'lm', ) avatar_img.paste(element_icon, (195, 10), mask=element_icon) - + avatar_draw.text( (270, 25), f'{avatar.level}', @@ -269,7 +282,7 @@ async def _draw_detail_card( sr_font_24, 'mm', ) - + avatar_draw.text( (325, 25), f'{avatar.rank}', @@ -277,76 +290,75 @@ async def _draw_detail_card( sr_font_24, 'mm', ) - + avatar_draw.text( (380, 25), - f"{avatar_detail['skills'][0]['cur_level']}", + f'{avatar_detail.skills[0].cur_level}', first_color, sr_font_24, 'mm', ) - + avatar_draw.text( (430, 25), - f"{avatar_detail['skills'][1]['cur_level']}", + f'{avatar_detail.skills[1].cur_level}', first_color, sr_font_24, 'mm', ) - + avatar_draw.text( (485, 25), - f"{avatar_detail['skills'][2]['cur_level']}", + f'{avatar_detail.skills[2].cur_level}', first_color, sr_font_24, 'mm', ) - + avatar_draw.text( (540, 25), - f"{avatar_detail['skills'][3]['cur_level']}", + f'{avatar_detail.skills[3].cur_level}', first_color, sr_font_24, 'mm', ) - + if avatar.equip: - + equip_icon = (await get_icon(avatar.equip.icon)).resize((40, 40)) avatar_img.paste(equip_icon, (580, 5), mask=equip_icon) - + avatar_draw.text( (640, 25), - f"{avatar.equip.rank}", + f'{avatar.equip.rank}', first_color, sr_font_24, 'lm', ) - + avatar_draw.text( (680, 25), - f"Lv{avatar.equip.level}", + f'Lv{avatar.equip.level}', first_color, sr_font_24, 'lm', ) - + avatar_draw.text( (750, 25), - f"{avatar.equip.name}", + f'{avatar.equip.name}', first_color, sr_font_24, 'lm', ) - + char_info.paste(avatar_img, (15, 211 + 51 * index), mask=avatar_img) - + return char_info 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): return get_error(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 = char_info.resize((1050, img_height)) char_img_draw = ImageDraw.Draw(char_info) - + char_img_draw.text( (50, 70), 'sr角色练度统计', @@ -362,7 +374,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_40, 'lm', ) - + char_img_draw.text( (50, 120), f'UID:{sr_uid} 共{avatar_num}名角色', @@ -370,7 +382,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_28, 'lm', ) - + title_img = Image.new('RGBA', (1020, 60), (0, 0, 0, 150)) char_info.paste(title_img, (15, 150), mask=title_img) char_img_draw.text( @@ -380,7 +392,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_26, 'mm', ) - + char_img_draw.text( (220, 180), '属性', @@ -388,7 +400,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_26, 'mm', ) - + char_img_draw.text( (285, 180), 'LV', @@ -396,7 +408,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_26, 'mm', ) - + char_img_draw.text( (340, 180), '星魂', @@ -404,7 +416,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_26, 'mm', ) - + char_img_draw.text( (395, 180), 'N', @@ -412,7 +424,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_26, 'mm', ) - + char_img_draw.text( (445, 180), 'B', @@ -420,7 +432,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_26, 'mm', ) - + char_img_draw.text( (500, 180), 'U', @@ -428,7 +440,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_26, 'mm', ) - + char_img_draw.text( (555, 180), 'T', @@ -436,7 +448,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: sr_font_26, 'mm', ) - + char_img_draw.text( (745, 180), '光锥', @@ -445,12 +457,17 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: 'mm', ) 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): return get_error(avatar_detail) # 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( (525, img_height - 40), @@ -459,7 +476,7 @@ async def get_detail_card(sr_uid: str) -> Union[bytes, str]: fw_font_28, 'mm', ) - + res = await convert_img(char_info) logger.info('[查询练度统计]绘图已完成,等待发送!') return res diff --git a/StarRailUID/starrailuid_roleinfo/utils.py b/StarRailUID/starrailuid_roleinfo/utils.py index 89afb1a..b21d117 100644 --- a/StarRailUID/starrailuid_roleinfo/utils.py +++ b/StarRailUID/starrailuid_roleinfo/utils.py @@ -1,10 +1,10 @@ from io import BytesIO 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 gsuid_core.data_store import get_res_path +from PIL import Image T = TypeVar('T') diff --git a/StarRailUID/utils/mys_api.py b/StarRailUID/utils/mys_api.py index 60b578f..aa17147 100644 --- a/StarRailUID/utils/mys_api.py +++ b/StarRailUID/utils/mys_api.py @@ -1,38 +1,39 @@ import copy -import time import random -from string import digits, ascii_letters -from typing import Any, Dict, Union, Literal, Optional +import time +from string import ascii_letters, digits +from typing import Any, Dict, Literal, Optional, Union 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.tools import ( - mys_version, _random_int_ds, generate_os_ds, 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.models import ( - MysSign, + AbyssData, + AvatarDetail, + AvatarInfo, + DailyNoteData, GachaLog, + MonthlyAward, + MysSign, + RogueData, + RogueLocustData, + RoleBasicInfo, + RoleIndex, SignInfo, SignList, - AbyssData, - RogueData, - RoleIndex, - AvatarInfo, - MonthlyAward, - DailyNoteData, - RoleBasicInfo, WidgetStamina, - RogueLocustData, ) +from .api import srdbsqla RECOGNIZE_SERVER = { '1': 'prod_gf_cn', @@ -285,28 +286,7 @@ class MysApi(_MysApi): data = msgspec.convert(data['data'], type=AvatarInfo) # data = cast(AvatarInfo, data['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( self, uid: str, avatarid: str ): @@ -325,9 +305,9 @@ class MysApi(_MysApi): header=self._HEADER, ) if isinstance(data, Dict): - data = data['data'] + data = msgspec.convert(data['data'], type=AvatarDetail) return data - + async def get_sign_list(self, uid) -> Union[SignList, int]: is_os = self.check_os(uid) if is_os: