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,请刷新后重试') 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