feat(ActivitySwitchNotice): 新增UID识别功能并优化通知内容 (#2632)

This commit is contained in:
云端客
2026-01-07 13:28:42 +08:00
committed by GitHub
parent 6542c21413
commit 55e3bdd672
7 changed files with 157 additions and 4 deletions

View File

@@ -382,6 +382,11 @@ ActivitySwitchNotice/
## 版本历史
### 0.0.6 (2026-01-06)
- **功能优化**新增识别uid通知提醒
实例:
![0.0.6](md/0.0.6.jpg)
### 0.0.5 (2026-01-04)
- **性能优化**:优化滚动到顶部算法,减少页面滚动次数,提升初始化效率

View File

@@ -1,6 +1,7 @@
let manifest = {};
async function init() {
let utils=[
"uid",
"ws",
"notice",
"campaignArea",

View File

@@ -1,6 +1,6 @@
{
"name": "活动期限/周本通知器",
"version": "0.0.5",
"version": "0.0.6",
"description": "",
"settings_ui": "settings.json",
"main": "main.js",

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -679,6 +679,7 @@ async function activityMain() {
}
// 7. 全部扫描完毕,统一发送通知(只发一次!)
if (activityMapFilter.size > 0) {
let uid = await uidUtil.ocrUID()
log.info(`扫描完成,共记录 {activityMap.size} 个活动,即将发送通知`, activityMapFilter.size);
// 构建通知标题,根据配置显示剩余时间阈值和白名单活动信息
let titleKey = `[ `;
@@ -703,7 +704,7 @@ async function activityMain() {
blackText += `==>{已开启黑名单: ${blackAllText.join("|")}}<==`
}
await noticeUtil.sendNotice(activityMapFilter, `原神活动剩余时间提醒(仅显示 ${titleKey} 的活动)${blackText}`);
await noticeUtil.sendNotice(activityMapFilter, `UID:${uid}\n原神活动剩余时间提醒(仅显示 ${titleKey} 的活动)${blackText}`);
} else {
log.warn("不存在符合条件的活动,未发送通知");
}

View File

@@ -88,7 +88,7 @@ async function campaignAreaMain() {
// 如果不是周日(0代表周日),则直接返回
const bool = dayOfWeek.day != config.campaignAreaReminderDay;
// 记录开始执行秘境征讨提醒的日志
log.info(`[{dayOfWeek.dayOfWeek}]${bool?"跳过":"开始"}执行秘境征讨剩余次数提醒`, dayOfWeek.dayOfWeek)
log.info(`[{dayOfWeek.dayOfWeek}]${bool ? "跳过" : "开始"}执行秘境征讨剩余次数提醒`, dayOfWeek.dayOfWeek)
if (bool) {
return
}
@@ -110,8 +110,9 @@ async function campaignAreaMain() {
// 如果有剩余次数,则记录日志并发送通知
if (weekJson.count > 0) {
let uid = await uidUtil.ocrUID()
log.info(`本周剩余消耗减半次数:${weekJson.count}`)
await noticeUtil.sendText(`>|本周剩余消耗减半次数:${weekJson.count}`, '秘境征讨')
await noticeUtil.sendText(`>|本周剩余消耗减半次数:${weekJson.count}`, `UID:${uid}\n秘境征讨`)
}
}

View File

@@ -0,0 +1,145 @@
const commonPath = 'assets/'
const commonMap = new Map([
['main_ui', {
path: `${commonPath}`,
name: 'paimon_menu',
type: '.png',
}],
])
const genshinJson = {
width: 1920,//genshin.width,
height: 1080,//genshin.height,
}
/**
* 根据键值获取JSON路径
* @param {string} key - 要查找的键值
* @returns {any} 返回与键值对应的JSON路径值
*/
function getJsonPath(key) {
return commonMap.get(key); // 通过commonMap的get方法获取指定键对应的值
}
function saveOnlyNumber(str) {
str = str ? str : '';
// 使用正则表达式匹配字符串中的所有数字
// \d+ 匹配一个或多个数字
// .join('') 将匹配到的数字数组连接成一个字符串
// parseInt 将连接后的字符串转换为整数
return parseInt(str.match(/\d+/g).join(''));
}
async function ocrUID() {
let uid_json = {
x: 1683,
y: 1051,
width: 234,
height: 28,
}
let recognitionObjectOcr = RecognitionObject.Ocr(uid_json.x, uid_json.y, uid_json.width, uid_json.height);
let region3 = captureGameRegion()
try {
let res = region3.find(recognitionObjectOcr);
log.debug(`[OCR识别UID]识别结果: ${res.text}, 原始坐标: x=${res.x}, y=${res.y},width:${res.width},height:${res.height}`);
//只保留数字
let uid
try {
uid = saveOnlyNumber(res.text)
} catch (e) {
log.warn(`识别uid异常{ket}`, e.message)
uid = 0
}
log.debug(`[OCR识别UID]识别结果: {uid}`, uid);
return uid
} finally {
region3.Dispose()
}
}
// 判断是否在主界面的函数
const isInMainUI = () => {
// let name = '主界面'
let main_ui = getJsonPath('main_ui');
// 定义识别对象
let paimonMenuRo = RecognitionObject.TemplateMatch(
file.ReadImageMatSync(`${main_ui.path}${main_ui.name}${main_ui.type}`),
0,
0,
genshinJson.width / 3.0,
genshinJson.width / 5.0
);
let captureRegion = captureGameRegion();
let res = captureRegion.find(paimonMenuRo);
captureRegion.Dispose()
return !res.isEmpty();
};
async function toMainUi() {
let ms = 1000
let index = 1
await sleep(ms);
while (!isInMainUI()) {
await sleep(ms);
await genshin.returnMainUi(); // 如果未启用,则返回游戏主界面
await sleep(ms);
if (index > 3) {
throw new Error(`多次尝试返回主界面失败`);
}
index += 1
}
}
async function compareUid(UID = settings.uid) {
let uid = await ocrUID()
let setUid = 0
try {
setUid = saveOnlyNumber(UID)
} catch (e) {
// log.warn(`UID未设置`)
}
let compare = uid === setUid
if (compare) {
log.debug(`[OCR识别UID]识别结果: {uid} 与设置UID相同`, uid);
}
return compare
}
async function checkUid() {
let reJson = {
inMainUI: false,
isUid: false
}
if (isInMainUI()) {
reJson.isUid = await compareUid()
}
return reJson
}
async function check() {
let check = false
if (settings.uid) {
try {
await toMainUi();
} catch (e) {
log.warn("多次尝试返回主界面失败")
}
let checkJson = await checkUid()
if ((!checkJson.inMainUI) && (!checkJson.isUid)) {
//尝试直接识别
checkJson.isUid = await compareUid()
}
check = checkJson.isUid
}
return check
}
this.uidUtil = {
toMainUi,
isInMainUI,
checkUid,
ocrUID,
check,
compareUid,
}