from openapi.dnfhelper.public import get_main_user_info_by_id 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_info_by_id(user_id: str, alter: AltersDep): # if alter is None: # raise ResponseException("登录过期或无效Token,请刷新后重试") # 通过OCR助手获取用户信息 helper_info = await get_main_user_info_by_id(user_id) 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(f"职业不匹配,请切换到{detail.get('job', '')}后或修改助手的默认角色后重试") basic = get_equipment('0') basicAvatars = basic.funs.get_dress_list([]) equs = detail.get('equs', []) equips = {} avatar = {} for equ in 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': 3, # 精度 '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 avatars = detail.get('avatars', []) for item in 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)' 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 return { 'job': job, 'equips': equips, 'avatars': avatar, } # 处理装备 # 处理时装 pass 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