Miao-Yunzai/plugins/genshin/model/roleIndex.js

516 lines
14 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 base from './base.js'
import MysInfo from './mys/mysInfo.js'
import gsCfg from './gsCfg.js'
import lodash from 'lodash'
import moment from 'moment'
import fs from 'node:fs'
let imgFile = {}
export default class RoleIndex extends base {
constructor (e) {
super(e)
this.model = 'roleIndex'
this.other = gsCfg.getdefSet('role', 'other')
this.wother = gsCfg.getdefSet('weapon', 'other')
this.area = {
蒙德: 1,
璃月: 2,
雪山: 3,
稻妻: 4,
渊下宫: 5,
层岩巨渊: 6,
层岩地下: 7,
须弥: 8
}
this.areaName = lodash.invert(this.area)
this.headIndexStyle = `<style> .head_box { background: url(${this.screenData.pluResPath}img/roleIndex/namecard/${lodash.random(1, 8)}.png) #f5f5f5; background-position-x: 30px; background-repeat: no-repeat; border-radius: 15px; font-family: tttgbnumber; padding: 10px 20px; position: relative; background-size: auto 101%; }</style>`
}
static async get (e) {
let roleIndex = new RoleIndex(e)
return await roleIndex.getIndex()
}
async getIndex () {
let ApiData = {
index: '',
spiralAbyss: { schedule_type: 1 },
character: '',
basicInfo: ''
}
let res = await MysInfo.get(this.e, ApiData)
if (!res || res[0].retcode !== 0 || res[2].retcode !== 0) return false
let ret = []
res.forEach(v => ret.push(v.data))
/** 截图数据 */
let data = {
quality: 80,
...this.screenData,
...this.dealData(ret)
}
// console.log(...this.dealData(ret))
return data
}
dealData (data) {
let [resIndex, resAbyss, resDetail, basicInfo] = data
let avatars = resDetail.avatars || []
let roleArr = avatars
for (let i in avatars) {
let rarity = avatars[i].rarity
let liveNum = avatars[i].actived_constellation_num
let level = avatars[i].level
let id = avatars[i].id - 10000000
if (rarity >= 5) {
rarity = 5
}
// 埃洛伊排到最后
if (rarity > 5) {
id = 0
}
// 增加神里排序
if (avatars[i].id == 10000002) {
id = 50
}
if (avatars[i].id == 10000005) {
avatars[i].name = '空'
liveNum = 0
level = 0
} else if (avatars[i].id == 10000007) {
avatars[i].name = '荧'
liveNum = 0
level = 0
}
avatars[i].sortLevel = level
// id倒序最新出的角色拍前面
avatars[i].sort = rarity * 100000 + liveNum * 10000 + level * 100 + id
avatars[i].weapon.showName = this.wother.sortName[avatars[i].weapon.name] ?? avatars[i].weapon.name
avatars[i].costumesLogo = ''
if (avatars[i].costumes && avatars[i].costumes.length >= 1) {
for (let val of avatars[i].costumes) {
if (this.other.costumes.includes(val.name)) {
avatars[i].costumesLogo = 2
break
}
}
}
}
let stats = resIndex.stats || {}
let line = [
[
{ lable: '成就', num: stats.achievement_number },
{ lable: '角色数', num: stats.avatar_number },
{ lable: '等级', num: resIndex?.role?.level ?? 0 },
{
lable: '总宝箱',
num:
stats.precious_chest_number +
stats.luxurious_chest_number +
stats.exquisite_chest_number +
stats.common_chest_number +
stats.magic_chest_number
}
],
[
{ lable: '华丽宝箱', num: stats.luxurious_chest_number },
{ lable: '珍贵宝箱', num: stats.precious_chest_number },
{ lable: '精致宝箱', num: stats.exquisite_chest_number },
{ lable: '普通宝箱', num: stats.common_chest_number }
]
]
// 尘歌壶
let homesLevel = 0
// let homesItem = 0
if (resIndex.homes && resIndex.homes.length > 0) {
homesLevel = resIndex.homes[0].level
// homesItem = resIndex.homes[0].item_num
}
let worldExplorations = lodash.keyBy(resIndex.world_explorations, 'id')
let explor = []
let explor2 = []
let expArr = ['须弥', '层岩巨渊', '渊下宫', '稻妻']
let expArr2 = ['雪山', '璃月', '蒙德']
for (let val of expArr) {
let tmp = { lable: val, num: `${(worldExplorations[this.area[val]]?.exploration_percentage ?? 0) / 10}%` }
explor.push(tmp)
}
for (let val of expArr2) {
let tmp = { lable: val, num: `${(worldExplorations[this.area[val]]?.exploration_percentage ?? 0) / 10}%` }
explor2.push(tmp)
}
explor2.push({ lable: '家园等级', num: homesLevel })
line.push(explor)
line.push(explor2)
if (avatars.length > 0) {
// 重新排序
avatars = lodash.chain(avatars).orderBy(['sortLevel'], ['desc'])
if (this.e.msg.includes('角色')) {
avatars = avatars.slice(0, 12)
}
avatars = avatars.orderBy(['sort'], ['desc']).value()
}
// 深渊
let abyss = this.abyssAll(roleArr, resAbyss)
return {
uid: this.e.uid,
saveId: this.e.uid,
activeDay: this.dayCount(stats.active_day_number),
line,
basicInfo,
avatars,
abyss,
headIndexStyle: this.headIndexStyle
}
}
// 处理深渊数据
abyssAll (roleArr, resAbyss) {
let abyss = {}
if (roleArr.length <= 0) {
return abyss
}
if (resAbyss?.total_battle_times <= 0) {
return abyss
}
if (resAbyss?.reveal_rank.length <= 0) {
return abyss
}
// 打了三层才放出来
if (resAbyss?.floors.length <= 2) {
return abyss
}
let startTime = moment(resAbyss.startTime)
let time = Number(startTime.month()) + 1
if (startTime.day() >= 15) {
time = time + '月下'
} else {
time = time + '月上'
}
let totalStar = 0
let star = []
for (let val of resAbyss.floors) {
if (val.index < 9) {
continue
}
totalStar += val.star
star.push(val.star)
}
totalStar = totalStar + '' + star.join('-') + ''
let dataName = ['damage', 'take_damage', 'defeat', 'normal_skill', 'energy_skill']
let data = []
let tmpRole = []
for (let val of dataName) {
if (resAbyss[`${val}_rank`].length <= 0) {
resAbyss[`${val}_rank`] = [
{
value: 0,
avatar_id: 10000007
}
]
}
data[val] = {
num: resAbyss[`${val}_rank`][0].value,
name: gsCfg.roleIdToName(resAbyss[`${val}_rank`][0].avatar_id)
}
if (data[val].num > 1000) {
data[val].num = (data[val].num / 10000).toFixed(1)
data[val].num += ' w'
}
if (tmpRole.length < 4 && !tmpRole.includes(resAbyss[`${val}_rank`][0].avatar_id)) {
tmpRole.push(resAbyss[`${val}_rank`][0].avatar_id)
}
}
let list = []
let avatar = lodash.keyBy(roleArr, 'id')
for (let val of resAbyss.reveal_rank) {
if (avatar[val.avatar_id]) {
val.life = avatar[val.avatar_id].actived_constellation_num
} else {
val.life = 0
}
val.name = gsCfg.roleIdToName(val.avatar_id)
list.push(val)
}
return {
time,
max_floor: resAbyss.max_floor,
totalStar,
list,
total_battle_times: resAbyss.total_battle_times,
...data
}
}
dayCount (num) {
let year = Math.floor(num / 365)
let month = Math.floor((num % 365) / 30.41)
let day = Math.floor((num % 365) % 30.41)
let msg = ''
if (year > 0) {
msg += year + '年'
}
if (month > 0) {
msg += month + '个月'
}
if (day > 0) {
msg += day + '天'
}
return msg
}
async roleCard () {
this.model = 'roleCard'
let res = await MysInfo.get(this.e, 'index')
if (!res || res.retcode !== 0) return false
return this.roleCardData(res.data)
}
roleCardData (res) {
this.initFile()
let stats = res.stats
let line = [
[
{ lable: '活跃天数', num: stats.active_day_number },
{ lable: '成就', num: stats.achievement_number },
{ lable: '角色数', num: stats.avatar_number },
{ lable: '等级', num: res?.role?.level ?? 0 },
{
lable: '总宝箱',
num:
stats.precious_chest_number +
stats.luxurious_chest_number +
stats.exquisite_chest_number +
stats.common_chest_number +
stats.magic_chest_number
}
],
[
{ lable: '华丽宝箱', num: stats.luxurious_chest_number },
{ lable: '珍贵宝箱', num: stats.precious_chest_number },
{ lable: '精致宝箱', num: stats.exquisite_chest_number },
{ lable: '普通宝箱', num: stats.common_chest_number },
{ lable: '奇馈宝箱', num: stats.magic_chest_number }
]
]
let explor1 = []
let explor2 = []
res.world_explorations = lodash.orderBy(res.world_explorations, ['id'], ['desc'])
for (let val of res.world_explorations) {
val.name = this.areaName[val.id] ? this.areaName[val.id] : lodash.truncate(val.name, { length: 6 })
let tmp = { lable: val.name, num: `${val.exploration_percentage / 10}%` }
if (explor1.length < 5) {
explor1.push(tmp)
} else {
explor2.push(tmp)
}
}
explor2 = explor2.concat([
{ lable: '雷神瞳', num: stats.electroculus_number },
{ lable: '岩神瞳', num: stats.geoculus_number },
{ lable: '风神瞳', num: stats.anemoculus_number }
])
line.push(explor1)
line.push(explor2.slice(0, 5))
let avatars = res.avatars
avatars = avatars.slice(0, 8)
let element = gsCfg.getdefSet('element', 'role')
for (let i in avatars) {
if (avatars[i].id == 10000005) {
avatars[i].name = '空'
}
if (avatars[i].id == 10000007) {
avatars[i].name = '荧'
}
avatars[i].element = element[avatars[i].name]
avatars[i].img = imgFile[avatars[i].name] || `${avatars[i].name}.png`
}
return {
saveId: this.e.uid,
uid: this.e.uid,
name: this.e.sender.card.replace(this.e.uid, '').trim(),
user_id: this.e.user_id,
line,
avatars,
bg: lodash.random(1, 3),
...this.screenData
}
}
async roleExplore () {
this.model = 'roleExplore'
let res = await MysInfo.get(this.e, 'index')
if (!res || res.retcode !== 0) return false
return this.roleExploreData(res.data)
}
roleExploreData (res) {
let stats = res.stats
let line = [
[
{ lable: '成就', num: stats.achievement_number },
{ lable: '角色数', num: stats.avatar_number },
{ lable: '等级', num: res?.role?.level ?? 0 },
{
lable: '总宝箱',
num:
stats.precious_chest_number +
stats.luxurious_chest_number +
stats.exquisite_chest_number +
stats.common_chest_number +
stats.magic_chest_number
}
],
[
{ lable: '华丽宝箱', num: stats.luxurious_chest_number },
{ lable: '珍贵宝箱', num: stats.precious_chest_number },
{ lable: '精致宝箱', num: stats.exquisite_chest_number },
{ lable: '普通宝箱', num: stats.common_chest_number }
],
[
{ lable: '草神瞳', num: stats.dendroculus_number },
{ lable: '雷神瞳', num: stats.electroculus_number },
{ lable: '岩神瞳', num: stats.geoculus_number },
{ lable: '风神瞳', num: stats.anemoculus_number }
]
]
// 尘歌壶
if (res.homes && res.homes.length > 0) {
line.push([
{ lable: '家园等级', num: res.homes[0].level },
{ lable: '最高仙力', num: res.homes[0].comfort_num },
{ lable: '获得摆设', num: res.homes[0].item_num },
{ lable: '历史访客', num: res.homes[0].visit_num }
])
}
res.world_explorations = lodash.orderBy(res.world_explorations, ['id'], ['desc'])
let explor = []
for (let val of res.world_explorations) {
if (val.id == 7) continue
val.name = this.areaName[val.id] ? this.areaName[val.id] : lodash.truncate(val.name, { length: 6 })
let tmp = {
name: val.name,
line: [
{
name: val.name,
text: `${val.exploration_percentage / 10}%`
}
]
}
if (['蒙德', '璃月', '稻妻', '须弥'].includes(val.name)) {
tmp.line.push({
name: '声望',
text: `${val.level}`
})
}
if (val.id == 6) {
let underground = lodash.find(res.world_explorations, function (o) {
return o.id == 7
})
if (underground) {
tmp.line.push({
name: this.areaName[underground.id],
text: `${underground.exploration_percentage / 10}%`
})
}
}
if (['雪山', '稻妻', '层岩巨渊', '须弥'].includes(val.name)) {
if (val.offerings[0].name.includes('流明石')) {
val.offerings[0].name = '流明石'
}
if (val.offerings[0].name == '恒那兰那的梦之树') {
val.offerings[0].name = '梦之树'
}
tmp.line.push({
name: val.offerings[0].name,
text: `${val.offerings[0].level}`
})
}
explor.push(tmp)
}
return {
saveId: this.e.uid,
uid: this.e.uid,
activeDay: this.dayCount(stats.active_day_number),
line,
explor,
headIndexStyle: this.headIndexStyle,
...this.screenData
}
}
initFile () {
if (imgFile['刻晴']) return imgFile
let path = './plugins/genshin/resources/img/gacha/'
let character = fs.readdirSync(path + 'character/')
let weapon = fs.readdirSync(path + 'weapon/')
let nameSet = (v) => {
let name = v.split('.')
imgFile[name[0]] = v
}
character.forEach(v => nameSet(v))
weapon.forEach(v => nameSet(v))
return imgFile
}
}