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>
This commit is contained in:
季落 2023-05-14 22:43:12 +08:00 committed by GitHub
parent b6243b16aa
commit 46eaee3eb0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 154 additions and 142 deletions

View File

@ -10,6 +10,7 @@ from gsuid_core.logger import logger
from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.convert import convert_img
from gsuid_core.utils.image.image_tools import draw_text_by_line 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 .mono.Character import Character
from ..utils.error_reply import CHAR_HINT from ..utils.error_reply import CHAR_HINT
from ..utils.map.SR_MAP_PATH import RelicId2Rarity from ..utils.map.SR_MAP_PATH import RelicId2Rarity
@ -580,6 +581,8 @@ async def get_char_data(
player_path = PLAYER_PATH / str(sr_uid) player_path = PLAYER_PATH / str(sr_uid)
SELF_PATH = player_path / 'SELF' SELF_PATH = player_path / 'SELF'
char_name = await alias_to_char_name(char_name) char_name = await alias_to_char_name(char_name)
if char_name is False:
return "请输入正确的角色名"
char_path = player_path / f'{char_name}.json' char_path = player_path / f'{char_name}.json'
char_self_path = SELF_PATH / f'{char_name}.json' char_self_path = SELF_PATH / f'{char_name}.json'
if char_path.exists(): if char_path.exists():
@ -587,7 +590,15 @@ async def get_char_data(
elif enable_self and char_self_path.exists(): elif enable_self and char_self_path.exists():
path = char_self_path path = char_self_path
else: 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: with open(path, 'r', encoding='utf8') as fp:
char_data = json.load(fp) char_data = json.load(fp)

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -1,150 +1,139 @@
# import asyncio import asyncio
# from pathlib import Path from pathlib import Path
from typing import Union, Optional 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 gsuid_core.utils.api.enka.models import EnkaData
#
from .to_data import api_to_dict 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' # MAP_PATH = Path(__file__).parent / 'map'
# TEXT_PATH = Path(__file__).parent / 'texture2D' TEXT_PATH = Path(__file__).parent / 'texture2D'
# char_mask = Image.open(TEXT_PATH / 'char_mask.png') char_mask = Image.open(TEXT_PATH / 'char_mask.png')
# tag = Image.open(TEXT_PATH / 'tag.png') tag = Image.open(TEXT_PATH / 'tag.png')
# footbar = Image.open(TEXT_PATH / 'footbar.png') footbar = Image.open(TEXT_PATH / 'footbar.png')
# pic_500 = Image.open(TEXT_PATH / '500.png') pic_500 = Image.open(TEXT_PATH / '500.png')
# pic_204 = Image.open(TEXT_PATH / '204.png') pic_204 = Image.open(TEXT_PATH / '204.png')
#
async def api_to_card( async def api_to_card(
uid: str, enka_data: Optional[EnkaData] = None uid: str, enka_data: Optional[EnkaData] = None
) -> Union[str, bytes]: ) -> Union[str, bytes]:
char_data_list = await api_to_dict(uid, enka_data) 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): async def draw_enka_card(
# if '服务器正在维护或者关闭中' in char_data_list: uid: str, char_list: Optional[List] = None, showfrom: int = 0
# return await convert_img(pic_500) ):
# elif '未打开角色展柜' in char_data_list: char_data_list = []
# return await convert_img(pic_204) for char in char_list:
# else: char_data_list.append(
# return await convert_img(pic_500) {'avatarName': char, 'avatarId': await name_to_avatar_id(char)}
# else: )
# if char_data_list == []: if showfrom == 0:
# return await convert_img(pic_500) line1 = f'展柜内有 {len(char_data_list)} 个角色!'
# else:
# img = await draw_enka_card(uid=uid, char_data_list=char_data_list) if char_data_list is None:
# return img return await convert_img(
# Image.new('RGBA', (0, 1), (255, 255, 255))
# )
# async def draw_enka_card( else:
# uid: str, line1 = '刷新成功!'
# char_data_list: Optional[List] = None, print(char_data_list[0]["avatarName"])
# char_list: Optional[List] = None, line2 = f'UID {str(uid)}请使用 sr查询{char_data_list[0]["avatarName"]} 命令进行查询!'
# ): char_num = len(char_data_list)
# if char_list: if char_num <= 8:
# char_data_list = [] based_w, based_h = 1000, 240 + ((char_num + 3) // 4) * 220
# for char in char_list: else:
# char_data_list.append( based_w, based_h = 1200, 660 + (char_num - 5) // 5 * 110
# {'avatarName': char, if (char_num - 5) % 5 >= 4:
# arId': await name_to_avatar_id(char)} based_h += 110
# )
# line1 = f'展柜内有 {len(char_data_list)} 个角色!' img = Image.open(TEXT_PATH / 'shin-w.jpg').resize((based_w, based_h))
# else: img.paste(tag, (0, 0), tag)
# if char_data_list is None: # img.paste(footbar, ((based_w - 800) // 2, based_h - 36), footbar)
# return await convert_img( img_draw = ImageDraw.Draw(img, 'RGBA')
# Image.new('RGBA', (0, 1), (255, 255, 255))
# ) img_draw.text(
# else: (97, 98),
# line1 = '刷新成功!' line1,
# white_color,
# ta_list[0]["avatarName"]} 命令进行查询!' sr_font_58,
# char_num = len(char_data_list) 'lm',
# if char_num <= 8: )
# based_w, based_h = 1000, 240 + ((char_num + 3) // 4) * 220 img_draw.text(
# else: (99, 140),
# based_w, based_h = 1200, 660 + (char_num - 5) // 5 * 110 line2,
# if (char_num - 5) % 5 >= 4: white_color,
# based_h += 110 sr_font_18,
# 'lm',
# img = Image.open(TEXT_PATH / 'shin-w.jpg').resize((based_w, based_h)) )
# img.paste(tag, (0, 0), tag) tasks = []
# img.paste(footbar, ((based_w - 800) // 2, based_h - 36), footbar) for index, char_data in enumerate(char_data_list):
# img_draw = ImageDraw.Draw(img, 'RGBA') tasks.append(draw_enka_char(index, img, char_data))
# await asyncio.gather(*tasks)
# img_draw.text( img = await convert_img(img)
# (97, 98), return img
# line1,
# white_color,
# gs_font_58, async def draw_enka_char(index: int, img: Image.Image, char_data: dict):
# 'lm', char_id = char_data['avatarId']
# ) char_star = await avatar_id_to_char_star(str(char_id))
# img_draw.text( char_card = Image.open(TEXT_PATH / f'char_card_{char_star}.png')
# (99, 140), char_img = (
# line2, Image.open(str(CHAR_ICON_PATH / f'{char_id}.png'))
# white_color, .convert('RGBA')
# gs_font_18, .resize((204, 204))
# 'lm', )
# ) char_temp = Image.new('RGBA', (220, 220))
# tasks = [] char_temp.paste(char_img, (8, 8), char_img)
# for index, char_data in enumerate(char_data_list): char_card.paste(char_temp, (0, 0), char_mask)
# tasks.append(draw_enka_char(index, img, char_data)) if index <= 7:
# await asyncio.gather(*tasks) if img.size[0] <= 1100:
# img = await convert_img(img) x = 60 + (index % 4) * 220
# return img else:
# x = 160 + (index % 4) * 220
# img.paste(
# async def draw_enka_char(index: int, img: Image.Image, char_data: dict): char_card,
# char_id = char_data['avatarId'] (x, 187 + (index // 4) * 220),
# char_star = await avatar_id_to_char_star(str(char_id)) char_card,
# char_card = Image.open(TEXT_PATH / f'char_card_{char_star}.png') )
# char_img = ( elif index <= 12:
# Image.open(str(CHAR_PATH / f'{char_id}.png')) img.paste(
# .convert('RGBA') char_card,
# .resize((204, 204)) (50 + (index % 8) * 220, 296),
# ) char_card,
# char_temp = Image.new('RGBA', (220, 220)) )
# char_temp.paste(char_img, (8, 8), char_img) else:
# char_card.paste(char_temp, (0, 0), char_mask) _i = index - 13
# if index <= 7: x, y = 50 + (_i % 9) * 220, 512 + (_i // 9) * 220
# if img.size[0] <= 1100: if _i % 9 >= 5:
# x = 60 + (index % 4) * 220 y += 110
# else: x = 160 + ((_i - 5) % 9) * 220
# x = 160 + (index % 4) * 220 img.paste(
# img.paste( char_card,
# char_card, (x, y),
# (x, 187 + (index // 4) * 220), char_card,
# 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,
# )

View File

@ -83,19 +83,20 @@ async def api_to_dict(
PlayerDetailInfo['AssistAvatar'], sr_data, sr_uid PlayerDetailInfo['AssistAvatar'], sr_data, sr_uid
) )
im += f'支援角色 {avatarName}\n' im += f'支援角色 {avatarName}\n'
char_dict_list.append(char_dict) char_dict_list.append(avatarName)
if PlayerDetailInfo.get('DisplayAvatarList'): if PlayerDetailInfo.get('DisplayAvatarList'):
im += '星海同行' im += '星海同行'
for char in PlayerDetailInfo['DisplayAvatarList']: for char in PlayerDetailInfo['DisplayAvatarList']:
char_dict, avatarName = await get_data(char, sr_data, sr_uid) char_dict, avatarName = await get_data(char, sr_data, sr_uid)
im += f' {avatarName}' im += f' {avatarName}'
char_dict_list.append(char_dict) char_dict_list.append(avatarName)
if not char_dict_list: if not char_dict_list:
im = f'UID: {sr_uid} 的角色展柜刷新失败!\n请检查UID是否正确或者角色展柜是否打开' 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): async def get_data(char: dict, sr_data: dict, sr_uid: str):
PlayerDetailInfo = sr_data['PlayerDetailInfo'] PlayerDetailInfo = sr_data['PlayerDetailInfo']

