diff --git a/StarRailUID/sruid_utils/api/mys/api.py b/StarRailUID/sruid_utils/api/mys/api.py index 42fee88..9879a77 100644 --- a/StarRailUID/sruid_utils/api/mys/api.py +++ b/StarRailUID/sruid_utils/api/mys/api.py @@ -46,6 +46,9 @@ STAR_RAIL_AVATAR_INFO_URL_OS = ( f'{OS_INFO_URL}/game_record/hkrpg/api/avatar/info' # OS角色详细信息接口 ) +STAR_RAIL_AVATAR_LIST_URL = f'{OLD_URL}/event/rpgcalc/avatar/list' +STAR_RAIL_AVATAR_DETAIL_URL = f'{OLD_URL}/event/rpgcalc/avatar/detail' + CHALLENGE_INFO_URL = f'{NEW_URL}/game_record/app/hkrpg/api/challenge' CHALLENGE_INFO_URL_OS = f'{OS_INFO_URL}/game_record/hkrpg/api/challenge' diff --git a/StarRailUID/starrailuid_roleinfo/__init__.py b/StarRailUID/starrailuid_roleinfo/__init__.py index d9cd10c..e002907 100644 --- a/StarRailUID/starrailuid_roleinfo/__init__.py +++ b/StarRailUID/starrailuid_roleinfo/__init__.py @@ -7,7 +7,7 @@ from gsuid_core.logger import logger from ..utils.convert import get_uid from ..utils.sr_prefix import PREFIX -from .draw_roleinfo_card import get_role_img +from .draw_roleinfo_card import get_role_img, get_detail_img sv_get_info = SV('sr查询信息') @@ -26,3 +26,18 @@ async def send_role_info(bot: Bot, ev: Event): await bot.logger.info('开始执行[sr查询信息]') await bot.send(await get_role_img(uid)) return None + +@sv_get_info.on_command(f'{PREFIX}练度统计') +async def send_role_info(bot: Bot, ev: Event): + name = ''.join(re.findall('[\u4e00-\u9fa5]', ev.text)) + if name: + return None + + uid = await get_uid(bot, ev) + if uid is None: + return '你还没有绑定UID噢,请使用[sr绑定uid123]完成绑定!' + + 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 diff --git a/StarRailUID/starrailuid_roleinfo/draw_roleinfo_card.py b/StarRailUID/starrailuid_roleinfo/draw_roleinfo_card.py index 9e53b94..e348948 100644 --- a/StarRailUID/starrailuid_roleinfo/draw_roleinfo_card.py +++ b/StarRailUID/starrailuid_roleinfo/draw_roleinfo_card.py @@ -8,8 +8,10 @@ from gsuid_core.utils.error_reply import get_error 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_30, sr_font_36 +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' @@ -22,7 +24,7 @@ user_avatar = ( char_bg_4 = Image.open(TEXT_PATH / 'rarity4_bg.png').convert('RGBA') char_bg_5 = Image.open(TEXT_PATH / 'rarity5_bg.png').convert('RGBA') circle = Image.open(TEXT_PATH / 'char_weapon_bg.png').convert('RGBA') - +bg_img = Image.open(TEXT_PATH / 'bg.png') bg_color = (248, 248, 248) white_color = (255, 255, 255) color_color = (40, 18, 7) @@ -50,6 +52,8 @@ elements = { async def get_role_img(uid: str) -> Union[bytes, str]: return await draw_role_card(uid) +async def get_detail_img(uid: str) -> Union[bytes, str]: + return await get_detail_card(uid) def _lv(level: int) -> str: return f'Lv.0{level}' if level < 10 else f'Lv.{level}' @@ -236,3 +240,224 @@ async def draw_role_card(sr_uid: str) -> Union[bytes, str]: img.paste(img2, (0, 810)) img.paste(bg3, (0, height + 810)) return await convert_img(img) + +async def _draw_detail_card( + avatar_detail, avatar, index, char_info +) -> Image.Image: + if str(avatar.rarity) == '5': + bg_color = (255, 240, 211) + else: + bg_color = (239, 222, 255) + avatar_img = Image.new('RGBA', (1020, 50), bg_color) + avatar_draw = ImageDraw.Draw(avatar_img) + char_icon = (await get_icon(avatar.icon)).resize((40, 40)) + element_icon = elements[avatar.element] + avatar_img.paste(char_icon, (5, 5), mask=char_icon) + avatar_draw.text( + (60, 25), + f'{avatar.name}', + first_color, + sr_font_24, + 'lm', + ) + avatar_img.paste(element_icon, (195, 10), mask=element_icon) + + avatar_draw.text( + (270, 25), + f'{avatar.level}', + first_color, + sr_font_24, + 'mm', + ) + + avatar_draw.text( + (325, 25), + f'{avatar.rank}', + first_color, + sr_font_24, + 'mm', + ) + + avatar_draw.text( + (380, 25), + 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']}", + first_color, + sr_font_24, + 'mm', + ) + + avatar_draw.text( + (485, 25), + 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']}", + 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}", + first_color, + sr_font_24, + 'lm', + ) + + avatar_draw.text( + (680, 25), + f"Lv{avatar.equip.level}", + first_color, + sr_font_24, + 'lm', + ) + + avatar_draw.text( + (750, 25), + 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_num = len(avatar_list.avatar_list) + img_height = 300 + avatar_num * 51 + 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角色练度统计', + white_color, + sr_font_40, + 'lm', + ) + + char_img_draw.text( + (50, 120), + f'UID:{sr_uid} 共{avatar_num}名角色', + white_color, + 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( + (115, 180), + '角色', + white_color, + sr_font_26, + 'mm', + ) + + char_img_draw.text( + (220, 180), + '属性', + white_color, + sr_font_26, + 'mm', + ) + + char_img_draw.text( + (285, 180), + 'LV', + white_color, + sr_font_26, + 'mm', + ) + + char_img_draw.text( + (340, 180), + '星魂', + white_color, + sr_font_26, + 'mm', + ) + + char_img_draw.text( + (395, 180), + 'N', + white_color, + sr_font_26, + 'mm', + ) + + char_img_draw.text( + (445, 180), + 'B', + white_color, + sr_font_26, + 'mm', + ) + + char_img_draw.text( + (500, 180), + 'U', + white_color, + sr_font_26, + 'mm', + ) + + char_img_draw.text( + (555, 180), + 'T', + white_color, + sr_font_26, + 'mm', + ) + + char_img_draw.text( + (745, 180), + '光锥', + white_color, + sr_font_26, + 'mm', + ) + for index, avatar in enumerate(avatar_list.avatar_list): + avatar_detail = await mys_api.get_avatar_detail(sr_uid, 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_img_draw.text( + (525, img_height - 40), + '--Created by qwerdvd-Designed By Wuyi-Thank for mihomo.me--', + (255, 255, 255), + fw_font_28, + 'mm', + ) + + res = await convert_img(char_info) + logger.info('[查询练度统计]绘图已完成,等待发送!') + return res diff --git a/StarRailUID/starrailuid_roleinfo/texture2D/bg.png b/StarRailUID/starrailuid_roleinfo/texture2D/bg.png new file mode 100644 index 0000000..b55303c Binary files /dev/null and b/StarRailUID/starrailuid_roleinfo/texture2D/bg.png differ diff --git a/StarRailUID/utils/mys_api.py b/StarRailUID/utils/mys_api.py index adc3635..60b578f 100644 --- a/StarRailUID/utils/mys_api.py +++ b/StarRailUID/utils/mys_api.py @@ -70,7 +70,9 @@ class MysApi(_MysApi): async def get_user_fp(self, uid: str) -> Optional[str]: data = await GsUser.get_user_attr_by_uid(uid, 'fp', 'sr') if data is None: - data = await self.generate_fp_by_uid(uid) + seed_id, seed_time = self.get_seed() + model_name = self.generate_model_name() + data = await self.generate_fp_by_uid(uid, seed_id, seed_time, model_name) await GsUser.update_data_by_uid_without_bot_id(uid, 'sr', fp=data) return data @@ -283,7 +285,49 @@ 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 + ): + data = await self.simple_mys_req( + 'STAR_RAIL_AVATAR_DETAIL_URL', + uid, + params={ + 'game': 'hkrpg', + 'lang': 'zh-cn', + 'item_id': avatarid, + 'tab_from': 'TabOwned', + 'change_target_level': '0', + 'uid': uid, + 'region': RECOGNIZE_SERVER.get(str(uid)[0], 'prod_gf_cn'), + }, + header=self._HEADER, + ) + if isinstance(data, Dict): + data = data['data'] + return data + async def get_sign_list(self, uid) -> Union[SignList, int]: is_os = self.check_os(uid) if is_os: