fix excel load

This commit is contained in:
qwerdvd 2023-12-05 08:46:14 +08:00
parent 7653a3b705
commit 451f0c5f5d
No known key found for this signature in database
GPG Key ID: A3AF89C783404769
6 changed files with 260 additions and 14 deletions

View File

@ -1,8 +1,13 @@
import asyncio
import re import re
from pathlib import Path
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.data_store import get_res_path
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.plugins.ArknightsUID.ArknightsUID.arknightsuid_resource.memoryStore import store
from gsuid_core.plugins.ArknightsUID.ArknightsUID.arknightsuid_wiki.draw_wiki_img import ( from gsuid_core.plugins.ArknightsUID.ArknightsUID.arknightsuid_wiki.draw_wiki_img import (
# draw_wiki,
get_equip_info, get_equip_info,
get_wiki_info, get_wiki_info,
) )
@ -32,6 +37,15 @@ async def text2pic(text: str, max_size: int = 800, font_size: int = 20):
async def send_role_wiki_pic(bot: Bot, ev: Event): async def send_role_wiki_pic(bot: Bot, ev: Event):
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', ev.text)) char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', ev.text))
try:
CHARACTER_TABLE = Excel.CHARATER_TABLE
except AttributeError:
TASK = []
for file_path in Path(get_res_path(['ArknightsUID', 'resource', 'gamedata'])).glob('*.json'):
TASK.append(store.get_file(file_path))
asyncio.gather(*TASK)
await Excel.preload_table()
CHARACTER_TABLE = Excel.CHARATER_TABLE CHARACTER_TABLE = Excel.CHARATER_TABLE
char_id = None char_id = None
@ -43,6 +57,7 @@ async def send_role_wiki_pic(bot: Bot, ev: Event):
await bot.send('未找到该干员') await bot.send('未找到该干员')
return return
await bot.logger.info(f'开始获取{char_name}图鉴') await bot.logger.info(f'开始获取{char_name}图鉴')
# img = await draw_wiki(char_id=char_id)
img = await get_wiki_info(char_id=char_id) img = await get_wiki_info(char_id=char_id)
await bot.send(await text2pic(img)) await bot.send(await text2pic(img))
@ -51,6 +66,15 @@ async def send_role_wiki_pic(bot: Bot, ev: Event):
async def send_equip_wiki_pic(bot: Bot, ev: Event): async def send_equip_wiki_pic(bot: Bot, ev: Event):
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', ev.text)) char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', ev.text))
try:
CHARACTER_TABLE = Excel.CHARATER_TABLE
except AttributeError:
TASK = []
for file_path in Path(get_res_path(['ArknightsUID', 'resource', 'gamedata'])).glob('*.json'):
TASK.append(store.get_file(file_path))
asyncio.gather(*TASK)
await Excel.preload_table()
CHARACTER_TABLE = Excel.CHARATER_TABLE CHARACTER_TABLE = Excel.CHARATER_TABLE
char_id = None char_id = None

View File