View File

@ -4,7 +4,7 @@ UID_HINT = '你还没有绑定过uid哦!\n请使用[sr绑定uid123456]命令绑
MYS_HINT = '你还没有绑定过mysid哦!\n请使用[绑定mys1234]命令绑定!' MYS_HINT = '你还没有绑定过mysid哦!\n请使用[绑定mys1234]命令绑定!'
CK_HINT = """你还没有绑定过Cookie哦!发送【ck帮助】获取帮助! CK_HINT = """你还没有绑定过Cookie哦!发送【ck帮助】获取帮助!
警告:绑定Cookie可能会带来未知的账号风险,请确保信任机器人管理员""" 警告:绑定Cookie可能会带来未知的账号风险,请确保信任机器人管理员"""
CHAR_HINT = '你还没有{}的缓存噢!\n请先使用【sr强制刷新】命令来缓存数据! \n或者使用【sr查询展柜角色】命令查看已缓存角色' CHAR_HINT = '您的支援/星海同行角色没有{}的数据哦!\n请先把{}放入支援/星海同行中再使用【sr强制刷新】命令来缓存数据进行查询! '
VERIFY_HINT = '''出现验证码! VERIFY_HINT = '''出现验证码!
如已绑定CK: 请至米游社软件->我的->我的角色处解锁验证码 如已绑定CK: 请至米游社软件->我的->我的角色处解锁验证码
可使用[gs关闭推送]命令关闭体力推送以减少出现验证码风险 可使用[gs关闭推送]命令关闭体力推送以减少出现验证码风险

