Files
bettergi-scripts-list/repo/js/ActivitySwitchNotice/utils/campaignArea.js
云端客 a3de5b65d6 [0.0.4迭代]活动期限/周本通知器 (#2604)
* feat(notice): 添加WebSocket独立通知功能并重构通知系统

- 实现WebSocket通知功能,支持私聊和群聊模式
- 添加通知类型配置选项,支持BGI通知、独立通知或两者同时使用
- 新增WebSocket相关配置项包括代理URL、连接地址和认证令牌
- 重构通知发送逻辑,支持多种通知类型的消息格式
- 添加@用户功能和多种消息类型支持
- 更新manifest.json添加网络请求权限配置
- 优化代码结构,使用异步初始化加载工具模块

* feat(ActivitySwitchNotice): 添加独立通知功能支持WebSocket推送

- 新增独立通知配置功能,支持通过WebSocket发送通知
- 新增ws.js模块实现WebSocket通知功能
- 新增noticeType配置选项用于选择通知模式
- 新增ws_proxy_url、ws_url、ws_token配置选项
- 新增action、send_id、at_list配置选项用于发送设置
- 更新README文档添加独立通知配置说明和使用要求
- 修复OCR识别函数名称从OcrRemainingTime改为OcrKey

* fix(ActivitySwitchNotice): 修复设置选项数组格式

- 修复了通知模式选项数组中缺少逗号的问题
- 确保JSON格式正确性以避免解析错误

* refactor(notice): 重构通知工具类并修复配置引用问题

- 将 noticeUtil.send 方法重命名为 sendText 以明确功能
- 修复配置对象引用问题,将 config 重命名为 configNotice 避免冲突
- 为 sendNotice 函数添加默认参数和调试日志
- 更新条件判断逻辑,使用 map.size 检查空值
- 修复 ws 模块中的配置对象引用,将 config 重命名为 configWs
- 重构 ws 模块初始化逻辑,确保配置正确加载
- 修复变量命名冲突,将 token 参数重命名为 wsToken
- 更新模块初始化顺序,调整 activity 工具的加载位置

* docs(ActivitySwitchNotice): 更新文档说明独立通知配置和WsProxy部署

- 更新独立通知功能说明,添加WsProxy依赖提示
- 简化settings.json文件路径引用
- 移除多余的配置示例分隔符
- 添加WsProxy部署指南和Docker镜像使用说明
- 整理文档结构,优化内容排版

* docs(ActivitySwitchNotice): 更新 README 文档完善功能说明和配置选项

- 添加了独立通知功能的详细配置说明
- 更新了设置表格格式和内容描述
- 增加了 WsProxy 部署指南和 Docker 配置示例
- 完善了核心模块和配置选项文档
- 修正了文档格式和链接引用问题

* docs(ActivitySwitchNotice): 更新 README 文档中的链接和函数名

- 修复 settings.json 链接格式
- 将 send 函数名更正为 sendText

* chore(ActivitySwitchNotice): 更新版本号

- 将版本号从 0.0.3 更新到 0.4
- 保持其他配置项不变

* docs(ActivitySwitchNotice): 更新版本历史文档

- 将版本 0.0.4 的发布状态更新为具体发布日期 2026-01-01
- 保持独立通知配置功能说明
- 保留 WebSocket 通知功能描述
- 维护版本历史记录的准确性
2026-01-01 20:20:44 +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.sendText(`>|本周剩余消耗减半次数:${weekJson.count}`, '秘境征讨')
}
}
this.campaignAreaUtil = {
campaignAreaMain,
}