Skip to content

Commit

Permalink
✨ 新增对比面板
Browse files Browse the repository at this point in the history
  • Loading branch information
KimigaiiWuyi committed Apr 18, 2023
1 parent 6877ef4 commit ee9d941
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 31 deletions.
89 changes: 74 additions & 15 deletions GenshinUID/genshinuid_enka/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import re
import json
from typing import Tuple
from typing import List, Tuple

import aiofiles
from PIL import Image
from gsuid_core.sv import SV
from gsuid_core.bot import Bot
from gsuid_core.models import Event
Expand All @@ -12,9 +13,10 @@
from .to_card import enka_to_card
from ..utils.convert import get_uid
from ..utils.error_reply import UID_HINT
from ..utils.image.convert import convert_img
from ..utils.map.GS_MAP_PATH import alias_data
from .draw_char_rank import draw_cahrcard_list
from .get_enka_img import draw_enka_img, get_char_data
from .get_enka_img import draw_enka_img, get_full_char
from ..utils.resource.RESOURCE_PATH import TEMP_PATH, PLAYER_PATH

sv_enka_config = SV('面板设置', pm=2)
Expand All @@ -39,8 +41,25 @@ async def send_change_api_info(bot: Bot, ev: Event):

@sv_get_enka.on_prefix('查询')
async def send_char_info(bot: Bot, ev: Event):
im = await _get_char_info(bot, ev, ev.text)
if isinstance(im, str):
await bot.send(im)
elif isinstance(im, Tuple):
if isinstance(im[0], Image.Image):
img = await convert_img(im[0])
else:
img = im[0]
await bot.send(img)
if im[1]:
with open(TEMP_PATH / f'{ev.msg_id}.jpg', 'wb') as f:
f.write(im[1])
else:
await bot.send('发生未知错误')


async def _get_char_info(bot: Bot, ev: Event, text: str):
# 获取角色名
msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', ev.text))
msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', text))
if not msg:
return
await bot.logger.info('开始执行[查询角色面板]')
Expand All @@ -51,15 +70,37 @@ async def send_char_info(bot: Bot, ev: Event):
await bot.logger.info('[查询角色面板]uid: {}'.format(uid))

im = await draw_enka_img(msg, uid, ev.image)
if isinstance(im, str):
await bot.send(im)
elif isinstance(im, Tuple):
await bot.send(im[0])
if im[1]:
with open(TEMP_PATH / f'{ev.msg_id}.jpg', 'wb') as f:
f.write(im[1])
else:
await bot.send('发生未知错误')
return im


@sv_get_enka.on_prefix('对比面板')
async def contrast_char_info(bot: Bot, ev: Event):
contrast_list = ev.text.strip().split(' ')
if len(contrast_list) <= 1:
return await bot.send('输入格式错误...参考格式: 对比面板 公子 公子换可莉圣遗物')
elif len(contrast_list) >= 4:
return await bot.send('不支持对比四个及以上的面板...')

img_list: List[Image.Image] = []
max_y = 0
for i in contrast_list:
im = await _get_char_info(bot, ev, i)
if isinstance(im, str):
return await bot.send(im)
elif isinstance(im, Tuple):
if isinstance(im[0], bytes):
return await bot.send('输入了错误的格式...参考格式: 对比面板 公子 公子换可莉圣遗物')
elif isinstance(im[0], str):
return await bot.send(im[0])
else:
img_list.append(im[0])
max_y = max(max_y, im[0].size[1])

base_img = Image.new('RGBA', (950 * len(img_list), max_y))
for index, img in enumerate(img_list):
base_img.paste(img, (950 * index, 0), img)

await bot.send(await convert_img(base_img))


@sv_get_enka.on_prefix('保存面板')
Expand All @@ -73,18 +114,36 @@ async def save_char_info(bot: Bot, ev: Event):
return await bot.send(UID_HINT)

save_char, save_name = save_list[0], save_list[1]

if bool(re.search(r'\d', save_name)):
return await bot.send('保存名称内不可存在数字!')

if save_name in alias_data:
return await bot.send('保存名称不可为已有角色的名称!')
else:
for _fix in ['队伍', '最佳', '最优', '曲线', '成长', '展柜', '伤害', '角色']:
for _fix in [
'队伍',
'最佳',
'最优',
'曲线',
'成长',
'展柜',
'伤害',
'角色',
'极限',
'带',
'换',
]:
if _fix in save_name:
return await bot.send(f'保存名称不能含有 {_fix} 等保留词...')
return await bot.send(f'保存名称不能含有{_fix}等保留词...')

for _name in alias_data:
if save_name in alias_data[_name]:
return await bot.send('保存名称不可为已有角色的别名!')
else:
char_data = await get_char_data(uid, save_char, False)
char_data = await get_full_char(save_char, uid)
if isinstance(char_data, str):
return await bot.send(char_data)
SELF_PATH = PLAYER_PATH / str(uid) / 'SELF'
if not SELF_PATH.exists():
SELF_PATH.mkdir()
Expand Down
11 changes: 7 additions & 4 deletions GenshinUID/genshinuid_enka/draw_char_card.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

