miao-plugin/components/profile-data/miao.js
2022-07-02 10:38:12 +08:00

227 lines
5.5 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 fetch from "node-fetch";
import lodash from "lodash";
import Character from "../models/Character.js";
import moment from "moment";
import { artiIdx, artiSetMap, attrMap } from "./miao-meta.js";
import cmeta from "./enka-char.js";
const url = "http://49.232.91.210/profile/detail?token=kokomi";
let Miao = {
key: "miao",
cd: 1,
async request({ e, uid, avatar = '', config }) {
let profileApi = config.miaoApi && lodash.isFunction(config.miaoApi) ? config.miaoApi : function ({ uid }) {
return `http://49.232.91.210/profile/list?uid=${uid}`
};
let api = profileApi({ uid, avatar });
let data;
let req = await fetch(api);
data = await req.json();
if (data.status !== 0) {
e.reply(data.msg || "请求失败");
return false;
}
if (!data.uidListData || data.uidListData.length === 0) {
e.reply(`请打开游戏内角色展柜的“显示详情”后等待5分钟重新获取面板`);
return false;
}
return Miao.getData(uid, data);
},
getData(uid, data) {
let ret = {
uid,
chars: {}
}
lodash.forEach({
name: "nickname",
//avatar: "profilePicture.avatarId",
lv: "level"
}, (src, key) => {
ret[key] = lodash.get(data, src, "");
})
lodash.forEach(data.uidListData, (ds) => {
let char = Miao.getAvatar(ds);
ret.chars[char.id] = char;
})
return ret;
},
getAvatar(ds) {
let char = Character.get(ds.usernameid);
let now = moment();
return {
id: ds.usernameid,
name: char ? char.name : "",
dataSource: "miao-pre",
updateTime: now.format("YYYY-MM-DD HH:mm:ss"),
lv: ds.level
};
},
async getCharData(uid, ds, saveCharData, { config = {} }) {
if (ds.dataSource !== "miao-pre" || !ds.id) {
return ds;
}
try {
let profileApi = function ({ uid, avatar }) {
return `http://49.232.91.210/profile/detail?uid=${uid}&avatar=${avatar}`
};
if (config.miaoApi && lodash.isFunction(config.miaoApi)) {
profileApi = config.miaoApi;
}
let api = profileApi({ uid, avatar: ds.id });
let req = await fetch(api);
let data = await req.json();
if (data.status === 0 && data.uidData) {
data = Miao.getAvatarDetail(data);
if (data) {
saveCharData(uid, data);
return data;
}
}
return ds;
} catch (err) {
console.log(err);
return ds;
}
},
getAvatarDetail(data) {
let ds = data.uidData;
let char = Character.get(ds.id);
let now = moment();
return {
id: ds.id,
name: char ? char.name : "",
dataSource: "miao",
updateTime: now.format("YYYY-MM-DD HH:mm:ss"),
lv: ds.level,
fetter: ds.fetterLevel,
attr: Miao.getAttr(data.uidDataCombatValue),
weapon: Miao.getWeapon(ds.weapon),
artis: Miao.getArtifact(data.uidDataByReliquary),
cons: ds.constellationNum,
talent: Miao.getTalent(char.id, ds.skill),
_priority: 10
};
},
getAttr(data) {
let ret = {};
lodash.forEach({
atk: "attack",
atkBase: "baseATK",
hp: "health",
hpBase: "baseHP",
def: "defense",
defBase: "baseDEF",
mastery: "elementMastery",
cRate: {
src: "critRate",
pct: true
},
cDmg: {
src: "critDamage",
pct: true
},
hInc: {
src: "heal",
pct: true
},
recharge: {
src: "recharge",
pct: true
}
}, (cfg, key) => {
if (!lodash.isObject(cfg)) {
cfg = { src: cfg };
}
let val = data[cfg.src] || 0;
if (cfg.pct) {
val = val * 100
}
ret[key] = val;
})
let maxDmg = 0, hurt = data.addHurt || {};
lodash.forEach("fire,elec,water,grass,wind,rock,ice".split(","), (key) => {
maxDmg = Math.max(hurt[key] * 100, maxDmg);
});
ret.dmgBonus = maxDmg;
ret.phyBonus = hurt.physical * 100;
return ret;
},
getWeapon(weapon) {
return {
name: weapon.name,
star: weapon.rank,
level: weapon.level,
promote: weapon.promoteLevel,
affix: (weapon.affixLevel || 0) + 1
}
},
getArtifact(data) {
let ret = {};
let get = function (d) {
if (!d) {
return [];
}
let name = d.name;
name = name.replace("FIGHT_PROP_", "");
if (!attrMap[name]) {
return [];
}
let value = d.value;
if (value && value < 1) {
value = value * 100;
}
return [attrMap[name], value];
}
lodash.forEach(data, (ds) => {
let sub = ds.appendAffix || [];
let idx = artiIdx[ds.type];
if (!idx) {
return;
}
ret[`arti${idx}`] = {
name: ds.name,
set: artiSetMap[ds.name] || "",
level: ds.level,
main: get(ds.mainAffix),
attrs: [
get(sub[0]),
get(sub[1]),
get(sub[2]),
get(sub[3])
]
}
})
return ret;
},
getTalent(charid, data = {}) {
let cm = cmeta[charid] || {};
let cn = cm.Skills || {};
let idx = 1;
let idxMap = { 0: 'a', 1: 'e', 2: 'q', 'a': 'a', 's': 'e', 'e': 'q' };
lodash.forEach(cn, (n, id) => {
let nRet = /skill_(\w)/.exec(n.toLowerCase());
idxMap[id] = nRet && nRet[1] ? idxMap[nRet[1]] : idxMap[idx];
idx++;
});
let ret = {};
lodash.forEach(data, (ds) => {
let key = idxMap[ds.id];
ret[key] = {
level_original: ds.level,
level_current: ds.level
}
})
return ret;
},
}
export default Miao;