fix(core): 网络模块支持并发请求

This commit is contained in:
DLmaster361
2025-05-30 20:30:23 +08:00
parent 222a3b35a2
commit e3c4b2edc8
8 changed files with 134 additions and 159 deletions

View File

@@ -567,7 +567,7 @@ class MaaPlanConfig(LQConfig):
class AppConfig(GlobalConfig): class AppConfig(GlobalConfig):
VERSION = "4.3.8.0" VERSION = "4.3.9.1"
gameid_refreshed = Signal() gameid_refreshed = Signal()
PASSWORD_refreshed = Signal() PASSWORD_refreshed = Signal()
@@ -652,18 +652,20 @@ class AppConfig(GlobalConfig):
def get_gameid(self) -> None: def get_gameid(self) -> None:
# 从MAA服务器获取活动关卡信息 # 从MAA服务器获取活动关卡信息
Network.set_info( network = Network.add_task(
mode="get", mode="get",
url="https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json", url="https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json",
) )
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:
gameid_infos: List[Dict[str, Union[str, Dict[str, Union[str, int]]]]] = ( gameid_infos: List[Dict[str, Union[str, Dict[str, Union[str, int]]]]] = (
Network.response_json["Official"]["sideStoryStage"] network_result["response_json"]["Official"]["sideStoryStage"]
) )
else: else:
logger.warning(f"无法从MAA服务器获取活动关卡信息:{Network.error_message}") logger.warning(
f"无法从MAA服务器获取活动关卡信息:{network_result['error_message']}"
)
gameid_infos = [] gameid_infos = []
ss_gameid_dict = {"value": [], "text": []} ss_gameid_dict = {"value": [], "text": []}

View File

@@ -26,55 +26,41 @@ v4.3
""" """
from loguru import logger from loguru import logger
from PySide6.QtCore import QThread, QEventLoop, QTimer from PySide6.QtCore import QObject, QThread, QEventLoop
import time import time
import requests import requests
from pathlib import Path from pathlib import Path
class _Network(QThread): class NetworkThread(QThread):
"""网络请求线程类"""
max_retries = 3 max_retries = 3
timeout = 10 timeout = 10
backoff_factor = 0.1 backoff_factor = 0.1
def __init__(self) -> None: def __init__(self, mode: str, url: str, path: Path = None) -> None:
super().__init__() 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.mode = mode
self.url = url self.url = url
self.path = path self.path = path
self.stutus_code = None self.status_code = None
self.response_json = None self.response_json = None
self.error_message = 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: def get_json(self, url: str) -> None:
"""通过get方法获取json数据""" """通过get方法获取json数据"""
@@ -83,12 +69,12 @@ class _Network(QThread):
for _ in range(self.max_retries): for _ in range(self.max_retries):
try: try:
response = requests.get(url, timeout=self.timeout) 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.response_json = response.json()
self.error_message = None self.error_message = None
break break
except Exception as e: 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.response_json = None
self.error_message = str(e) self.error_message = str(e)
time.sleep(self.backoff_factor) time.sleep(self.backoff_factor)
@@ -105,16 +91,47 @@ class _Network(QThread):
if response.status_code == 200: if response.status_code == 200:
with open(path, "wb") as file: with open(path, "wb") as file:
file.write(response.content) file.write(response.content)
self.stutus_code = response.status_code self.status_code = response.status_code
else: else:
self.stutus_code = response.status_code self.status_code = response.status_code
self.error_message = "下载失败" self.error_message = "下载失败"
except Exception as e: 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.error_message = str(e)
self.loop.quit() 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() Network = _Network()

View File

@@ -277,20 +277,20 @@ class _TaskManager(QObject):
def check_maa_version(self, v: str): def check_maa_version(self, v: str):
"""检查MAA版本""" """检查MAA版本"""
Network.set_info( network = Network.add_task(
mode="get", mode="get",
url="https://mirrorchyan.com/api/resources/MAA/latest?user_agent=AutoMaaGui&os=win&arch=x64&channel=stable", url="https://mirrorchyan.com/api/resources/MAA/latest?user_agent=AutoMaaGui&os=win&arch=x64&channel=stable",
) )
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:
maa_info = Network.response_json maa_info = network_result["response_json"]
else: else:
logger.warning(f"获取MAA版本信息时出错{Network.error_message}") logger.warning(f"获取MAA版本信息时出错{network_result['error_message']}")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "warning",
"获取MAA版本信息时出错", "获取MAA版本信息时出错",
f"网络错误:{Network.stutus_code}", f"网络错误:{network_result['status_code']}",
5000, 5000,
) )
return None return None

View File

@@ -26,8 +26,7 @@ v4.3
""" """
from loguru import logger from loguru import logger
from PySide6.QtWidgets import QWidget from PySide6.QtCore import QObject, QTimer
from PySide6.QtCore import QTimer
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
import pyautogui import pyautogui
@@ -37,7 +36,7 @@ from .task_manager import TaskManager
from app.services import System from app.services import System
class _MainTimer(QWidget): class _MainTimer(QObject):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)

View File

@@ -199,20 +199,22 @@ class Home(QWidget):
elif Config.get(Config.function_HomeImageMode) == "主题图像": elif Config.get(Config.function_HomeImageMode) == "主题图像":
# 从远程服务器获取最新主题图像 # 从远程服务器获取最新主题图像
Network.set_info( network = Network.add_task(
mode="get", mode="get",
url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/theme_image.json", url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/theme_image.json",
) )
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:
theme_image = Network.response_json theme_image = network_result["response_json"]
else: else:
logger.warning(f"获取最新主题图像时出错:{Network.error_message}") logger.warning(
f"获取最新主题图像时出错:{network_result['error_message']}"
)
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "warning",
"获取最新主题图像时出错", "获取最新主题图像时出错",
f"网络错误:{Network.stutus_code}", f"网络错误:{network_result['status_code']}",
5000, 5000,
) )
return None return None
@@ -236,15 +238,15 @@ class Home(QWidget):
> time_local > time_local
): ):
Network.set_info( network = Network.add_task(
mode="get_file", mode="get_file",
url=theme_image["url"], url=theme_image["url"],
path=Config.app_path / "resources/images/Home/BannerTheme.jpg", 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( with (Config.app_path / "resources/theme_image.json").open(
mode="w", encoding="utf-8" mode="w", encoding="utf-8"
@@ -261,11 +263,13 @@ class Home(QWidget):
else: else:
logger.warning(f"下载最新主题图像时出错:{Network.error_message}") logger.warning(
f"下载最新主题图像时出错:{network_result['error_message']}"
)
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "warning",
"下载最新主题图像时出错", "下载最新主题图像时出错",
f"网络错误:{Network.stutus_code}", f"网络错误:{network_result['status_code']}",
5000, 5000,
) )

View File

@@ -333,20 +333,20 @@ class MemberManager(QWidget):
return None return None
# 从远程服务器获取应用列表 # 从远程服务器获取应用列表
Network.set_info( network = Network.add_task(
mode="get", mode="get",
url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/apps_info.json", url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/apps_info.json",
) )
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:
apps_info = Network.response_json apps_info = network_result["response_json"]
else: else:
logger.warning(f"获取应用列表时出错:{Network.error_message}") logger.warning(f"获取应用列表时出错:{network_result['error_message']}")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "warning",
"获取应用列表时出错", "获取应用列表时出错",
f"网络错误:{Network.stutus_code}", f"网络错误:{network_result['status_code']}",
5000, 5000,
) )
return None return None
@@ -376,19 +376,19 @@ class MemberManager(QWidget):
return None return None
# 从mirrorc服务器获取最新版本信息 # 从mirrorc服务器获取最新版本信息
Network.set_info( network = Network.add_task(
mode="get", 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", 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()
Network.loop.exec() network_result = Network.get_result(network)
if Network.stutus_code == 200: if network_result["status_code"] == 200:
app_info = Network.response_json app_info = network_result["response_json"]
else: 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: if app_info["code"] != 0:
@@ -425,11 +425,11 @@ class MemberManager(QWidget):
return None return None
logger.warning(f"获取版本信息时出错:{Network.error_message}") logger.warning(f"获取版本信息时出错:{network_result['error_message']}")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "warning",
"获取版本信息时出错", "获取版本信息时出错",
f"网络错误:{Network.stutus_code}", f"网络错误:{network_result['status_code']}",
5000, 5000,
) )
return None return None

