chore: 性能优化
- 调度队列历史记录归入配置类管理 - 添加.gitignore - 工作流删除冗余部分 - 自动代理与人工排查结束后MAA恢复到全局配置 #40 - 网络相关操作由子线程执行
This commit is contained in:
@@ -31,6 +31,7 @@ __license__ = "GPL-3.0 license"
|
||||
|
||||
from .config import QueueConfig, MaaConfig, MaaUserConfig, Config
|
||||
from .main_info_bar import MainInfoBar
|
||||
from .network import Network
|
||||
from .task_manager import Task, TaskManager
|
||||
from .timer import MainTimer
|
||||
|
||||
@@ -40,6 +41,7 @@ __all__ = [
|
||||
"MaaConfig",
|
||||
"MaaUserConfig",
|
||||
"MainInfoBar",
|
||||
"Network",
|
||||
"Task",
|
||||
"TaskManager",
|
||||
"MainTimer",
|
||||
|
||||
@@ -32,8 +32,6 @@ import json
|
||||
import sys
|
||||
import shutil
|
||||
import re
|
||||
import requests
|
||||
import time
|
||||
import base64
|
||||
from datetime import datetime, timedelta
|
||||
from collections import defaultdict
|
||||
@@ -53,6 +51,8 @@ from qfluentwidgets import (
|
||||
from urllib.parse import urlparse
|
||||
from typing import Union, Dict, List
|
||||
|
||||
from .network import Network
|
||||
|
||||
|
||||
class UrlListValidator(ConfigValidator):
|
||||
"""Url list validator"""
|
||||
@@ -319,6 +319,13 @@ class QueueConfig(QConfig):
|
||||
self.queue_Member_9 = OptionsConfigItem("Queue", "Member_9", "禁用")
|
||||
self.queue_Member_10 = OptionsConfigItem("Queue", "Member_10", "禁用")
|
||||
|
||||
self.Data_LastProxyTime = ConfigItem(
|
||||
"Data", "LastProxyTime", "2000-01-01 00:00:00"
|
||||
)
|
||||
self.Data_LastProxyHistory = ConfigItem(
|
||||
"Data", "LastProxyHistory", "暂无历史运行记录"
|
||||
)
|
||||
|
||||
def toDict(self, serialize=True):
|
||||
"""convert config items to `dict`"""
|
||||
items = {}
|
||||
@@ -599,7 +606,7 @@ class MaaUserConfig(QConfig):
|
||||
|
||||
class AppConfig(GlobalConfig):
|
||||
|
||||
VERSION = "4.3.4.1"
|
||||
VERSION = "4.3.4.2"
|
||||
|
||||
gameid_refreshed = Signal()
|
||||
PASSWORD_refreshed = Signal()
|
||||
@@ -614,7 +621,6 @@ class AppConfig(GlobalConfig):
|
||||
self.log_path = self.app_path / "debug/AUTO_MAA.log"
|
||||
self.database_path = self.app_path / "data/data.db"
|
||||
self.config_path = self.app_path / "config/config.json"
|
||||
self.history_path = self.app_path / "history/main.json"
|
||||
self.key_path = self.app_path / "data/key"
|
||||
self.gameid_path = self.app_path / "data/gameid.txt"
|
||||
self.version_path = self.app_path / "resources/version.json"
|
||||
@@ -675,21 +681,18 @@ class AppConfig(GlobalConfig):
|
||||
def get_gameid(self) -> None:
|
||||
|
||||
# 从MAA服务器获取活动关卡信息
|
||||
for _ in range(3):
|
||||
try:
|
||||
response = requests.get(
|
||||
"https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json",
|
||||
timeout=10,
|
||||
)
|
||||
gameid_infos: List[
|
||||
Dict[str, Union[str, Dict[str, Union[str, int]]]]
|
||||
] = response.json()["Official"]["sideStoryStage"]
|
||||
break
|
||||
except Exception as e:
|
||||
err = e
|
||||
time.sleep(0.1)
|
||||
Network.set_info(
|
||||
mode="get",
|
||||
url="https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json",
|
||||
)
|
||||
Network.start()
|
||||
Network.loop.exec()
|
||||
if Network.stutus_code == 200:
|
||||
gameid_infos: List[Dict[str, Union[str, Dict[str, Union[str, int]]]]] = (
|
||||
Network.response_json["Official"]["sideStoryStage"]
|
||||
)
|
||||
else:
|
||||
logger.warning(f"无法从MAA服务器获取活动关卡信息:{err}")
|
||||
logger.warning(f"无法从MAA服务器获取活动关卡信息:{Network.error_message}")
|
||||
gameid_infos = []
|
||||
|
||||
gameid_dict = {"value": [], "text": []}
|
||||
@@ -1540,24 +1543,15 @@ class AppConfig(GlobalConfig):
|
||||
def save_history(self, key: str, content: dict) -> None:
|
||||
"""保存历史记录"""
|
||||
|
||||
history = {}
|
||||
if self.history_path.exists():
|
||||
with self.history_path.open(mode="r", encoding="utf-8") as f:
|
||||
history = json.load(f)
|
||||
history[key] = content
|
||||
with self.history_path.open(mode="w", encoding="utf-8") as f:
|
||||
json.dump(history, f, ensure_ascii=False, indent=4)
|
||||
|
||||
def get_history(self, key: str) -> dict:
|
||||
"""获取历史记录"""
|
||||
|
||||
history = {}
|
||||
if self.history_path.exists():
|
||||
with self.history_path.open(mode="r", encoding="utf-8") as f:
|
||||
history = json.load(f)
|
||||
return history.get(
|
||||
key, {"Time": "0000-00-00 00:00", "History": "暂无历史运行记录"}
|
||||
)
|
||||
if key in self.queue_dict:
|
||||
self.queue_dict[key]["Config"].set(
|
||||
self.queue_dict[key]["Config"].Data_LastProxyTime, content["Time"]
|
||||
)
|
||||
self.queue_dict[key]["Config"].set(
|
||||
self.queue_dict[key]["Config"].Data_LastProxyHistory, content["History"]
|
||||
)
|
||||
else:
|
||||
logger.warning(f"保存历史记录时未找到调度队列: {key}")
|
||||
|
||||
|
||||
Config = AppConfig()
|
||||
|
||||
@@ -27,10 +27,7 @@ v4.3
|
||||
|
||||
from loguru import logger
|
||||
from PySide6.QtCore import Qt
|
||||
from qfluentwidgets import (
|
||||
InfoBar,
|
||||
InfoBarPosition,
|
||||
)
|
||||
from qfluentwidgets import InfoBar, InfoBarPosition
|
||||
|
||||
|
||||
class _MainInfoBar:
|
||||
|
||||
120
app/core/network.py
Normal file
120
app/core/network.py
Normal file
@@ -0,0 +1,120 @@
|
||||
# <AUTO_MAA:A MAA Multi Account Management and Automation Tool>
|
||||
# Copyright © <2024> <DLmaster361>
|
||||
|
||||
# This file is part of AUTO_MAA.
|
||||
|
||||
# AUTO_MAA is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published
|
||||
# by the Free Software Foundation, either version 3 of the License,
|
||||
# or (at your option) any later version.
|
||||
|
||||
# AUTO_MAA is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty
|
||||
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
|
||||
# the GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with AUTO_MAA. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
# DLmaster_361@163.com
|
||||
|
||||
"""
|
||||
AUTO_MAA
|
||||
AUTO_MAA网络请求线程
|
||||
v4.3
|
||||
作者:DLmaster_361
|
||||
"""
|
||||
|
||||
from loguru import logger
|
||||
from PySide6.QtCore import QThread, QEventLoop, QTimer
|
||||
import time
|
||||
import requests
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class _Network(QThread):
|
||||
|
||||
max_retries = 3
|
||||
timeout = 10
|
||||
backoff_factor = 0.1
|
||||
|
||||
def __init__(self) -> 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
|
||||
|
||||
print(self.url)
|
||||
|
||||
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.response_json = None
|
||||
self.error_message = None
|
||||
|
||||
def get_json(self, url: str) -> None:
|
||||
"""通过get方法获取json数据"""
|
||||
|
||||
for _ in range(self.max_retries):
|
||||
try:
|
||||
response = requests.get(url, timeout=self.timeout)
|
||||
self.stutus_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.response_json = None
|
||||
self.error_message = str(e)
|
||||
time.sleep(self.backoff_factor)
|
||||
|
||||
self.loop.quit()
|
||||
print("quited")
|
||||
|
||||
def get_file(self, url: str, path: Path) -> None:
|
||||
"""通过get方法获取json数据"""
|
||||
|
||||
try:
|
||||
response = requests.get(url, timeout=10)
|
||||
if response.status_code == 200:
|
||||
with open(path, "wb") as file:
|
||||
file.write(response.content)
|
||||
self.stutus_code = response.status_code
|
||||
else:
|
||||
self.stutus_code = response.status_code
|
||||
self.error_message = "下载失败"
|
||||
|
||||
except Exception as e:
|
||||
self.stutus_code = response.status_code if response else None
|
||||
self.error_message = str(e)
|
||||
|
||||
self.loop.quit()
|
||||
print("quited-----")
|
||||
|
||||
|
||||
Network = _Network()
|
||||
@@ -229,37 +229,33 @@ class _TaskManager(QObject):
|
||||
self.task_dict[name].quit()
|
||||
self.task_dict[name].wait()
|
||||
|
||||
def remove_task(self, mode: str, name: str, logs: str):
|
||||
def remove_task(self, mode: str, name: str, logs: list):
|
||||
"""任务结束后的处理"""
|
||||
|
||||
logger.info(f"任务结束:{name}")
|
||||
MainInfoBar.push_info_bar("info", "任务结束", name, 3000)
|
||||
|
||||
self.task_dict[name].deleteLater()
|
||||
|
||||
if len(logs) > 0:
|
||||
time = logs[0][1]["Time"]
|
||||
history = ""
|
||||
for log in logs:
|
||||
Config.save_history(log[0], log[1])
|
||||
history += (
|
||||
f"任务名称:{log[0]},{log[1]["History"].replace("\n","\n ")}\n"
|
||||
)
|
||||
Config.save_history(name, {"Time": time, "History": history})
|
||||
else:
|
||||
Config.save_history(
|
||||
name,
|
||||
{
|
||||
"Time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"History": "没有任务被执行",
|
||||
},
|
||||
)
|
||||
|
||||
self.task_dict.pop(name)
|
||||
Config.running_list.remove(name)
|
||||
|
||||
if "调度队列" in name and "人工排查" not in mode:
|
||||
|
||||
if len(logs) > 0:
|
||||
time = logs[0][1]["Time"]
|
||||
history = ""
|
||||
for log in logs:
|
||||
history += f"任务名称:{log[0]},{log[1]["History"].replace("\n","\n ")}\n"
|
||||
Config.save_history(name, {"Time": time, "History": history})
|
||||
else:
|
||||
Config.save_history(
|
||||
name,
|
||||
{
|
||||
"Time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"History": "没有任务被执行",
|
||||
},
|
||||
)
|
||||
|
||||
if (
|
||||
Config.queue_dict[name]["Config"].get(
|
||||
Config.queue_dict[name]["Config"].queueSet_AfterAccomplish
|
||||
|
||||
@@ -64,8 +64,6 @@ class _MainTimer(QWidget):
|
||||
if not info["Config"].get(info["Config"].queueSet_Enabled):
|
||||
continue
|
||||
|
||||
history = Config.get_history(name)
|
||||
|
||||
data = info["Config"].toDict()
|
||||
|
||||
time_set = [
|
||||
@@ -77,7 +75,8 @@ class _MainTimer(QWidget):
|
||||
curtime = datetime.now().strftime("%Y-%m-%d %H:%M")
|
||||
if (
|
||||
curtime[11:16] in time_set
|
||||
and curtime != history["Time"][:16]
|
||||
and curtime
|
||||
!= info["Config"].get(info["Config"].Data_LastProxyTime)[:16]
|
||||
and name not in Config.running_list
|
||||
):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user