sr强制刷新简单画图,初次sr查询刷新缓存 (#16)
* 别名查询修改 * 别名查询修改 * add some functions * 别名查询修改 * 🚨 `pre-commit-ci`修复格式错误 * 修改别名 * 🚨 `pre-commit-ci`修复格式错误 * 修改别名 * 🚨 `pre-commit-ci`修复格式错误 * Add files via upload * 🚨 `pre-commit-ci`修复格式错误 * 修复别名查询 * 🚨 `pre-commit-ci`修复格式错误 * 修复别名查询 * 🚨 `pre-commit-ci`修复格式错误 * 修复别名查询 * 修复角色别名 * 🚨 `pre-commit-ci`修复格式错误 * 别名查询修复 * 🚨 `pre-commit-ci`修复格式错误 * 强制刷新画图,查询修改 * 🚨 `pre-commit-ci`修复格式错误 * Add files via upload * 🚨 `pre-commit-ci`修复格式错误 * Update draw_char_img.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
@ -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)
|
||||
|
BIN
StarRailUID/starrailuid_charinfo/texture2D/204.png
Normal file
After Width: | Height: | Size: 414 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/500.png
Normal file
After Width: | Height: | Size: 407 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/char_card_4.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/char_card_5.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/char_info_1.png
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/char_info_2.png
Normal file
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 1.1 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/char_info_mask.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/char_mask.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/char_rank.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/char_rank_title.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/footbar.png
Normal file
After Width: | Height: | Size: 8.2 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/shin-w.jpg
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
StarRailUID/starrailuid_charinfo/texture2D/tag.png
Normal file
After Width: | Height: | Size: 39 KiB |
@ -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,
|
||||
)
|
||||
|
@ -83,19 +83,20 @@ 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 char_dict_list
|
||||
|
||||
|
||||
async def get_data(char: dict, sr_data: dict, sr_uid: str):
|
||||
PlayerDetailInfo = sr_data['PlayerDetailInfo']
|
||||
|
@ -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关闭推送]命令关闭体力推送以减少出现验证码风险)
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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"}
|
@ -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:
|
||||
|