257 lines
11 KiB
Python
257 lines
11 KiB
Python
from openapi.dnfhelper.public import get_main_user_info_by_id, get_user_list
|
|
from core.basic.equipment import get_equipment
|
|
from api.dp import AltersDep
|
|
from api.core.exception import ResponseException
|
|
import re
|
|
|
|
job_mapping = {
|
|
'极诣·剑魂': 'weapon_master',
|
|
'极诣·鬼泣': 'soul_bender',
|
|
'极诣·狂战士': 'berserker',
|
|
'极诣·阿修罗': 'asura',
|
|
'极诣·剑影': 'ghostblade',
|
|
'极诣·驭剑士': 'sword_master',
|
|
'极诣·暗殿骑士': 'dark_templar',
|
|
'极诣·契魔者': 'demon_slayer',
|
|
'极诣·流浪武士': 'vegabond',
|
|
'极诣·刃影': 'spectre',
|
|
'归元·气功师(男)': 'nenmaster_male',
|
|
'归元·散打(男)': 'striker_male',
|
|
'归元·街霸(男)': 'brawler_male',
|
|
'归元·柔道家(男)': 'grappler_male',
|
|
'归元·气功师(女)': 'nenmaster_female',
|
|
'归元·散打(女)': 'striker_female',
|
|
'归元·街霸(女)': 'brawler_female',
|
|
'归元·柔道家(女)': 'grappler_female',
|
|
'重霄·漫游枪手(男)': 'ranger_male',
|
|
'重霄·枪炮师(男)': 'launcher_male',
|
|
'重霄·机械师(男)': 'mechanic_male',
|
|
'重霄·弹药专家(男)': 'spitfire_male',
|
|
'重霄·合金战士': 'assault',
|
|
'重霄·漫游枪手(女)': 'ranger_female',
|
|
'重霄·枪炮师(女)': 'launcher_female',
|
|
'重霄·机械师(女)': 'mechanic_female',
|
|
'重霄·弹药专家(女)': 'spitfire_female',
|
|
'重霄·协战师': 'paramedic',
|
|
'知源·元素爆破师': 'elemental_bomber',
|
|
'知源·冰结师': 'glacial_master',
|
|
'知源·血法师': 'blood_mage',
|
|
'知源·逐风者': 'swift_master',
|
|
'知源·次元行者': 'dimension_walker',
|
|
'知源·元素师': 'elementalist',
|
|
'知源·召唤师': 'summoner',
|
|
'知源·战斗法师': 'battle_mage',
|
|
'知源·魔道学者': 'witch',
|
|
'知源·小魔女': 'enchantress',
|
|
'光启·光明骑士(男)': 'crusader_male',
|
|
'光启·蓝拳使者(男)': 'infighter',
|
|
'光启·驱魔师(男)': 'exorcist',
|
|
'光启·惩戒者': 'avenger',
|
|
'光启·光明骑士(女)': 'crusader_female',
|
|
'光启·正义审判者': 'inquistor',
|
|
'光启·驱魔师(女)': 'sorceress',
|
|
'光启·蓝拳使者(女)': 'infighter_female',
|
|
'光启·除恶者': 'mistress',
|
|
'隐夜·暗星': 'rogue',
|
|
'隐夜·黑夜术士': 'necro',
|
|
'隐夜·忍者': 'kunoichi',
|
|
'隐夜·影舞者': 'shadow_dancer',
|
|
'皓曦·精灵骑士': 'elven_knight',
|
|
'皓曦·混沌魔灵': 'chaos',
|
|
'皓曦·帕拉丁': 'paladin',
|
|
'皓曦·龙骑士': 'dragon_knight',
|
|
'千魂·征战者': 'vanguard',
|
|
'千魂·决战者': 'skirmisher',
|
|
'千魂·狩猎者': 'dragoon',
|
|
'千魂·暗枪士': 'impaler',
|
|
'苍暮·暗刃': 'hitman',
|
|
'苍暮·特工': 'agent',
|
|
'苍暮·战线佣兵': 'trouble_shooter',
|
|
'苍暮·源能专家': 'specialist',
|
|
'聆风·缪斯': 'muse',
|
|
'聆风·旅人': 'traveler',
|
|
'聆风·猎人': 'hunter',
|
|
'聆风·妖护使': 'vigilante',
|
|
'聆风·奇美拉': 'chimera',
|
|
'知源·缔造者': 'creator',
|
|
'极诣·黑暗武士': 'dark_knight',
|
|
'鸣锋·破浪者': 'breaker',
|
|
}
|
|
|
|
|
|
async def get_user_list_by_id(user_id: str):
|
|
# 通过OCR助手获取用户列表
|
|
helper_list = await get_user_list(user_id)
|
|
if helper_list is None:
|
|
raise ResponseException('当前用户ID不存在或无公开角色,请确认后重试')
|
|
else:
|
|
return helper_list
|
|
|
|
|
|
def getRoleJobCode(jobName: str):
|
|
return job_mapping.get(jobName, None)
|
|
|
|
|
|
async def get_user_info_by_role_id(user_id: str, role_id: str, alter: AltersDep):
|
|
# 通过OCR助手获取用户信息
|
|
helper_info = await get_main_user_info_by_id(user_id, None, role_id)
|
|
if helper_info is None:
|
|
raise ResponseException('当前助手ID不存在或已隐藏,请确认后重试')
|
|
else:
|
|
return trans_to_dcalc_set(helper_info, alter)
|
|
|
|
|
|
async def get_user_info_by_id(user_id: str, alter: AltersDep):
|
|
if alter is None:
|
|
raise ResponseException('登录过期或无效Token,请刷新后重试')
|
|
name = next((k for k, v in job_mapping.items() if v == alter.origin), '')
|
|
# 通过OCR助手获取用户信息
|
|
helper_info = await get_main_user_info_by_id(user_id, name)
|
|
if helper_info is None:
|
|
raise ResponseException('当前助手ID不存在或已隐藏,请确认后重试')
|
|
else:
|
|
return trans_to_dcalc_set(helper_info, alter)
|
|
pass
|
|
|
|
|
|
def trans_to_dcalc_set(detail, alter: AltersDep):
|
|
job = job_mapping.get(detail.get('job', ''), '')
|
|
if job != alter.origin:
|
|
raise ResponseException('未能匹配到当前职业对应的角色信息,请确认后重试')
|
|
basic = get_equipment('0')
|
|
basicAvatars = basic.funs.get_dress_list([])
|
|
equips = {}
|
|
avatar = {}
|
|
emblems = {}
|
|
oaths = {}
|
|
for equ in detail.get('equs', []):
|
|
info = {
|
|
'id': '0',
|
|
# 强化
|
|
'reinforce': equ.get('enhance', {}).get('reinforce', 0),
|
|
# 强化类型
|
|
'reinforceType': equ.get('enhance', {}).get('reinforceType', 0),
|
|
# 附魔
|
|
'enchant': 0,
|
|
# # 徽章1
|
|
# 'emblem_0': 0,
|
|
# # 徽章2
|
|
# 'emblem_1': 0,
|
|
# 贴膜
|
|
# 'fusion': 0,
|
|
# 锻造等级
|
|
'refine': equ.get('enhance', {}).get('refine', 0),
|
|
# 调试等级
|
|
'adaptation': equ.get('adaptation', 0),
|
|
# 精度
|
|
'precision': 100,
|
|
}
|
|
# 装备
|
|
dcalcEqu = next((item for item in basic.equs if item.name == equ['name'].replace('(黑雨) ', '')), None)
|
|
if dcalcEqu:
|
|
info['id'] = dcalcEqu.id
|
|
# dcalcEquFusion = next((item for item in basic.stones if item.name == equ.get('upgrade', '')), None)
|
|
# if dcalcEquFusion:
|
|
# info['fusion'] = dcalcEquFusion.id
|
|
info['enchant'] = getEnchatIdByName(equ.get('enchant', ''), equ.get('posName', ''), basic.enchants)
|
|
# emblems = [getEmblemIdByName(i.get('detail', ''), i.get('categorize', ''), i.get('rarity', ''), basic.emblems) for i in equ.get('emblems', [])]
|
|
# info['emblem_0'] = emblems[0] if len(emblems) > 0 else 0
|
|
# info['emblem_1'] = emblems[1] if len(emblems) > 1 else 0
|
|
equips[equ['posName']] = info
|
|
for item in detail.get('avatars', []):
|
|
info = {
|
|
'id': '',
|
|
'option': '',
|
|
'enchant': '',
|
|
# 'emblem_0': '',
|
|
# 'emblem_1': '',
|
|
}
|
|
list = basicAvatars.get(item.get('posName', ''), [])
|
|
if len(list) > 0:
|
|
dcalcAvatar = next((i for i in list if i.get('rarity', '') == item.get('rarity', '')), None)
|
|
if dcalcAvatar:
|
|
info['id'] = dcalcAvatar.get('id', '0')
|
|
info['option'] = item.get('attr', '')
|
|
avatar[item['posName']] = info
|
|
else:
|
|
if item.get('posName', '') in ['光环', '皮肤', '武器装扮']:
|
|
# TODO: 处理没有找到对应时装的情况 即光环、皮肤、武器
|
|
# 装扮
|
|
if item.get('posName', '') == '武器装扮':
|
|
if item.get('name', '') == '神器克隆武器装扮':
|
|
item['enchant'] = '技攻(3%)|增益量(1%)|四维(65)'
|
|
else:
|
|
match = re.search(r'\[(\d+)级\]', item.get('name', ''))
|
|
lv = int(match.group(1)) if match else None
|
|
if lv:
|
|
item['enchant'] = f'Lv{lv}主动+1|四维(55)'
|
|
else:
|
|
item['enchant'] = '全属强(6)'
|
|
if item.get('posName', '') == '皮肤':
|
|
match = re.search(r'\[(\d+)级\]', item.get('name', ''))
|
|
lv = int(match.group(1)) if match else None
|
|
if lv:
|
|
item['enchant'] = f'Lv{lv}主动+1|全属强(12)|四维(55)'
|
|
if item.get('posName', '') == '光环':
|
|
# 先默认这个了 不管了
|
|
item['enchant'] = 'Lv1~95+1|攻击强化(12%)|增益量(7%)'
|
|
info['enchant'] = getEnchatIdByName(item.get('enchant', ''), item.get('posName', ''), basic.enchants)
|
|
# emblems = [getEmblemIdByName(i.get('detail', ''), i.get('categorize', ''), i.get('rarity', ''), basic.emblems) for i in item.get('emblems', [])]
|
|
# info['emblem_0'] = emblems[0] if len(emblems) > 0 else 0
|
|
# info['emblem_1'] = emblems[1] if len(emblems) > 1 else 0
|
|
avatar[item['posName']] = info
|
|
for index, item in enumerate(detail.get('oaths', [])):
|
|
info = {'id': -1, 'adaptation': 0}
|
|
dcalcOath = next((i for i in basic.oaths if i.name == item), None)
|
|
if dcalcOath:
|
|
info['id'] = dcalcOath.id
|
|
info['adaptation'] = 3 if index < 11 else 0
|
|
oaths[str(index)] = info
|
|
|
|
rarities = ['稀有', '神器', '传说', '史诗']
|
|
for item in detail.get('emblems', []):
|
|
pos = item.get('pos', '')
|
|
if not pos:
|
|
continue
|
|
rarity = item.get('rarity', '')
|
|
lv = item.get('lv', 1)
|
|
if rarity in rarities:
|
|
lv += rarities.index(rarity) * 5 - 1
|
|
emblems[pos] = {'lv': lv, 'items': [getEmblemIdByAttr(i.get('attr', ''), i.get('rarity', ''), i.get('type', ''), basic.emblems) for i in item.get('items', [])]}
|
|
return {'job': job, 'equips': equips, 'avatars': avatar, 'emblems': emblems, 'avatarLink': detail.get('avatarLink', ''), 'fogOathLv': detail.get('fogOathLv', 0), 'oaths': oaths, 'dressInfo': detail.get('dressInfo', [])}
|
|
|
|
|
|
def getEnchatIdByName(name: str, position: str, items: list):
|
|
try:
|
|
items = list(filter(lambda x: position in x.get('position', []), items))
|
|
for item in items:
|
|
if '|'.join(sorted(item.get('detail', '').split('|'))) == '|'.join(sorted(name.split('|'))):
|
|
return item.get('id', 0)
|
|
return 0
|
|
except Exception as _:
|
|
return 0
|
|
|
|
|
|
def getEmblemIdByName(detail: str, categorize: str, rarity: str, items: list):
|
|
try:
|
|
if categorize == '白金':
|
|
return detail
|
|
for item in items:
|
|
if item.get('detail', '') == detail and categorize in item.get('categorize', []) and item.get('rarity', '') == rarity:
|
|
return item.get('id', 0)
|
|
return 0
|
|
except Exception as _:
|
|
return 0
|
|
|
|
|
|
def getEmblemIdByAttr(attr: str, rarity: str, type: str, items: list):
|
|
try:
|
|
if type == '白金':
|
|
return attr
|
|
for item in items:
|
|
if item.get('attr', '') == attr and item.get('type', '') == type and item.get('rarity', '') == rarity:
|
|
return item.get('id', 0)
|
|
return 0
|
|
except Exception as _:
|
|
return 0
|