View File

@ -18,6 +18,7 @@ skillId2Type_fileName = f'skillId2Type_mapping_{version}.json'
Property2Name_fileName = 'Property2Name.json' Property2Name_fileName = 'Property2Name.json'
RelicId2SetId_fileName = f'RelicId2SetId_mapping_{version}.json' RelicId2SetId_fileName = f'RelicId2SetId_mapping_{version}.json'
SetId2Name_fileName = f'SetId2Name_mapping_{version}.json' SetId2Name_fileName = f'SetId2Name_mapping_{version}.json'
avatarId2Star_fileName = f'avatarId2Star_mapping_{version}.json'
rankId2Name_fileName = f'rankId2Name_mapping_{version}.json' rankId2Name_fileName = f'rankId2Name_mapping_{version}.json'
characterSkillTree_fileName = f'characterSkillTree_mapping_{version}.json' characterSkillTree_fileName = f'characterSkillTree_mapping_{version}.json'
avatarId2DamageType_fileName = f'avatarId2DamageType_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: with open(MAP / RelicId2Rarity_fileName, 'r', encoding='UTF-8') as f:
RelicId2Rarity = msgjson.decode(f.read(), type=Dict[str, int]) 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: with open(MAP / ItemId2Name_fileName, 'r', encoding='UTF-8') as f:
ItemId2Name = msgjson.decode(f.read(), type=Dict[str, str]) ItemId2Name = msgjson.decode(f.read(), type=Dict[str, str])

View File

@ -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"}

View File

@ -3,6 +3,7 @@ from .SR_MAP_PATH import (
EquipmentID2EnName, EquipmentID2EnName,
alias_data, alias_data,
avatarId2Name, avatarId2Name,
avatarId2Star_data,
) )
@ -20,11 +21,16 @@ async def name_to_avatar_id(name: str) -> str:
return avatar_id 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: async def alias_to_char_name(char_name: str) -> str:
for i in alias_data['characters']: for i in alias_data['characters']:
if char_name in alias_data['characters'][i]: if char_name in alias_data['characters'][i]:
return alias_data['characters'][i][0] return alias_data['characters'][i][0]
return char_name return False
async def weapon_id_to_name(weapon_id: str) -> str: async def weapon_id_to_name(weapon_id: str) -> str: