🚧 更新一部分计算

This commit is contained in:
qwerdvd 2023-05-12 18:01:56 +08:00
parent 9c65d01497
commit 26c867d493
7 changed files with 215 additions and 57 deletions

View File

@ -1,65 +1,63 @@
# import re import re
# import json
# from typing import Tuple
# from PIL import Image # import json
from typing import Tuple
from PIL import Image
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from .to_card import enka_to_card from .to_card import api_to_card
# from .get_enka_img import draw_char_info_img
from ..utils.convert import get_uid from ..utils.convert import get_uid
from ..utils.error_reply import UID_HINT from ..utils.error_reply import UID_HINT
from ..utils.image.convert import convert_img
# from ..utils.image.convert import convert_img from .draw_char_img import draw_char_info_img
# from ..utils.map.GS_MAP_PATH import alias_data # from ..utils.map.GS_MAP_PATH import alias_data
# from .draw_char_rank import draw_cahrcard_list # from .draw_char_rank import draw_cahrcard_list
# from .get_enka_img import draw_enka_img, get_full_char # from .get_enka_img import draw_enka_img, get_full_char
# from ..utils.resource.RESOURCE_PATH import TEMP_PATH from ..utils.resource.RESOURCE_PATH import TEMP_PATH
sv_char_info_config = SV('sr面板设置', pm=2) sv_char_info_config = SV('sr面板设置', pm=2)
sv_get_char_info = SV('sr面板查询', priority=10) sv_get_char_info = SV('sr面板查询', priority=10)
sv_get_sr_original_pic = SV('sr查看面板原图', priority=5) sv_get_sr_original_pic = SV('sr查看面板原图', priority=5)
# @sv_get_char_info.on_prefix('查询') @sv_get_char_info.on_prefix('sr查询')
# async def send_char_info(bot: Bot, ev: Event): async def send_char_info(bot: Bot, ev: Event):
# # im = await _get_char_info(bot, ev, ev.text) im = await _get_char_info(bot, ev, ev.text)
# im = '' if isinstance(im, str):
# if isinstance(im, str): await bot.send(im)
# await bot.send(im) elif isinstance(im, Tuple):
# elif isinstance(im, Tuple): if isinstance(im[0], Image.Image):
# if isinstance(im[0], Image.Image): img = await convert_img(im[0])
# img = await convert_img(im[0]) else:
# else: img = im[0]
# img = im[0] await bot.send(img)
# await bot.send(img) if im[1]:
# if im[1]: with open(TEMP_PATH / f'{ev.msg_id}.jpg', 'wb') as f:
# with open(TEMP_PATH / f'{ev.msg_id}.jpg', 'wb') as f: f.write(im[1])
# f.write(im[1]) elif im is None:
# elif im is None: return
# return else:
# else: await bot.send('发生未知错误')
# await bot.send('发生未知错误')
# async def _get_char_info(bot: Bot, ev: Event, text: str): async def _get_char_info(bot: Bot, ev: Event, text: str):
# # 获取角色名 # 获取角色名
# msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', text)) msg = ''.join(re.findall('[\u4e00-\u9fa5 ]', text))
# if not msg: if not msg:
# return return
# await bot.logger.info('开始执行[查询角色面板]') await bot.logger.info('开始执行[查询角色面板]')
# # 获取uid # 获取uid
# uid = await get_uid(bot, ev) uid = await get_uid(bot, ev)
# if uid is None: if uid is None:
# return await bot.send(UID_HINT) return await bot.send(UID_HINT)
# await bot.logger.info('[查询角色面板]uid: {}'.format(uid)) await bot.logger.info('[查询角色面板]uid: {}'.format(uid))
#
# im = await draw_char_info_img(msg, uid, ev.image) im = await draw_char_info_img(msg, uid, ev.image)
# return im return im
@sv_get_char_info.on_command('sr强制刷新') @sv_get_char_info.on_command('sr强制刷新')
@ -68,6 +66,6 @@ async def send_card_info(bot: Bot, ev: Event):
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info('[sr强制刷新]uid: {}'.format(uid)) await bot.logger.info('[sr强制刷新]uid: {}'.format(uid))
im = await enka_to_card(uid) im = await api_to_card(uid)
await bot.logger.info(f'UID{uid}获取角色数据成功!') await bot.logger.info(f'UID{uid}获取角色数据成功!')
await bot.send(im) await bot.send(im)

