diff --git a/GenshinUID/genshinuid_enka/__init__.py b/GenshinUID/genshinuid_enka/__init__.py index 87b7b9a6..cfc0d4ff 100644 --- a/GenshinUID/genshinuid_enka/__init__.py +++ b/GenshinUID/genshinuid_enka/__init__.py @@ -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('开始执行...可能时间较久, 执行完成会有提示, 请勿重复执行!') diff --git a/GenshinUID/genshinuid_enka/draw_arti_rank.py b/GenshinUID/genshinuid_enka/draw_arti_rank.py new file mode 100644 index 00000000..d0ac07cb --- /dev/null +++ b/GenshinUID/genshinuid_enka/draw_arti_rank.py @@ -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) diff --git a/GenshinUID/genshinuid_enka/draw_normal.py b/GenshinUID/genshinuid_enka/draw_normal.py index 54dd4b5f..ea44703b 100644 --- a/GenshinUID/genshinuid_enka/draw_normal.py +++ b/GenshinUID/genshinuid_enka/draw_normal.py @@ -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 diff --git a/GenshinUID/genshinuid_enka/draw_role_rank.py b/GenshinUID/genshinuid_enka/draw_role_rank.py index d0d3b950..12c074d4 100644 --- a/GenshinUID/genshinuid_enka/draw_role_rank.py +++ b/GenshinUID/genshinuid_enka/draw_role_rank.py @@ -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') diff --git a/GenshinUID/genshinuid_enka/effect/value_attr.json b/GenshinUID/genshinuid_enka/effect/value_attr.json index ef63f6cb..bc379df3 100644 --- a/GenshinUID/genshinuid_enka/effect/value_attr.json +++ b/GenshinUID/genshinuid_enka/effect/value_attr.json @@ -6,6 +6,15 @@ "暴击伤害", "元素精通" ], + "无疑": [ + "血量", + "攻击力", + "暴击率", + "暴击伤害", + "元素精通", + "防御力", + "元素充能效率" + ], "八重神子": [ "攻击力", "暴击率", diff --git a/GenshinUID/genshinuid_enka/texture2D/rank_img/arti_bg.png b/GenshinUID/genshinuid_enka/texture2D/rank_img/arti_bg.png new file mode 100644 index 00000000..d991d733 Binary files /dev/null and b/GenshinUID/genshinuid_enka/texture2D/rank_img/arti_bg.png differ diff --git a/GenshinUID/genshinuid_enka/texture2D/rank_img/star.jpg b/GenshinUID/genshinuid_enka/texture2D/rank_img/star.jpg new file mode 100644 index 00000000..21c73225 Binary files /dev/null and b/GenshinUID/genshinuid_enka/texture2D/rank_img/star.jpg differ diff --git a/GenshinUID/utils/api/cv/request.py b/GenshinUID/utils/api/cv/request.py index e3e085a3..5d91a056 100644 --- a/GenshinUID/utils/api/cv/request.py +++ b/GenshinUID/utils/api/cv/request.py @@ -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: