diff --git a/repo/js/七圣召唤七日历练全自动/assets/weekly.txt b/repo/js/七圣召唤七日历练全自动/assets/weekly.txt new file mode 100644 index 00000000..11a620f4 --- /dev/null +++ b/repo/js/七圣召唤七日历练全自动/assets/weekly.txt @@ -0,0 +1 @@ +2025-05-02T03:24:01.736Z \ No newline at end of file diff --git a/repo/js/七圣召唤七日历练全自动/main.js b/repo/js/七圣召唤七日历练全自动/main.js index 3bf09de5..c2848ab0 100644 --- a/repo/js/七圣召唤七日历练全自动/main.js +++ b/repo/js/七圣召唤七日历练全自动/main.js @@ -35,10 +35,140 @@ async function switchCardTeam(Name) { } (async function () { + + // 存储挑战玩家信息 let textArray = []; let skipNum = 0; +/** + * 判断任务是否已刷新 + * @param {string} filePath - 存储最后完成时间的文件路径 + * @param {object} options - 配置选项 + * @param {string} [options.refreshType] - 刷新类型: 'hourly'|'daily'|'weekly'|'monthly'|'custom' + * @param {number} [options.customHours] - 自定义小时数(用于'custom'类型) + * @param {number} [options.dailyHour=4] - 每日刷新的小时(0-23) + * @param {number} [options.weeklyDay=1] - 每周刷新的星期(0-6, 0是周日) + * @param {number} [options.weeklyHour=4] - 每周刷新的小时(0-23) + * @param {number} [options.monthlyDay=1] - 每月刷新的日期(1-31) + * @param {number} [options.monthlyHour=4] - 每月刷新的小时(0-23) + * @returns {Promise} - 是否已刷新 + */ +async function isTaskRefreshed(filePath, options = {}) { + const { + refreshType = 'hourly', // 默认每小时刷新 + customHours = 24, // 自定义刷新小时数默认24 + dailyHour = 4, // 每日刷新默认凌晨4点 + weeklyDay = 1, // 每周刷新默认周一(0是周日) + weeklyHour = 4, // 每周刷新默认凌晨4点 + monthlyDay = 1, // 每月刷新默认第1天 + monthlyHour = 4 // 每月刷新默认凌晨4点 + } = options; + + try { + // 读取文件内容 + let content = await file.readText(filePath); + const lastTime = new Date(content); + const nowTime = new Date(); + + + let shouldRefresh = false; + + + switch (refreshType) { + case 'hourly': // 每小时刷新 + shouldRefresh = (nowTime - lastTime) >= 3600 * 1000; + break; + + case 'daily': // 每天固定时间刷新 + // 检查是否已经过了当天的刷新时间 + const todayRefresh = new Date(nowTime); + todayRefresh.setHours(dailyHour, 0, 0, 0); + + // 如果当前时间已经过了今天的刷新时间,检查上次完成时间是否在今天刷新之前 + if (nowTime >= todayRefresh) { + shouldRefresh = lastTime < todayRefresh; + } else { + // 否则检查上次完成时间是否在昨天刷新之前 + const yesterdayRefresh = new Date(todayRefresh); + yesterdayRefresh.setDate(yesterdayRefresh.getDate() - 1); + shouldRefresh = lastTime < yesterdayRefresh; + } + break; + + case 'weekly': // 每周固定时间刷新 + // 获取本周的刷新时间 + const thisWeekRefresh = new Date(nowTime); + // 计算与本周指定星期几的差值 + const dayDiff = (thisWeekRefresh.getDay() - weeklyDay + 7) % 7; + thisWeekRefresh.setDate(thisWeekRefresh.getDate() - dayDiff); + thisWeekRefresh.setHours(weeklyHour, 0, 0, 0); + + // 如果当前时间已经过了本周的刷新时间 + if (nowTime >= thisWeekRefresh) { + shouldRefresh = lastTime < thisWeekRefresh; + } else { + // 否则检查上次完成时间是否在上周刷新之前 + const lastWeekRefresh = new Date(thisWeekRefresh); + lastWeekRefresh.setDate(lastWeekRefresh.getDate() - 7); + shouldRefresh = lastTime < lastWeekRefresh; + } + break; + + case 'monthly': // 每月固定时间刷新 + // 获取本月的刷新时间 + const thisMonthRefresh = new Date(nowTime); + // 设置为本月指定日期的凌晨 + thisMonthRefresh.setDate(monthlyDay); + thisMonthRefresh.setHours(monthlyHour, 0, 0, 0); + + // 如果当前时间已经过了本月的刷新时间 + if (nowTime >= thisMonthRefresh) { + shouldRefresh = lastTime < thisMonthRefresh; + } else { + // 否则检查上次完成时间是否在上月刷新之前 + const lastMonthRefresh = new Date(thisMonthRefresh); + lastMonthRefresh.setMonth(lastMonthRefresh.getMonth() - 1); + shouldRefresh = lastTime < lastMonthRefresh; + } + break; + + case 'custom': // 自定义小时数刷新 + shouldRefresh = (nowTime - lastTime) >= customHours * 3600 * 1000; + break; + + default: + throw new Error(`未知的刷新类型: ${refreshType}`); + } + + // 如果文件内容无效或不存在,视为需要刷新 + if (!content || isNaN(lastTime.getTime())) { + await file.writeText(filePath, ''); + shouldRefresh = true; + } + + if (shouldRefresh) { + notification.send(`任务已经刷新,执行脚本`); + + + return true; + } else { + notification.send(`任务未刷新,跳过脚本`); + return false; + } + + } catch (error) { + // 如果文件不存在,创建新文件并返回true(视为需要刷新) + const createResult = await file.writeText(filePath, ''); + if (createResult) { + log.info("创建新文件成功"); + await isTaskRefreshed(filePath, options = {}); + } + } +} + + + //检查挑战结果 await checkChallengeResults(); async function checkChallengeResults() { const region1 = RecognitionObject.ocr(785, 890, 340, 82); // 对话区域 @@ -465,19 +595,9 @@ async function gotoTable6() { await sleep(500); } -async function openMap() { - await gotoTavern(); - keyDown("w"); - await sleep(2000); - keyUp("w"); - keyDown("d"); - await sleep(5000); - keyUp("d"); - await sleep(700); -} - - +async function main() { //主流程 +const nowTime = new Date(); log.info(`前往猫尾酒馆`); await gotoTavern(); await captureAndStoreTexts(); @@ -493,11 +613,23 @@ for (let i = 0; i < 20; i++) { await searchAndClickTexts(); } await genshin.returnMainUi(); -await sleep(500); -keyPress("F6"); -await sleep(1000); -click(300, 370); //点击七日历练 -await sleep(1000); -log.info(`打牌结束`); +await captureAndStoreTexts(); +notification.send(`打牌结束、剩余挑战人数:${textArray.length}`); +// 更新最后完成时间 +if(textArray.length === 0) await file.writeText("assets/weekly.txt", nowTime.toISOString()); + + +} + + +if( await isTaskRefreshed("assets/weekly.txt", { + refreshType: 'weekly', + weeklyDay: 1, // 周一 + weeklyHour: 4 // 凌晨4点 +})){ +await main(); +} + + })(); diff --git a/repo/js/七圣召唤七日历练全自动/manifest.json b/repo/js/七圣召唤七日历练全自动/manifest.json index fba8ed03..6d1b3949 100644 --- a/repo/js/七圣召唤七日历练全自动/manifest.json +++ b/repo/js/七圣召唤七日历练全自动/manifest.json @@ -1,8 +1,8 @@ { "manifest_version": 1, "name": "打牌一条龙", - "version": "1.9.2", - "description": "只靠一个牌组的话,胜率还是太低了,所以有没有既简单又强势的卡组推荐下呢?", + "version": "1.9.3", + "description": "已添加 CD 管理,执行完后会检测是否全部挑战成功,之后会记录本次时间进入CD,如果想要重置请前往assets/weekly.txt中删除内容", "authors": [ { "name": "柒叶子",