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.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)

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
# 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,
)

View File

@ -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']

View File

@ -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关闭推送]命令关闭体力推送以减少出现验证码风险

View File

@ -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])

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,
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: