diff --git a/StarRailUID/starrailuid_charinfo/draw_char_img.py b/StarRailUID/starrailuid_charinfo/draw_char_img.py index e6df86e..915d65b 100644 --- a/StarRailUID/starrailuid_charinfo/draw_char_img.py +++ b/StarRailUID/starrailuid_charinfo/draw_char_img.py @@ -10,6 +10,7 @@ from gsuid_core.logger import logger from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.image_tools import draw_text_by_line +from .to_data import api_to_dict from .mono.Character import Character from ..utils.error_reply import CHAR_HINT from ..utils.map.SR_MAP_PATH import RelicId2Rarity @@ -580,6 +581,8 @@ async def get_char_data( player_path = PLAYER_PATH / str(sr_uid) SELF_PATH = player_path / 'SELF' char_name = await alias_to_char_name(char_name) + if char_name is False: + return "请输入正确的角色名" char_path = player_path / f'{char_name}.json' char_self_path = SELF_PATH / f'{char_name}.json' if char_path.exists(): @@ -587,7 +590,15 @@ async def get_char_data( elif enable_self and char_self_path.exists(): path = char_self_path else: - return CHAR_HINT.format(char_name) + im = await api_to_dict(sr_uid) + print(str(im)) + if str(char_name) in im: + if char_path.exists(): + path = char_path + elif enable_self and char_self_path.exists(): + path = char_self_path + else: + return CHAR_HINT.format(char_name, char_name) with open(path, 'r', encoding='utf8') as fp: char_data = json.load(fp) diff --git a/StarRailUID/starrailuid_charinfo/texture2D/204.png b/StarRailUID/starrailuid_charinfo/texture2D/204.png new file mode 100644 index 0000000..6ea825a Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/204.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/500.png b/StarRailUID/starrailuid_charinfo/texture2D/500.png new file mode 100644 index 0000000..9dddc25 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/500.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_card_4.png b/StarRailUID/starrailuid_charinfo/texture2D/char_card_4.png new file mode 100644 index 0000000..fa3a5e8 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_card_4.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_card_5.png b/StarRailUID/starrailuid_charinfo/texture2D/char_card_5.png new file mode 100644 index 0000000..f72bb2d Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_card_5.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_info_1.png b/StarRailUID/starrailuid_charinfo/texture2D/char_info_1.png new file mode 100644 index 0000000..246e75b Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_info_1.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_info_2.png b/StarRailUID/starrailuid_charinfo/texture2D/char_info_2.png new file mode 100644 index 0000000..a7c33c3 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_info_2.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_info_artifacts.png b/StarRailUID/starrailuid_charinfo/texture2D/char_info_artifacts.png new file mode 100644 index 0000000..d231f38 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_info_artifacts.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_info_mask.png b/StarRailUID/starrailuid_charinfo/texture2D/char_info_mask.png new file mode 100644 index 0000000..0a1e40c Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_info_mask.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_mask.png b/StarRailUID/starrailuid_charinfo/texture2D/char_mask.png new file mode 100644 index 0000000..280f2a1 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_mask.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_rank.png b/StarRailUID/starrailuid_charinfo/texture2D/char_rank.png new file mode 100644 index 0000000..eee578f Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_rank.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/char_rank_title.png b/StarRailUID/starrailuid_charinfo/texture2D/char_rank_title.png new file mode 100644 index 0000000..768561f Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/char_rank_title.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/footbar.png b/StarRailUID/starrailuid_charinfo/texture2D/footbar.png new file mode 100644 index 0000000..c97e10a Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/footbar.png differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/shin-w.jpg b/StarRailUID/starrailuid_charinfo/texture2D/shin-w.jpg new file mode 100644 index 0000000..b097170 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/shin-w.jpg differ diff --git a/StarRailUID/starrailuid_charinfo/texture2D/tag.png b/StarRailUID/starrailuid_charinfo/texture2D/tag.png new file mode 100644 index 0000000..bcf7e25 Binary files /dev/null and b/StarRailUID/starrailuid_charinfo/texture2D/tag.png differ diff --git a/StarRailUID/starrailuid_charinfo/to_card.py b/StarRailUID/starrailuid_charinfo/to_card.py index 07ada81..dd32362 100644 --- a/StarRailUID/starrailuid_charinfo/to_card.py +++ b/StarRailUID/starrailuid_charinfo/to_card.py @@ -1,150 +1,139 @@ -# import asyncio -# from pathlib import Path -from typing import Union, Optional +import asyncio +from pathlib import Path +from typing import List, Union, Optional -# -# from PIL import Image, ImageDraw +from PIL import Image, ImageDraw from gsuid_core.utils.api.enka.models import EnkaData -# from .to_data import api_to_dict +from ..utils.image.convert import convert_img +from ..utils.resource.RESOURCE_PATH import CHAR_ICON_PATH +from ..utils.fonts.starrail_fonts import sr_font_18, sr_font_58 +from ..utils.map.name_covert import name_to_avatar_id, avatar_id_to_char_star + +half_color = (255, 255, 255, 120) +first_color = (29, 29, 29) +second_color = (67, 61, 56) +white_color = (247, 247, 247) -# from ..utils.image.convert import convert_img -# from ..utils.resource.RESOURCE_PATH import CHAR_ICON_PATH -# from ..utils.fonts.genshin_fonts import gs_font_18, gs_font_58 -# from ..utils.map.name_covert import name_to_avatar_id, -# avatar_id_to_char_star -# -# half_color = (255, 255, 255, 120) -# first_color = (29, 29, 29) -# second_color = (67, 61, 56) -# white_color = (247, 247, 247) -# # MAP_PATH = Path(__file__).parent / 'map' -# TEXT_PATH = Path(__file__).parent / 'texture2D' -# char_mask = Image.open(TEXT_PATH / 'char_mask.png') -# tag = Image.open(TEXT_PATH / 'tag.png') -# footbar = Image.open(TEXT_PATH / 'footbar.png') -# pic_500 = Image.open(TEXT_PATH / '500.png') -# pic_204 = Image.open(TEXT_PATH / '204.png') -# +TEXT_PATH = Path(__file__).parent / 'texture2D' +char_mask = Image.open(TEXT_PATH / 'char_mask.png') +tag = Image.open(TEXT_PATH / 'tag.png') +footbar = Image.open(TEXT_PATH / 'footbar.png') +pic_500 = Image.open(TEXT_PATH / '500.png') +pic_204 = Image.open(TEXT_PATH / '204.png') async def api_to_card( uid: str, enka_data: Optional[EnkaData] = None ) -> Union[str, bytes]: char_data_list = await api_to_dict(uid, enka_data) - return char_data_list + if isinstance(char_data_list, str): + if ('服务器正在维护或者关闭中' in char_data_list) or ('网络不太稳定' in char_data_list): + return await convert_img(pic_500) + elif '未打开角色展柜' in char_data_list: + return await convert_img(pic_204) + else: + return await convert_img(pic_500) + else: + if char_data_list == []: + return await convert_img(pic_500) + + img = await draw_enka_card(uid=uid, char_list=char_data_list, showfrom=1) + return img -# if isinstance(char_data_list, str): -# if '服务器正在维护或者关闭中' in char_data_list: -# return await convert_img(pic_500) -# elif '未打开角色展柜' in char_data_list: -# return await convert_img(pic_204) -# else: -# return await convert_img(pic_500) -# else: -# if char_data_list == []: -# return await convert_img(pic_500) -# -# img = await draw_enka_card(uid=uid, char_data_list=char_data_list) -# return img -# -# -# async def draw_enka_card( -# uid: str, -# char_data_list: Optional[List] = None, -# char_list: Optional[List] = None, -# ): -# if char_list: -# char_data_list = [] -# for char in char_list: -# char_data_list.append( -# {'avatarName': char, -# arId': await name_to_avatar_id(char)} -# ) -# line1 = f'展柜内有 {len(char_data_list)} 个角色!' -# else: -# if char_data_list is None: -# return await convert_img( -# Image.new('RGBA', (0, 1), (255, 255, 255)) -# ) -# else: -# line1 = '刷新成功!' -# -# ta_list[0]["avatarName"]} 命令进行查询!' -# char_num = len(char_data_list) -# if char_num <= 8: -# based_w, based_h = 1000, 240 + ((char_num + 3) // 4) * 220 -# else: -# based_w, based_h = 1200, 660 + (char_num - 5) // 5 * 110 -# if (char_num - 5) % 5 >= 4: -# based_h += 110 -# -# img = Image.open(TEXT_PATH / 'shin-w.jpg').resize((based_w, based_h)) -# img.paste(tag, (0, 0), tag) -# img.paste(footbar, ((based_w - 800) // 2, based_h - 36), footbar) -# img_draw = ImageDraw.Draw(img, 'RGBA') -# -# img_draw.text( -# (97, 98), -# line1, -# white_color, -# gs_font_58, -# 'lm', -# ) -# img_draw.text( -# (99, 140), -# line2, -# white_color, -# gs_font_18, -# 'lm', -# ) -# tasks = [] -# for index, char_data in enumerate(char_data_list): -# tasks.append(draw_enka_char(index, img, char_data)) -# await asyncio.gather(*tasks) -# img = await convert_img(img) -# return img -# -# -# async def draw_enka_char(index: int, img: Image.Image, char_data: dict): -# char_id = char_data['avatarId'] -# char_star = await avatar_id_to_char_star(str(char_id)) -# char_card = Image.open(TEXT_PATH / f'char_card_{char_star}.png') -# char_img = ( -# Image.open(str(CHAR_PATH / f'{char_id}.png')) -# .convert('RGBA') -# .resize((204, 204)) -# ) -# char_temp = Image.new('RGBA', (220, 220)) -# char_temp.paste(char_img, (8, 8), char_img) -# char_card.paste(char_temp, (0, 0), char_mask) -# if index <= 7: -# if img.size[0] <= 1100: -# x = 60 + (index % 4) * 220 -# else: -# x = 160 + (index % 4) * 220 -# img.paste( -# char_card, -# (x, 187 + (index // 4) * 220), -# char_card, -# ) -# elif index <= 12: -# img.paste( -# char_card, -# (50 + (index % 8) * 220, 296), -# char_card, -# ) -# else: -# _i = index - 13 -# x, y = 50 + (_i % 9) * 220, 512 + (_i // 9) * 220 -# if _i % 9 >= 5: -# y += 110 -# x = 160 + ((_i - 5) % 9) * 220 -# img.paste( -# char_card, -# (x, y), -# char_card, -# ) +async def draw_enka_card( + uid: str, char_list: Optional[List] = None, showfrom: int = 0 +): + char_data_list = [] + for char in char_list: + char_data_list.append( + {'avatarName': char, 'avatarId': await name_to_avatar_id(char)} + ) + if showfrom == 0: + line1 = f'展柜内有 {len(char_data_list)} 个角色!' + else: + if char_data_list is None: + return await convert_img( + Image.new('RGBA', (0, 1), (255, 255, 255)) + ) + else: + line1 = '刷新成功!' + print(char_data_list[0]["avatarName"]) + line2 = f'UID {str(uid)}请使用 sr查询{char_data_list[0]["avatarName"]} 命令进行查询!' + char_num = len(char_data_list) + if char_num <= 8: + based_w, based_h = 1000, 240 + ((char_num + 3) // 4) * 220 + else: + based_w, based_h = 1200, 660 + (char_num - 5) // 5 * 110 + if (char_num - 5) % 5 >= 4: + based_h += 110 + + img = Image.open(TEXT_PATH / 'shin-w.jpg').resize((based_w, based_h)) + img.paste(tag, (0, 0), tag) + # img.paste(footbar, ((based_w - 800) // 2, based_h - 36), footbar) + img_draw = ImageDraw.Draw(img, 'RGBA') + + img_draw.text( + (97, 98), + line1, + white_color, + sr_font_58, + 'lm', + ) + img_draw.text( + (99, 140), + line2, + white_color, + sr_font_18, + 'lm', + ) + tasks = [] + for index, char_data in enumerate(char_data_list): + tasks.append(draw_enka_char(index, img, char_data)) + await asyncio.gather(*tasks) + img = await convert_img(img) + return img + + +async def draw_enka_char(index: int, img: Image.Image, char_data: dict): + char_id = char_data['avatarId'] + char_star = await avatar_id_to_char_star(str(char_id)) + char_card = Image.open(TEXT_PATH / f'char_card_{char_star}.png') + char_img = ( + Image.open(str(CHAR_ICON_PATH / f'{char_id}.png')) + .convert('RGBA') + .resize((204, 204)) + ) + char_temp = Image.new('RGBA', (220, 220)) + char_temp.paste(char_img, (8, 8), char_img) + char_card.paste(char_temp, (0, 0), char_mask) + if index <= 7: + if img.size[0] <= 1100: + x = 60 + (index % 4) * 220 + else: + x = 160 + (index % 4) * 220 + img.paste( + char_card, + (x, 187 + (index // 4) * 220), + char_card, + ) + elif index <= 12: + img.paste( + char_card, + (50 + (index % 8) * 220, 296), + char_card, + ) + else: + _i = index - 13 + x, y = 50 + (_i % 9) * 220, 512 + (_i // 9) * 220 + if _i % 9 >= 5: + y += 110 + x = 160 + ((_i - 5) % 9) * 220 + img.paste( + char_card, + (x, y), + char_card, + ) diff --git a/StarRailUID/starrailuid_charinfo/to_data.py b/StarRailUID/starrailuid_charinfo/to_data.py index 31cff4a..8e8d755 100644 --- a/StarRailUID/starrailuid_charinfo/to_data.py +++ b/StarRailUID/starrailuid_charinfo/to_data.py @@ -83,18 +83,19 @@ async def api_to_dict( PlayerDetailInfo['AssistAvatar'], sr_data, sr_uid ) im += f'支援角色 {avatarName}\n' - char_dict_list.append(char_dict) + char_dict_list.append(avatarName) if PlayerDetailInfo.get('DisplayAvatarList'): im += '星海同行' for char in PlayerDetailInfo['DisplayAvatarList']: char_dict, avatarName = await get_data(char, sr_data, sr_uid) im += f' {avatarName}' - char_dict_list.append(char_dict) + char_dict_list.append(avatarName) if not char_dict_list: im = f'UID: {sr_uid} 的角色展柜刷新失败!\n请检查UID是否正确或者角色展柜是否打开!' + return im - return im + return char_dict_list async def get_data(char: dict, sr_data: dict, sr_uid: str): diff --git a/StarRailUID/utils/error_reply.py b/StarRailUID/utils/error_reply.py index 604e024..85ffb25 100644 --- a/StarRailUID/utils/error_reply.py +++ b/StarRailUID/utils/error_reply.py @@ -4,7 +4,7 @@ UID_HINT = '你还没有绑定过uid哦!\n请使用[sr绑定uid123456]命令绑 MYS_HINT = '你还没有绑定过mysid哦!\n请使用[绑定mys1234]命令绑定!' CK_HINT = """你还没有绑定过Cookie哦!发送【ck帮助】获取帮助! 警告:绑定Cookie可能会带来未知的账号风险,请确保信任机器人管理员""" -CHAR_HINT = '你还没有{}的缓存噢!\n请先使用【sr强制刷新】命令来缓存数据! \n或者使用【sr查询展柜角色】命令查看已缓存角色!' +CHAR_HINT = '您的支援/星海同行角色没有{}的数据哦!\n请先把{}放入支援/星海同行中再使用【sr强制刷新】命令来缓存数据进行查询! !' VERIFY_HINT = '''出现验证码! 如已绑定CK: 请至米游社软件->我的->我的角色处解锁验证码 (可使用[gs关闭推送]命令关闭体力推送以减少出现验证码风险) diff --git a/StarRailUID/utils/map/SR_MAP_PATH.py b/StarRailUID/utils/map/SR_MAP_PATH.py index 32dabe1..70530a0 100644 --- a/StarRailUID/utils/map/SR_MAP_PATH.py +++ b/StarRailUID/utils/map/SR_MAP_PATH.py @@ -18,6 +18,7 @@ skillId2Type_fileName = f'skillId2Type_mapping_{version}.json' Property2Name_fileName = 'Property2Name.json' RelicId2SetId_fileName = f'RelicId2SetId_mapping_{version}.json' SetId2Name_fileName = f'SetId2Name_mapping_{version}.json' +avatarId2Star_fileName = f'avatarId2Star_mapping_{version}.json' rankId2Name_fileName = f'rankId2Name_mapping_{version}.json' characterSkillTree_fileName = f'characterSkillTree_mapping_{version}.json' avatarId2DamageType_fileName = f'avatarId2DamageType_mapping_{version}.json' @@ -101,6 +102,9 @@ with open(MAP / EquipmentID2Rarity_fileName, 'r', encoding='UTF-8') as f: with open(MAP / RelicId2Rarity_fileName, 'r', encoding='UTF-8') as f: RelicId2Rarity = msgjson.decode(f.read(), type=Dict[str, int]) +with open(MAP / avatarId2Star_fileName, 'r', encoding='utf8') as f: + avatarId2Star_data = msgjson.decode(f.read(), type=Dict[str, str]) + with open(MAP / ItemId2Name_fileName, 'r', encoding='UTF-8') as f: ItemId2Name = msgjson.decode(f.read(), type=Dict[str, str]) diff --git a/StarRailUID/utils/map/data/avatarId2Star_mapping_1.0.5.json b/StarRailUID/utils/map/data/avatarId2Star_mapping_1.0.5.json new file mode 100644 index 0000000..1f28314 --- /dev/null +++ b/StarRailUID/utils/map/data/avatarId2Star_mapping_1.0.5.json @@ -0,0 +1 @@ +{"1001": "4", "1002": "4", "1003": "5", "1004": "5", "1005": "5", "1006": "5", "1008": "4", "1009": "4", "1013": "4", "1101": "5", "1102": "5", "1103": "4", "1104": "5", "1105": "4", "1106": "4", "1107": "5", "1108": "4", "1109": "4", "1201": "4", "1202": "4", "1203": "5", "1204": "5", "1206": "4", "1209": "5", "1211": "5", "8001": "5", "8002": "5", "8003": "5", "8004": "5"} \ No newline at end of file diff --git a/StarRailUID/utils/map/name_covert.py b/StarRailUID/utils/map/name_covert.py index 3431e81..426475e 100644 --- a/StarRailUID/utils/map/name_covert.py +++ b/StarRailUID/utils/map/name_covert.py @@ -3,6 +3,7 @@ from .SR_MAP_PATH import ( EquipmentID2EnName, alias_data, avatarId2Name, + avatarId2Star_data, ) @@ -20,11 +21,16 @@ async def name_to_avatar_id(name: str) -> str: return avatar_id +async def avatar_id_to_char_star(char_id: str) -> str: + char_star = avatarId2Star_data[str(char_id)] + return char_star + + async def alias_to_char_name(char_name: str) -> str: for i in alias_data['characters']: if char_name in alias_data['characters'][i]: return alias_data['characters'][i][0] - return char_name + return False async def weapon_id_to_name(weapon_id: str) -> str: