From b359cd623b31d2082a80c78be71418d796813c14 Mon Sep 17 00:00:00 2001 From: aoxuan Date: Thu, 20 Mar 2025 10:42:46 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(maa):=20=E6=B7=BB=E5=8A=A0=E6=AF=8F?= =?UTF-8?q?=E5=91=A8=E5=89=BF=E7=81=AD=E6=A8=A1=E5=BC=8F=E4=B8=8A=E9=99=90?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 7 ++++ app/models/MAA.py | 80 ++++++++++++++++++++++++++++++++++++++++ app/ui/member_manager.py | 8 ++++ 3 files changed, 95 insertions(+) diff --git a/app/core/config.py b/app/core/config.py index cafc088..b4ef8f0 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -719,6 +719,7 @@ class AppConfig: self.maa_config.set(self.maa_config.RunSet_AnnihilationTimeLimit, 40) self.maa_config.set(self.maa_config.RunSet_RoutineTimeLimit, 10) self.maa_config.set(self.maa_config.RunSet_RunTimesLimit, 3) + self.maa_config.set(self.maa_config.RunSet_AnnihilationWeeklyLimit, False) self.maa_config.set(self.maa_config.MaaSet_Name, "") self.maa_config.set(self.maa_config.MaaSet_Name, "") self.maa_config.set(self.maa_config.MaaSet_Name, "") @@ -915,6 +916,9 @@ class QueueConfig(QConfig): class MaaConfig(QConfig): + def __init__(self): + super().__init__() + """MAA配置""" MaaSet_Name = ConfigItem("MaaSet", "Name", "") @@ -944,6 +948,9 @@ class MaaConfig(QConfig): RunSet_RunTimesLimit = RangeConfigItem( "RunSet", "RunTimesLimit", 3, RangeValidator(1, 1024) ) + RunSet_AnnihilationWeeklyLimit = ConfigItem( + "RunSet", "AnnihilationWeeklyLimit", False, BoolValidator() + ) Config = AppConfig() diff --git a/app/models/MAA.py b/app/models/MAA.py index eee2ea9..8fb9e6f 100644 --- a/app/models/MAA.py +++ b/app/models/MAA.py @@ -64,6 +64,9 @@ class MaaManager(QObject): ): super(MaaManager, self).__init__() + self.current_user = "" + self.weekly_annihilation_limit_reached = False + self.user_list = "" self.mode = mode self.config_path = config_path self.user_config_path = user_config_path @@ -107,6 +110,8 @@ class MaaManager(QObject): def run(self): """主进程,运行MAA代理进程""" + # 初始化本周剿灭上限标志 + self.weekly_annihilation_limit_reached = False curdate = self.server_date() begin_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") @@ -152,6 +157,12 @@ class MaaManager(QObject): # 开始代理 for user in self.user_list: + self.current_user = user[0].split(" - ")[0] + if self.load_weekly_annihilation_status(self.current_user): + self.weekly_annihilation_limit_reached = True + logger.info(f"用户 {self.current_user} 本周已达上限") + else: + self.weekly_annihilation_limit_reached = False if self.isInterruptionRequested: break @@ -201,6 +212,12 @@ class MaaManager(QObject): if self.isInterruptionRequested: break + # j == 0 剿灭模式;满足条件跳过剿灭 + if j == 0 and self.set["RunSet"].get("RunSet_AnnihilationWeeklyLimit", True) and self.weekly_annihilation_limit_reached: + logger.info(f"{self.name} | 用户: {self.current_user} - 本周剿灭模式已达上限,跳过执行剿灭任务") + run_book[j] = True + continue + if self.data[user[2]][10 - j] == "n": run_book[j] = True continue @@ -633,6 +650,12 @@ class MaaManager(QObject): logs.append(entry) log = "".join(logs) + # 如果日志中包含提示信息,则设置上限标志,并记录持久化信息 + if "剿灭任务失败" in log: + logger.info(f"用户:{self.current_user} | 剿灭任务失败,设置上限标志为True") + self.weekly_annihilation_limit_reached = True + self.record_weekly_annihilation_limit(self.current_user) + # 更新MAA日志 if len(logs) > 100: self.update_log_text.emit("".join(logs[-100:])) @@ -1285,3 +1308,60 @@ class MaaManager(QObject): Notify.send_mail("网页", title, message_html) Notify.ServerChanPush(title, "好羡慕~\n\nAUTO_MAA 敬上") Notify.CompanyWebHookBotPush(title, "好羡慕~\n\nAUTO_MAA 敬上") + + def record_weekly_annihilation_limit(self, username: str) -> None: + """ + 持久化记录当前用户在本周剿灭模式达到上限的信息 + 计算方式:以周一凌晨4点为一周起点,故将当前时间减4小时再计算 ISO 周 + """ + self.weekly_annihilation_limit_reached = True + logger.info(f"已记录用户 {username} 达到本周剿灭模式达到上限") + now = datetime.now() + shifted_time = now - timedelta(hours=4) + year, week, _ = shifted_time.isocalendar() + + # 构造/history/annihilation.json路径 + record_path = Config.app_path / "history" / "annihilation.json" + record_path.parent.mkdir(parents=True, exist_ok=True) + + # 如果文件存在,则读取原有数据,否则初始化为空字典 + if record_path.exists(): + with record_path.open("r", encoding="utf-8") as f: + data = json.load(f) + else: + data = {} + + # 如果该用户本周已经记录则不更新,否则写入当前记录 + if username in data: + existing = data[username] + if existing.get("year") == year and existing.get("week") == week: + return + data[username] = {"year": year, "week": week} + + with record_path.open("w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + @staticmethod + def load_weekly_annihilation_status(username: str) -> bool: + """ + 读取 /history/annihilation.json 判断当前用户是否在本周已经达到剿灭上限 + 计算方式:当前时间减4小时再计算 ISO 周 + """ + record_path = Config.app_path / "history" / "annihilation.json" + if not record_path.exists(): + logger.info("未找到记录文件,将不进行剿灭上限判断") + return False + + with record_path.open("r", encoding="utf-8") as f: + data = json.load(f) + + now = datetime.now() + shifted_time = now - timedelta(hours=4) + year, week, _ = shifted_time.isocalendar() + + if username in data: + existing = data[username] + if existing.get("year") == year and existing.get("week") == week: + return True + + return False diff --git a/app/ui/member_manager.py b/app/ui/member_manager.py index 4b68f60..b658ad6 100644 --- a/app/ui/member_manager.py +++ b/app/ui/member_manager.py @@ -48,6 +48,7 @@ from qfluentwidgets import ( ExpandGroupSettingCard, ComboBoxSettingCard, PushSettingCard, + SwitchSettingCard, ) from PySide6.QtCore import Qt import requests @@ -697,6 +698,12 @@ class MaaSettingBox(QWidget): "若超过该次数限制仍未完成代理,视为代理失败", Config.maa_config.RunSet_RunTimesLimit, ) + self.AnnihilationWeeklyLimit = SwitchSettingCard( + configItem=Config.maa_config.RunSet_AnnihilationWeeklyLimit, + icon=FluentIcon.PAGE_RIGHT, + title="每周剿灭仅执行到上限", + content="每周剿灭模式执行到上限,本周剩下时间不再执行剿灭任务", + ) widget = QWidget() Layout = QVBoxLayout(widget) @@ -706,6 +713,7 @@ class MaaSettingBox(QWidget): Layout.addWidget(self.AnnihilationTimeLimit) Layout.addWidget(self.RoutineTimeLimit) Layout.addWidget(self.RunTimesLimit) + Layout.addWidget(self.AnnihilationWeeklyLimit) self.viewLayout.setContentsMargins(0, 0, 0, 0) self.viewLayout.setSpacing(0) self.addGroupWidget(widget) From 7ed4b7db57cbfaff23e0dd9bf9e6f5c7608f70a0 Mon Sep 17 00:00:00 2001 From: DLmaster Date: Thu, 20 Mar 2025 12:41:47 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(core):=20=E8=A1=A5=E5=85=85=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E4=BF=A1=E6=81=AF=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/version.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/resources/version.json b/resources/version.json index d1e94f8..0d82e76 100644 --- a/resources/version.json +++ b/resources/version.json @@ -1,8 +1,13 @@ { - "main_version": "4.2.5.6", + "main_version": "4.2.5.7", "updater_version": "1.2.0.1", "announcement": "\n## 新增功能\n- 屏蔽MuMu模拟器开屏广告功能上线\n- 更新器支持多线程下载\n- 添加强制关闭ADB与模拟器等增强任务项\n## 修复BUG\n- 修复统计信息HTML模板公招匹配错误\n- 修复密码显示按钮动画异常\n- 修复`检测到MAA未能实际执行任务`报错被异常屏蔽\n- 修复MAA超时判定异常失效\n## 程序优化\n- 关机等电源操作添加100s倒计时\n- 人工排查弹窗方法优化\n- 人工排查时自动屏蔽静默操作\n- 公告样式优化", "version_info": { + "4.2.5.7":{ + "新增功能": [ + "添加每周剿灭模式上限功能" + ] + }, "4.2.5.6":{ "程序优化": [ "更新信息样式优化",