miao-plugin/apps/profile/ProfileDetail.js

212 lines
6.1 KiB
JavaScript
Raw Normal View History

2022-07-23 20:32:10 +00:00
import lodash from 'lodash'
import { getTargetUid, getProfileRefresh } from './ProfileCommon.js'
import ProfileList from './ProfileList.js'
import { Cfg, Common, Format } from '../../components/index.js'
import { MysApi, ProfileRank, ProfileArtis, Player, Character } from '../../models/index.js'
import ProfileChange from './ProfileChange.js'
import { profileArtis } from './ProfileArtis.js'
// 查看当前角色
export async function profileDetail (e) {
let msg = e.original_msg || e.msg
if (!msg) {
return false
}
if (!/详细|详情|面板|面版|圣遗物|伤害|换/.test(msg)) {
return false
}
let mode = 'profile'
let profileChange = false
let changeMsg = msg
let pc = ProfileChange.matchMsg(msg)
if (pc && pc.char && pc.change) {
if (!Cfg.get('profileChange')) {
e.reply('面板替换功能已禁用...')
return true
}
e.uid = pc.uid || e.runtime.uid
profileChange = ProfileChange.getProfile(e.uid, pc.char, pc.change)
if (profileChange && profileChange.char) {
msg = `#${profileChange.char?.name}${pc.mode || '面板'}`
e._profile = profileChange
e._profileMsg = changeMsg
}
}
let uidRet = /[0-9]{9}/.exec(msg)
if (uidRet) {
e.uid = uidRet[0]
msg = msg.replace(uidRet[0], '')
}
let name = msg.replace(/#|老婆|老公/g, '').trim()
msg = msg.replace('面版', '面板')
let dmgRet = /伤害(\d?)$/.exec(name)
let dmgIdx = 0
if (/(最强|最高|最高分|最牛|第一)/.test(msg)) {
mode = /(分|圣遗物|评分|ACE)/.test(msg) ? 'rank-mark' : 'rank-dmg'
name = name.replace(/(最强|最高分|第一|最高|最牛|圣遗物|评分|群)/g, '')
}
if (/(详情|详细|面板|面版)\s*$/.test(msg) && !/更新|录入|输入/.test(msg)) {
mode = 'profile'
name = name.replace(/(详情|详细|面板)/, '').trim()
} else if (dmgRet) {
mode = 'dmg'
name = name.replace(/伤害[0-5]?/, '').trim()
if (dmgRet[1]) {
dmgIdx = dmgRet[1] * 1
}
} else if (/(详情|详细|面板)更新$/.test(msg) || (/更新/.test(msg) && /(详情|详细|面板)$/.test(msg))) {
mode = 'refresh'
name = name.replace(/详情|详细|面板|更新/g, '').trim()
} else if (/圣遗物/.test(msg)) {
mode = 'artis'
name = name.replace('圣遗物', '').trim()
}
if (!Common.cfg('avatarProfile')) {
return false // 面板开关关闭
}
let char = Character.get(name.trim())
if (!char) {
return false
}
let uid = e.uid || await getTargetUid(e)
if (!uid) {
return true
}
e.uid = uid
e.avatar = char.id
if (char.isCustom) {
e.reply('自定义角色暂不支持此功能')
return true
}
if (!char.isRelease) {
if (!profileChange) {
e.reply('角色尚未实装')
return true
} else if (Cfg.get('notReleasedData') === false) {
e.reply('未实装角色面板已禁用...')
return true
}
}
if (mode === 'profile' || mode === 'dmg') {
return renderProfile(e, char, mode, { dmgIdx })
} else if (mode === 'refresh') {
await ProfileList.refresh(e)
return true
} else if (mode === 'artis') {
return profileArtis(e)
}
return true
}
export async function renderProfile (e, char, mode = 'profile', params = {}) {
let selfUser = await MysApi.initUser(e)
2022-09-27 02:25:31 +00:00
if (!selfUser) {
e.reply('尚未绑定UID')
return true
}
2022-07-23 20:32:10 +00:00
let { uid } = e
if (char.isCustom) {
2022-07-23 20:32:10 +00:00
e.reply(`暂不支持自定义角色${char.name}的面板信息查看`)
return true
}
let profile = e._profile || await getProfileRefresh(e, char.id)
if (!profile) {
2022-07-23 20:32:10 +00:00
return true
}
char = profile.char || char
2022-07-23 20:32:10 +00:00
let a = profile.attr
let c = Format.comma
let p = Format.pct
let attr = {
hp: c(a.hp),
hpPlus: c(a.hp - a.hpBase),
atk: c(a.atk),
atkPlus: c(a.atk - a.atkBase),
def: c(a.def),
defPlus: c(a.def - a.defBase),
2022-08-18 10:13:42 +00:00
cpct: p(a.cpct),
cdmg: p(a.cdmg),
mastery: c(a.mastery),
recharge: p(a.recharge),
2022-08-18 10:13:42 +00:00
dmg: p(Math.max(a.dmg * 1 || 0, a.phy * 1 || 0))
2022-07-23 20:32:10 +00:00
}
2022-07-23 20:32:10 +00:00
let enemyLv = await selfUser.getCfg('char.enemyLv', 91)
let dmgMsg = []
let dmgData = []
2022-08-18 10:13:42 +00:00
let dmgCalc = await profile.calcDmg({
enemyLv,
mode,
...params
2022-07-23 20:32:10 +00:00
})
if (dmgCalc && dmgCalc.ret) {
lodash.forEach(dmgCalc.ret, (ds) => {
2022-07-23 20:32:10 +00:00
ds.dmg = Format.comma(ds.dmg, 0)
ds.avg = Format.comma(ds.avg, 0)
dmgData.push(ds)
})
lodash.forEach(dmgCalc.msg, (msg) => {
2022-07-23 20:32:10 +00:00
msg.replace(':', '')
dmgMsg.push(msg.split(''))
})
}
if (mode === 'dmg' && dmgCalc.dmgRet) {
let basic = dmgCalc?.dmgCfg?.basicRet
lodash.forEach(dmgCalc.dmgRet, (row) => {
lodash.forEach(row, (ds) => {
2022-07-23 20:32:10 +00:00
ds.val = (ds.avg > basic.avg ? '+' : '') + Format.comma(ds.avg - basic.avg)
ds.dmg = Format.comma(ds.dmg, 0)
ds.avg = Format.comma(ds.avg, 0)
})
2022-07-23 20:32:10 +00:00
})
basic.dmg = Format.comma(basic.dmg)
basic.avg = Format.comma(basic.avg)
}
2022-11-07 20:16:30 +00:00
let rank = false
if (e.group_id && !e._profile) {
2022-11-07 20:16:30 +00:00
rank = await ProfileRank.create({ group: e.group_id, uid, qq: e.user_id })
await rank.getRank(profile, true)
}
let artisDetail = profile.getArtisMark()
let artisKeyTitle = ProfileArtis.getArtisKeyTitle()
let imgs = char.getImgs(profile.costume)
let costumeSplash = profile.costumeSplash
2022-07-23 20:32:10 +00:00
// 渲染图像
let msgRes = await Common.render('character/profile-detail', {
save_id: uid,
2022-07-23 20:32:10 +00:00
uid,
2023-02-10 13:53:57 +00:00
data: profile.getData('name,abbr,cons,level,weapon,talent,dataSource,updateTime'),
attr,
elem: char.elem,
dmgData,
dmgMsg,
dmgRet: dmgCalc.dmgRet || false,
dmgCfg: dmgCalc.dmgCfg || false,
artisDetail,
artisKeyTitle,
enemyLv,
imgs,
costumeSplash,
2022-07-23 20:32:10 +00:00
enemyName: dmgCalc.enemyName || '小宝',
talentMap: { a: '普攻', e: '战技', q: '爆发' },
2022-09-10 19:59:45 +00:00
bodyClass: `char-${char.name}`,
mode,
changeProfile: e._profileMsg
2023-02-08 20:55:54 +00:00
}, { e, scale: 1.6, retMsgId: true })
if (msgRes && msgRes.message_id) {
// 如果消息发送成功就将message_id和图片路径存起来3小时过期
await redis.set(`miao:original-picture:${msgRes.message_id}`, JSON.stringify({ type: 'profile', img: costumeSplash }), { EX: 3600 * 3 })
}
return true
2022-07-23 20:32:10 +00:00
}