新增圣遗物排名 双爆等类似用法 (#493)

This commit is contained in:
KimigaiiWuyi 2023-10-22 04:58:05 +08:00
parent 3fffd97ab3
commit 5979715c4c
8 changed files with 187 additions and 12 deletions

View File

@ -19,6 +19,7 @@ from .draw_artifacts_lib import draw_lib
from .draw_rank_list import draw_rank_img
from ..utils.image.convert import convert_img
from ..utils.map.GS_MAP_PATH import alias_data
from .draw_arti_rank import draw_arti_rank_img
from .draw_char_rank import draw_cahrcard_list
from .draw_role_rank import draw_role_rank_img
from .get_enka_img import draw_enka_img, get_full_char
@ -62,6 +63,14 @@ async def sned_role_rank_pic(bot: Bot, ev: Event):
await bot.send(await draw_role_rank_img(msg))
@sv_akasha.on_command('圣遗物排名')
async def sned_arti_rank_pic(bot: Bot, ev: Event):
# 获取排序名
msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', ev.text))
logger.info(f'[圣遗物排名]排序: {msg}')
await bot.send(await draw_arti_rank_img(msg))
@sv_enka_admin.on_fullmatch('刷新全部圣遗物仓库')
async def sned_fresh_all_list(bot: Bot, ev: Event):
await bot.send('开始执行...可能时间较久, 执行完成会有提示, 请勿重复执行!')

View File

@ -0,0 +1,134 @@
from typing import Union
from PIL import Image, ImageDraw
from gsuid_core.utils.image.convert import convert_img
from .draw_rank_list import RANK_TEXT
from ..utils.api.cv.request import _CvApi
from .draw_role_rank import REGION_MAP, grey
from ..genshinuid_config.gs_config import gsconfig
from ..utils.map.GS_MAP_PATH import icon2Name, artifact2attr
from .draw_normal import get_artifact_score_data, _get_single_artifact_img
from ..utils.fonts.genshin_fonts import (
gs_font_15,
gs_font_18,
gs_font_24,
gs_font_26,
)
is_enable_akasha = gsconfig.get_config('EnableAkasha').data
EQUIP_MAP = {
'EQUIP_BRACER': '生之花',
'EQUIP_NECKLACE': '死之羽',
'EQUIP_SHOES': '时之沙',
'EQUIP_RING': '空之杯',
'EQUIP_DRESS': '理之冠',
}
SUBSTAT_MAP = {
'Flat ATK': '攻击力',
'Flat HP': '血量',
'Flat DEF': '防御力',
'ATK%': '百分比攻击力',
'HP%': '百分比血量',
'DEF%': '百分比防御',
'Elemental Mastery': '元素精通',
'Energy Recharge': '元素充能效率',
'Crit RATE': '暴击率',
'Crit DMG': '暴击伤害',
'Cryo DMG Bonus': '冰元素伤害加成',
'Pyro DMG Bonus': '火元素伤害加成',
'Hydro DMG Bonus': '水元素伤害加成',
'Electro DMG Bonus': '雷元素伤害加成',
'Anemo DMG Bonus': '风元素伤害加成',
'Geo DMG Bonus': '岩元素伤害加成',
'Dendro DMG Bonus': '草元素伤害加成',
'Healing Bonus': '治疗加成',
'Physical Bonus': '物理伤害加成',
}
async def draw_arti_rank_img(sort_by: str) -> Union[str, bytes]:
if not is_enable_akasha:
return '未开启排名系统...'
cv_api = _CvApi()
sort_by = sort_by.strip()
if not sort_by:
sort_by = '双爆'
raw_data = await cv_api.get_artifacts_list(sort_by)
if raw_data is None:
return '输入的排序值错误...'
img = Image.open(RANK_TEXT / 'star.jpg')
for index, arti in enumerate(raw_data):
arti_img = Image.open(RANK_TEXT / 'arti_bg.png')
region: str = arti['owner']['region']
nickname: str = arti['owner']['nickname']
uid: str = arti['uid']
icon_url: str = arti['icon']
name = icon2Name[icon_url.split('/')[-1].split('.')[0]]
# rel_img = Image.open(REL_PATH / f'{name}.png')
aritifact = {
'aritifactName': name,
'aritifactSetsName': artifact2attr[name],
'aritifactPieceName': EQUIP_MAP[arti['equipType']],
'aritifactStar': arti['stars'],
'aritifactLevel': arti['level'] - 1,
'reliquaryMainstat': {
'statValue': int(arti['mainStatValue']),
'statName': SUBSTAT_MAP[arti['mainStatKey']],
},
'reliquarySubstats': [],
}
for sub in arti['substats']:
aritifact['reliquarySubstats'].append(
{
'statValue': round(arti['substats'][sub], 1),
'statName': SUBSTAT_MAP[sub],
}
)
if region in REGION_MAP:
region_color = REGION_MAP[region]
else:
region_color = (128, 128, 128)
new_aritifact = await get_artifact_score_data(aritifact, None, '无疑')
_arti_img = await _get_single_artifact_img(new_aritifact)
arti_img.paste(_arti_img, (0, 0), _arti_img)
arti_draw = ImageDraw.Draw(arti_img)
arti_draw.rounded_rectangle((27, 366, 112, 396), 20, region_color)
arti_draw.text((70, 381), region, 'white', gs_font_24, 'mm')
arti_draw.text((120, 381), nickname, 'white', gs_font_24, 'lm')
arti_draw.text((155, 333), f'UID {uid}', grey, gs_font_15, 'mm')
img.paste(
arti_img,
(15 + 318 * (index % 4), 468 + 410 * (index // 4)),
arti_img,
)
img_draw = ImageDraw.Draw(img)
img_draw.text(
(650, 425), f'前20 / 当前排序 {sort_by}', 'white', gs_font_26, 'mm'
)
img_draw.text(
(650, img.size[1] - 35),
'Power by Wuyi无疑 & '
'Data by AKS & CV '
'Created by GsCore & GenshinUID',
(200, 200, 200),
gs_font_18,
anchor='mm',
)
await cv_api.close()
return await convert_img(img)

View File

@ -619,13 +619,17 @@ async def _get_single_artifact_img(aritifact: Dict) -> Image.Image:
return artifactimg_bg
async def get_artifact_score_data(aritifact: Dict, char: Character) -> Dict:
async def get_artifact_score_data(
aritifact: Dict,
char: Optional[Character] = None,
char_name: Optional[str] = None,
) -> Dict:
all_value_score = 0
all_cv_score = 0
for i in aritifact['reliquarySubstats']:
subName: str = i['statName']
subValue: float = i['statValue']
if not hasattr(char, 'baseAtk'):
if char is not None and not hasattr(char, 'baseAtk'):
await char.new()
cv_score = 0
@ -634,13 +638,26 @@ async def get_artifact_score_data(aritifact: Dict, char: Character) -> Dict:
elif subName == '暴击伤害':
cv_score += subValue
if char is None:
_atk = 750
_hp = 12000
_def = 700
if char_name is None:
return {}
_char_name = char_name
else:
_atk = char.baseAtk
_hp = char.baseHp
_def = char.baseDef
_char_name = char.char_name
value_temp = await get_artifacts_value(
subName,
subValue,
char.baseAtk,
char.baseHp,
char.baseDef,
char.char_name,
_atk,
_hp,
_def,
_char_name,
)
i['value_score'] = value_temp

View File

@ -32,12 +32,15 @@ CV_MAP = {
REGION_MAP = {
'CN': (255, 58, 58),
'ASIA': (255, 255, 127),
'ASIA': (169, 109, 57),
'NA': (255, 165, 0),
'EU': (80, 98, 255),
'TW': (37, 37, 37),
'B': (128, 35, 151),
}
grey = (170, 170, 170)
async def _get_color(
cmap: Dict[int, str], value: float
@ -117,9 +120,8 @@ async def draw_role_rank_img(char_name: str) -> Union[str, bytes]:
icon_list.append(icon_img.resize((51, 51)))
bar_draw.rounded_rectangle((47, 30, 150, 70), 10, region_color)
bar_draw.text((99, 50), region, 'black', gs_font_30, 'mm')
bar_draw.text((99, 50), region, 'white', gs_font_30, 'mm')
grey = (170, 170, 170)
bar_draw.text((162, 41), nickname, 'white', gs_font_26, 'lm')
bar_draw.text((162, 66), f'UID {uid}', grey, gs_font_20, 'lm')
bar_draw.text((398, 42), f'{cr}: {cd}', 'white', gs_font_26, 'lm')

View File

@ -6,6 +6,15 @@
"暴击伤害",
"元素精通"
],
"无疑": [
"血量",
"攻击力",
"暴击率",
"暴击伤害",
"元素精通",
"防御力",
"元素充能效率"
],
"八重神子": [
"攻击力",
"暴击率",

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

View File

@ -16,12 +16,13 @@ from .api import (
SUBSTAT_MAP = {
'双爆': 'critValue',
'攻击力': 'substats.Flat ATK',
'血量': 'substats.Flat HP',
'防御力': 'substats.Flat DEF',
'百分比攻击力': 'substats.ATK%',
'百分比血量': 'substats.HP%',
'百分比防御': 'substats.DEF%',
'固定攻击力': 'substats.Flat ATK',
'固定血量': 'substats.Flat HP',
'固定生命': 'substats.Flat HP',
'固定防御力': 'substats.Flat DEF',
'元素精通': 'substats.Elemental Mastery',
'元素充能效率': 'substats.Energy Recharge',
'暴击率': 'substats.Crit RATE',
@ -56,8 +57,11 @@ class _CvApi:
'substats.Crit DMG',
],
str,
None,
] = 'critValue',
) -> Optional[List[Dict]]:
if sort_by is None or not sort_by:
sort_by = 'critValue'
if not sort_by.startswith(('c', 's')):
for i in SUBSTAT_MAP:
if sort_by in i: