From e3c4b2edc8f38bbc8c60a48f2203b55b33f1ca47 Mon Sep 17 00:00:00 2001 From: DLmaster361 Date: Fri, 30 May 2025 20:30:23 +0800 Subject: [PATCH] =?UTF-8?q?fix(core):=20=E7=BD=91=E7=BB=9C=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E6=94=AF=E6=8C=81=E5=B9=B6=E5=8F=91=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/config.py | 16 ++++---- app/core/network.py | 87 ++++++++++++++++++++++++---------------- app/core/task_manager.py | 14 +++---- app/core/timer.py | 5 +-- app/ui/home.py | 30 ++++++++------ app/ui/member_manager.py | 32 +++++++-------- app/ui/setting.py | 59 +++++++++++++-------------- resources/version.json | 50 ++--------------------- 8 files changed, 134 insertions(+), 159 deletions(-) diff --git a/app/core/config.py b/app/core/config.py index b99afff..1789131 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -567,7 +567,7 @@ class MaaPlanConfig(LQConfig): class AppConfig(GlobalConfig): - VERSION = "4.3.8.0" + VERSION = "4.3.9.1" gameid_refreshed = Signal() PASSWORD_refreshed = Signal() @@ -652,18 +652,20 @@ class AppConfig(GlobalConfig): def get_gameid(self) -> None: # 从MAA服务器获取活动关卡信息 - Network.set_info( + network = Network.add_task( mode="get", url="https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json", ) - Network.start() - Network.loop.exec() - if Network.stutus_code == 200: + network.loop.exec() + network_result = Network.get_result(network) + if network_result["status_code"] == 200: gameid_infos: List[Dict[str, Union[str, Dict[str, Union[str, int]]]]] = ( - Network.response_json["Official"]["sideStoryStage"] + network_result["response_json"]["Official"]["sideStoryStage"] ) else: - logger.warning(f"无法从MAA服务器获取活动关卡信息:{Network.error_message}") + logger.warning( + f"无法从MAA服务器获取活动关卡信息:{network_result['error_message']}" + ) gameid_infos = [] ss_gameid_dict = {"value": [], "text": []} diff --git a/app/core/network.py b/app/core/network.py index 5c91d8b..628b6cf 100644 --- a/app/core/network.py +++ b/app/core/network.py @@ -26,55 +26,41 @@ v4.3 """ from loguru import logger -from PySide6.QtCore import QThread, QEventLoop, QTimer +from PySide6.QtCore import QObject, QThread, QEventLoop import time import requests from pathlib import Path -class _Network(QThread): +class NetworkThread(QThread): + """网络请求线程类""" max_retries = 3 timeout = 10 backoff_factor = 0.1 - def __init__(self) -> None: + def __init__(self, mode: str, url: str, path: Path = None) -> None: super().__init__() - self.if_running = False - self.mode = None - self.url = None - self.loop = QEventLoop() - self.wait_loop = QEventLoop() - - @logger.catch - def run(self) -> None: - """运行网络请求线程""" - - self.if_running = True - - if self.mode == "get": - self.get_json(self.url) - elif self.mode == "get_file": - self.get_file(self.url, self.path) - - self.if_running = False - - def set_info(self, mode: str, url: str, path: Path = None) -> None: - """设置网络请求信息""" - - while self.if_running: - QTimer.singleShot(self.backoff_factor * 1000, self.wait_loop.quit) - self.wait_loop.exec() - self.mode = mode self.url = url self.path = path - self.stutus_code = None + self.status_code = None self.response_json = None self.error_message = None + self.loop = QEventLoop() + + @logger.catch + def run(self) -> None: + """运行网络请求线程""" + + if self.mode == "get": + self.get_json(self.url) + elif self.mode == "get_file": + self.get_file(self.url, self.path) + def get_json(self, url: str) -> None: """通过get方法获取json数据""" @@ -83,12 +69,12 @@ class _Network(QThread): for _ in range(self.max_retries): try: response = requests.get(url, timeout=self.timeout) - self.stutus_code = response.status_code + self.status_code = response.status_code self.response_json = response.json() self.error_message = None break except Exception as e: - self.stutus_code = response.status_code if response else None + self.status_code = response.status_code if response else None self.response_json = None self.error_message = str(e) time.sleep(self.backoff_factor) @@ -105,16 +91,47 @@ class _Network(QThread): if response.status_code == 200: with open(path, "wb") as file: file.write(response.content) - self.stutus_code = response.status_code + self.status_code = response.status_code else: - self.stutus_code = response.status_code + self.status_code = response.status_code self.error_message = "下载失败" except Exception as e: - self.stutus_code = response.status_code if response else None + self.status_code = response.status_code if response else None self.error_message = str(e) self.loop.quit() +class _Network(QObject): + """网络请求线程类""" + + def __init__(self) -> None: + super().__init__() + + self.task_queue = [] + + def add_task(self, mode: str, url: str, path: Path = None) -> NetworkThread: + """添加网络请求任务""" + + network_thread = NetworkThread(mode, url, path) + + self.task_queue.append(network_thread) + + network_thread.start() + + return network_thread + + def get_result(self, network_thread: NetworkThread) -> dict: + """获取网络请求结果""" + + self.task_queue.remove(network_thread) + + return { + "status_code": network_thread.status_code, + "response_json": network_thread.response_json, + "error_message": network_thread.error_message, + } + + Network = _Network() diff --git a/app/core/task_manager.py b/app/core/task_manager.py index ce97f21..eefbc77 100644 --- a/app/core/task_manager.py +++ b/app/core/task_manager.py @@ -277,20 +277,20 @@ class _TaskManager(QObject): def check_maa_version(self, v: str): """检查MAA版本""" - Network.set_info( + network = Network.add_task( 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 + network.loop.exec() + network_result = Network.get_result(network) + if network_result["status_code"] == 200: + maa_info = network_result["response_json"] else: - logger.warning(f"获取MAA版本信息时出错:{Network.error_message}") + logger.warning(f"获取MAA版本信息时出错:{network_result['error_message']}") MainInfoBar.push_info_bar( "warning", "获取MAA版本信息时出错", - f"网络错误:{Network.stutus_code}", + f"网络错误:{network_result['status_code']}", 5000, ) return None diff --git a/app/core/timer.py b/app/core/timer.py index c09bd7f..43c0da3 100644 --- a/app/core/timer.py +++ b/app/core/timer.py @@ -26,8 +26,7 @@ v4.3 """ from loguru import logger -from PySide6.QtWidgets import QWidget -from PySide6.QtCore import QTimer +from PySide6.QtCore import QObject, QTimer from datetime import datetime from pathlib import Path import pyautogui @@ -37,7 +36,7 @@ from .task_manager import TaskManager from app.services import System -class _MainTimer(QWidget): +class _MainTimer(QObject): def __init__(self, parent=None): super().__init__(parent) diff --git a/app/ui/home.py b/app/ui/home.py index 9a60344..475230a 100644 --- a/app/ui/home.py +++ b/app/ui/home.py @@ -199,20 +199,22 @@ class Home(QWidget): elif Config.get(Config.function_HomeImageMode) == "主题图像": # 从远程服务器获取最新主题图像 - Network.set_info( + network = Network.add_task( mode="get", url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/theme_image.json", ) - Network.start() - Network.loop.exec() - if Network.stutus_code == 200: - theme_image = Network.response_json + network.loop.exec() + network_result = Network.get_result(network) + if network_result["status_code"] == 200: + theme_image = network_result["response_json"] else: - logger.warning(f"获取最新主题图像时出错:{Network.error_message}") + logger.warning( + f"获取最新主题图像时出错:{network_result['error_message']}" + ) MainInfoBar.push_info_bar( "warning", "获取最新主题图像时出错", - f"网络错误:{Network.stutus_code}", + f"网络错误:{network_result['status_code']}", 5000, ) return None @@ -236,15 +238,15 @@ class Home(QWidget): > time_local ): - Network.set_info( + network = Network.add_task( mode="get_file", url=theme_image["url"], path=Config.app_path / "resources/images/Home/BannerTheme.jpg", ) - Network.start() - Network.loop.exec() + network.loop.exec() + network_result = Network.get_result(network) - if Network.stutus_code == 200: + if network_result["status_code"] == 200: with (Config.app_path / "resources/theme_image.json").open( mode="w", encoding="utf-8" @@ -261,11 +263,13 @@ class Home(QWidget): else: - logger.warning(f"下载最新主题图像时出错:{Network.error_message}") + logger.warning( + f"下载最新主题图像时出错:{network_result['error_message']}" + ) MainInfoBar.push_info_bar( "warning", "下载最新主题图像时出错", - f"网络错误:{Network.stutus_code}", + f"网络错误:{network_result['status_code']}", 5000, ) diff --git a/app/ui/member_manager.py b/app/ui/member_manager.py index 82865af..4952690 100644 --- a/app/ui/member_manager.py +++ b/app/ui/member_manager.py @@ -333,20 +333,20 @@ class MemberManager(QWidget): return None # 从远程服务器获取应用列表 - Network.set_info( + network = Network.add_task( mode="get", url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/apps_info.json", ) - Network.start() - Network.loop.exec() - if Network.stutus_code == 200: - apps_info = Network.response_json + network.loop.exec() + network_result = Network.get_result(network) + if network_result["status_code"] == 200: + apps_info = network_result["response_json"] else: - logger.warning(f"获取应用列表时出错:{Network.error_message}") + logger.warning(f"获取应用列表时出错:{network_result['error_message']}") MainInfoBar.push_info_bar( "warning", "获取应用列表时出错", - f"网络错误:{Network.stutus_code}", + f"网络错误:{network_result['status_code']}", 5000, ) return None @@ -376,19 +376,19 @@ class MemberManager(QWidget): return None # 从mirrorc服务器获取最新版本信息 - Network.set_info( + network = Network.add_task( mode="get", url=f"https://mirrorchyan.com/api/resources/{app_rid}/latest?user_agent=AutoMaaGui&cdk={Crypto.win_decryptor(Config.get(Config.update_MirrorChyanCDK))}&os={apps_info[app_name]["os"]}&arch={apps_info[app_name]["arch"]}&channel=stable", ) - Network.start() - Network.loop.exec() - if Network.stutus_code == 200: - app_info = Network.response_json + network.loop.exec() + network_result = Network.get_result(network) + if network_result["status_code"] == 200: + app_info = network_result["response_json"] else: - if Network.response_json: + if network_result["response_json"]: - app_info = Network.response_json + app_info = network_result["response_json"] if app_info["code"] != 0: @@ -425,11 +425,11 @@ class MemberManager(QWidget): return None - logger.warning(f"获取版本信息时出错:{Network.error_message}") + logger.warning(f"获取版本信息时出错:{network_result['error_message']}") MainInfoBar.push_info_bar( "warning", "获取版本信息时出错", - f"网络错误:{Network.stutus_code}", + f"网络错误:{network_result['status_code']}", 5000, ) return None diff --git a/app/ui/setting.py b/app/ui/setting.py index 84fda41..23cd5f4 100644 --- a/app/ui/setting.py +++ b/app/ui/setting.py @@ -262,31 +262,26 @@ class Setting(QWidget): current_version = list(map(int, Config.VERSION.split("."))) - if Network.if_running and if_show: - MainInfoBar.push_info_bar( - "warning", "请求速度过快", "上个网络请求还未结束,请稍等片刻", 5000 - ) - return None # 从远程服务器获取最新版本信息 - Network.set_info( + network = Network.add_task( mode="get", url=f"https://mirrorchyan.com/api/resources/AUTO_MAA/latest?user_agent=AutoMaaGui¤t_version={version_text(current_version)}&cdk={Crypto.win_decryptor(Config.get(Config.update_MirrorChyanCDK))}&channel={Config.get(Config.update_UpdateType)}", ) - Network.start() - Network.loop.exec() - if Network.stutus_code == 200: - version_info: Dict[str, Union[int, str, Dict[str, str]]] = ( - Network.response_json - ) + network.loop.exec() + network_result = Network.get_result(network) + if network_result["status_code"] == 200: + version_info: Dict[str, Union[int, str, Dict[str, str]]] = network_result[ + "response_json" + ] else: - if Network.response_json: + if network_result["response_json"]: - version_info = Network.response_json + version_info = network_result["response_json"] if version_info["code"] != 0: - logger.error(f"获取版本信息时出错:{version_info["msg"]}") + logger.error(f"获取版本信息时出错:{version_info['msg']}") error_remark_dict = { 1001: "获取版本信息的URL参数不正确", @@ -319,11 +314,11 @@ class Setting(QWidget): return None - logger.warning(f"获取版本信息时出错:{Network.error_message}") + logger.warning(f"获取版本信息时出错:{network_result['error_message']}") MainInfoBar.push_info_bar( "warning", "获取版本信息时出错", - f"网络错误:{Network.stutus_code}", + f"网络错误:{network_result['status_code']}", 5000, ) return None @@ -406,20 +401,22 @@ class Setting(QWidget): else: # 从远程服务器获取代理信息 - Network.set_info( + network = Network.add_task( mode="get", url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/download_info.json", ) - Network.start() - Network.loop.exec() - if Network.stutus_code == 200: - download_info = Network.response_json + network.loop.exec() + network_result = Network.get_result(network) + if network_result["status_code"] == 200: + download_info = network_result["response_json"] else: - logger.warning(f"获取应用列表时出错:{Network.error_message}") + logger.warning( + f"获取应用列表时出错:{network_result['error_message']}" + ) MainInfoBar.push_info_bar( "warning", "获取应用列表时出错", - f"网络错误:{Network.stutus_code}", + f"网络错误:{network_result['status_code']}", 5000, ) return None @@ -488,20 +485,20 @@ class Setting(QWidget): """显示公告""" # 从远程服务器获取最新公告 - Network.set_info( + network = Network.add_task( mode="get", url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/notice.json", ) - Network.start() - Network.loop.exec() - if Network.stutus_code == 200: - notice = Network.response_json + network.loop.exec() + network_result = Network.get_result(network) + if network_result["status_code"] == 200: + notice = network_result["response_json"] else: - logger.warning(f"获取最新公告时出错:{Network.error_message}") + logger.warning(f"获取最新公告时出错:{network_result['error_message']}") MainInfoBar.push_info_bar( "warning", "获取最新公告时出错", - f"网络错误:{Network.stutus_code}", + f"网络错误:{network_result['status_code']}", 5000, ) return None diff --git a/resources/version.json b/resources/version.json index c0e4e71..4fda158 100644 --- a/resources/version.json +++ b/resources/version.json @@ -1,53 +1,9 @@ { - "main_version": "4.3.8.0", + "main_version": "4.3.9.1", "version_info": { - "4.3.8.0": { - "新增功能": [ - "吐司通知在主窗口隐藏时不再弹出" - ] - }, - "4.3.8.4": { - "新增功能": [ - "支持为每一个用户执行独立通知", - "输入文本框适配文本插入操作", - "计划表功能上线", - "静默控制时长从全任务内缩短至搜索ADB时段内", - "UI界面添加自动日常代理任务序列设置项" - ], + "4.3.9.1": { "修复bug": [ - "修复雷电模拟器静默模式无法正常识别模拟器是否隐藏相关问题" - ] - }, - "4.3.8.3": { - "新增功能": [ - "用户仪表盘支持直接控制用户状态" - ], - "修复bug": [ - "修复雷电ADB端口号相关问题" - ] - }, - "4.3.8.2": { - "新增功能": [ - "添加ADB端口号宽幅适配能力" - ], - "修复bug": [ - "日志分析忽略MAA超时提示" - ], - "程序优化": [ - "配置类定义方法优化" - ] - }, - "4.3.8.1": { - "新增功能": [ - "自定义基建显示配置名称 #46", - "主调度台添加仅一次电源任务" - ], - "修复bug": [ - "电源相关选项改为所有任务完成后生效", - "适配MAAv5.16.3的ADB报错信息更改" - ], - "程序优化": [ - "UI样式优化,进一步适配win10主题" + "网络模块支持并发请求" ] } }