/* * 用户角色封装 * 兼容处理面板 Profile Data 及 Mys Avatar 数据 * */ import Base from './Base.js' import lodash from 'lodash' import { Profile } from '../components/index.js' import { Artifact, Character, Weapon, ArtifactSet } from './index.js' import moment from 'moment' const charKey = 'name,abbr,sName,star,imgs,face,side,gacha,weaponTypeName,elem'.split(',') export default class Avatar extends Base { constructor (data = {}, pd = false, hasCk = true) { super() if (!data.name) { return false } let char = Character.get(data.name) if (!char || char.isCustom) { return false } this.meta = data this.char = char let isProfile = data.isProfile this.dataType = isProfile ? 'profile' : 'avatar' this.hasCk = hasCk let profile let uid if (isProfile) { profile = data } else if (pd) { if (pd.isProfile) { profile = pd } else if (/\d{9}/.test(pd)) { uid = pd profile = Profile.get(pd, char.id, true) } } if (profile && profile.isProfile && profile.hasData) { this.profile = profile } this.elem = ((profile && profile.elem) || data.element || data.elem || char.elem || 'anemo').toLowerCase() if (char.isTraveler) { this.char = Character.get({ id: data.id || char.id, elem: this.elem }) uid && char.setTraveler(uid) } } _get (key) { if (charKey.includes(key)) { return this.char[key] } return this.meta[key] } get dataSourceName () { if (!this.hasCk && this.profile) { return this.profile.dataSourceName } return this.meta.dataSourceName || '米游社' } get updateTime () { if ((!this.hasCk || this.isProfile) && this.profile) { return this.profile.updateTime } return moment(new Date()).format('MM-DD HH:mm') } get isProfile () { return this.dataType === 'profile' } get isAvatar () { return this.dataType === 'avatar' } get artis () { let ret = {} if (!this.isProfile) { lodash.forEach(this.meta.reliquaries, (ds) => { let arti = Artifact.get(ds.name) ret[arti.idx] = { name: arti.name, set: arti.setName, img: arti.img, level: ds.level } }) return ret } if (this.profile && this.profile?.artis) { return this.profile.artis.getArtisData() } return false } get cons () { let data = this.meta let profile = this.profile return data?.cons || data?.actived_constellation_num || profile?.cons || 0 } get weapon () { let wd = this.meta?.weapon || this.profile?.weapon if (!wd || !wd.name) { return {} } let weapon = Weapon.get(wd.name) return { name: wd.name, abbr: weapon.abbr, star: weapon.star, level: wd.level || 1, affix: wd.affix || wd.affix_level || 0, type: weapon.type, img: weapon.img } } async getTalent (mys) { if (!this.isProfile && mys && mys.isSelfCookie) { let char = this.char let id = char.id let talent = {} let talentRes = await mys.getDetail(id) // { data: null, message: '请先登录', retcode: -100, api: 'detail' } let avatar = this.meta if (!char || !avatar) { return false } if (talentRes && talentRes.skill_list) { let talentList = lodash.orderBy(talentRes.skill_list, ['id'], ['asc']) for (let val of talentList) { let { max_level: maxLv, level_current: lv } = val if (val.name.includes('普通攻击')) { talent.a = lv continue } if (maxLv >= 10 && !talent.e) { talent.e = lv continue } if (maxLv >= 10 && !talent.q) { talent.q = lv continue } } } let ret = char.getAvatarTalent(talent, this.cons, 'original') if (ret) { ret.id = id } return ret } if (this.profile) { let profile = this.profile let talent = profile.talent talent.id = profile.id return talent } return false } get artisSet () { if (this._artisSet) { return this._artisSet } this._artisSet = false if (!this.isProfile) { let artis = this.artis let setCount = {} lodash.forEach(artis, (arti, idx) => { let set = arti?.set if (set) { setCount[set] = (setCount[set] || 0) + 1 } }) let sets = {} let names = [] let abbrs = [] let abbrs2 = [] let imgs = [] for (let set in setCount) { if (setCount[set] >= 2) { let value = setCount[set] >= 4 ? 4 : 2 sets[set] = value let artiSet = ArtifactSet.get(set) names.push(artiSet.name) abbrs.push(artiSet.abbr + value) abbrs2.push(artiSet.name + value) imgs.push(artiSet.img) } } this._artisSet = { sets, names, abbrs: [...abbrs, ...abbrs2], imgs, name: (abbrs.length > 1 || abbrs2[0]?.length > 7) ? abbrs.join('+') : abbrs2[0], sName: abbrs.join('+') } } if (this.profile) { let profile = this.profile this._artisSet = profile.artis ? profile.artis.getSetData() : false } return this._artisSet || {} } }