日志输出优化

This commit is contained in:
xyz 2025-04-03 15:32:57 +08:00
parent 69992b0283
commit ac7725e41d
3 changed files with 20 additions and 355 deletions

View file

@ -52,248 +52,36 @@ export class Panel extends ZZZPlugin {
if (queryPanelReg.test(this.e.msg)) return await this.getCharPanel();
return false;
}
// async refreshPanel() {
// const uid = await this.getUID();
// // ... 省略获取 lastQueryTime 和冷卻时间判断的代码 ...
// this.result = null; // 先清空结果
//
// const useEnka = _.get(settings.getConfig('config'), 'useEnka', false);
// logger.mark(`[panel.js] useEnka 设置值: ${useEnka}`); // 1. 确认是否启用 Enka 逻辑
//
// if (useEnka) { // 检查这个 if 是否进入
// logger.mark('[panel.js] 进入 useEnka 逻辑块');
// let enkaData = null; // 初始化 enkaData
// try {
// logger.mark(`[panel.js] 准备调用 getZzzEnkaData for UID: ${uid}`);
// enkaData = await getZzzEnkaData(uid);
// logger.mark('[panel.js] getZzzEnkaData 调用完成');
//
// // 2. 详细检查 enkaData 的状态
// if (enkaData === null || enkaData === undefined) {
// logger.error('[panel.js] getZzzEnkaData 返回了 null 或 undefined');
// await this.reply('获取Enka数据失败 (返回null/undefined),请稍后再试');
// return false;
// } else if (enkaData === -1) {
// logger.warn('[panel.js] getZzzEnkaData 返回了 -1 (表示获取失败)');
// await this.reply('获取Enka数据失败 (返回-1),请稍后再试');
// return false;
// } else if (!enkaData.PlayerInfo || !enkaData.PlayerInfo.ShowcaseDetail || !enkaData.PlayerInfo.ShowcaseDetail.AvatarList) {
// logger.error('[panel.js] 获取到的 enkaData 结构不完整:', enkaData);
// await this.reply('获取到的Enka数据结构不完整无法处理');
// return false;
// } else {
// logger.mark('[panel.js] 成功获取到有效的 enkaData 结构');
// console.log('[panel.js] enkaData.PlayerInfo.ShowcaseDetail.AvatarList:', enkaData.PlayerInfo.ShowcaseDetail.AvatarList); // 打印角色列表确认
// }
//
// // 3. 检查 _enka_data_to_mys_data 函数是否已正确导入
// if (typeof _enka_data_to_mys_data !== 'function') {
// logger.error('[panel.js] _enka_data_to_mys_data 不是一个函数! 请检查导入语句和文件是否存在。');
// await this.reply('内部错误:数据转换函数加载失败');
// return false;
// }
//
// logger.mark('[panel.js] _enka_data_to_mys_data 函数已找到,类型:', typeof _enka_data_to_mys_data);
// logger.mark('[panel.js] 即将调用 _enka_data_to_mys_data...');
//
// // 4. 使用 try...catch 包裹调用,捕获可能的内部错误
// try {
// this.result = await _enka_data_to_mys_data(enkaData);
// logger.mark('[panel.js] _enka_data_to_mys_data 调用完成。');
// // 在这里可以检查 this.result 是否是你期望的格式
// console.log('[panel.js] 转换后的 result (部分示例):', this.result ? JSON.stringify(this.result[0], null, 2).substring(0, 500) + '...' : 'null or empty');
// } catch (conversionError) {
// logger.error('[panel.js] 调用 _enka_data_to_mys_data 时发生严重错误:', conversionError);
// // 打印详细错误堆栈
// console.error(conversionError);
// await this.reply(`处理Enka数据时出错: ${conversionError.message}`);
// return false; // 出错则不再继续
// }
//
// } catch (fetchError) {
// // 这个 catch 捕获 getZzzEnkaData 自身的 await 可能抛出的错误
// logger.error('[panel.js] 调用 getZzzEnkaData 时发生错误:', fetchError);
// console.error(fetchError); // 打印错误堆栈
// await this.reply(`获取Enka数据时发生网络或API错误: ${fetchError.message}`);
// return false;
// }
//
// } else { // 如果 useEnka 是 false
// logger.mark('[panel.js] 未启用 useEnka跳过 Enka 面板逻辑');
// // 这里可以继续执行原有的 mysapi 逻辑(如果需要的话)
// // logger.mark('mysapi执行');
// // ... (原有的 mysapi 刷新逻辑) ...
// // 注意:如果 useEnka 为 falsethis.result 可能需要从 mysapi 获取
// }
//
// // ----- 后续处理 this.result 的代码 -----
// // (确保无论走 Enka 逻辑还是 mysapi 逻辑this.result 都有合适的值)
//
// // 例如,原有的 newChar 计算和渲染逻辑:
// if (this.result && Array.isArray(this.result)) { // 检查 this.result 是否有效
// const newChar = this.result.filter(item => item.isNew); // 假设 MYS 数据结构中有 isNew
// const finalData = {
// newChar: newChar.length,
// list: this.result, // 使用转换后的或 mysapi 的结果
// };
// await this.render('panel/refresh.html', finalData);
// } else if (!useEnka) {
// // 如果没用 Enka 且没有执行 mysapi 逻辑(或 mysapi 逻辑没产生 result可能需要提示
// logger.warn('[panel.js] 没有可用的面板数据用于渲染 (useEnka=false, result无效)');
// // 可能需要添加回复告诉用户没有数据?
// } else if (useEnka && (!this.result || this.result.length === 0)) {
// logger.warn('[panel.js] Enka 数据转换后结果为空或无效');
// // 根据需要决定是否回复用户
// }
//
// }
// async refreshPanel() {
// const uid = await this.getUID();
// const lastQueryTime = await redis.get(`ZZZ:PANEL:${uid}:LASTTIME`);
// const panelSettings = settings.getConfig('panel');
// const coldTime = _.get(panelSettings, 'interval', 300);
// this.result = null; // Initialize instance result
//
// // --- Enka Path ---
// if(_.get(settings.getConfig('config'), 'useEnka', false)){ // Default is false if setting missing
// logger.mark('enka面板执行')
// const enkaData = await getZzzEnkaData(uid); // Fetch Enka data
//
// // --- Issue 1: Check for failure *before* processing ---
// if (enkaData === -1) { // Check for specific failure code
// await this.reply('获取enka数据失败请稍后再试');
// return false; // Exit early
// }
// // Add more checks for null/undefined/incomplete data if needed here
//
// console.log('[panel.js] 获取到 enkaData准备转换...');
// console.log('Enka AvatarList:', enkaData?.PlayerInfo?.ShowcaseDetail?.AvatarList);
// console.log('[panel.js] 即将调用 _enka_data_to_mys_data...');
//
// // --- This is where previous errors occurred due to name_convert.js load failure ---
// // Assuming name_convert.js path fix is applied, this should now work
// this.result = await _enka_data_to_mys_data(enkaData); // Assign to instance variable
// logger.mark('[panel.js] _enka_data_to_mys_data 调用完成.'); // Added log for confirmation
//
// // --- MYS API Path ---
// } else {
// logger.mark('mysapi执行')
// if (lastQueryTime && Date.now() - lastQueryTime < 1000 * coldTime) {
// await this.reply(`${coldTime}秒内只能刷新一次,请稍后再试`);
// return false;
// }
// const { api } = await this.getAPI();
// await redis.set(`ZZZ:PANEL:${uid}:LASTTIME`, Date.now());
// await this.reply('正在刷新面板列表,请稍候...');
// await this.getPlayerInfo(); // Assumed necessary for MYS panel
//
// // --- Issue 2: Assign result correctly ---
// let mysResult = null; // Use a temporary variable for MYS result
// try {
// mysResult = await refreshPanelFunction(api); // Call the imported MYS refresh
// console.dir('MYS API res:', mysResult); // Log MYS result
// if (!mysResult) {
// await this.reply('面板列表刷新失败 (MYS API),请稍后再试');
// return false;
// }
// // Assign the successful MYS result to the instance variable
// this.result = mysResult; // <<<< IMPORTANT ASSIGNMENT
// } catch (e) {
// this.reply(e.message);
// // Consider logging the full error for debugging
// logger.error("MYS API refresh failed:", e);
// // Depending on desired behavior, you might return false or re-throw
// return false; // Exit on MYS API error
// }
// } // End if/else
//
// // --- Post-processing: Use this.result consistently ---
// // Ensure this.result is an array before proceeding
// if (!this.result || !Array.isArray(this.result)) {
// logger.error('[panel.js] 最终结果无效或不是数组:', this.result);
// // Maybe reply to the user that no data could be processed
// await this.reply('未能获取或处理有效的面板数据。');
// return false;
// }
//
// // --- Issue 3: Use this.result for calculations ---
// // Filter based on the unified this.result
// const newChar = this.result.filter(item => item && item.isNew); // Added check for item existence
//
// // Prepare final data using the unified this.result
// const finalData = {
// newChar: newChar.length,
// list: this.result, // Use the instance variable
// };
//
// // Render the result
// await this.render('panel/refresh.html', finalData);
// }
async refreshPanel() {
const uid = await this.getUID();
// --- 获取玩家信息 (带容错处理) ---
// ... (这部分代码保持不变,使用带有占位符逻辑的版本) ...
logger.mark('[panel.js] 准备调用 getPlayerInfo...');
let playerInfo = null;
try {
playerInfo = await this.getPlayerInfo();
if (!playerInfo) playerInfo = this.e.player;
if (!playerInfo) {
logger.warn(`[panel.js] getPlayerInfo 未返回有效信息使用默认占位。UID: ${uid}`);
playerInfo = { uid: uid, nickname: `用户${uid}`, level: '??', region_name: '未知服务器' };
}
logger.mark('[panel.js] getPlayerInfo 尝试完成.');
} catch (playerInfoError) {
logger.error('[panel.js] 调用 getPlayerInfo 时出错 (使用占位):', playerInfoError.message);
playerInfo = { uid: uid, nickname: `用户${uid}`, level: '??', region_name: '错误', error: playerInfoError.message };
}
// --- End 获取玩家信息 ---
this.result = null; // 初始化结果
// ----- 选择 Enka 或 MYS API -----
this.result = null;
const useEnka = _.get(settings.getConfig('config'), 'useEnka', true); // 读取配置Enka 优先
logger.mark(`[panel.js] useEnka 设置值: ${useEnka}`);
// ----- End -----
// --- 数据获取和处理逻辑 ---
if (useEnka) {
logger.mark('[panel.js] 进入 Enka 逻辑块');
try {
const enkaData = await getZzzEnkaData(uid);
logger.mark('[panel.js] getZzzEnkaData 调用完成.'); // <-- 日志:调用后
// ----- !!! 在这里添加打印原始 Enka 数据的日志 !!! -----
console.log('===== ZZZ Enka Raw Data Start =====');
// 使用 JSON.stringify 完整打印null, 2 用于格式化输出
console.log(JSON.stringify(enkaData, null, 2));
console.log('===== ZZZ Enka Raw Data End =====');
// ----- !!! 日志添加结束 !!! -----
if (!enkaData || enkaData === -1 || !enkaData.PlayerInfo) { throw new Error('获取或验证 Enka 数据失败'); }
logger.mark('[panel.js] 即将调用 _enka_data_to_mys_data...');
this.result = await _enka_data_to_mys_data(enkaData); // <<< Enka 结果赋给 this.result
logger.mark('[panel.js] _enka_data_to_mys_data 调用完成.');
// ----- !!! 在这里添加打印转换后数据的日志 !!! -----
console.log('===== Enka Converted Data (First Avatar) Start =====');
if (this.result && Array.isArray(this.result) && this.result.length > 0) {
console.log(JSON.stringify(this.result[0], null, 2)); // 打印第一个转换后的角色
} else {
console.log('Converted result is empty or invalid.');
}
console.log('===== Enka Converted Data (First Avatar) End =====');
// ----- !!! 日志添加结束 !!! -----
logger.mark('[panel.js] _enka_data_to_mys_data 调用完成.');
this.result = await _enka_data_to_mys_data(enkaData);
} catch (enkaError) {
logger.error('[panel.js] 处理 Enka 逻辑时出错:', enkaError);
logger.error('处理 Enka 逻辑时出错:', enkaError);
await this.reply(`处理Enka数据时出错: ${enkaError.message}`);
return false;
}
} else {
logger.mark('[panel.js] 进入 mysapi 逻辑块');
try {
const { api } = await this.getAPI(); // MYS 需要 api 对象
// MYS 逻辑需要冷却判断
@ -317,20 +105,16 @@ export class Panel extends ZZZPlugin {
return false;
}
}
// --- End 数据获取和处理逻辑 ---
// --- !!! 关键步骤:更新面板数据缓存 !!! ---
if (this.result && Array.isArray(this.result)) { // 确保有有效数据 (非 null, 是数组)
// 并且至少包含一个角色数据才存,避免存空数组?(可选)
if (this.result.length > 0) {
try {
logger.mark(`[panel.js] 准备调用 updatePanelData 更新缓存,包含 ${this.result.length} 个角色数据...`);
// 调用导入的 updatePanelData 函数
await updatePanelData(uid, this.result); // <<< 核心:写入缓存
logger.mark('[panel.js] updatePanelData 调用完成,缓存已更新。');
await updatePanelData(uid, this.result);
} catch (cacheError) {
logger.error('[panel.js] 调用 updatePanelData 更新缓存时出错:', cacheError);
logger.error('出错:', cacheError);
// 记录错误,但可能继续
}
} else {
@ -348,18 +132,10 @@ export class Panel extends ZZZPlugin {
await this.reply('处理后的面板数据格式无效。');
return false;
}
// --- !!! End 更新缓存 !!! ---
// --- 后续处理:构建 finalData 用于渲染刷新摘要 ---
const currentResult = this.result || []; // 保证 currentResult 是数组
// newChar 的计算可能依赖于 MYS 的特定字段Enka 结果可能没有
// 保持之前的兼容逻辑,如果 Enka 结果没有 isNewnewCharCount 为 0
const currentResult = this.result || [];
const newCharCount = (currentResult.length > 0 && currentResult[0]?.isNew !== undefined)
? currentResult.filter(item => item && item.isNew).length
: 0;
const finalData = {
newChar: newCharCount,
list: currentResult,
@ -367,9 +143,6 @@ export class Panel extends ZZZPlugin {
uid: uid
};
logger.mark('[panel.js] 准备渲染 refresh.html 模板...');
// 渲染刷新摘要页面
try {
await this.render('panel/refresh.html', finalData);
} catch (renderError) {

View file

@ -1,6 +1,6 @@
render:
scale: 100 # 渲染精度
useEnka: true # 使用enka接口查询
useEnka: false # 使用enka接口查询
query:
others: true # 允许查询他人信息
update:

View file

@ -23,9 +23,9 @@ try {
if (fs.existsSync(skillParamPath)) {
const skillParamContent = fs.readFileSync(skillParamPath, { encoding: 'utf-8' });
PartnerId2SkillParam = JSON.parse(skillParamContent);
console.log(`[name_convert.js] 成功加载并解析 ${SkillParamFile}`);
logger.debug(`[name_convert.js] 成功加载并解析 ${SkillParamFile}`);
// 可以选择性地添加更多日志来确认加载内容
// console.log(`[name_convert.js] 加载了 ${Object.keys(PartnerId2SkillParam).length} 个角色的技能数据。`);
// logger.debug(`[name_convert.js] 加载了 ${Object.keys(PartnerId2SkillParam).length} 个角色的技能数据。`);
} else {
console.error(`${SkillParamFile} 文件未找到于: ${skillParamPath}`);
// 或者使用 console.warn 如果你希望即使缺少技能数据也能继续运行
@ -56,17 +56,17 @@ try {
if (fs.existsSync(partnerDataPath)) {
const partnerDataContent = fs.readFileSync(partnerDataPath, { encoding: 'utf-8' });
partner_data = JSON.parse(partnerDataContent);
console.log(`[name_convert.js] 成功解析 JSON。`);
console.log(`[name_convert.js] 加载了 ${Object.keys(partner_data).length} 个伙伴条目。`);
console.log(`[name_convert.js] 加载后是否存在 "1191"? ${partner_data.hasOwnProperty('1191')}`);
console.log(`[name_convert.js] 加载后是否存在 "1021"? ${partner_data.hasOwnProperty('1021')}`);
logger.debug(`[name_convert.js] 成功解析 JSON。`);
logger.debug(`[name_convert.js] 加载了 ${Object.keys(partner_data).length} 个伙伴条目。`);
logger.debug(`[name_convert.js] 加载后是否存在 "1191"? ${partner_data.hasOwnProperty('1191')}`);
logger.debug(`[name_convert.js] 加载后是否存在 "1021"? ${partner_data.hasOwnProperty('1021')}`);
// Optional: Keep debug logs if needed during development
// console.log('--- partner_data loaded successfully ---');
// console.log(`Loaded ${Object.keys(partner_data).length} partner entries.`);
// console.log('--- partner_data sample entry ---');
// logger.debug('--- partner_data loaded successfully ---');
// logger.debug(`Loaded ${Object.keys(partner_data).length} partner entries.`);
// logger.debug('--- partner_data sample entry ---');
// const sampleKey = Object.keys(partner_data)[0];
// if (sampleKey) console.log({ [sampleKey]: partner_data[sampleKey] });
// console.log('--- partner_data loading end ---');
// if (sampleKey) logger.debug({ [sampleKey]: partner_data[sampleKey] });
// logger.debug('--- partner_data loading end ---');
} else {
console.error(`Partner data file not found at: ${partnerDataPath}`);
}
@ -224,112 +224,4 @@ export {
partner_data,
char_alias_data,
PartnerId2SkillParam
// Optionally export alias data if needed elsewhere
};
// import fs from 'node:fs';
// import path from 'node:path';
//
// const MAP_PATH = path.dirname(new URL(import.meta.url).pathname);
// const ALIAS_LIST = path.join(path.dirname(new URL(import.meta.url).pathname), 'alias');
// const CHAR_ALIAS = path.join(ALIAS_LIST, 'char_alias.json');
// const PartnerId2DataFile = 'PartnerId2Data.json';
// const WeaponId2DataFile = 'WeaponId2Data.json';
// const EquipId2DataFile = 'EquipId2Data.json';
//
// let char_alias_data = {};
// try {
// const charAliasContent = fs.readFileSync(CHAR_ALIAS, { encoding: 'utf-8' });
// char_alias_data = JSON.parse(charAliasContent);
// } catch (error) {
// console.error('Error reading char_alias.json:', error);
// }
//
// let partner_data = {};
// try {
// const partnerDataContent = fs.readFileSync(path.join(MAP_PATH, PartnerId2DataFile), { encoding: 'utf-8' });
// partner_data = JSON.parse(partnerDataContent);
// console.log('--- partner_data 内容开始 ---');
// console.log(partner_data);
// console.log('--- partner_data 内容结束 ---');
// } catch (error) {
// console.error('Error reading PartnerId2Data.json:', error);
// }
//
// let weapon_data = {};
// try {
// const weaponDataContent = fs.readFileSync(path.join(MAP_PATH, WeaponId2DataFile), { encoding: 'utf-8' });
// weapon_data = JSON.parse(weaponDataContent);
// } catch (error) {
// console.error('Error reading WeaponId2Data.json:', error);
// }
//
// let equip_data = {};
// try {
// const equipDataContent = fs.readFileSync(path.join(MAP_PATH, EquipId2DataFile), { encoding: 'utf-8' });
// equip_data = JSON.parse(equipDataContent);
// } catch (error) {
// console.error('Error reading EquipId2Data.json:', error);
// }
//
// export function char_id_to_sprite(char_id) {
// const charIdStr = String(char_id);
// if (partener_data[charIdStr]) {
// return partener_data[charIdStr].sprite_id;
// } else {
// return '28';
// }
// }
//
// export function char_id_to_full_name(char_id) {
// const charIdStr = String(char_id);
// if (partener_data[charIdStr]) {
// return partener_data[charIdStr].full_name;
// } else {
// return '绳匠';
// }
// }
//
// export function equip_id_to_sprite(equip_id) {
// const equipIdStr = String(equip_id);
// if (equipIdStr.length === 5) {
// const suit_id = equipIdStr.slice(0, 3) + '00';
// if (equip_data[suit_id]) {
// return equip_data[suit_id].sprite_file;
// }
// }
// return undefined;
// }
//
// export function alias_to_char_name(char_name) {
// for (const i in char_alias_data) {
// if (char_name === i || (Array.isArray(char_alias_data[i]) && char_alias_data[i].includes(char_name))) {
// return i;
// }
// }
// return char_name;
// }
//
// export function char_id_to_char_name(char_id) {
// if (partener_data[char_id]) {
// return partener_data[char_id].name;
// } else {
// return undefined;
// }
// }
//
// export function char_name_to_char_id(char_name) {
// const aliasConvertedName = alias_to_char_name(char_name);
// for (const i in partener_data) {
// const chars = partener_data[i];
// if (aliasConvertedName === chars.name) {
// return i;
// }
// }
// return undefined;
// }
//
// export {
// equip_data,
// weapon_data,
// partner_data,
// };