2022-06-29 20:40:06 +00:00
|
|
|
|
import { Artifact, Character } from "../../components/models.js";
|
2022-06-30 18:53:05 +00:00
|
|
|
|
import { Cfg, Data, Common, Profile } from "../../components/index.js";
|
2022-06-25 23:45:43 +00:00
|
|
|
|
import lodash from "lodash";
|
|
|
|
|
import { segment } from "oicq";
|
|
|
|
|
|
|
|
|
|
//角色昵称
|
|
|
|
|
let nameID = "";
|
|
|
|
|
let genshin = {};
|
|
|
|
|
await init();
|
|
|
|
|
|
|
|
|
|
export async function init(isUpdate = false) {
|
|
|
|
|
let _path = "file://" + process.cwd();
|
|
|
|
|
let version = isUpdate ? new Date().getTime() : 0;
|
|
|
|
|
genshin = await import(_path + `/config/genshin/roleId.js?version=${version}`);
|
|
|
|
|
nameID = "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export async function renderAvatar(e, avatar, render, 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: "查询信息"
|
|
|
|
|
});
|
2022-06-29 20:40:06 +00:00
|
|
|
|
|
2022-06-25 23:45:43 +00:00
|
|
|
|
if (!MysApi) return true;
|
|
|
|
|
|
2022-06-29 20:40:06 +00:00
|
|
|
|
let uid = e.targetUser.uid;
|
2022-06-25 23:45:43 +00:00
|
|
|
|
|
2022-06-29 23:05:31 +00:00
|
|
|
|
if (char.isCustom) {
|
|
|
|
|
avatar = { id: char.id, name: char.name, detail: false }
|
2022-06-29 20:40:06 +00:00
|
|
|
|
} else {
|
2022-06-29 23:05:31 +00:00
|
|
|
|
let profile = await 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;
|
|
|
|
|
let length = avatars.length;
|
|
|
|
|
char.checkAvatars(avatars);
|
|
|
|
|
avatars = lodash.keyBy(avatars, "id");
|
|
|
|
|
avatar = avatars[char.id] || { id: char.id, name: char.name, detail: false };
|
|
|
|
|
}
|
2022-06-25 23:45:43 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return await renderCard(e, avatar, render, renderType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 渲染角色卡片
|
|
|
|
|
async function renderCard(e, avatar, render, renderType = "card") {
|
2022-06-29 20:40:06 +00:00
|
|
|
|
|
2022-06-25 23:45:43 +00:00
|
|
|
|
let char = Character.get(avatar);
|
|
|
|
|
|
|
|
|
|
if (!char) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2022-06-29 23:05:31 +00:00
|
|
|
|
let uid = e.uid || (e.targetUser && e.targetUser.uid);
|
2022-06-25 23:45:43 +00:00
|
|
|
|
|
2022-06-29 23:05:31 +00:00
|
|
|
|
let crownNum = 0, 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));
|
2022-06-25 23:45:43 +00:00
|
|
|
|
if (renderType === "photo") {
|
|
|
|
|
e.reply(segment.image(process.cwd() + "/plugins/miao-plugin/resources/" + bg.img));
|
|
|
|
|
} else {
|
|
|
|
|
//渲染图像
|
|
|
|
|
let msgRes = await Common.render("character/card", {
|
|
|
|
|
save_id: uid,
|
|
|
|
|
uid,
|
|
|
|
|
talent,
|
|
|
|
|
crownNum,
|
|
|
|
|
talentMap: { a: "普攻", e: "战技", q: "爆发" },
|
|
|
|
|
bg,
|
2022-06-29 23:05:31 +00:00
|
|
|
|
custom: char.isCustom,
|
2022-06-25 23:45:43 +00:00
|
|
|
|
...getCharacterData(avatar),
|
|
|
|
|
ds: char.getData("name,id,title,desc"),
|
|
|
|
|
}, { e, render, scale: 1.6 });
|
|
|
|
|
if (msgRes && msgRes.message_id) {
|
|
|
|
|
// 如果消息发送成功,就将message_id和图片路径存起来,1小时过期
|
|
|
|
|
await redis.set(`miao:original-picture:${msgRes.message_id}`, bg.img, { EX: 3600 });
|
|
|
|
|
}
|
2022-07-06 22:12:05 +00:00
|
|
|
|
return true;
|
2022-06-25 23:45:43 +00:00
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//获取角色技能数据
|
|
|
|
|
async function getTalent(e, avatars) {
|
2022-06-29 20:40:06 +00:00
|
|
|
|
let talent = {}, cons = 0, char = Character.get(avatars.id), mode = "level";
|
2022-06-29 23:05:31 +00:00
|
|
|
|
if (char.isCustom) {
|
|
|
|
|
return {}
|
|
|
|
|
}
|
2022-06-29 20:40:06 +00:00
|
|
|
|
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 skill_list = lodash.orderBy(skillRes.skill_list, ["id"], ["asc"]);
|
|
|
|
|
for (let val of skill_list) {
|
|
|
|
|
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;
|
|
|
|
|
}
|
2022-06-25 23:45:43 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-06-29 23:05:31 +00:00
|
|
|
|
|
2022-06-29 20:40:06 +00:00
|
|
|
|
return char.getAvatarTalent(talent, cons, mode);
|
2022-06-25 23:45:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 获取角色数据
|
|
|
|
|
* */
|
|
|
|
|
function getCharacterData(avatars) {
|
|
|
|
|
let list = [];
|
|
|
|
|
let set = {};
|
2022-06-29 20:40:06 +00:00
|
|
|
|
let artiEffect = [];
|
|
|
|
|
let w = avatars.weapon || {};
|
2022-06-25 23:45:43 +00:00
|
|
|
|
let weapon = {
|
|
|
|
|
type: "weapon",
|
2022-06-29 20:40:06 +00:00
|
|
|
|
name: w.name || "",
|
|
|
|
|
showName: genshin.abbr[w.name] || w.name || "",
|
|
|
|
|
level: w.level || 1,
|
|
|
|
|
affix: w.affix || w.affix_level || 0
|
|
|
|
|
}
|
2022-06-25 23:45:43 +00:00
|
|
|
|
|
2022-06-29 20:40:06 +00:00
|
|
|
|
let artis = avatars.artis || avatars.reliquaries;
|
2022-06-25 23:45:43 +00:00
|
|
|
|
|
2022-06-29 20:40:06 +00:00
|
|
|
|
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'])
|
2022-06-25 23:45:43 +00:00
|
|
|
|
}
|
2022-06-29 20:40:06 +00:00
|
|
|
|
if (set[setName] === 4) {
|
|
|
|
|
artiEffect.push("4件套:" + setCfg.name);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
set[setName] = 1;
|
2022-06-25 23:45:43 +00:00
|
|
|
|
}
|
2022-06-29 20:40:06 +00:00
|
|
|
|
})
|
2022-06-25 23:45:43 +00:00
|
|
|
|
|
2022-06-29 20:40:06 +00:00
|
|
|
|
if (artiEffect.length === 0) {
|
|
|
|
|
artiEffect = ["无套装效果"];
|
2022-06-25 23:45:43 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (avatars.id == "10000005") {
|
|
|
|
|
avatars.name = "空";
|
|
|
|
|
} else if (avatars.id == "10000007") {
|
|
|
|
|
avatars.name = "荧";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let reliquaries = list[0];
|
|
|
|
|
return {
|
|
|
|
|
name: avatars.name,
|
|
|
|
|
showName: genshin.abbr[avatars.name] ? genshin.abbr[avatars.name] : avatars.name,
|
2022-06-30 18:53:05 +00:00
|
|
|
|
level: Data.def(avatars.lv, avatars.level),
|
2022-06-25 23:45:43 +00:00
|
|
|
|
fetter: avatars.fetter,
|
2022-06-30 18:53:05 +00:00
|
|
|
|
cons: Data.def(avatars.cons, avatars.actived_constellation_num),
|
2022-06-25 23:45:43 +00:00
|
|
|
|
weapon,
|
2022-06-29 20:40:06 +00:00
|
|
|
|
artiEffect,
|
|
|
|
|
reliquaries
|
2022-06-25 23:45:43 +00:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 (!genshin.wifeData[type].includes(Number(val.id))) {
|
|
|
|
|
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;
|
2022-06-29 20:40:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function checkWifeType(id, type) {
|
2022-06-29 23:05:31 +00:00
|
|
|
|
return Chargenshin.wifeData[type].includes(Number(id));
|
2022-06-25 23:45:43 +00:00
|
|
|
|
}
|