From 5d14c419f71de10f99f0bb40554329d147fa15d9 Mon Sep 17 00:00:00 2001 From: bietiaop <1527109126@qq.com> Date: Sun, 2 Mar 2025 00:23:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=9D=A2=E6=9D=BFhan?= =?UTF-8?q?dler=E4=BE=9B=E5=BC=80=E5=8F=91=E8=80=85=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/panel.js | 67 ++++++++++++++++++++++++++++++++++++++++-------- lib/avatar.js | 71 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 117 insertions(+), 21 deletions(-) diff --git a/apps/panel.js b/apps/panel.js index ac0044d..c97cd73 100644 --- a/apps/panel.js +++ b/apps/panel.js @@ -2,7 +2,9 @@ import { ZZZPlugin } from '../lib/plugin.js'; import { getPanelList, refreshPanel as refreshPanelFunction, - getPanel, + getPanelOrigin, + updatePanelData, + formatPanelData, } from '../lib/avatar.js'; import settings from '../lib/settings.js'; import _ from 'lodash'; @@ -29,6 +31,7 @@ export class Panel extends ZZZPlugin { fnc: 'getCharOriImage', }, ], + handler: [{ key: 'zzz.tool.panel', fn: 'getCharPanelTool' }], }); } async handleRule() { @@ -101,32 +104,74 @@ export class Panel extends ZZZPlugin { const match = this.e.msg.match(reg); if (!match) return false; const name = match[4]; - const data = getPanel(uid, name); + const data = getPanelOrigin(uid, name); if (!data) { await this.reply(`未找到角色${name}的面板信息,请先刷新面板`); 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(() => { if (this?.reply) { this.reply('查询成功,正在下载图片资源,请稍候。'); } }, 5000); - await data.get_detail_assets(); + const parsedData = formatPanelData(data); + await parsedData.get_detail_assets(); clearTimeout(timer); const finalData = { - uid: uid, - charData: data, + uid, + charData: parsedData, }; const image = await this.render('panel/card.html', finalData, { 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() { const uid = await this.getUID(); diff --git a/lib/avatar.js b/lib/avatar.js index 2ceb20b..439b1f6 100644 --- a/lib/avatar.js +++ b/lib/avatar.js @@ -55,16 +55,14 @@ export const getAvatarInfoList = async (api, origin = false) => { }; /** - * 刷新面板 - * @param {MysZZZApi} api - * @returns {Promise} + * 更新面板数据 + * @param {string} uid 用户 ID + * @param {Array} newData 新数据 + * @returns {Array} 合并后的数据 */ -export const refreshPanel = async api => { +export const updatePanelData = (uid, newData) => { // 获取已保存数据 - const originData = getPanelData(api.uid); - // 获取新数据 - const newData = await getAvatarInfoList(api, true); - if (!newData) return null; + const originData = getPanelData(uid); // 初始化最终数据 const finalData = [...newData]; // 如果有已保存的数据 @@ -77,12 +75,31 @@ export const refreshPanel = async api => { } } } + // 保存数据 - savePanelData(api.uid, finalData); - // 格式化数据 + savePanelData(uid, finalData); + + // 标记新数据 finalData.forEach(item => { item.isNew = !!newData.find(i => i.id === item.id); }); + + return finalData; +}; + +/** + * 刷新面板 + * @param {MysZZZApi} api + * @returns {Promise} + */ +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)); for (const item of formattedData) { // 下载图片资源 @@ -119,3 +136,37 @@ export const getPanel = (uid, name) => { if (!result) return null; 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} + */ +export const formatPanelDatas = data => { + return data.map(item => new ZZZAvatarInfo(item)); +}; + +/** + * 将数据格式化 + * @param {Object} data + * @returns {ZZZAvatarInfo} + */ +export const formatPanelData = data => { + return new ZZZAvatarInfo(data); +};