miao-plugin/apps/character/avatar-card.js
2022-09-04 14:15:00 +08:00

223 lines
5.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Artifact, Character } from '../../models/index.js'
import { Cfg, Data, Common, Profile } from '../../components/index.js'
import lodash from 'lodash'
import { segment } from 'oicq'
// 角色昵称
let abbr = Character.getAbbr()
export async function renderAvatar (e, avatar, renderType = 'card') {
// 如果传递的是名字,则获取
if (typeof (avatar) === 'string') {
let char = Character.get(avatar)
if (!char) {
return false
}
let MysApi = await e.getMysApi({
auth: 'all',
targetType: Cfg.get('char.queryOther', true) ? 'all' : 'self',
cookieType: 'all',
actionName: '查询信息'
})
if (!MysApi) return true
let uid = MysApi.targetUser.uid
if (char.isCustom) {
avatar = { id: char.id, name: char.name, detail: false }
} else {
let profile = Profile.get(uid, char.id, true)
if (profile) {
// 优先使用Profile数据
avatar = profile
} else {
// 使用Mys数据兜底
let charData = await MysApi.getCharacter()
if (!charData) return true
let avatars = charData.avatars
if (char.isTraveler) {
char = await char.checkAvatars(avatars, uid)
}
avatars = lodash.keyBy(avatars, 'id')
avatar = avatars[char.id] || { id: char.id, name: char.name, detail: false }
}
}
}
return await renderCard(e, avatar, renderType)
}
// 渲染角色卡片
async function renderCard (e, avatar, renderType = 'card') {
let char = Character.get(avatar)
if (!char) {
return false
}
let uid = e.uid || (e.targetUser && e.targetUser.uid)
let crownNum = 0;
let talent = {}
if (!char.isCustom) {
talent = await getTalent(e, avatar)
// 计算皇冠个数
crownNum = lodash.filter(lodash.map(talent, (d) => d.original), (d) => d >= 10).length
}
let bg = char.getCardImg(Cfg.get('char.se', false))
if (renderType === 'photo') {
e.reply(segment.image(process.cwd() + '/plugins/miao-plugin/resources/' + bg.img))
} else {
// 渲染图像
let msgRes = await Common.render('character/character-card', {
save_id: uid,
uid,
talent,
crownNum,
talentMap: { a: '普攻', e: '战技', q: '爆发' },
bg,
custom: char.isCustom,
...getCharacterData(avatar, char),
ds: char.getData('name,id,title,desc')
}, { e, scale: 1.6, retMsgId: true })
if (msgRes && msgRes.message_id) {
// 如果消息发送成功就将message_id和图片路径存起来1小时过期
await redis.set(`miao:original-picture:${msgRes.message_id}`, bg.img, { EX: 3600 })
}
return true
}
return true
}
// 获取角色技能数据
async function getTalent (e, avatars) {
let talent = {};
let cons = 0;
let char = Character.get(avatars.id);
let mode = 'level'
if (char.isCustom) {
return {}
}
if (avatars.dataSource && avatars.talent) {
// profile模式
talent = avatars.talent || {}
cons = avatars.cons || 0
} else {
let MysApi = await e.getMysApi({
auth: 'all',
targetType: Cfg.get('char.queryOther', true) ? 'all' : 'self',
cookieType: 'all',
actionName: '查询信息'
})
if (!MysApi && !MysApi.isSelfCookie) return {}
let skillRes = await MysApi.getAvatar(avatars.id)
cons = avatars.actived_constellation_num
mode = 'original'
if (skillRes && skillRes.skill_list) {
let skillList = lodash.orderBy(skillRes.skill_list, ['id'], ['asc'])
for (let val of skillList) {
if (val.name.includes('普通攻击')) {
talent.a = val
continue
}
if (val.max_level >= 10 && !talent.e) {
talent.e = val
continue
}
if (val.max_level >= 10 && !talent.q) {
talent.q = val
}
}
}
}
return char.getAvatarTalent(talent, cons, mode)
}
/*
* 获取角色数据
* */
function getCharacterData (avatars, char) {
let list = []
let set = {}
let artiEffect = []
let w = avatars.weapon || {}
let weapon = {
type: 'weapon',
name: w.name || '',
showName: abbr[w.name] || w.name || '',
level: w.level || 1,
affix: w.affix || w.affix_level || 0
}
let artis = avatars?.artis?.artis || avatars.reliquaries
if (artis) {
lodash.forEach(artis, (val) => {
let setCfg = Artifact.getSetByArti(val.name)
if (!setCfg) {
return
}
let setName = setCfg.name
if (set[setName]) {
set[setName]++
if (set[setName] === 2) {
artiEffect.push('2件套' + setCfg.effect['2'])
}
if (set[setName] === 4) {
artiEffect.push('4件套' + setCfg.name)
}
} else {
set[setName] = 1
}
})
if (artiEffect.length === 0) {
artiEffect = ['无套装效果']
}
}
let reliquaries = list[0]
return {
name: char.name,
showName: char.abbr || char.name,
level: Data.def(avatars.lv, avatars.level),
fetter: avatars.fetter,
cons: Data.def(avatars.cons, avatars.actived_constellation_num),
weapon,
artiEffect,
reliquaries
}
}
export async function getAvatarList (e, type, MysApi) {
let data = await MysApi.getCharacter()
if (!data) return false
let avatars = data.avatars
if (avatars.length <= 0) {
return false
}
let list = []
for (let val of avatars) {
if (type !== false) {
if (!Character.checkWifeType(val.id, type)) {
continue
}
}
if (val.rarity > 5) {
val.rarity = 5
}
list.push(val)
}
if (list.length <= 0) {
return false
}
let sortKey = 'level,fetter,weapon_level,rarity,weapon_rarity,cons,weapon_affix_level'
list = lodash.orderBy(list, sortKey, lodash.repeat('desc,', sortKey.length).split(','))
return list
}