mirror of
https://github.com/yoimiya-kokomi/miao-plugin.git
synced 2024-11-21 14:38:30 +00:00
增加#喵喵设置功能
This commit is contained in:
parent
7f2b058951
commit
93b3ff01a2
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
*.psd
|
||||
.idea
|
||||
.idea
|
||||
/components/cfg.json
|
||||
|
107
apps/admin.js
107
apps/admin.js
@ -1,28 +1,108 @@
|
||||
import { segment } from "oicq";
|
||||
import fs from "fs";
|
||||
import { Character } from "../components/models.js";
|
||||
import lodash from "lodash";
|
||||
|
||||
import { createRequire } from "module";
|
||||
import { exec } from "child_process";
|
||||
import { Cfg } from "../components/index.js";
|
||||
|
||||
const require = createRequire(import.meta.url);
|
||||
|
||||
|
||||
//import {wikiCharacter} from "../modules/wiki.js";
|
||||
|
||||
let cfgMap = {
|
||||
"角色": "char.char",
|
||||
"老婆": "char.wife",
|
||||
"查他人": "char.queryOther",
|
||||
"天赋": "wiki.talent",
|
||||
"命座": "wiki.cons",
|
||||
"图片": "wiki.pic",
|
||||
"深渊": "wiki.abyss",
|
||||
"渲染": "sys.scale",
|
||||
};
|
||||
let sysCfgReg = `^#喵喵设置\s*(${lodash.keys(cfgMap).join("|")})?\s*(.*)$`;
|
||||
export const rule = {
|
||||
updateRes: {
|
||||
reg: "#喵喵更新素材",
|
||||
describe: "【#老婆,#老公,#女儿】角色详情",
|
||||
reg: "^#喵喵更新图像$",
|
||||
describe: "【#管理】更新素材",
|
||||
},
|
||||
sysCfg: {
|
||||
reg: sysCfgReg,
|
||||
describe: "【#管理】系统设置"
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
const _path = process.cwd();
|
||||
const resPath = `${_path}/plugins/miao-plugin/resources/`;
|
||||
const plusPath = `${resPath}/miao-res-plus/`;
|
||||
|
||||
const checkAuth = async function (e) {
|
||||
return await e.checkAuth({
|
||||
auth: "master",
|
||||
replyMsg: `只有主人才能命令喵喵哦~
|
||||
(*/ω\*)`
|
||||
});
|
||||
}
|
||||
|
||||
export async function sysCfg(e, { render }) {
|
||||
if (!await checkAuth(e)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
let cfgReg = new RegExp(sysCfgReg);
|
||||
let regRet = cfgReg.exec(e.msg);
|
||||
|
||||
if (!regRet) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (regRet[1]) {
|
||||
// 设置模式
|
||||
let val = regRet[2] || "";
|
||||
|
||||
let cfgKey = cfgMap[regRet[1]];
|
||||
if (cfgKey === "sys.scale") {
|
||||
val = Math.min(200, Math.max(50, val * 1 || 100));
|
||||
} else {
|
||||
val = !/关闭/.test(val);
|
||||
}
|
||||
|
||||
if (cfgKey) {
|
||||
Cfg.set(cfgKey, val);
|
||||
}
|
||||
}
|
||||
|
||||
let cfg = {
|
||||
chars: getStatus("char.char"),
|
||||
wife: getStatus("char.wife"),
|
||||
other: getStatus("char.queryOther"),
|
||||
talent: getStatus("wiki.talent"),
|
||||
cons: getStatus("wiki.cons"),
|
||||
pic: getStatus("wiki.pic"),
|
||||
abyss: getStatus("wiki.hutao"),
|
||||
imgPlus: fs.existsSync(plusPath),
|
||||
scale: Cfg.get("sys.scale", 100)
|
||||
}
|
||||
|
||||
let base64 = await render("admin", "index", {
|
||||
...cfg,
|
||||
cfgScale: Cfg.scale(1.2)
|
||||
}, "png");
|
||||
if (base64) {
|
||||
e.reply(segment.image(`base64://${base64}`));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
const getStatus = function (rote) {
|
||||
if (Cfg.get(rote, true)) {
|
||||
return `<div class="cfg-status" >已开启</div>`;
|
||||
} else {
|
||||
return `<div class="cfg-status status-off">已关闭</div>`;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export async function updateRes(e) {
|
||||
if (!e.checkAuth({ auth: "master" })) {
|
||||
if (!await checkAuth(e)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -31,22 +111,23 @@ export async function updateRes(e) {
|
||||
command = `git -C ${resPath}/miao-res-plus pull`;
|
||||
exec(command, function (error, stdout, stderr) {
|
||||
console.log(stdout);
|
||||
if (stdout === "Already up to date.") {
|
||||
if (/Already up to date/.test(stdout)) {
|
||||
e.reply("素材已经是最新了~");
|
||||
return true;
|
||||
}
|
||||
if (error) {
|
||||
e.reply("素材初始化失败!\nError code: " + error.code + "\n" + error.stack + "\n出错了,可以重试一下。");
|
||||
e.reply("更新失败!\nError code: " + error.code + "\n" + error.stack + "\n 请稍后重试。");
|
||||
} else {
|
||||
e.reply("额外素材初始化成功");
|
||||
e.reply("角色图像加量包更新成功~");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
command = `git clone https://gitee.com/yoimiya-kokomi/miao-res-plus.git ${resPath}/miao-res-plus/`;
|
||||
exec(command, function (error, stdout, stderr) {
|
||||
if (error) {
|
||||
e.reply("素材初始化失败!\nError code: " + error.code + "\n" + error.stack + "\n出错了,可以重试一下。");
|
||||
e.reply("角色图像加量包安装失败!\nError code: " + error.code + "\n" + error.stack + "\n 请稍后重试。");
|
||||
} else {
|
||||
e.reply("额外素材初始化成功");
|
||||
e.reply("角色图像加量包安装成功!您后续也可以通过 #喵喵更新图像 命令来更新图像");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { segment } from "oicq";
|
||||
import lodash from "lodash";
|
||||
import { Character } from "../components/models.js"
|
||||
import { Cfg } from "../components/index.js";
|
||||
import fs from "fs";
|
||||
import sizeOf from "image-size";
|
||||
|
||||
@ -52,6 +53,10 @@ export async function character(e, { render, User }) {
|
||||
if (!e.msg) {
|
||||
return;
|
||||
}
|
||||
if (Cfg.isDisable(e, "char.char")) {
|
||||
return;
|
||||
}
|
||||
|
||||
let name = e.msg.replace(/#|老婆|老公|[1|2|5][0-9]{8}/g, "").trim();
|
||||
|
||||
let char = Character.get(name);
|
||||
@ -69,8 +74,11 @@ export async function wife(e, { render, User }) {
|
||||
msg = msg.replace(/#|\w/g, "");
|
||||
if (!msg) return false;
|
||||
|
||||
let msgRet = (new RegExp(wifeReg)).exec(msg);
|
||||
if (Cfg.isDisable(e, "char.wife")) {
|
||||
return;
|
||||
}
|
||||
|
||||
let msgRet = (new RegExp(wifeReg)).exec(msg);
|
||||
if (!msgRet) return false;
|
||||
|
||||
let target = msgRet[1],
|
||||
@ -87,12 +95,18 @@ export async function wife(e, { render, User }) {
|
||||
|
||||
let MysApi = await e.getMysApi({
|
||||
auth: "all",
|
||||
target: "self",
|
||||
targetType: Cfg.get("char.queryOther", true) ? "all" : "self",
|
||||
cookieType: "all",
|
||||
actionName: "查询信息"
|
||||
});
|
||||
let selfUser = MysApi.selfUser;
|
||||
|
||||
let selfMysUser = await MysApi.selfUser.getMysUser();
|
||||
let isSelf = true;
|
||||
if (!selfMysUser || selfMysUser.uid !== MysApi.targetUser.uid) {
|
||||
isSelf = false;
|
||||
}
|
||||
|
||||
switch (action) {
|
||||
case "卡片":
|
||||
case "照片":
|
||||
@ -105,7 +119,7 @@ export async function wife(e, { render, User }) {
|
||||
wifeList = await selfUser.getCfg(`wife.${targetCfg.key}`, []);
|
||||
let renderType = action === "卡片" ? "card" : "photo";
|
||||
// 存在设置
|
||||
if (wifeList && wifeList.length > 0) {
|
||||
if (wifeList && wifeList.length > 0 && isSelf) {
|
||||
if (wifeList[0] === "随机") {
|
||||
// 如果选择为全部,则从列表中随机选择一个
|
||||
avatarList = await getAvatarList(e, targetCfg.type, MysApi);
|
||||
@ -131,8 +145,7 @@ export async function wife(e, { render, User }) {
|
||||
case "选择":
|
||||
case "挑选":
|
||||
case "指定":
|
||||
let selfMysUser = await MysApi.selfUser.getMysUser();
|
||||
if (!selfMysUser || selfMysUser.uid !== MysApi.targetUser.uid) {
|
||||
if (!isSelf) {
|
||||
e.reply("只能指定自己的哦~");
|
||||
return true;
|
||||
}
|
||||
@ -170,6 +183,12 @@ export async function wife(e, { render, User }) {
|
||||
case "是":
|
||||
case "是谁":
|
||||
// 查看当前选择老婆
|
||||
|
||||
if (!isSelf) {
|
||||
e.reply("只能查看自己的哦~");
|
||||
return true;
|
||||
}
|
||||
|
||||
wifeList = await selfUser.getCfg(`wife.${targetCfg.key}`, []);
|
||||
if (wifeList && wifeList.length > 0) {
|
||||
e.reply(`你的${targetCfg.keyword[0]}是:${wifeList.join(",")}`);
|
||||
@ -220,7 +239,7 @@ async function renderAvatar(e, avatar, render, renderType = "card") {
|
||||
let roleId = char.id;
|
||||
let MysApi = await e.getMysApi({
|
||||
auth: "all",
|
||||
target: "all",
|
||||
targetType: Cfg.get("char.queryOther", true) ? "all" : "self",
|
||||
cookieType: "all",
|
||||
actionName: "查询信息"
|
||||
});
|
||||
@ -286,6 +305,7 @@ async function renderCard(e, avatar, render, renderType = "card") {
|
||||
bg: getCharacterImg(avatar.name),
|
||||
...getCharacterData(avatar),
|
||||
ds: char.getData("name,id,title,desc"),
|
||||
cfgScale: Cfg.scale(1.25)
|
||||
}, "png");
|
||||
if (base64) {
|
||||
e.reply(segment.image(`base64://${base64}`));
|
||||
@ -300,7 +320,7 @@ async function getTalent(e, avatars) {
|
||||
|
||||
let MysApi = await e.getMysApi({
|
||||
auth: "all",
|
||||
target: "all",
|
||||
targetType: Cfg.get("char.queryOther", true) ? "all" : "self",
|
||||
cookieType: "all",
|
||||
actionName: "查询信息"
|
||||
});
|
||||
|
19
apps/stat.js
19
apps/stat.js
@ -3,10 +3,14 @@
|
||||
*
|
||||
* */
|
||||
import { HutaoApi, Character } from "../components/models.js";
|
||||
import { Cfg } from "../components/index.js";
|
||||
import lodash from "lodash";
|
||||
import { segment } from "oicq";
|
||||
|
||||
export async function consStat(e, { render }) {
|
||||
if (Cfg.isDisable(e, "wiki.abyss")) {
|
||||
return;
|
||||
}
|
||||
|
||||
let consData = await HutaoApi.getCons();
|
||||
if (!consData) {
|
||||
@ -14,6 +18,8 @@ export async function consStat(e, { render }) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
let msg = e.msg;
|
||||
|
||||
let mode = /持有/.test(msg) ? "char" : "cons";
|
||||
@ -71,7 +77,8 @@ export async function consStat(e, { render }) {
|
||||
lastUpdate: consData.lastUpdate,
|
||||
pct: function (num) {
|
||||
return (num * 100).toFixed(2);
|
||||
}
|
||||
},
|
||||
cfgScale: Cfg.scale(1.4)
|
||||
}, "png");
|
||||
if (base64) {
|
||||
e.reply(segment.image(`base64://${base64}`));
|
||||
@ -80,6 +87,11 @@ export async function consStat(e, { render }) {
|
||||
}
|
||||
|
||||
export async function abyssPct(e, { render }) {
|
||||
|
||||
if (Cfg.isDisable(e, "wiki.abyss")) {
|
||||
return;
|
||||
}
|
||||
|
||||
let abyssData = await HutaoApi.getAbyssPct();
|
||||
if (!abyssData) {
|
||||
e.reply("暂时无法查询");
|
||||
@ -119,7 +131,7 @@ export async function abyssPct(e, { render }) {
|
||||
avatars.push({
|
||||
name: char.name,
|
||||
star: char.star,
|
||||
value: ds.value
|
||||
value: ds.value * 8
|
||||
})
|
||||
}
|
||||
})
|
||||
@ -143,7 +155,8 @@ export async function abyssPct(e, { render }) {
|
||||
lastUpdate: abyssData.lastUpdate,
|
||||
pct: function (num) {
|
||||
return (num * 100).toFixed(2);
|
||||
}
|
||||
},
|
||||
cfgScale: Cfg.scale(1.4)
|
||||
}, "png");
|
||||
if (base64) {
|
||||
e.reply(segment.image(`base64://${base64}`));
|
||||
|
@ -2,6 +2,7 @@ import { segment } from "oicq";
|
||||
import fs from "fs";
|
||||
import { Character } from "../components/models.js";
|
||||
import lodash from "lodash";
|
||||
import { Cfg } from "../components/index.js";
|
||||
|
||||
//import {wikiCharacter} from "../modules/wiki.js";
|
||||
|
||||
@ -32,6 +33,10 @@ export async function wiki(e, { render }) {
|
||||
mode = "pic";
|
||||
}
|
||||
|
||||
if (Cfg.isDisable(e, `wiki.${mode}`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
let char = Character.get(ret[1]);
|
||||
|
||||
@ -50,7 +55,8 @@ export async function wiki(e, { render }) {
|
||||
...char,
|
||||
mode,
|
||||
line: getLineData(char),
|
||||
_char: `/meta/character/${char.name}/`
|
||||
_char: `/meta/character/${char.name}/`,
|
||||
cfgScale: Cfg.scale(1)
|
||||
});
|
||||
|
||||
if (base64) {
|
||||
|
195
apps/word-cloud.js
Normal file
195
apps/word-cloud.js
Normal file
@ -0,0 +1,195 @@
|
||||
//技能列表,配置了cookie能查
|
||||
import fs from "fs";
|
||||
import lodash from "lodash";
|
||||
import common from "../../../lib/common.js";
|
||||
|
||||
import { segment } from "oicq";
|
||||
|
||||
export async function talentList(e, { render }) {
|
||||
//缓存时间,单位小时
|
||||
let cacheCd = 6;
|
||||
|
||||
let msg = e.msg.replace("#", "").trim();
|
||||
if (msg === "角色统计" || msg === "武器统计") {
|
||||
//暂时避让一下抽卡分析的关键词
|
||||
return false;
|
||||
}
|
||||
|
||||
let MysApi = await getMysApi(e);
|
||||
if (!MysApi) return true;
|
||||
let uid = MysApi.targetUid;
|
||||
|
||||
//禁止重复获取
|
||||
if (skillLoading[e.user_id]) {
|
||||
e.reply("角色数据获取中,请耐心等待...");
|
||||
setTimeout(() => {
|
||||
if (skillLoading[e.user_id]) delete skillLoading[e.user_id];
|
||||
}, 60000);
|
||||
return;
|
||||
}
|
||||
|
||||
const displayMode = /(角色|武器|练度)/.test(e.msg) ? "weapon" : "talent";
|
||||
|
||||
//四星五星
|
||||
let star = 0;
|
||||
if (/(四|4)/.test(msg)) star = 4;
|
||||
if (/(五|5)/.test(msg)) star = 5;
|
||||
|
||||
// 技能查询缓存
|
||||
let cachePath = `./data/cache/`;
|
||||
if (!fs.existsSync(cachePath)) {
|
||||
fs.mkdirSync(cachePath);
|
||||
}
|
||||
cachePath += "talentList/";
|
||||
if (!fs.existsSync(cachePath)) {
|
||||
fs.mkdirSync(cachePath);
|
||||
}
|
||||
|
||||
let avatarRet = [];
|
||||
|
||||
let hasCache = await redis.get(`cache:uid-talent-new:${uid}`); // 由于数据结构改变,临时修改一下键值,防止命中历史缓存导致展示错误
|
||||
if (hasCache && !/force/.test(e.msg)) {
|
||||
// 有缓存优先使用缓存
|
||||
let jsonRet = fs.readFileSync(cachePath + `${uid}.json`, "utf8");
|
||||
avatarRet = JSON.parse(jsonRet);
|
||||
} else {
|
||||
|
||||
skillLoading[e.user_id] = true;
|
||||
let resIndex = await MysApi.getCharacter();
|
||||
if (!resIndex) {
|
||||
delete skillLoading[e.user_id];
|
||||
return true;
|
||||
}
|
||||
|
||||
let avatarData = resIndex && resIndex.avatars || [];
|
||||
|
||||
// let skillRet = [], skill = [];
|
||||
//配置了cookie的才去获取技能
|
||||
// if (NoteCookie[e.user_id]) {
|
||||
|
||||
let skillRet = [], skill = [];
|
||||
//配置了完整cookie的才去获取技能
|
||||
if (NoteCookie[e.user_id] && NoteCookie[e.user_id].cookie.includes("cookie_token")) {
|
||||
e.reply("角色数据获取中,请耐心等待...");
|
||||
//批量获取技能数据,分组10个id一次,延迟100ms
|
||||
let num = 10, ms = 100;
|
||||
let avatarArr = lodash.chunk(avatarData, num);
|
||||
for (let val of avatarArr) {
|
||||
for (let avatar of val) {
|
||||
skillRet.push(getSkill(e, uid, avatar, MysApi));
|
||||
}
|
||||
skillRet = await Promise.all(skillRet);
|
||||
//过滤没有获取成功的
|
||||
skillRet.filter(item => item.a);
|
||||
skillRet = skillRet.filter(item => item.a);
|
||||
|
||||
await common.sleep(ms);
|
||||
}
|
||||
skill = lodash.keyBy(skillRet, "id");
|
||||
}
|
||||
|
||||
// 天赋等级背景
|
||||
const talentLvMap = '0,1,1,1,2,2,3,3,3,4,5'.split(',')
|
||||
|
||||
// 根据每日素材构建 角色->素材的映射关系
|
||||
let charTalentMap = {};
|
||||
daily.forEach((weekCfg, week) => {
|
||||
lodash.forIn(weekCfg[0], (talentCfg, talentName) => {
|
||||
talentCfg[1].forEach((charName) => {
|
||||
charTalentMap[charName] = { name: talentName, week: [3, 1, 2][week] };
|
||||
})
|
||||
})
|
||||
});
|
||||
|
||||
for (let idx in avatarData) {
|
||||
let curr = avatarData[idx];
|
||||
let avatar = lodash.pick(curr, "id,name,rarity,level,rarity,fetter".split(","));
|
||||
// 埃洛伊rarity是105...
|
||||
avatar.rarity = avatar.rarity > 5 ? 5 : avatar.rarity;
|
||||
let weapon = curr.weapon || {};
|
||||
"name,level,rarity,affix_level".split(",").forEach((idx) => {
|
||||
avatar[`weapon_${idx}`] = curr.weapon[idx];
|
||||
});
|
||||
avatar.cons = curr.actived_constellation_num;
|
||||
if (avatar.id == 10000007) {
|
||||
avatar.name = "荧";
|
||||
} else if (avatar.id == 10000005) {
|
||||
avatar.name = "空";
|
||||
} else {
|
||||
let talent = charTalentMap[avatar.name] || {};
|
||||
avatar.talent = talent.name;
|
||||
avatar.talentWeek = talent.week; //`${talent.week}${talent.week + 3}`;
|
||||
}
|
||||
|
||||
let skillRet = skill[avatar.id] || {};
|
||||
const talentConsCfg = { a: 0, e: 3, q: 5 };
|
||||
|
||||
lodash.forIn(talentConsCfg, (consLevel, key) => {
|
||||
let talent = skillRet[key] || {};
|
||||
// 天赋等级
|
||||
avatar[key] = talent.level_current || '-';
|
||||
// 是否有命座加成
|
||||
avatar[`${key}_plus`] = talent.level_current > talent.level_original;
|
||||
// 天赋书星级
|
||||
avatar[`${key}_lvl`] = talentLvMap[talent.level_original * 1];
|
||||
avatar[`${key}_original`] = talent.level_original * 1;
|
||||
})
|
||||
avatar.aeq = avatar.a * 1 + avatar.e + avatar.q;
|
||||
avatarRet.push(avatar);
|
||||
}
|
||||
|
||||
fs.writeFileSync(cachePath + `${uid}.json`, JSON.stringify(avatarRet));
|
||||
//缓存
|
||||
await redis.set(`cache:uid-talent-new:${uid}`, uid, { EX: 3600 * cacheCd });
|
||||
delete skillLoading[e.user_id];
|
||||
// }
|
||||
|
||||
}
|
||||
//超过八个角色才分类四星五星
|
||||
if (star >= 4 && avatarRet.length > 8) {
|
||||
avatarRet = avatarRet.filter(item => item.rarity == star);
|
||||
}
|
||||
|
||||
let sortKey = ({
|
||||
talent: "aeq,rarity,level,star,fetter,talentWeek",
|
||||
weapon: "level,rarity,aeq,cons,weapon_level,weapon_rarity,weapon_affix_level,fetter"
|
||||
})[displayMode].split(",");
|
||||
|
||||
avatarRet = lodash.orderBy(avatarRet, sortKey, lodash.repeat("desc,", sortKey.length).split(","));
|
||||
|
||||
let noTalent = avatarRet.length == 0 || /^\-+$/.test(avatarRet.map((d) => d.a).join(""));
|
||||
|
||||
let talentNotice = `技能列表每${cacheCd}小时更新一次`;
|
||||
if (noTalent) {
|
||||
talentNotice = "未绑定体力Cookie,无法获取天赋列表。请回复 #体力 获取配置教程";
|
||||
}
|
||||
|
||||
let week = new Date().getDay();
|
||||
if (new Date().getHours() < 4) {
|
||||
week--;
|
||||
}
|
||||
|
||||
let base64 = await render("genshin", "talentList", {
|
||||
save_id: uid,
|
||||
uid: uid,
|
||||
avatars: avatarRet,
|
||||
bgType: Math.ceil(Math.random() * 3),
|
||||
abbr: genshin.abbr,
|
||||
displayMode,
|
||||
isSelf: e.isSelf,
|
||||
week: [3, 1, 2][week % 3],
|
||||
talentNotice
|
||||
|
||||
});
|
||||
|
||||
if (base64) {
|
||||
let msg = [];
|
||||
if (e.isGroup) {
|
||||
let name = lodash.truncate(e.sender.card, { length: 8 });
|
||||
msg.push(segment.at(e.user_id, name));
|
||||
}
|
||||
msg.push(segment.image(`base64://${base64}`));
|
||||
e.reply(msg);
|
||||
}
|
||||
return true; //事件结束不再往下
|
||||
}
|
45
components/Cfg.js
Normal file
45
components/Cfg.js
Normal file
@ -0,0 +1,45 @@
|
||||
import fs from "fs";
|
||||
import lodash from "lodash";
|
||||
|
||||
const _path = process.cwd();
|
||||
const _cfgPath = `${_path}/plugins/miao-plugin/components/`;
|
||||
let cfg = {};
|
||||
|
||||
if (!fs.existsSync(_cfgPath)) {
|
||||
fs.mkdirSync(_cfgPath);
|
||||
}
|
||||
|
||||
try {
|
||||
if (fs.existsSync(_cfgPath + "cfg.json")) {
|
||||
cfg = JSON.parse(fs.readFileSync(_cfgPath + "miao-plugin.json", "utf8")) || {};
|
||||
}
|
||||
} catch (e) {
|
||||
// do nth
|
||||
}
|
||||
|
||||
let Cfg = {
|
||||
get(rote, def = '') {
|
||||
return lodash.get(cfg, rote, def);
|
||||
},
|
||||
set(rote, val) {
|
||||
lodash.set(cfg, rote, val);
|
||||
fs.writeFileSync(_cfgPath + "cfg.json", JSON.stringify(cfg, null, "\t"));
|
||||
},
|
||||
scale(pct = 1) {
|
||||
let scale = Cfg.get("sys.scale", 100);
|
||||
scale = Math.min(2, Math.max(0.5, scale / 100));
|
||||
pct = pct * scale;
|
||||
return `style=transform:scale(${pct})`;
|
||||
},
|
||||
isDisable(e, rote) {
|
||||
if (Cfg.get(rote, true)) {
|
||||
return false;
|
||||
}
|
||||
if (/^#*喵喵/.test(e.msg || "")) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
export default Cfg;
|
@ -1,3 +1,4 @@
|
||||
import Data from "./Data.js";
|
||||
import Cfg from "./Cfg.js";
|
||||
|
||||
export { Data }
|
||||
export { Data, Cfg }
|
4
index.js
4
index.js
@ -3,9 +3,9 @@ import { consStat, abyssPct } from "./apps/stat.js";
|
||||
import { wiki } from "./apps/wiki.js";
|
||||
import lodash from "lodash";
|
||||
|
||||
import { rule as adminRule, updateRes } from "./apps/admin.js";
|
||||
import { rule as adminRule, updateRes, sysCfg } from "./apps/admin.js";
|
||||
|
||||
export { character, wife, consStat, abyssPct, wiki, updateRes };
|
||||
export { character, wife, consStat, abyssPct, wiki, updateRes, sysCfg };
|
||||
|
||||
|
||||
let rule = {
|
||||
|
BIN
resources/admin/bg.png
Normal file
BIN
resources/admin/bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 MiB |
BIN
resources/admin/cfg-right.jpg
Normal file
BIN
resources/admin/cfg-right.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.9 KiB |
BIN
resources/admin/cfg-right.png
Normal file
BIN
resources/admin/cfg-right.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.7 KiB |
90
resources/admin/index.css
Normal file
90
resources/admin/index.css
Normal file
@ -0,0 +1,90 @@
|
||||
body {
|
||||
transform: scale(1);
|
||||
width: 520px;
|
||||
}
|
||||
|
||||
.container {
|
||||
background: url("bg.png") #000144 left top no-repeat;
|
||||
background-size: 520px auto;
|
||||
width:520px;
|
||||
}
|
||||
|
||||
.head-box {
|
||||
margin: 0 0 80px 0;
|
||||
}
|
||||
|
||||
.cfg-box {
|
||||
border-radius: 15px;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
padding: 5px 15px;
|
||||
overflow: hidden;
|
||||
background: #f5f5f5;
|
||||
box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%);
|
||||
position: relative;
|
||||
background: rgba(35, 38, 57, .8);
|
||||
}
|
||||
|
||||
|
||||
.cfg-group {
|
||||
color: #ceb78b;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
padding: 10px 20px;
|
||||
}
|
||||
|
||||
.cfg-ul {
|
||||
|
||||
}
|
||||
|
||||
.cfg-li {
|
||||
border-radius: 18px;
|
||||
min-height: 36px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
margin-bottom: 10px;
|
||||
background: rgba(203, 196, 190, 0);
|
||||
}
|
||||
|
||||
.cfg-line {
|
||||
color: #4e5769;
|
||||
line-height: 36px;
|
||||
padding-left: 20px;
|
||||
font-weight: bold;
|
||||
border-radius: 16px;
|
||||
box-shadow: 0 0 2px rgba(0, 0, 0, 0.5);
|
||||
background: url("./cfg-right.jpg") right top #cbc4be no-repeat;
|
||||
background-size: auto 36px;
|
||||
}
|
||||
|
||||
.cfg-hint {
|
||||
font-size: 12px;
|
||||
font-weight: normal;
|
||||
margin-top: 3px;
|
||||
margin-bottom: -3px;
|
||||
}
|
||||
|
||||
.cfg-status {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
height: 36px;
|
||||
width: 160px;
|
||||
text-align: center;
|
||||
line-height: 36px;
|
||||
font-size: 16px;
|
||||
color: #495366;
|
||||
font-weight: bold;
|
||||
border-radius: 0 16px 16px 0;
|
||||
font-family: Number, "微软雅黑", sans-serif;
|
||||
}
|
||||
|
||||
.cfg-status.status-off {
|
||||
color: #a95151;
|
||||
}
|
||||
|
||||
.cfg-desc {
|
||||
font-size: 12px;
|
||||
color: #cbc4be;
|
||||
margin: 5px 0 5px 20px;
|
||||
}
|
114
resources/admin/index.html
Normal file
114
resources/admin/index.html
Normal file
@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
|
||||
<link rel="shortcut icon" href="#"/>
|
||||
<link rel="stylesheet" type="text/css" href="{{_res_path}}/common/common.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="{{_res_path}}/admin/index.css"/>
|
||||
</head>
|
||||
<body class="body_box" {{cfgScale}}>
|
||||
<div id="container" class="container">
|
||||
<div class="info_box">
|
||||
<div class="head-box type{{bgType}}">
|
||||
<div class="label">#喵喵设置</div>
|
||||
<div class="title">喵喵管理面板</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cfg-box">
|
||||
<div class="cfg-group">玩家&老婆卡片展示</div>
|
||||
<ul class="cfg-ul">
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
角色查询
|
||||
<span class="cfg-hint"> #喵喵设置角色 + 开启/关闭</span>
|
||||
{{@chars}}
|
||||
</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
老婆查询
|
||||
<span class="cfg-hint"> #喵喵设置老婆 + 开启/关闭</span>
|
||||
{{@wife}}
|
||||
</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
允许查他人
|
||||
<span class="cfg-hint"> #喵喵设置查他人 + 开启/关闭</span>
|
||||
{{@other}}
|
||||
</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
角色图片扩展包
|
||||
<span class="cfg-hint"> #喵喵更新图像</span>
|
||||
{{if imgPlus}}
|
||||
<div class="cfg-status">已安装</div>
|
||||
{{else}}
|
||||
<div class="cfg-status status-off">未安装</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="cfg-desc">角色图片的扩展包,包含更多的角色图片</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="cfg-box">
|
||||
<div class="cfg-group">角色资料与信息查询</div>
|
||||
<ul class="cfg-ul">
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
角色天赋
|
||||
<span class="cfg-hint"> #喵喵设置天赋 + 开启/关闭</span>
|
||||
{{@talent}}
|
||||
</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
角色命座
|
||||
<span class="cfg-hint"> #喵喵设置命座 + 开启/关闭</span>
|
||||
{{@cons}}
|
||||
</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
角色图片
|
||||
<span class="cfg-hint"> #喵喵设置图片 + 开启/关闭</span>
|
||||
{{@pic}}
|
||||
</div>
|
||||
</li>
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
深渊资料
|
||||
<span class="cfg-hint"> #喵喵设置深渊 + 开启/关闭</span>
|
||||
{{@abyss}}
|
||||
</div>
|
||||
<div class="cfg-desc">角色持有率、深渊出场率等信息</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="cfg-box">
|
||||
<div class="cfg-group">系统设置</div>
|
||||
<ul class="cfg-ul">
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
渲染精度
|
||||
<span class="cfg-hint">#喵喵设置渲染100 </span>
|
||||
<div class="cfg-status">{{scale}}</div>
|
||||
</div>
|
||||
<div class="cfg-desc">可选值50~150,建议100。设置高精度会提高图片的精细度,但因图片较大可能会影响渲染与发送速度</div>
|
||||
</li>
|
||||
|
||||
<li class="cfg-li">
|
||||
<div class="cfg-line">
|
||||
更新版本
|
||||
<div class="cfg-status">#喵喵更新</div>
|
||||
</div>
|
||||
<div class="cfg-desc">更新喵喵Plugin,可能需要重启Yunzai-Bot</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<div class="copyright"> Create By Yunzai-Bot & Miao-Plugin</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,20 +1,20 @@
|
||||
@font-face {
|
||||
font-family: "HWZhongSong";
|
||||
src: url("../font/华文中宋.TTF");
|
||||
src: url("../common/font/华文中宋.TTF");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "tttgbnumber";
|
||||
src: url("../font/tttgbnumber.ttf");
|
||||
src: url("../common/font/tttgbnumber.ttf");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "NZBZ";
|
||||
src: url("../font/NZBZ.ttf");
|
||||
src: url("../common/font/NZBZ.ttf");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
<link rel="shortcut icon" href="#"/>
|
||||
<link rel="stylesheet" type="text/css" href="{{_res_path}}/character/card.css?v=1.0"/>
|
||||
</head>
|
||||
<body class="{{bg.mode}}_mode">
|
||||
<body class="{{bg.mode}}_mode" {{cfgScale}}>
|
||||
<div class="container" id="container">
|
||||
<div class="char_name">
|
||||
<div class="uid">ID:{{uid}}</div>
|
||||
|
100
resources/common/common.css
Normal file
100
resources/common/common.css
Normal file
@ -0,0 +1,100 @@
|
||||
@font-face {
|
||||
font-family: "HWZS";
|
||||
src: url("../common/font/华文中宋.TTF");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Number";
|
||||
src: url("../common/font/tttgbnumber.ttf");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "NZBZ";
|
||||
src: url("../common/font/NZBZ.ttf");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 18px;
|
||||
color: #1e1f20;
|
||||
font-family: PingFangSC-Medium, PingFang SC, sans-serif;
|
||||
transform: scale(1.4);
|
||||
transform-origin: 0 0;
|
||||
background: url("./bg1.png") top left no-repeat #2a3860;
|
||||
background-size: contain;
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
.container {
|
||||
width: 600px;
|
||||
padding: 20px 15px 10px 15px;
|
||||
|
||||
background-size: contain;
|
||||
}
|
||||
|
||||
|
||||
.head-box {
|
||||
border-radius: 15px;
|
||||
padding: 10px 20px;
|
||||
position: relative;
|
||||
color: #fff;
|
||||
margin-top: 30px;
|
||||
|
||||
}
|
||||
|
||||
.head-box .title {
|
||||
font-size: 36px;
|
||||
font-family: NZBZ, sans-serif;
|
||||
text-shadow: 0 0 1px #000, 1px 1px 3px rgba(0,0,0,.9);
|
||||
}
|
||||
|
||||
|
||||
.head-box .genshin_logo {
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
right: 15px;
|
||||
width: 97px;
|
||||
}
|
||||
|
||||
.head-box .label {
|
||||
font-size: 16px;
|
||||
text-shadow: 0 0 1px #000, 1px 1px 3px rgba(0,0,0,.9);
|
||||
}
|
||||
|
||||
|
||||
.notice {
|
||||
color: #888;
|
||||
font-size: 12px;
|
||||
text-align: right;
|
||||
padding: 12px 5px 5px;
|
||||
}
|
||||
|
||||
.notice-center {
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
margin-bottom: 10px;
|
||||
text-shadow: 1px 1px 1px #333;
|
||||
}
|
||||
|
||||
.copyright {
|
||||
font-size: 16px;
|
||||
font-family: Number, sans-serif;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
position: relative;
|
||||
padding-left: 10px;
|
||||
text-shadow: 1px 1px 1px #000;
|
||||
margin-bottom: 10px;
|
||||
}
|
1
resources/miao-res-plus
Submodule
1
resources/miao-res-plus
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 6b582ed7f308ce1db3ccf0ab7ed9b01d0f77b7fd
|
@ -7,7 +7,7 @@
|
||||
<link rel="stylesheet" type="text/css" href="{{_res_path}}/stat/abyss-pct.css?v=1.0"/>
|
||||
<link rel="preload" href="{{_res_path}}/font/tttgbnumber.ttf" as="font">
|
||||
</head>
|
||||
<body id="container" class="body_box">
|
||||
<body id="container" class="body_box" {{cfgScale}}>
|
||||
<div class="container">
|
||||
<div class="info_box">
|
||||
<div class="head-box type{{bgType}}">
|
||||
|
@ -7,7 +7,7 @@
|
||||
<link rel="stylesheet" type="text/css" href="{{_res_path}}/stat/character.css?v=1.0"/>
|
||||
<link rel="preload" href="{{_res_path}}/font/tttgbnumber.ttf" as="font">
|
||||
</head>
|
||||
<body id="container" class="body_box">
|
||||
<body id="container" class="body_box" {{cfgScale}}>
|
||||
<div class="container">
|
||||
<div class="info_box">
|
||||
<div class="head-box type{{bgType}}">
|
||||
|
@ -1,18 +1,18 @@
|
||||
@font-face {
|
||||
font-family: "tttgbnumber";
|
||||
src: url("../../font/tttgbnumber.ttf");
|
||||
src: url("../common/font/tttgbnumber.ttf");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: HYWenHei-55W;
|
||||
src: url('../../font/HYWenHei-55W.ttf');
|
||||
src: url('../common/font/HYWenHei-55W.ttf');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "NZBZ";
|
||||
src: url("../font/NZBZ.ttf");
|
||||
src: url("../common/font/NZBZ.ttf");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
@font-face {
|
||||
font-family: "tttgbnumber";
|
||||
src: url("../font/tttgbnumber.ttf");
|
||||
src: url("../common/font/tttgbnumber.ttf");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
35
tools/test.txt
Normal file
35
tools/test.txt
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user