mirror of
https://github.com/babalae/bettergi-scripts-list.git
synced 2026-03-16 03:33:25 +08:00
feat(ActivitySwitchNotice): 新增UID识别功能并优化通知内容 (#2632)
This commit is contained in:
@@ -382,6 +382,11 @@ ActivitySwitchNotice/
|
||||
|
||||
## 版本历史
|
||||
|
||||
### 0.0.6 (2026-01-06)
|
||||
- **功能优化**:新增识别uid通知提醒
|
||||
实例:
|
||||

|
||||
|
||||
### 0.0.5 (2026-01-04)
|
||||
|
||||
- **性能优化**:优化滚动到顶部算法,减少页面滚动次数,提升初始化效率
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
let manifest = {};
|
||||
async function init() {
|
||||
let utils=[
|
||||
"uid",
|
||||
"ws",
|
||||
"notice",
|
||||
"campaignArea",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "活动期限/周本通知器",
|
||||
"version": "0.0.5",
|
||||
"version": "0.0.6",
|
||||
"description": "",
|
||||
"settings_ui": "settings.json",
|
||||
"main": "main.js",
|
||||
|
||||
BIN
repo/js/ActivitySwitchNotice/md/0.0.6.jpg
Normal file
BIN
repo/js/ActivitySwitchNotice/md/0.0.6.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
@@ -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("不存在符合条件的活动,未发送通知");
|
||||
}
|
||||
|
||||
@@ -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秘境征讨`)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
145
repo/js/ActivitySwitchNotice/utils/uid.js
Normal file
145
repo/js/ActivitySwitchNotice/utils/uid.js
Normal 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,
|
||||
}
|
||||
Reference in New Issue
Block a user