View File

@ -0,0 +1,50 @@
import re
import json
from typing import Dict, Union, Optional
from gsuid_core.utils.error_reply import CHAR_HINT
from .mono.Character import Character
from ..utils.resource.RESOURCE_PATH import PLAYER_PATH
from ..utils.map.name_covert import name_to_avatar_id, alias_to_char_name
async def draw_char_info_img(raw_mes: str, sr_uid: str, url: Optional[str]):
# 获取角色名
char_name = ' '.join(re.findall('[\u4e00-\u9fa5]+', raw_mes))
char_data = await get_char_data(sr_uid, char_name)
print(char_data)
await cal_char_info(char_data)
async def cal_char_info(char_data: dict):
await Character(char_data).get_equipment_info()
async def get_char_data(
sr_uid: str, char_name: str, enable_self: bool = True
) -> Union[Dict, str]:
player_path = PLAYER_PATH / str(sr_uid)
SELF_PATH = player_path / 'SELF'
print(char_name)
char_id = await name_to_avatar_id(char_name)
print(char_id)
if '开拓者' in char_name:
char_name = '开拓者'
else:
char_name = await alias_to_char_name(char_id, char_name)
char_path = player_path / f'{char_name}.json'
char_self_path = SELF_PATH / f'{char_name}.json'
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)
with open(path, 'r', encoding='utf8') as fp:
char_data = json.load(fp)
return char_data

View File

@ -0,0 +1,107 @@
from typing import Dict, Tuple
from mpmath import mp
from ...utils.map.SR_MAP_PATH import EquipmentID2AbilityProperty
mp.dps = 14
class Character:
def __init__(self, card_prop: Dict):
# 面板数据
self.card_prop: Dict = card_prop
self.char_level: int = int(card_prop['avatarLevel'])
self.char_id: str = card_prop['avatarId']
self.char_name: str = card_prop['avatarName']
self.char_element = card_prop['avatarElement']
self.char_promotion = card_prop['avatarPromotion']
self.char_skill = card_prop['avatarSkill']
self.extra_ability = card_prop['avatarExtraAbility']
self.attribute_bonus = card_prop['avatarAttributeBonus']
self.char_relic = card_prop['RelicInfo']
self.base_attributes = card_prop['baseAttributes']
self.add_attr = {}
self.equipment = card_prop['equipmentInfo']
self.rarity = card_prop['avatarRarity']
# 角色的圣遗物总分
self.artifacts_all_score: float = 0
self.percent: str = '0.0'
self.dmg_data: Dict = {}
self.seq_str: str = '无匹配'
async def get_equipment_info(self):
base_attr = self.base_attributes
equip = self.equipment
ability_property = EquipmentID2AbilityProperty[
str(equip['equipmentID'])
]
equip_rank = equip['equipmentRank']
equip_ability_property = ability_property[str(equip_rank)]
equip_add_base_attr = equip['baseAttributes']
hp = mp.mpf(base_attr['hp']) + mp.mpf(equip_add_base_attr['hp'])
attack = mp.mpf(base_attr['attack']) + mp.mpf(
equip_add_base_attr['attack']
)
defence = mp.mpf(base_attr['defence']) + mp.mpf(
equip_add_base_attr['defence']
)
base_attr['hp'] = str(hp)
base_attr['attack'] = str(attack)
base_attr['defence'] = str(defence)
self.base_attributes = base_attr
for equip_ability in equip_ability_property:
property_type = equip_ability['PropertyType']
value = equip_ability['Value']['Value']
if property_type in self.add_attr:
self.add_attr[property_type] += value
else:
self.add_attr[property_type] = value
print(self.base_attributes)
print(self.add_attr)
async def p2v(power: str, power_plus: int) -> Tuple[float, float]:
"""
将power转换为value
"""
# 如果存在123%+123%形式的
if '+' in power:
power_percent = (
float(power.split('+')[0].replace('%', '')) / 100
) * power_plus
power_value = power.split('+')[1]
if '%' in power_value:
power_percent += (
float(power_value.replace('%', '')) / 100 * power_plus
)
power_value = 0
else:
power_value = float(power_value)
elif '%' in power:
power_percent = float(power.replace('%', '')) / 100 * power_plus
power_value = 0
else:
power_percent = 0
power_value = float(power)
return power_percent, power_value
# async def get_artifacts_value(raw_data: Dict) -> List[str]:
# # 计算圣遗物效果
# all_effects = []
# for equip in raw_data['equipList']:
# statNmae = equip['reliquaryMainstat']['statName']
# statValue = equip['reliquaryMainstat']['statValue']
# all_effects.append(await text_to_effect(statNmae, statValue))
# for sub in equip['reliquarySubstats']:
# sub_name = sub['statName']
# sub_value = sub['statValue']
# all_effects.append(await text_to_effect(sub_name, sub_value))
# return all_effects

