diff --git a/repo/js/ActivitySwitchNotice/README.md b/repo/js/ActivitySwitchNotice/README.md index 48082b3a1..368d99083 100644 --- a/repo/js/ActivitySwitchNotice/README.md +++ b/repo/js/ActivitySwitchNotice/README.md @@ -511,6 +511,8 @@ ActivitySwitchNotice/ ## 版本历史 +### 0.1.0 (2026-02-01) +- 新增 新活动通知(存储活动名称列表-历史对比) ### 0.0.8 (2026-01-22) - 新增 地图识别任务提醒 如: diff --git a/repo/js/ActivitySwitchNotice/main.js b/repo/js/ActivitySwitchNotice/main.js index 0d1b43508..4539e11eb 100644 --- a/repo/js/ActivitySwitchNotice/main.js +++ b/repo/js/ActivitySwitchNotice/main.js @@ -170,5 +170,5 @@ async function main() { await campaignAreaUtil.campaignAreaMain(openKey) await sleep(ms * 2); await toMainUi() - await activityUtil.activityMain() + await activityUtil.activityMain(settings.newActivityNotice) } \ No newline at end of file diff --git a/repo/js/ActivitySwitchNotice/manifest.json b/repo/js/ActivitySwitchNotice/manifest.json index 778adb2f4..d5c8183c0 100644 --- a/repo/js/ActivitySwitchNotice/manifest.json +++ b/repo/js/ActivitySwitchNotice/manifest.json @@ -1,6 +1,6 @@ { "name": "活动期限/周本通知器", - "version": "0.0.8", + "version": "0.1.0", "description": "", "settings_ui": "settings.json", "main": "main.js", diff --git a/repo/js/ActivitySwitchNotice/settings.json b/repo/js/ActivitySwitchNotice/settings.json index 6c3b5de11..c24c0f58b 100644 --- a/repo/js/ActivitySwitchNotice/settings.json +++ b/repo/js/ActivitySwitchNotice/settings.json @@ -19,6 +19,12 @@ { "type": "separator" }, + { + "name": "newActivityNotice", + "type": "checkbox", + "label": "启用新活动通知", + "default": true + }, { "label": "地图识别任务提醒", "type": "multi-checkbox", diff --git a/repo/js/ActivitySwitchNotice/utils/activity.js b/repo/js/ActivitySwitchNotice/utils/activity.js index 44e1488f3..2b3a8aa75 100644 --- a/repo/js/ActivitySwitchNotice/utils/activity.js +++ b/repo/js/ActivitySwitchNotice/utils/activity.js @@ -1,3 +1,8 @@ +const config_name = "config" +const json_path = { + activity: `${config_name}/activity.json` +} + function settingsParseInt(str, defaultValue) { try { return str ? parseInt('' + str) : defaultValue; @@ -440,10 +445,21 @@ async function init() { /** * 活动主函数:扫描所有活动页面,识别剩余时间,最后统一发送通知 */ -async function activityMain() { +async function activityMain(newActivityNotice = true) { await init(); const ms = 1000; await sleep(ms); + let uid = await uidUtil.ocrUID() + let activityData=[] + let activitySetLast = new Set() + try { + // 读取活动配置文件并转换为Set + activityData = JSON.parse(file.readTextSync(json_path.activity)); + const uidActivity = (Array.isArray(activityData) ? activityData : []).filter(item => item?.uid === uid).find(item => item) + activitySetLast = new Set(uidActivity.activityNames); + } catch (e) { + log.warn(`error:{1}`, e.message) + } // 1. 打开活动页面(默认 F5) await keyPress(config.activityKey); @@ -456,7 +472,7 @@ async function activityMain() { } catch (e) { log.warn("回到顶部失败,但继续尝试执行"); } - + // let activityNameSet = new Set() // 3. 初始化存储所有活动的 Map let activityMap = new Map(); // key: 活动名称, value: 剩余时间文本 let previousPageActivities = new Set(); // 新增:记录上一页识别到的所有活动名称(用于重复页判断) @@ -466,7 +482,7 @@ async function activityMain() { let scannedPages = 0; const maxPages = 25; // 防止意外死循环的安全上限 let sameBottomCountMax = 1; // 连续相同底部活动名的最大次数 - + let currentActivityJson = {uid: uid, activityNames: new Set()} // 4. 主循环:逐页向下扫描 while (scannedPages < maxPages) { scannedPages++; @@ -494,8 +510,10 @@ async function activityMain() { } // ============ 新增:提前判断是否为重复页 ============ const currentPageNames = new Set(); + for (let res of resList) { currentPageNames.add(res.text.trim()); + currentActivityJson?.activityNames?.add(res.text.trim()); } // 计算与上一页的重合率 @@ -520,6 +538,9 @@ async function activityMain() { let currentPageBottomName = null; // 本页最下面的活动名 let newActivityCountThisPage = 0; + // const newActivityNames = new Set(Array.from(resList).map(item => item.text.trim())); + // activityNameSet = [...activityNameSet, ...currentPageNames]; + // 遍历当前页所有识别到的活动条目 for (let res of resList) { const activityName = res.text.trim(); @@ -537,7 +558,7 @@ async function activityMain() { let matched = config.blackActivityNameList.some(keyword => activityName.includes(keyword)); if (matched) { // 获取黑名单活动的条件配置 - let blackActivityConditions = getMapByKey(config.blackActivityMap, activityName,true); + let blackActivityConditions = getMapByKey(config.blackActivityMap, activityName, true); log.info(`[黑名单条件检测]blackActivityMap:{blackActivityMap},activityName:{activityName},blackActivityConditions:{blackActivityConditions}`, config.blackActivityMap, activityName, blackActivityConditions); if (blackActivityConditions && blackActivityConditions.length > 0) { @@ -546,7 +567,7 @@ async function activityMain() { // 遍历所有条件,检查是否满足黑名单条件 for (const blackActivityCondition of blackActivityConditions) { try { - let condition = await OcrKey(activityName,blackActivityCondition); + let condition = await OcrKey(activityName, blackActivityCondition); if (condition) { log.info(`满足黑名单条件==>{ac}->{ba}`, activityName, blackActivityCondition); matched = true; @@ -679,7 +700,6 @@ async function activityMain() { } // 7. 全部扫描完毕,统一发送通知(只发一次!) if (activityMapFilter.size > 0) { - let uid = await uidUtil.ocrUID() log.info(`扫描完成,共记录 {activityMap.size} 个活动,即将发送通知`, activityMapFilter.size); // 构建通知标题,根据配置显示剩余时间阈值和白名单活动信息 let titleKey = `[ `; @@ -708,6 +728,38 @@ async function activityMain() { } else { log.warn("不存在符合条件的活动,未发送通知"); } + //新活动通知 + if (newActivityNotice) { + // 计算新增活动 + const newActivities = [...currentActivityJson.activityNames].filter(activity => !activitySetLast.has(activity)); + + if (newActivities.length > 0 ) { + try { + if(activitySetLast.size > 0){ + log.info("新增活动: {newActivities}", newActivities); + await noticeUtil.sendText(newActivities.join("\n"), `UID:${uid}\n新增活动`); + } + activityData=activityData.filter(item => item.uid !== uid) + activityData.push(currentActivityJson) + // 确保所有数据都转换为可序列化格式 + const finalSerializableData = activityData.map(item => ({ + ...item, + activityNames: Array.isArray(item.activityNames) ? + item.activityNames : + [...(item.activityNames || [])] + })); + // 发送成功后更新配置文件 + file.writeTextSync(json_path.activity, JSON.stringify(finalSerializableData)); + log.debug("活动配置文件已更新"); + + } catch (e) { + log.error(`发送新增活动通知失败: {message}`, {message: e.message}); + // 即使发送失败也记录错误,但不更新配置文件以保持一致性 + } + } else { + log.debug("无新增活动"); + } + } } this.activityUtil = {