Files
dcalc/backend/core/open/helper.py
T
imelonandCopilot 01b648a3e7 dev
Co-authored-by: Copilot <copilot@github.com>
2026-05-05 18:59:06 +08:00

250 lines
10 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',
'光启·除恶者': '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',
}
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
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 = {}
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
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),
'dressInfo': [
{
'dress': i.get('name', ''),
'clone': i.get('clone', ''),
'part': i.get('posName', ''),
}
for i in detail.get('avatars', [])
],
}
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