View File

@ -22,22 +22,13 @@ from ..utils.map.SR_MAP_PATH import (
skillId2Type, skillId2Type,
avatarId2Name, avatarId2Name,
avatarId2EnName, avatarId2EnName,
avatarId2Rarity,
characterSkillTree, characterSkillTree,
avatarId2DamageType, avatarId2DamageType,
) )
mp.dps = 14 mp.dps = 14
PROP_ATTR_MAP = {
'Anemo': '44',
'Cryo': '46',
'Dendro': '43',
'Electro': '41',
'Geo': '45',
'Hydro': '42',
'Pyro': '40',
}
async def api_to_dict( async def api_to_dict(
sr_uid: str, sr_data: Optional[EnkaData] = None sr_uid: str, sr_data: Optional[EnkaData] = None
@ -114,6 +105,7 @@ async def get_data(char: dict, sr_data: dict, sr_uid: str):
'avatarId': char['AvatarID'], 'avatarId': char['AvatarID'],
'avatarName': avatarId2Name[str(char['AvatarID'])], 'avatarName': avatarId2Name[str(char['AvatarID'])],
'avatarElement': avatarId2DamageType[str(char['AvatarID'])], 'avatarElement': avatarId2DamageType[str(char['AvatarID'])],
'avatarRarity': avatarId2Rarity[str(char['AvatarID'])],
'avatarPromotion': char['Promotion'], 'avatarPromotion': char['Promotion'],
'avatarLevel': char['Level'], 'avatarLevel': char['Level'],
'avatarSkill': [], 'avatarSkill': [],

View File

@ -22,6 +22,9 @@ rankId2Name_fileName = f'rankId2Name_mapping_{version}.json'
characterSkillTree_fileName = f'characterSkillTree_mapping_{version}.json' characterSkillTree_fileName = f'characterSkillTree_mapping_{version}.json'
avatarId2DamageType_fileName = f'avatarId2DamageType_mapping_{version}.json' avatarId2DamageType_fileName = f'avatarId2DamageType_mapping_{version}.json'
avatarId2Rarity_fileName = f'avatarId2Rarity_mapping_{version}.json' avatarId2Rarity_fileName = f'avatarId2Rarity_mapping_{version}.json'
EquipmentID2AbilityProperty_fileName = (
f'EquipmentID2AbilityProperty_mapping_{version}.json'
)
class TS(TypedDict): class TS(TypedDict):
@ -70,3 +73,10 @@ with open(MAP / 'char_alias.json', 'r', encoding='UTF-8') as f:
with open(MAP / avatarId2Rarity_fileName, 'r', encoding='UTF-8') as f: with open(MAP / avatarId2Rarity_fileName, 'r', encoding='UTF-8') as f:
avatarId2Rarity = msgjson.decode(f.read(), type=Dict[str, str]) avatarId2Rarity = msgjson.decode(f.read(), type=Dict[str, str])
with open(
MAP / EquipmentID2AbilityProperty_fileName, 'r', encoding='UTF-8'
) as f:
EquipmentID2AbilityProperty = msgjson.decode(
f.read(), type=Dict[str, Dict[str, List]]
)

File diff suppressed because one or more lines are too long

6
poetry.lock generated
View File

@ -510,14 +510,14 @@ files = [
[[package]] [[package]]
name = "nodeenv" name = "nodeenv"
version = "1.7.0" version = "1.8.0"
description = "Node.js virtual environment builder" description = "Node.js virtual environment builder"
category = "dev" category = "dev"
optional = false optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
files = [ files = [
{file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"},
{file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"},
] ]
[package.dependencies] [package.dependencies]