from .mono.Character import Character
from .dmg_calc.dmg_calc import draw_dmg_img
from ..utils.image.convert import convert_img
from .draw_char_curve import draw_char_curve_card
from .etc.etc import TEXT_PATH, get_all_artifacts_value
from ..utils.fonts.genshin_fonts import gs_font_18, gs_font_50
Expand All @@ -20,15 +19,17 @@ async def draw_char_img(
char: Character,
charUrl: Optional[str] = None,
is_curve: bool = False,
) -> Union[str, Tuple[bytes, Optional[bytes]]]:
) -> Union[str, Tuple[Image.Image, Optional[bytes]]]:
if is_curve:
res = await draw_char_curve_card(char, charUrl)
else:
res = await draw_char_card(char, charUrl)
return res, char.char_bytes


async def draw_char_card(char: Character, char_url: Optional[str]) -> bytes:
async def draw_char_card(
char: Character, char_url: Optional[str]
) -> Image.Image:
dmg_img, dmg_len = await draw_dmg_img(char)
char_img = await get_char_img(char, char_url)
ex_len = dmg_len * 40 + 765
Expand Down Expand Up @@ -70,7 +71,9 @@ async def draw_char_card(char: Character, char_url: Optional[str]) -> bytes:
gs_font_18,
anchor='mm',
)
'''
res = await convert_img(img)
if isinstance(res, str):
res = b''
return res
'''
return img
7 changes: 4 additions & 3 deletions GenshinUID/genshinuid_enka/draw_char_curve.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from io import BytesIO
from typing import Optional

from PIL import Image, ImageDraw
Expand All @@ -22,7 +21,7 @@ async def get_adv_card() -> Image.Image:

async def draw_char_curve_card(
char: Character, char_url: Optional[str]
) -> bytes:
) -> Image.Image:
await get_artifacts_card(char, Image.new('RGB', (1, 1)))
curve_img, curve_len = await draw_char_curve_data(
char.char_name, char.card_prop
Expand Down Expand Up @@ -74,7 +73,9 @@ async def draw_char_curve_card(
)

img = img.convert('RGB')
'''
result_buffer = BytesIO()
img.save(result_buffer, format='JPEG', subsampling=0, quality=90)
res = result_buffer.getvalue()
return res
'''
return img
5 changes: 2 additions & 3 deletions GenshinUID/genshinuid_enka/draw_group_dmg.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from .etc.etc import TEXT_PATH
from .mono.Character import Character
from .mono.SEQ import ALL_SEQ, SEQ_ARG
from ..utils.image.convert import convert_img
from ..utils.resource.RESOURCE_PATH import CHAR_PATH
from ..utils.map.name_covert import name_to_avatar_id
from ..utils.image.image_tools import get_color_bg, draw_pic_with_ring
Expand Down Expand Up @@ -60,7 +59,7 @@ def _p(value: float) -> str:

async def draw_group_dmg_img(
uid: str, char_list: List[Character]
) -> Union[bytes, str]:
) -> Union[Image.Image, str]:
# 获取数据
dmg_data = await get_group_dmg_data(char_list)
if isinstance(dmg_data, str):
Expand Down Expand Up @@ -163,5 +162,5 @@ async def draw_group_dmg_img(
img_draw.text((390, 333), f'{_f(avg_dps)}', 'white', gs_font_44, 'lm')
img_draw.text((650, 333), f'{_f(all_time)}秒内', 'white', gs_font_44, 'lm')

img = await convert_img(img)
# img = await convert_img(img)
return img
16 changes: 15 additions & 1 deletion GenshinUID/genshinuid_enka/get_enka_img.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import json
from typing import Dict, List, Tuple, Union, Optional

from PIL import Image
from gsuid_core.logger import logger

from .to_card import draw_enka_card
Expand Down Expand Up @@ -38,9 +39,22 @@
}


async def get_full_char(raw_mes: str, uid: str) -> Union[str, Dict]:
# 获取角色名
msg = ' '.join(re.findall('[\u4e00-\u9fa5]+', raw_mes))
_args = await get_char_args(msg, uid)
if isinstance(_args, Tuple):
char = await get_char(*_args)
if isinstance(char, str):
return char
return char.card_prop
else:
return _args


async def draw_enka_img(
raw_mes: str, uid: str, url: Optional[str]
) -> Union[str, Tuple[Union[bytes, str], Optional[bytes]]]:
) -> Union[str, Tuple[Union[bytes, Image.Image, str], Optional[bytes]]]:
# 获取角色名
msg = ' '.join(re.findall('[\u4e00-\u9fa5]+', raw_mes))
# msg = raw_mes.strip()
Expand Down
10 changes: 5 additions & 5 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit ee9d941

Please sign in to comment.