import base from './base.js' import { MysInfo, gsCfg } from 'yunzai/mys' import lodash from 'lodash' import fs from 'node:fs' import fetch from 'node-fetch' import { downFile } from 'yunzai/utils' export default class RoleDetail extends base { constructor(e) { super(e) this.model = 'roleDetail' this.path = './data/roleDetail/' } static async get(e) { if (!e.roleName) return false let roleDetail = new RoleDetail(e) return await roleDetail.getDetail() } async getDetail() { let character = await MysInfo.get(this.e, 'character') let detail = await MysInfo.get(this.e, 'detail', { avatar_id: this.e.roleId }) if (!character || character.retcode !== 0) return false let avatar = await this.getAvatar(character.data) if (!avatar) return false /** 获取技能等级 */ let skill = {} if (detail && detail.data) { skill = this.getSkill(detail.data, avatar) } if (!(await this.checkImg(avatar.name))) return false /** 截图数据 */ let data = { quality: 80, ...this.screenData, uid: this.e.uid, saveId: this.e.uid, ...avatar, skill } this.e.msg += ` ${avatar.name}` return data } async getAvatar(data) { let avatars = lodash.keyBy(data.avatars, 'id') /** 旅行者特殊处理 */ if (this.e.roleId == '20000000') { if (avatars['10000007']) this.e.roleId = '10000007' if (avatars['10000005']) this.e.roleId = '10000005' } if (!avatars[this.e.roleId]) { await this.noAvatar() return false } /** 角色数据 */ avatars = avatars[this.e.roleId] let list = [] let set = {} let setArr = [] let text1 = '' let text2 = '' let bg = 2 list[0] = { type: 'weapon', name: avatars.weapon.name, showName: gsCfg.shortName(avatars.weapon.name, true), level: avatars.weapon.level, affix_level: avatars.weapon.affix_level } for (let val of avatars.reliquaries) { if (set[val.set.name]) { set[val.set.name]++ if (set[val.set.name] == 2) { if (text1) { text2 = '2件套:' + val.set.affixes[0].effect } else { text1 = '2件套:' + val.set.affixes[0].effect } } if (set[val.set.name] == 4) { text2 = '4件套:' + val.set.name } } else { set[val.set.name] = 1 } list.push({ type: 'reliquaries', name: val.name, level: val.level }) } for (let val of Object.keys(set)) { setArr.push({ name: val, num: set[val], showName: gsCfg.shortName(val, true) }) } if (avatars.reliquaries.length >= 2 && !text1) { text1 = '无套装效果' } if (avatars.id == '10000005') avatars.name = '空' if (avatars.id == '10000007') avatars.name = '荧' // 皮肤图片 if (['魈', '甘雨'].includes(avatars.name)) { if (lodash.random(0, 100) > 50) { bg = 3 } } else if ( [ '芭芭拉', '凝光', '刻晴', '琴', '菲谢尔', '迪卢克', '丽莎', '神里绫华' ].includes(avatars.name) ) { if (avatars.costumes && avatars.costumes.length >= 1) { bg = 3 } } return { name: avatars.name, showName: gsCfg.shortName(avatars.name), level: avatars.level, fetter: avatars.fetter, actived_constellation_num: avatars.actived_constellation_num, list, text1, text2, bg, set: setArr, constellations: avatars.constellations } } async noAvatar() { let msg = '' if (this.isBing) { let randFace = lodash.sample([ 26, 111, 110, 173, 177, 36, 37, 5, 9, 267, 264, 262, 265 ]) msg = [`\n尚未拥有${this.e.roleName}`, segment.face(randFace)] } else { msg = '\n请先在米游社展示该角色' } await this.e.reply(msg, false, { at: true }) } getSkill(data = {}, avatar) { // if (!this.isBing) return {} let skill = { id: avatar.id } let type = 'id' if ([10000021].includes(Number(avatar.id))) { type = 'group_id' } let skillList = lodash.orderBy(data.skill_list, [type], ['asc']) for (let val of skillList) { val.level_original = val.level_current if (val.name.includes('普通攻击') || val.name.includes('Normal Attack')) { skill.a = val continue } if (val.max_level >= 10 && !skill.e) { skill.e = val continue } if (val.max_level >= 10 && !skill.q) { skill.q = val continue } } if (avatar.actived_constellation_num >= 3) { if (avatar.constellations[2].effect.includes(skill.e.name)) { skill.e.level_current += 3 } else if (avatar.constellations[2].effect.includes(skill.q.name)) { skill.q.level_current += 3 } } if (avatar.actived_constellation_num >= 5) { if (avatar.constellations[4].effect.includes(skill.e.name)) { skill.e.level_current += 3 } else if (avatar.constellations[4].effect.includes(skill.q.name)) { skill.q.level_current += 3 } } return skill } async checkImg(name) { if (fs.existsSync(`${this.path}${name}1.png`)) return true let ret = await this.getData() if (!ret) return false if (ret.retcode != 0) return false let img = {} for (let post of ret.data.posts) { img[post.post.subject] = post.post.images } if (!img[name]) { this.e.reply(`暂无${name}素材`) return false } await this.downImg(name, img[name]) return true } async getData() { let url = 'https://bbs-api.mihoyo.com/post/wapi/getPostFullInCollection?&gids=2&collection_id=1057503' try { let ret = await fetch(url, { method: 'get' }) if (!ret.ok) { return false } return await ret.json() } catch (error) { return false } } async downImg(name, arr) { let ret = [] arr.forEach((v, k) => ret.push(downFile(v, `${this.path}${name}${++k}.png`)) ) try { ret = await Promise.all(ret) return true } catch (error) { logger.error(`${this.e.logFnc} ${error}}`) return false } } }