@ -1,17 +1,23 @@
import asyncio import asyncio
import re import re
from pathlib import Path from pathlib import Path
from typing import Union from pprint import pformat
from typing import Any, Dict, Union
from colorama import Fore, Style
from gsuid_core.utils.colortext.ColorText import ColorTextGroup, split_ctg
from gsuid_core.utils.image.image_tools import draw_text_by_line
from jinja2 import Template from jinja2 import Template
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from ..arknightsuid_resource.constants import Excel from ..arknightsuid_resource.constants import Excel
from ..utils.fonts.source_han_sans import ( from ..utils.fonts.source_han_sans import (
# sans_font_18, sans_font_18,
# sans_font_26, sans_font_20,
# sans_font_34, sans_font_24,
# sans_font_50, sans_font_26,
sans_font_34,
sans_font_50,
sans_font_120, sans_font_120,
) )
@ -80,7 +86,18 @@ potential_id_to_cn = {
} }
def render_template(template_str, data): def test_ctg(length: int, *params):
print(
f'{Fore.GREEN}> running split_ctg(){Style.RESET_ALL}\
\n length: {length}\
\n texts: {params}'
)
groups_ = ColorTextGroup(list(params))
f_ = pformat(split_ctg(groups_, length)).split('\n')
print(Fore.CYAN, '\t', f_[0], '\n\t'.join(f_[0:]))
def render_template(template_str: str, data: Dict[str, Union[float, int]]):
matches = re.finditer(r'\{([^}:]+)\}', template_str) matches = re.finditer(r'\{([^}:]+)\}', template_str)
matches_1 = re.finditer(r'\{([^{}]+):([^{}]+)\}', template_str) matches_1 = re.finditer(r'\{([^{}]+):([^{}]+)\}', template_str)
@ -91,8 +108,13 @@ def render_template(template_str, data):
placeholder_data[placeholder[0]] = (formatting_option, data.get(placeholder[0], '')) placeholder_data[placeholder[0]] = (formatting_option, data.get(placeholder[0], ''))
for match in matches_1: for match in matches_1:
placeholder, formatting_option = match.groups() placeholder, formatting_option = match.groups()
value = data.get(placeholder.replace('-', ''), '')
placeholder_data[placeholder] = (formatting_option, data.get(placeholder.replace('-', ''), '')) # 可以在下列状态和初始状态间切换:\n攻击范围缩小防御力+{def:0%}
# 每秒恢复最大生命的{HP_RECOVERY_PER_SEC_BY_MAX_HP_RATIO:0.0%}
# {'def': 1, 'hp_recovery_per_sec_by_max_hp_ratio': 0.06}
if value == '':
value = data.get(placeholder.replace('-', '_').lower(), '')
placeholder_data[placeholder] = (formatting_option, value)
for placeholder, (formatting_option, value) in placeholder_data.items(): for placeholder, (formatting_option, value) in placeholder_data.items():
if formatting_option == '': if formatting_option == '':
@ -367,18 +389,19 @@ async def draw_wiki(char_id: str):
CHARACTER_TABLE = Excel.CHARATER_TABLE CHARACTER_TABLE = Excel.CHARATER_TABLE
SKILL_TABLE = Excel.SKILL_TABLE SKILL_TABLE = Excel.SKILL_TABLE
UNIEQUIP_TABLE = Excel.UNIEQUIP_TABLE UNIEQUIP_TABLE = Excel.UNIEQUIP_TABLE
RANGE_TABLE = Excel.RANGE_TABLE
img = Image.new('RGBA', (1500, 2800), (255, 255, 255, 0)) img = Image.new('RGBA', (1500, 2800), (255, 255, 255, 0))
draw = ImageDraw.Draw(img) draw = ImageDraw.Draw(img)
img.paste(bg_img, (0, 0)) img.paste(bg_img, (0, 0))
img.paste(vvan_img, (-700, -100), vvan_img) img.paste(vvan_img, (-700, -100), vvan_img)
img.paste(title_img, (0, 0), title_img) img.paste(title_img, (0, -50), title_img)
character_data = CHARACTER_TABLE[char_id] character_data = CHARACTER_TABLE[char_id]
char_name = character_data.name char_name = character_data.name
draw.text( draw.text(
(80, 145), (144, 85),
char_name, char_name,
font=sans_font_120, font=sans_font_120,
fill=black_color, fill=black_color,
@ -387,24 +410,202 @@ async def draw_wiki(char_id: str):
char_rarity = character_data.rarity char_rarity = character_data.rarity
rarity_img = Image.open(TEXTURE2D_PATH / f'rarity_yellow_{char_rarity}.png') rarity_img = Image.open(TEXTURE2D_PATH / f'rarity_yellow_{char_rarity}.png')
img.paste(rarity_img, (800, 300), rarity_img) img.paste(rarity_img, (960, 120), rarity_img)
profession = character_data.profession profession = character_data.profession
profession_img = Image.open(TEXTURE2D_PATH / f'icon_{profession.lower()}.png') profession_img = Image.open(TEXTURE2D_PATH / f'icon_{profession.lower()}.png')
img.paste(profession_img, (1000, 500), profession_img) img.paste(profession_img, (1100, 7050), profession_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
char_position = character_data.position char_position = character_data.position
char_position_cn = char_position_en_to_cn[char_position]
bar_img_draw.text(
(160, 100),
char_position_cn,
font=sans_font_34,
fill=white_color,
anchor='lm',
)
sub_profession_id = character_data.subProfessionId sub_profession_id = character_data.subProfessionId
sub_profession = UNIEQUIP_TABLE.subProfDict[sub_profession_id].subProfessionName sub_profession = UNIEQUIP_TABLE.subProfDict[sub_profession_id].subProfessionName
bar_img_draw.text(
(360, 100),
sub_profession,
font=sans_font_34,
fill=white_color,
anchor='lm',
)
img.paste(bar_img, (40, 110), bar_img)
nation_id = character_data.nationId nation_id = character_data.nationId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(155, 100),
'势力',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(355, 100),
nation_id if nation_id else '未知',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
img.paste(bar_img, (940, 180 - 50), bar_img)
group_id = character_data.groupId group_id = character_data.groupId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(155, 100),
'阵营',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(355, 100),
group_id if group_id else '未知',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
img.paste(bar_img, (940, 188 + 20), bar_img)
team_id = character_data.teamId team_id = character_data.teamId
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (290, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(155, 100),
'队伍',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(355, 100),
team_id if team_id else '未知',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
img.paste(bar_img, (940, 196 + 90), bar_img)
char_phases_data = character_data.phases[-1] char_phases_data = character_data.phases[-1]
char_max_phase = len(character_data.phases) char_max_phase = len(character_data.phases)
char_max_level = char_phases_data.maxLevel char_max_level = char_phases_data.maxLevel
char_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data char_attributes_key_frame = char_phases_data.attributesKeyFrames[-1].data
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(140, 100),
'生命上限',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(420, 100),
str(char_attributes_key_frame.maxHp),
font=sans_font_34,
fill=white_color,
anchor='mm',
)
img.paste(bar_img, (940, 380), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(140, 100),
'攻击力',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(420, 100),
str(char_attributes_key_frame.atk),
font=sans_font_34,
fill=white_color,
anchor='mm',
)
img.paste(bar_img, (940, 380 + 78), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(140, 100),
'防御力',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(420, 100),
str(char_attributes_key_frame.def_),
font=sans_font_34,
fill=white_color,
anchor='mm',
)
img.paste(bar_img, (940, 380 + 78 * 2), bar_img)
bar_img = Image.open(TEXTURE2D_PATH / 'bar.png')
light_line = Image.open(TEXTURE2D_PATH / 'light_line.png')
bar_img.paste(light_line, (320, 60), light_line)
bar_img_draw = ImageDraw.ImageDraw(bar_img)
bar_img_draw.text(
(140, 100),
'法抗',
font=sans_font_34,
fill=white_color,
anchor='lm',
)
bar_img_draw.text(
(420, 100),
str(char_attributes_key_frame.magicResistance),
font=sans_font_34,
fill=white_color,
anchor='mm',
)
img.paste(bar_img, (940, 380 + 78 * 3), bar_img)
# 攻击范围
range_id = char_phases_data.rangeId
attack_area_img = Image.open(TEXTURE2D_PATH / 'attack_area.png')
if range_id:
range_data = RANGE_TABLE.range_[range_id]
grids = range_data.grids
area_0 = Image.open(TEXTURE2D_PATH / 'area_0.png').resize((58, 58))
area_1 = Image.open(TEXTURE2D_PATH / 'area_1.png')
for grid in grids:
col = grid.col
row = grid.row
if col == 1 and row == 1:
attack_area_img.paste(area_1, (90, 105), area_1)
attack_area_img.paste(area_0, (105 + col * 56, 120 + row * 56), area_0)
img.paste(attack_area_img, (915, 730), attack_area_img)
char_potential_data = character_data.potentialRanks char_potential_data = character_data.potentialRanks
potential_add_dict: dict[int, tuple[int, float]] = {} potential_add_dict: dict[int, tuple[int, float]] = {}
for potential_id, potential in enumerate(char_potential_data): for potential_id, potential in enumerate(char_potential_data):
@ -441,6 +642,9 @@ async def draw_wiki(char_id: str):
skill_id_list.append(skill.skillId) skill_id_list.append(skill.skillId)
for skill in skill_id_list: for skill in skill_id_list:
skill_bg = Image.open(TEXTURE2D_PATH / 'skill_bg.png')
skill3_bar_bg = Image.open(TEXTURE2D_PATH / 'skill3_bar.png')
skill_data = SKILL_TABLE.skills[skill] skill_data = SKILL_TABLE.skills[skill]
skill_level_data = skill_data.levels[-1] skill_level_data = skill_data.levels[-1]
skill_name = skill_level_data.name skill_name = skill_level_data.name
@ -453,8 +657,26 @@ async def draw_wiki(char_id: str):
black_board_dict[black_board.key] = black_board.value black_board_dict[black_board.key] = black_board.value
if skill_description: if skill_description:
skill_description = re.sub(r'<[^>]+>', '', skill_description) skill_description = re.sub(r'<[^>]+>', '', skill_description)
skill_description = skill_description.format(**black_board_dict) skill_description = render_template(skill_description, black_board_dict).replace('--', '-')
skill_description = re.sub(r'.000000', '', skill_description) last_skill_description = re.sub(r'.000000', '', skill_description)
print(last_skill_description)
if '{' in last_skill_description:
raise NotImplementedError
# 匹配 -70% +200% 这种格式的数字
c = re.sub(r'(\d+)%', r'\1%', last_skill_description)
print(c)
print(test_ctg(30, last_skill_description))
draw_text_by_line(
img=skill_bg,
pos=(70, 20),
text=last_skill_description,
font=sans_font_24,
fill='#3b4354',
max_length=400,
)
# skill_bg.show()
# img.show()
return img return img

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB