对player.getAvatar()增加旅行者逻辑处理

This commit is contained in:
Kokomi 2023-02-13 05:18:06 +08:00
parent c35386676e
commit 817ae8fb46
10 changed files with 52 additions and 104 deletions

View File

@ -168,7 +168,7 @@ async function getAvatarList (player, type, mys) {
let list = []
player.forEachAvatar((avatar) => {
if (type !== false) {
if (!Character.checkWifeType(avatar.id, type)) {
if (!avatar.char.checkWifeType(avatar.id, type)) {
return true
}
}

View File

@ -117,8 +117,7 @@ export async function renderProfile (e, char, mode = 'profile', params = {}) {
}
let player = Player.create(uid)
let avatar = player.getAvatar(char.id)
let profile = e._profile || avatar.getProfile(char.id)
let profile = e._profile || player.getProfile(char.id)
let refresh = async () => {
let refreshRet = await autoRefresh(e)

View File

@ -159,6 +159,9 @@ async function renderCharRankList ({ e, uids, char, mode, groupId }) {
let uid = ds.uid || ds.value
let player = Player.create(uid)
let avatar = player.getAvatar(ds.charId || char.id)
if (!avatar) {
continue
}
let profile = avatar.getProfile()
if (profile) {

View File

@ -21,19 +21,6 @@ export default class AvatarData extends Base {
this.setAvatar(ds, source)
}
/**
* 当前数据是否需要更新天赋
* @returns {boolean}
*/
get needRefreshTalent () {
// 不存在天赋数据
if (!this.hasTalent) {
return true
}
// 超过2个小时的天赋数据进行请求
return (new Date() * 1) - this._talent > 3600 * 2 * 1000
}
get hasTalent () {
return this.talent && !lodash.isEmpty(this.talent) && !!this._talent
}

View File

@ -13,7 +13,7 @@ import CharId from './character-lib/CharId.js'
import CharMeta from './character-lib/CharMeta.js'
import CharCfg from './character-lib/CharCfg.js'
let { abbrMap, wifeMap, idSort, idMap } = CharId
let { wifeMap, idSort, idMap } = CharId
let getMeta = function (name) {
return Data.readJSON(`resources/meta/character/${name}/data.json`)
@ -172,22 +172,6 @@ class Character extends Base {
})
}
// 当获取角色为旅行者时会考虑当前uid的账号情况返回对应旅行者
static async getAvatar (name, uid) {
let char = Character.get(name)
return await char.getTraveler(uid)
}
// TODO待废弃
static getAbbr () {
return abbrMap
}
// TODO待废弃
static checkWifeType (charid, type) {
return !!wifeMap[type][charid]
}
// 获取排序ID
static sortIds (arr) {
return arr.sort((a, b) => (idSort[a] || 300) - (idSort[b] || 300))
@ -275,52 +259,6 @@ class Character extends Base {
return this._detail
}
// 获取别名数据
// TODO迁移至Avatar
setTraveler (uid = '') {
if (this.isTraveler && uid && uid.toString().length === 9) {
Data.setCacheJSON(`miao:uid-traveler:${uid}`, {
id: CharId.getTravelerId(this.id),
elem: this.elem
}, 3600 * 24 * 120)
}
}
// 检查wife类型
// 获取旅行者数据
async getTraveler (uid) {
if (this.isTraveler) {
let tData = await Data.getCacheJSON(`miao:uid-traveler:${uid}`)
return Character.get({
id: CharId.getTravelerId(tData.id || this.id),
elem: tData.elem || (this.elem !== 'multi' ? this.elem : 'anemo')
})
}
return this
}
async checkAvatars (avatars, uid = '') {
if (!this.isTraveler) {
return this
}
if (lodash.isObject(avatars) && avatars.id) {
avatars = [avatars]
}
for (let avatar of avatars) {
if (CharId.isTraveler(avatar.id)) {
let char = Character.get({
id: avatar.id,
elem: (avatar.elem || avatar.element || 'anemo').toLowerCase()
})
char.setTraveler(uid)
return char
}
}
return await this.getTraveler(uid)
}
// 获取伤害计算配置
getCalcRule () {
if (!this._calcRule && this._calcRule !== false) {

View File

@ -1,10 +1,13 @@
/**
* 用户数据文件
* 数据存储在/data/userData/${uid}.json
* 兼容处理面板户数及Mys数据
*
*/
import lodash from 'lodash'
import Base from './Base.js'
import { Data } from '../components/index.js'
import { AvatarData, ProfileRank } from './index.js'
import { AvatarData, ProfileRank, Character } from './index.js'
import MysAvatar from './player-lib/MysAvatar.js'
import Profile from './player-lib/Profile.js'
@ -38,6 +41,12 @@ export default class Player extends Base {
}
}
// 获取面板更新服务名
static getProfileServName (uid) {
let Serv = Profile.getServ(uid)
return Serv.name
}
/**
* 重新加载json文件
*/
@ -96,16 +105,22 @@ export default class Player extends Base {
// 设置角色数据
setAvatar (ds, source = '') {
let avatar = this.getAvatar(ds.id)
let avatar = this.getAvatar(ds.id, true)
avatar.setAvatar(ds, source)
}
// 获取Avatar角色
getAvatar (id) {
if (!this._avatars[id]) {
this._avatars[id] = AvatarData.create({ id })
getAvatar (id, create = false) {
let char = Character.get(id)
let avatars = this._avatars
// 兼容处理旅行者的情况
if (char.isTraveler && !create) {
id = avatars['10000005'] ? 10000005 : 10000007
}
return this._avatars[id]
if (!avatars[id] && create) {
avatars[id] = AvatarData.create({ id })
}
return avatars[id] || false
}
// 异步循环角色
@ -137,7 +152,10 @@ export default class Player extends Base {
})
} else {
lodash.forEach(ids, (id) => {
ret[id] = this.getAvatar(id)
let avatar = this.getAvatar(id)
if (avatar) {
ret[id] = avatar.getDetail()
}
})
}
return ret
@ -146,7 +164,7 @@ export default class Player extends Base {
// 获取指定角色的面板数据
getProfile (id) {
let avatar = this.getAvatar(id)
return avatar.getProfile()
return avatar ? avatar.getProfile() : false
}
// 获取所有面板数据
@ -205,12 +223,6 @@ export default class Player extends Base {
return await MysAvatar.refreshTalent(this, ids, force)
}
// 获取面板更新服务名
static getProfileServName (uid) {
let Serv = Profile.getServ(uid)
return Serv.name
}
async refreshAndGetAvatarData (cfg) {
// 更新角色信息
await this.refreshMysDetail(cfg.force || 0)

View File

@ -1,10 +1,6 @@
import Base from './Base.js'
import fetch from 'node-fetch'
function sleep (ms) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
export default class ProfileReq extends Base {
constructor (e) {
super()
@ -40,7 +36,7 @@ export default class ProfileReq extends Base {
let serv = this.serv
let extra = serv.name ? `当前面板服务${serv.name}` : ''
const msgs = {
error: `UID${this.uid}更新面板失败,${extra}可能是面板服务维护中,请稍后重试...`,
error: `UID${this.uid}更新面板失败,${extra}\n可能是面板服务维护中,请稍后重试...`,
empty: '请将角色放置在【游戏内】角色展柜并打开【显示详情】等待5分钟重新获取面板'
}
msg = msgs[msg] || msg
@ -66,8 +62,6 @@ export default class ProfileReq extends Base {
return this.err(`请求过快,请${cdTime}秒后重试..`)
}
await this.setCd(20)
// this.msg(`开始获取uid:${this.uid}的数据,可能会需要一定时间~`)
// await sleep(100)
// 发起请求
logger.mark(`面板请求UID:${this.uid},面板服务:${serv.name}...`)
let data = {}

View File

@ -8,7 +8,7 @@ let EnkaData = {
if (!char) {
return
}
let avatar = player.getAvatar(char.id)
let avatar = player.getAvatar(char.id, true)
let talentRet = EnkaData.getTalent(char.id, data.skillLevelMap)
avatar.setAvatar({
level: data.propMap['4001'].val * 1,

View File

@ -1,4 +1,4 @@
import { Character, Artifact } from '../index.js'
import { Character } from '../index.js'
import lodash from 'lodash'
import { attrMap, artisIdxMap } from './ProfileMeta.js'
@ -6,7 +6,7 @@ import { attrMap, artisIdxMap } from './ProfileMeta.js'
let MiaoData = {
setAvatar (player, ds) {
let char = Character.get(ds.id)
let avatar = player.getAvatar(ds.id)
let avatar = player.getAvatar(ds.id, true)
let talentRet = MiaoData.getTalent(char.id, ds.skill)
avatar.setAvatar({
level: ds.level,

View File

@ -68,6 +68,7 @@ const MysAvatar = {
level: role.level,
name: role.nickname
})
let charIds = {}
lodash.forEach(charData.avatars, (ds) => {
let avatar = Data.getData(ds, 'id,level,cons:actived_constellation_num,fetter')
avatar.elem = ds.element.toLowerCase()
@ -90,7 +91,16 @@ const MysAvatar = {
})
avatar.artis = artis
player.setAvatar(avatar, 'mys')
charIds[avatar.id] = true
})
// 若角色数据>8检查缓存删除错误缓存的数据
if (lodash.keys(charIds).length > 8) {
player.forEachAvatar((avatar) => {
if (!charIds[avatar.id] && !avatar.isProfile) {
delete player._avatars[avatar.id]
}
})
}
player._mys = new Date() * 1
player.save()
},
@ -152,6 +162,9 @@ const MysAvatar = {
}
lodash.forEach(ids, (id) => {
let avatar = player.getAvatar(id)
if (!avatar) {
return true
}
if (!avatar.hasTalent || MysAvatar.needRefresh(avatar._talent, force, { 0: 60 * 24, 1: 60, 2: 0 })) {
ret.push(avatar.id)
}
@ -184,7 +197,9 @@ const MysAvatar = {
for (let val of avatarArr) {
for (let id of val) {
let avatar = player.getAvatar(id)
skillRet.push(await MysAvatar.refreshAvatarTalent(avatar, mys))
if (avatar) {
skillRet.push(await MysAvatar.refreshAvatarTalent(avatar, mys))
}
}
skillRet = await Promise.all(skillRet)
skillRet = skillRet.filter(item => item.id)