From fecff625a3c0d0337fd7c82fa653a99a9c4ffd74 Mon Sep 17 00:00:00 2001 From: DLmaster361 Date: Sat, 26 Apr 2025 11:28:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EMAA=E7=A8=B3=E5=AE=9A?= =?UTF-8?q?=E7=89=88=E6=9B=B4=E6=96=B0=E6=8F=90=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/task_manager.py | 40 ++++++++++++++++++++++++++++++- app/models/MAA.py | 52 +++++++++++++++++++++++++++------------- app/ui/setting.py | 2 +- app/utils/downloader.py | 28 +++++++++------------- resources/version.json | 6 +++-- 5 files changed, 90 insertions(+), 38 deletions(-) diff --git a/app/core/task_manager.py b/app/core/task_manager.py index a09fbf1..3b6d93f 100644 --- a/app/core/task_manager.py +++ b/app/core/task_manager.py @@ -29,10 +29,12 @@ from loguru import logger from PySide6.QtCore import QThread, QObject, Signal from qfluentwidgets import MessageBox from datetime import datetime +from packaging import version from typing import Dict, Union from .config import Config from .main_info_bar import MainInfoBar +from .network import Network from app.models import MaaManager from app.services import System @@ -40,6 +42,7 @@ from app.services import System class Task(QThread): """业务线程""" + check_maa_version = Signal(str) push_info_bar = Signal(str, str, str, int) question = Signal(str, str) question_response = Signal(bool) @@ -77,6 +80,7 @@ class Task(QThread): Config.member_dict[self.name], (None if "全局" in self.mode else self.info["SetMaaInfo"]["Path"]), ) + self.task.check_maa_version.connect(self.check_maa_version.emit) self.task.push_info_bar.connect(self.push_info_bar.emit) self.task.accomplish.connect(lambda: self.accomplish.emit([])) @@ -132,6 +136,7 @@ class Task(QThread): Config.member_dict[task[2]], ) + self.task.check_maa_version.connect(self.check_maa_version.emit) self.task.question.connect(self.question.emit) self.question_response.disconnect() self.question_response.connect(self.task.question_response.emit) @@ -166,7 +171,6 @@ class _TaskManager(QObject): create_gui = Signal(Task) connect_gui = Signal(Task) - push_info_bar = Signal(str, str, str, int) def __init__(self, main_window=None): super(_TaskManager, self).__init__() @@ -190,6 +194,7 @@ class _TaskManager(QObject): Config.running_list.append(name) self.task_dict[name] = Task(mode, name, info) + self.task_dict[name].check_maa_version.connect(self.check_maa_version) self.task_dict[name].question.connect( lambda title, content: self.push_dialog(name, title, content) ) @@ -283,6 +288,39 @@ class _TaskManager(QObject): ) ) + def check_maa_version(self, v: str): + """检查MAA版本""" + + Network.set_info( + mode="get", + url="https://mirrorchyan.com/api/resources/MAA/latest?user_agent=AutoMaaGui&os=win&arch=x64&channel=stable", + ) + Network.start() + Network.loop.exec() + if Network.stutus_code == 200: + maa_info = Network.response_json + else: + logger.warning(f"获取MAA版本信息时出错:{Network.error_message}") + MainInfoBar.push_info_bar( + "warning", + "获取MAA版本信息时出错", + f"网络错误:{Network.stutus_code}", + 5000, + ) + return None + + if version.parse(maa_info["data"]["version_name"]) > version.parse(v): + + logger.info( + f"检测到MAA版本过低:{v},最新版本:{maa_info['data']['version_name']}" + ) + MainInfoBar.push_info_bar( + "info", + "MAA版本过低", + f"当前版本:{v},最新稳定版:{maa_info['data']['version_name']}", + -1, + ) + def push_dialog(self, name: str, title: str, content: str): """推送对话框""" diff --git a/app/models/MAA.py b/app/models/MAA.py index fa85ce6..5e12658 100644 --- a/app/models/MAA.py +++ b/app/models/MAA.py @@ -32,6 +32,7 @@ from datetime import datetime, timedelta import subprocess import shutil import time +import re from pathlib import Path from jinja2 import Environment, FileSystemLoader from typing import Union, List, Dict @@ -43,6 +44,7 @@ from app.services import Notify, System class MaaManager(QObject): """MAA控制器""" + check_maa_version = Signal(str) question = Signal(str, str) question_response = Signal(bool) update_user_info = Signal(str, dict) @@ -87,6 +89,7 @@ class MaaManager(QObject): self.interrupt.connect(self.quit_monitor) + self.maa_version = None self.set = config["Config"].toDict() self.data = {} @@ -743,6 +746,19 @@ class MaaManager(QObject): else: self.update_log_text.emit("".join(logs)) + # 获取MAA版本号 + if not self.maa_version: + + section_match = re.search(r"={35}(.*?)={35}", log, re.DOTALL) + if section_match: + + version_match = re.search( + r"Version\s+v(\d+\.\d+\.\d+(?:-\w+\.\d+)?)", section_match.group(1) + ) + if version_match: + self.maa_version = f"v{version_match.group(1)}" + self.check_maa_version.emit(self.maa_version) + if "自动代理" in mode: # 获取最近一条日志的时间 @@ -765,22 +781,23 @@ class MaaManager(QObject): self.weekly_annihilation_limit_reached = False if mode == "自动代理_日常" and "任务出错: Fight" in log: - self.maa_result = "检测到MAA未能实际执行任务" + self.maa_result = "MAA未能实际执行任务" elif "任务出错: StartUp" in log: - self.maa_result = "检测到MAA未能正确登录PRTS" + self.maa_result = "MAA未能正确登录PRTS" elif "任务已全部完成!" in log: self.maa_result = "Success!" - elif ( - ("请「检查连接设置」或「尝试重启模拟器与 ADB」或「重启电脑」" in log) - or ("未检测到任何模拟器" in log) - or ("已停止" in log) - or ("MaaAssistantArknights GUI exited" in log) - ): - self.maa_result = "检测到MAA进程异常" + elif "请「检查连接设置」或「尝试重启模拟器与 ADB」或「重启电脑」" in log: + self.maa_result = "MAA的ADB连接异常" + elif "未检测到任何模拟器" in log: + self.maa_result = "MAA未检测到任何模拟器" + elif "已停止" in log: + self.maa_result = "MAA在完成任务前中止" + elif "MaaAssistantArknights GUI exited" in log: + self.maa_result = "MAA在完成任务前退出" elif datetime.now() - latest_time > timedelta( minutes=self.set["RunSet"][time_book[mode]] ): - self.maa_result = "检测到MAA进程超时" + self.maa_result = "MAA进程超时" elif self.isInterruptionRequested: self.maa_result = "任务被手动中止" else: @@ -789,13 +806,14 @@ class MaaManager(QObject): elif mode == "人工排查": if "完成任务: StartUp" in log: self.maa_result = "Success!" - elif ( - ("请「检查连接设置」或「尝试重启模拟器与 ADB」或「重启电脑」" in log) - or ("未检测到任何模拟器" in log) - or ("已停止" in log) - or ("MaaAssistantArknights GUI exited" in log) - ): - self.maa_result = "检测到MAA进程异常" + elif "请「检查连接设置」或「尝试重启模拟器与 ADB」或「重启电脑」" in log: + self.maa_result = "MAA的ADB连接异常" + elif "未检测到任何模拟器" in log: + self.maa_result = "MAA未检测到任何模拟器" + elif "已停止" in log: + self.maa_result = "MAA在完成任务前中止" + elif "MaaAssistantArknights GUI exited" in log: + self.maa_result = "MAA在完成任务前退出" elif self.isInterruptionRequested: self.maa_result = "任务被手动中止" else: diff --git a/app/ui/setting.py b/app/ui/setting.py index eafc5bf..bdbaca0 100644 --- a/app/ui/setting.py +++ b/app/ui/setting.py @@ -299,7 +299,7 @@ class Setting(QWidget): 7002: "填入的 CDK 错误", 7003: "填入的 CDK 今日下载次数已达上限", 7004: "填入的 CDK 类型和待下载的资源不匹配", - 7005: "填入的 CDK 不合法", + 7005: "填入的 CDK 已被封禁", 8001: "对应架构和系统下的资源不存在", 8002: "错误的系统参数", 8003: "错误的架构参数", diff --git a/app/utils/downloader.py b/app/utils/downloader.py index c13504a..c61ea84 100644 --- a/app/utils/downloader.py +++ b/app/utils/downloader.py @@ -229,18 +229,12 @@ class DownloadManager(QDialog): isInterruptionRequested = False - def __init__( - self, - app_path: Path, - name: str, - main_version: list, - config: dict, - ) -> None: + def __init__(self, app_path: Path, name: str, version: list, config: dict) -> None: super().__init__() self.app_path = app_path self.name = name - self.main_version = main_version + self.version = version self.config = config self.download_path = app_path / "DOWNLOAD_TEMP.zip" # 临时下载文件的路径 self.version_path = app_path / "resources/version.json" @@ -289,25 +283,25 @@ class DownloadManager(QDialog): if mode == "测速": url_dict["GitHub站"] = ( - f"https://github.com/DLmaster361/AUTO_MAA/releases/download/{version_text(self.main_version)}/AUTO_MAA_{version_text(self.main_version)}.zip" + f"https://github.com/DLmaster361/AUTO_MAA/releases/download/{version_text(self.version)}/AUTO_MAA_{version_text(self.version)}.zip" ) url_dict["官方镜像站"] = ( - f"https://gitee.com/DLmaster_361/AUTO_MAA/releases/download/{version_text(self.main_version)}/AUTO_MAA_{version_text(self.main_version)}.zip" + f"https://gitee.com/DLmaster_361/AUTO_MAA/releases/download/{version_text(self.version)}/AUTO_MAA_{version_text(self.version)}.zip" ) for name, download_url_head in self.config["download_dict"].items(): url_dict[name] = ( - f"{download_url_head}AUTO_MAA_{version_text(self.main_version)}.zip" + f"{download_url_head}AUTO_MAA_{version_text(self.version)}.zip" ) for proxy_url in self.config["proxy_list"]: url_dict[proxy_url] = ( - f"{proxy_url}https://github.com/DLmaster361/AUTO_MAA/releases/download/{version_text(self.main_version)}/AUTO_MAA_{version_text(self.main_version)}.zip" + f"{proxy_url}https://github.com/DLmaster361/AUTO_MAA/releases/download/{version_text(self.version)}/AUTO_MAA_{version_text(self.version)}.zip" ) return url_dict elif mode == "下载": if self.name == "MAA": - return f"https://jp-download.fearr.xyz/MAA/MAA-{version_text(self.main_version)}-win-x64.zip" + return f"https://jp-download.fearr.xyz/MAA/MAA-{version_text(self.version)}-win-x64.zip" if self.name == "AUTO_MAA": @@ -322,13 +316,13 @@ class DownloadManager(QDialog): ) if selected_url == "GitHub站": - return f"https://github.com/DLmaster361/AUTO_MAA/releases/download/{version_text(self.main_version)}/AUTO_MAA_{version_text(self.main_version)}.zip" + return f"https://github.com/DLmaster361/AUTO_MAA/releases/download/{version_text(self.version)}/AUTO_MAA_{version_text(self.version)}.zip" elif selected_url == "官方镜像站": - return f"https://gitee.com/DLmaster_361/AUTO_MAA/releases/download/{version_text(self.main_version)}/AUTO_MAA_{version_text(self.main_version)}.zip" + return f"https://gitee.com/DLmaster_361/AUTO_MAA/releases/download/{version_text(self.version)}/AUTO_MAA_{version_text(self.version)}.zip" elif selected_url in self.config["download_dict"].keys(): - return f"{self.config["download_dict"][selected_url]}AUTO_MAA_{version_text(self.main_version)}.zip" + return f"{self.config["download_dict"][selected_url]}AUTO_MAA_{version_text(self.version)}.zip" else: - return f"{selected_url}https://github.com/DLmaster361/AUTO_MAA/releases/download/{version_text(self.main_version)}/AUTO_MAA_{version_text(self.main_version)}.zip" + return f"{selected_url}https://github.com/DLmaster361/AUTO_MAA/releases/download/{version_text(self.version)}/AUTO_MAA_{version_text(self.version)}.zip" elif self.config["mode"] == "MirrorChyan": with requests.get( diff --git a/resources/version.json b/resources/version.json index 0ec9b7d..a0564ac 100644 --- a/resources/version.json +++ b/resources/version.json @@ -5,13 +5,15 @@ "version_info": { "4.3.4.6": { "新增功能": [ - "历史记录添加`按周合并`、`按月合并`功能" + "历史记录添加`按周合并`、`按月合并`功能", + "新增MAA稳定版更新提醒" ], "修复BUG": [ "修复历史记录选项卡无法回收的问题" ], "程序优化": [ - "历史记录添加`选中最近一月`、`选中最近一周`选项与打开日志文件所在目录功能" + "历史记录添加`选中最近一月`、`选中最近一周`选项与打开日志文件所在目录功能", + "MAA报错判定结果文案拆分优化" ] }, "4.3.4.5": {