Files
bettergi-scripts-list/repo/js/ActivitySwitchNotice/utils/campaignArea.js
云端客 32b950d6a9 [0.0.3版本迭代]--活动期限/周本通知器 (#2591)
* feat(activity): 优化活动筛选逻辑并添加白名单功能

- 新增 relationship 配置项,控制剩余时间与白名单的逻辑关系
- 将 activityNameList 重命名为 whiteActivityNameList 作为白名单功能
- 实现白名单与黑名单的互斥过滤机制
- 更新活动筛选逻辑,支持按剩余时间或白名单条件过滤
- 修改通知标题构建逻辑,显示剩余时间与白名单配置信息
- 更新 README 文档说明白名单与逻辑关系配置使用方法

* chore(ActivitySwitchNotice): 更新版本号

- 将版本号从 0.0.2 更新到 0.0.3

* fix(ActivitySwitchNotice): 修正活动识别日志消息

- 修正了未识别到活动时的日志消息文案,从"未识别到任何活动"改为"不存在符合条件的活动"

* refactor: 优化秘境征讨提醒逻辑代码结构

* fix(activity): 修复活动白名单过滤逻辑

- 修复了当配置了关系条件时活动白名单过滤的问题
- 添加了对 config.relationship 的检查以决定是否跳过活动处理
- 确保在没有关系配置的情况下仍然按照白名单过滤活动

* fix(ActivitySwitchNotice): 修复活动白名单逻辑判断错误

- 修正了白名单活动匹配时的关系判断逻辑
- 将 !config.relationship 条件改为 config.relationship
- 确保只有在关系配置正确时才跳过非白名单活动

* refactor(ActivitySwitchNotice): 优化OCR识别函数命名

- 将OcrRemainingTime函数重命名为OcrKey以提高通用性
- 更新函数调用以使用新的函数名称
- 保持原有功能逻辑不变,仅优化函数命名规范

* fix(activity): 修复OCR识别和活动过滤逻辑

- 修复OCR识别时资源释放位置,添加try-finally确保截图资源正确释放
- 修改OCR识别逻辑,支持返回多个匹配结果并用'<-->'连接
- 修复活动名称过滤条件中的逻辑运算符空格问题
- 优化代码结构,提高OCR识别的稳定性和准确性

* fix(ActivitySwitchNotice): 修复活动识别结果处理逻辑

- 将 Set 数据结构改为数组并使用 push 方法添加元素
- 保持原有的文本识别和日志记录功能
- 确保返回识别到的文本结果

* feat(ActivitySwitchNotice): 添加根据键名部分内容获取Map值的工具函数

- 新增getMapByKey函数,支持通过键名部分匹配获取Map中的值
- 更新needOcrOtherMap配置,为"飒勇争锋"和"幽境危战"活动添加OCR识别项
- 修改代码逻辑,使用getMapByKey函数替代原有的精确匹配方式
- 优化活动OCR处理流程,提升键名匹配的灵活性

* refactor(ActivitySwitchNotice): 优化OCR识别功能

- 移除"飒勇争锋"活动的OCR配置项
- 修复getMapByKey函数参数格式问题
- 添加函数间空白行以改善代码可读性
- 增强OCR识别日志记录功能,添加命中标识
- 修复变量赋值和参数传递的格式问题

* feat(ActivitySwitchNotice): 添加通用关键词OCR识别功能

- 新增commonList常量定义通用关键词列表
- 实现通用关键词的OCR识别逻辑
- 将识别结果添加到剩余时间文本中
- 支持对已完成等通用状态的自动识别

* feat(ActivitySwitchNotice): 添加通用关键词显示功能

- 在activity.js中添加common变量存储通用关键词
- 将通用关键词信息保存到activityMap中
- 在notice.js中读取并显示通用关键词信息
- 修复通知文本中的格式问题
- 优化条件判断中的空格格式

* docs(ActivitySwitchNotice): 更新README文档添加剩余时间与白名单关系配置说明

- 新增:支持剩余时间和白名单的"与"关系和"或"关系配置说明
- 完善了配置参数文档,增加了`relationship`参数的详细说明
- 更新了版本发布信息和变更日志格式

* feat(ActivitySwitchNotice): 添加剩余时间与白名单关系配置和完成状态显示

- 支持剩余时间和白名单的"与"关系和"或"关系配置
- 添加标记界面显示 `已完成` 的活动功能
- 修复活动过滤逻辑问题,将`activityNameList`更改为`whiteActivityNameList`
- 新增黑名单与白名单的互斥过滤机制,黑名单中剔除白名单
- 在配置中增加`relationship`参数,用于控制剩余时间与白名单活动的逻辑关系

* fix(ActivitySwitchNotice): 修复活动切换通知中的逻辑错误和显示问题

- 修复剩余时间白名单关系逻辑,默认从`与`改为`或`关系
- 移除过早的返回语句,确保列表处理逻辑完整执行
- 调整注释格式以保持代码一致性

* fix(ActivitySwitchNotice): 修复活动通用键处理逻辑

- 将common变量初始化为数组而非undefined
- 使用push方法将OCR识别文本添加到数组中
- 将数组内容通过逗号连接成字符串存储
- 当数组为空时保持undefined值以维持原有行为

* refactor(Notice): 重构活动通知黑名单文本拼接逻辑

* refactor(ActivitySwitchNotice): 重命名活动学期转换函数并添加文档注释

- 将 getDATE_ENUM 函数重命名为 getActivityTermConversion 以提高语义清晰度
- 为函数添加 JSDoc 注释说明参数和返回值类型
- 在函数内部添加代码注释解释逻辑流程
- 更新函数调用处的函数名称引用

* refactor(ActivitySwitchNotice): 移除废弃的滚动到顶部功能

- 删除了 scrollPagesByActivityToTop 函数的完整实现
- 移除了相关的OCR检测和鼠标滚动逻辑
- 清理了游戏区域截图和资源释放代码
- 保留了优化版的滚动到顶部功能注释

* fix(ActivitySwitchNotice): 修复截图资源释放问题

- 添加 try-finally 块确保 captureRegion 资源正确释放
- 防止截图资源未释放导致的内存泄漏问题
- 保持截图识别和滚动逻辑不变
- 修复黑名单文本格式中的多余空格问题

* refactor(ActivitySwitchNotice): 优化活动列表扫描逻辑的资源管理

- 添加 try-finally 块确保 captureRegion 资源正确释放
- 修复资源泄露问题,避免未调用 dispose() 方法
- 保持原有的活动识别和滚动扫描功能不变
- 优化代码结构提高可读性和维护性

* fix(ocr): 修复OCR文本提取时的空值问题

- 添加了对OCR提取结果的空值检查
- 避免将空值推入common数组中
- 确保只有有效的文本内容才会被添加到数组中
2025-12-30 18:57:38 +08:00

121 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
function settingsParseInt(str, defaultValue) {
try {
return str ? parseInt('' + str) : defaultValue;
} catch (e) {
log.warn(`settingsParseInt error:${e}`)
return defaultValue;
}
}
function settingsParseStr(str, defaultValue) {
return '' + (str ? str : defaultValue);
}
const config = {
campaignAreaKey: settingsParseStr(settings.campaignAreaKey, 'F1'),
campaignAreaReminderDay: settingsParseInt(settings.campaignAreaReminderDay, 0),//征讨领域提醒日
}
const ocrRegionConfig = {
weeklyCount: {x: 809, y: 258, width: 277, height: 37},//征讨领域减半次数识别区域坐标和尺寸
}
const xyConfig = {
campaignArea: {x: 493, y: 537},//征讨领域坐标
secretRealm: {x: 304, y: 448},//秘境坐标
}
/**
* OCR识别周计数函数
* @param {Object} ocrRegion - OCR识别区域配置默认为ocrRegionConfig.weeklyCount
* @returns {Object} 返回包含周计数信息的JSON对象包含text、total和count属性
* @throws {Error} 当OCR识别失败时抛出错误
*/
async function ocrWeeklyCount(ocrRegion = ocrRegionConfig.weeklyCount) {
let captureRegion = captureGameRegion(); // 获取游戏区域截图
const ocrObject = RecognitionObject.Ocr(ocrRegion.x, ocrRegion.y, ocrRegion.width, ocrRegion.height); // 创建OCR识别对象
// ocrObject.threshold = 1.0;
let res = captureRegion.find(ocrObject); // 在指定区域进行OCR识别
captureRegion.dispose(); // 释放截图资源
if (!res.isExist()) {
log.error(`ocrWeeklyCount not found`) // 记录错误日志
throw new Error(`ocrWeeklyCount not found`) // 抛出错误异常
}
let weekJson = { // 初始化周计数JSON对象
text: res.text,
total: 3,
count: 3,
}
let weekCountText = res.text // 获取OCR识别的文本结果
let result = weekCountText.match(/[0-9/]+/g)?.join('') || ''; // 使用正则表达式提取数字和斜杠
log.debug(`识别结果:{weekCountText}`, weekCountText) // 记录原始识别结果
log.debug(`处理结果:{result}`, result) // 记录处理后的结果
const numbers = result.split('/').map((item) => parseInt(item)); // 分割字符串并转换为数字数组
weekJson.total = numbers[1] // 设置总数
weekJson.count = numbers[0] // 设置当前计数
log.debug(`Json:{weekJson}`, weekJson) // 记录最终JSON结果
return weekJson // 返回处理后的周计数JSON对象
}
/**
* 获取当前日期的星期信息
* @returns {Object} 返回包含星期数字和星期名称的对象
*/
async function getDayOfWeek() {
// 获取当前日期对象
const today = new Date();
// 获取当前日期是星期几0代表星期日1代表星期一以此类推
const day = today.getDay();
// 创建包含星期名称的数组
const weekDays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
let weekDay = `${weekDays[day]}`;
log.debug(`今天是[{day}]`, day)
log.debug(`今天是[{weekDays}]`, weekDay)
// 返回包含星期数字和对应星期名称的对象
return {
day: day,
dayOfWeek: weekDay
}
}
/**
* 执行秘境征讨剩余次数提醒的主函数
* 该函数会在每周日执行,检查秘境征讨的剩余次数并发送提醒
*/
async function campaignAreaMain() {
// 获取当前星期信息
let dayOfWeek = await getDayOfWeek();
// 如果不是周日(0代表周日),则直接返回
const bool = dayOfWeek.day != config.campaignAreaReminderDay;
// 记录开始执行秘境征讨提醒的日志
log.info(`[{dayOfWeek.dayOfWeek}]${bool?"跳过":"开始"}执行秘境征讨剩余次数提醒`, dayOfWeek.dayOfWeek)
if (bool) {
return
}
// 设置操作间隔时间(毫秒)
let ms = 600
// 等待一段时间
await sleep(ms)
// 按下配置的热键
await keyPress(config.campaignAreaKey)
await sleep(ms * 2)
// 点击秘境入口坐标
await click(xyConfig.secretRealm.x, xyConfig.secretRealm.y)
await sleep(ms * 2)
// 点击秘境征讨坐标
await click(xyConfig.campaignArea.x, xyConfig.campaignArea.y)
await sleep(ms * 2)
// 使用OCR识别本周秘境征讨剩余次数
let weekJson = await ocrWeeklyCount();
// 如果有剩余次数,则记录日志并发送通知
if (weekJson.count > 0) {
log.info(`本周剩余消耗减半次数:${weekJson.count}`)
await noticeUtil.send(`>|本周剩余消耗减半次数:${weekJson.count}`, '秘境征讨')
}
}
this.campaignAreaUtil = {
campaignAreaMain,
}