View File

@@ -262,31 +262,26 @@ class Setting(QWidget):
current_version = list(map(int, Config.VERSION.split("."))) 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", mode="get",
url=f"https://mirrorchyan.com/api/resources/AUTO_MAA/latest?user_agent=AutoMaaGui&current_version={version_text(current_version)}&cdk={Crypto.win_decryptor(Config.get(Config.update_MirrorChyanCDK))}&channel={Config.get(Config.update_UpdateType)}", url=f"https://mirrorchyan.com/api/resources/AUTO_MAA/latest?user_agent=AutoMaaGui&current_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()
Network.loop.exec() network_result = Network.get_result(network)
if Network.stutus_code == 200: if network_result["status_code"] == 200:
version_info: Dict[str, Union[int, str, Dict[str, str]]] = ( version_info: Dict[str, Union[int, str, Dict[str, str]]] = network_result[
Network.response_json "response_json"
) ]
else: 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: if version_info["code"] != 0:
logger.error(f"获取版本信息时出错:{version_info["msg"]}") logger.error(f"获取版本信息时出错:{version_info['msg']}")
error_remark_dict = { error_remark_dict = {
1001: "获取版本信息的URL参数不正确", 1001: "获取版本信息的URL参数不正确",
@@ -319,11 +314,11 @@ class Setting(QWidget):
return None return None
logger.warning(f"获取版本信息时出错:{Network.error_message}") logger.warning(f"获取版本信息时出错:{network_result['error_message']}")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "warning",
"获取版本信息时出错", "获取版本信息时出错",
f"网络错误:{Network.stutus_code}", f"网络错误:{network_result['status_code']}",
5000, 5000,
) )
return None return None
@@ -406,20 +401,22 @@ class Setting(QWidget):
else: else:
# 从远程服务器获取代理信息 # 从远程服务器获取代理信息
Network.set_info( network = Network.add_task(
mode="get", mode="get",
url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/download_info.json", url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/download_info.json",
) )
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:
download_info = Network.response_json download_info = network_result["response_json"]
else: else:
logger.warning(f"获取应用列表时出错:{Network.error_message}") logger.warning(
f"获取应用列表时出错:{network_result['error_message']}"
)
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "warning",
"获取应用列表时出错", "获取应用列表时出错",
f"网络错误:{Network.stutus_code}", f"网络错误:{network_result['status_code']}",
5000, 5000,
) )
return None return None
@@ -488,20 +485,20 @@ class Setting(QWidget):
"""显示公告""" """显示公告"""
# 从远程服务器获取最新公告 # 从远程服务器获取最新公告
Network.set_info( network = Network.add_task(
mode="get", mode="get",
url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/notice.json", url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/notice.json",
) )
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:
notice = Network.response_json notice = network_result["response_json"]
else: else:
logger.warning(f"获取最新公告时出错:{Network.error_message}") logger.warning(f"获取最新公告时出错:{network_result['error_message']}")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "warning",
"获取最新公告时出错", "获取最新公告时出错",
f"网络错误:{Network.stutus_code}", f"网络错误:{network_result['status_code']}",
5000, 5000,
) )
return None return None

View File

@@ -1,53 +1,9 @@
{ {
"main_version": "4.3.8.0", "main_version": "4.3.9.1",
"version_info": { "version_info": {
"4.3.8.0": { "4.3.9.1": {
"新增功能": [
"吐司通知在主窗口隐藏时不再弹出"
]
},
"4.3.8.4": {
"新增功能": [
"支持为每一个用户执行独立通知",
"输入文本框适配文本插入操作",
"计划表功能上线",
"静默控制时长从全任务内缩短至搜索ADB时段内",
"UI界面添加自动日常代理任务序列设置项"
],
"修复bug": [ "修复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主题"
] ]
} }
} }