diff --git a/apps/panel.js b/apps/panel.js index 2ed7dec..cfd5a60 100644 --- a/apps/panel.js +++ b/apps/panel.js @@ -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 为 false,this.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 结果没有 isNew,newCharCount 为 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) { diff --git a/defSet/config.yaml b/defSet/config.yaml index 1d6b4b6..5abf7e8 100644 --- a/defSet/config.yaml +++ b/defSet/config.yaml @@ -1,6 +1,6 @@ render: scale: 100 # 渲染精度 -useEnka: true # 使用enka接口查询 +useEnka: false # 使用enka接口查询 query: others: true # 允许查询他人信息 update: diff --git a/lib/ekapi/name_convert.js b/lib/ekapi/name_convert.js index 6129c6d..3ff0445 100644 --- a/lib/ekapi/name_convert.js +++ b/lib/ekapi/name_convert.js @@ -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, -// };