mirror of
https://github.com/ZZZure/ZZZ-Plugin.git
synced 2025-12-18 14:17:45 +00:00
feat: 新增面板handler供开发者调用
This commit is contained in:
parent
73715f015f
commit
5d14c419f7
2 changed files with 117 additions and 21 deletions
|
|
@ -2,7 +2,9 @@ import { ZZZPlugin } from '../lib/plugin.js';
|
||||||
import {
|
import {
|
||||||
getPanelList,
|
getPanelList,
|
||||||
refreshPanel as refreshPanelFunction,
|
refreshPanel as refreshPanelFunction,
|
||||||
getPanel,
|
getPanelOrigin,
|
||||||
|
updatePanelData,
|
||||||
|
formatPanelData,
|
||||||
} from '../lib/avatar.js';
|
} from '../lib/avatar.js';
|
||||||
import settings from '../lib/settings.js';
|
import settings from '../lib/settings.js';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
|
|
@ -29,6 +31,7 @@ export class Panel extends ZZZPlugin {
|
||||||
fnc: 'getCharOriImage',
|
fnc: 'getCharOriImage',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
handler: [{ key: 'zzz.tool.panel', fn: 'getCharPanelTool' }],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
async handleRule() {
|
async handleRule() {
|
||||||
|
|
@ -101,32 +104,74 @@ export class Panel extends ZZZPlugin {
|
||||||
const match = this.e.msg.match(reg);
|
const match = this.e.msg.match(reg);
|
||||||
if (!match) return false;
|
if (!match) return false;
|
||||||
const name = match[4];
|
const name = match[4];
|
||||||
const data = getPanel(uid, name);
|
const data = getPanelOrigin(uid, name);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
await this.reply(`未找到角色${name}的面板信息,请先刷新面板`);
|
await this.reply(`未找到角色${name}的面板信息,请先刷新面板`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let handler = this.e.runtime?.handler || {};
|
||||||
|
if (handler.has('zzz.tool.panel')) {
|
||||||
|
await handler.call('zzz.tool.panel', this.e, {
|
||||||
|
uid,
|
||||||
|
data: data,
|
||||||
|
needSave: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCharPanelTool(e, _data = {}) {
|
||||||
|
if (e) this.e = e;
|
||||||
|
const {
|
||||||
|
uid = undefined,
|
||||||
|
data = undefined,
|
||||||
|
needSave = true,
|
||||||
|
reply = true,
|
||||||
|
} = _data;
|
||||||
|
if (!uid) {
|
||||||
|
await this.reply('UID为空');
|
||||||
|
throw new Error('UID为空');
|
||||||
|
}
|
||||||
|
if (!data) {
|
||||||
|
await this.reply('数据为空');
|
||||||
|
throw new Error('数据为空');
|
||||||
|
}
|
||||||
|
if (needSave) {
|
||||||
|
updatePanelData(uid, [data]);
|
||||||
|
}
|
||||||
const timer = setTimeout(() => {
|
const timer = setTimeout(() => {
|
||||||
if (this?.reply) {
|
if (this?.reply) {
|
||||||
this.reply('查询成功,正在下载图片资源,请稍候。');
|
this.reply('查询成功,正在下载图片资源,请稍候。');
|
||||||
}
|
}
|
||||||
}, 5000);
|
}, 5000);
|
||||||
await data.get_detail_assets();
|
const parsedData = formatPanelData(data);
|
||||||
|
await parsedData.get_detail_assets();
|
||||||
clearTimeout(timer);
|
clearTimeout(timer);
|
||||||
const finalData = {
|
const finalData = {
|
||||||
uid: uid,
|
uid,
|
||||||
charData: data,
|
charData: parsedData,
|
||||||
};
|
};
|
||||||
const image = await this.render('panel/card.html', finalData, {
|
const image = await this.render('panel/card.html', finalData, {
|
||||||
retType: 'base64',
|
retType: 'base64',
|
||||||
});
|
});
|
||||||
const res = await this.reply(image);
|
|
||||||
if (res?.message_id && data.role_icon)
|
|
||||||
await redis.set(`ZZZ:PANEL:IMAGE:${res.message_id}`, data.role_icon, {
|
|
||||||
EX: 3600 * 3,
|
|
||||||
});
|
|
||||||
|
|
||||||
return false;
|
if (reply) {
|
||||||
|
const res = await this.reply(image);
|
||||||
|
if (res?.message_id && parsedData.role_icon)
|
||||||
|
await redis.set(
|
||||||
|
`ZZZ:PANEL:IMAGE:${res.message_id}`,
|
||||||
|
parsedData.role_icon,
|
||||||
|
{
|
||||||
|
EX: 3600 * 3,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
message: res,
|
||||||
|
image,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
}
|
}
|
||||||
async proficiency() {
|
async proficiency() {
|
||||||
const uid = await this.getUID();
|
const uid = await this.getUID();
|
||||||
|
|
|
||||||
|
|
@ -55,16 +55,14 @@ export const getAvatarInfoList = async (api, origin = false) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 刷新面板
|
* 更新面板数据
|
||||||
* @param {MysZZZApi} api
|
* @param {string} uid 用户 ID
|
||||||
* @returns {Promise<ZZZAvatarInfo[] | null>}
|
* @param {Array} newData 新数据
|
||||||
|
* @returns {Array} 合并后的数据
|
||||||
*/
|
*/
|
||||||
export const refreshPanel = async api => {
|
export const updatePanelData = (uid, newData) => {
|
||||||
// 获取已保存数据
|
// 获取已保存数据
|
||||||
const originData = getPanelData(api.uid);
|
const originData = getPanelData(uid);
|
||||||
// 获取新数据
|
|
||||||
const newData = await getAvatarInfoList(api, true);
|
|
||||||
if (!newData) return null;
|
|
||||||
// 初始化最终数据
|
// 初始化最终数据
|
||||||
const finalData = [...newData];
|
const finalData = [...newData];
|
||||||
// 如果有已保存的数据
|
// 如果有已保存的数据
|
||||||
|
|
@ -77,12 +75,31 @@ export const refreshPanel = async api => {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存数据
|
// 保存数据
|
||||||
savePanelData(api.uid, finalData);
|
savePanelData(uid, finalData);
|
||||||
// 格式化数据
|
|
||||||
|
// 标记新数据
|
||||||
finalData.forEach(item => {
|
finalData.forEach(item => {
|
||||||
item.isNew = !!newData.find(i => i.id === item.id);
|
item.isNew = !!newData.find(i => i.id === item.id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return finalData;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新面板
|
||||||
|
* @param {MysZZZApi} api
|
||||||
|
* @returns {Promise<ZZZAvatarInfo[] | null>}
|
||||||
|
*/
|
||||||
|
export const refreshPanel = async api => {
|
||||||
|
// 获取新数据
|
||||||
|
const newData = await getAvatarInfoList(api, true);
|
||||||
|
if (!newData) return null;
|
||||||
|
|
||||||
|
// 合并新旧数据
|
||||||
|
const finalData = updatePanelData(uid, newData);
|
||||||
|
|
||||||
const formattedData = finalData.map(item => new ZZZAvatarInfo(item));
|
const formattedData = finalData.map(item => new ZZZAvatarInfo(item));
|
||||||
for (const item of formattedData) {
|
for (const item of formattedData) {
|
||||||
// 下载图片资源
|
// 下载图片资源
|
||||||
|
|
@ -119,3 +136,37 @@ export const getPanel = (uid, name) => {
|
||||||
if (!result) return null;
|
if (!result) return null;
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取某个角色的面板数据(原始数据)
|
||||||
|
* @param {string} uid
|
||||||
|
* @param {string} name
|
||||||
|
* @returns {ZZZAvatarInfo | null}
|
||||||
|
*/
|
||||||
|
export const getPanelOrigin = (uid, name) => {
|
||||||
|
const data = getPanelData(uid);
|
||||||
|
const id = char.aliasToID(name);
|
||||||
|
if (!id) return null;
|
||||||
|
// 通过 ID 获取角色数据
|
||||||
|
const result = data.find(item => item.id === id);
|
||||||
|
if (!result) return null;
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将数据数组格式化
|
||||||
|
* @param {Array} data
|
||||||
|
* @returns {Array<ZZZAvatarInfo>}
|
||||||
|
*/
|
||||||
|
export const formatPanelDatas = data => {
|
||||||
|
return data.map(item => new ZZZAvatarInfo(item));
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将数据格式化
|
||||||
|
* @param {Object} data
|
||||||
|
* @returns {ZZZAvatarInfo}
|
||||||
|
*/
|
||||||
|
export const formatPanelData = data => {
|
||||||
|
return new ZZZAvatarInfo(data);
|
||||||
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue