feat(core): 重构日志记录,载入更多日志记录项

This commit is contained in:
DLmaster361
2025-07-18 18:12:47 +08:00
parent 8427bd9f6b
commit 9b492b5e0d
26 changed files with 2217 additions and 800 deletions

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import (
QWidget,
QVBoxLayout,
@@ -48,7 +47,7 @@ from PySide6.QtGui import QTextCursor
from typing import List, Dict
from app.core import Config, TaskManager, Task, MainInfoBar, SoundPlayer
from app.core import Config, TaskManager, Task, MainInfoBar, logger
from .Widget import StatefulItemCard, ComboBoxMessageBox, PivotArea
@@ -59,10 +58,12 @@ class DispatchCenter(QWidget):
self.setObjectName("调度中枢")
# 添加任务按钮
self.multi_button = PushButton(FluentIcon.ADD, "添加任务", self)
self.multi_button.setToolTip("添加任务")
self.multi_button.clicked.connect(self.start_multi_task)
# 电源动作设置组件
self.power_combox = ComboBox()
self.power_combox.addItem("无动作", userData="NoAction")
self.power_combox.addItem("退出软件", userData="KillSelf")
@@ -72,15 +73,18 @@ class DispatchCenter(QWidget):
self.power_combox.setCurrentText("无动作")
self.power_combox.currentIndexChanged.connect(self.set_power_sign)
# 导航栏
self.pivotArea = PivotArea(self)
self.pivot = self.pivotArea.pivot
# 导航页面组
self.stackedWidget = QStackedWidget(self)
self.stackedWidget.setContentsMargins(0, 0, 0, 0)
self.stackedWidget.setStyleSheet("background: transparent; border: none;")
self.script_list: Dict[str, DispatchCenter.DispatchBox] = {}
# 添加主调度台
dispatch_box = self.DispatchBox("主调度台", self)
self.script_list["主调度台"] = dispatch_box
self.stackedWidget.addWidget(self.script_list["主调度台"])
@@ -91,6 +95,7 @@ class DispatchCenter(QWidget):
icon=FluentIcon.CAFE,
)
# 顶栏组合
h_layout = QHBoxLayout()
h_layout.addWidget(self.multi_button)
h_layout.addWidget(self.pivotArea)
@@ -108,7 +113,13 @@ class DispatchCenter(QWidget):
)
def add_board(self, task: Task) -> None:
"""添加一个调度台界面"""
"""
为任务添加一个调度台界面并绑定信号
:param task: 任务对象
"""
logger.info(f"添加调度台:{task.name}", module="调度中枢")
dispatch_box = self.DispatchBox(task.name, self)
@@ -129,19 +140,36 @@ class DispatchCenter(QWidget):
self.pivot.addItem(routeKey=f"调度台_{task.name}", text=f"调度台 {task.name}")
logger.success(f"调度台 {task.name} 添加成功", module="调度中枢")
def del_board(self, name: str) -> None:
"""删除指定子界面"""
"""
删除指定子界面
:param name: 子界面名称
"""
logger.info(f"删除调度台:{name}", module="调度中枢")
self.pivot.setCurrentItem("主调度台")
self.stackedWidget.removeWidget(self.script_list[name])
self.script_list[name].deleteLater()
self.script_list.pop(name)
self.pivot.removeWidget(name)
logger.success(f"调度台 {name} 删除成功", module="调度中枢")
def connect_main_board(self, task: Task) -> None:
"""连接主调度台"""
"""
将任务连接到主调度台
:param task: 任务对象
"""
logger.info(f"主调度台载入任务:{task.name}", module="调度中枢")
self.script_list["主调度台"].top_bar.Lable.setText(
f"{task.name} - {task.mode.replace("_主调度台","")}模式"
f"{task.name} - {task.mode.replace('_主调度台','')}模式"
)
self.script_list["主调度台"].top_bar.Lable.show()
self.script_list["主调度台"].top_bar.object.hide()
@@ -170,8 +198,17 @@ class DispatchCenter(QWidget):
lambda logs: self.disconnect_main_board(task.name, logs)
)
logger.success(f"主调度台成功载入:{task.name} ", module="调度中枢")
def disconnect_main_board(self, name: str, logs: list) -> None:
"""断开主调度台"""
"""
断开主调度台
:param name: 任务名称
:param logs: 任务日志列表
"""
logger.info(f"主调度台断开任务:{name}", module="调度中枢")
self.script_list["主调度台"].top_bar.Lable.hide()
self.script_list["主调度台"].top_bar.object.show()
@@ -191,6 +228,8 @@ class DispatchCenter(QWidget):
else:
self.script_list["主调度台"].info.log_text.text.setText("没有任务被执行")
logger.success(f"主调度台成功断开:{name}", module="调度中枢")
def update_top_bar(self):
"""更新顶栏"""
@@ -253,10 +292,7 @@ class DispatchCenter(QWidget):
self.power_combox.currentIndexChanged.connect(self.set_power_sign)
logger.warning("没有正在运行的任务,无法设置任务完成后动作")
MainInfoBar.push_info_bar(
"warning",
"没有正在运行的任务",
"无法设置任务完成后动作",
5000,
"warning", "没有正在运行的任务", "无法设置任务完成后动作", 5000
)
else:
@@ -264,7 +300,7 @@ class DispatchCenter(QWidget):
Config.set_power_sign(self.power_combox.currentData())
def start_multi_task(self) -> None:
"""开始任务"""
"""开始多开任务"""
# 获取所有可用的队列和实例
text_list = []
@@ -300,7 +336,9 @@ class DispatchCenter(QWidget):
if choice.exec() and choice.input[0].currentIndex() != -1:
if choice.input[0].currentData() in Config.running_list:
logger.warning(f"任务已存在:{choice.input[0].currentData()}")
logger.warning(
f"任务已存在:{choice.input[0].currentData()}", module="调度中枢"
)
MainInfoBar.push_info_bar(
"warning", "任务已存在", choice.input[0].currentData(), 5000
)
@@ -308,7 +346,9 @@ class DispatchCenter(QWidget):
if "调度队列" in choice.input[0].currentData():
logger.info(f"用户添加任务:{choice.input[0].currentData()}")
logger.info(
f"用户添加任务:{choice.input[0].currentData()}", module="调度中枢"
)
TaskManager.add_task(
"自动代理_新调度台",
choice.input[0].currentData(),
@@ -317,7 +357,9 @@ class DispatchCenter(QWidget):
elif "脚本" in choice.input[0].currentData():
logger.info(f"用户添加任务:{choice.input[0].currentData()}")
logger.info(
f"用户添加任务:{choice.input[0].currentData()}", module="调度中枢"
)
TaskManager.add_task(
"自动代理_新调度台",
f"自定义队列 - {choice.input[0].currentData()}",
@@ -384,24 +426,26 @@ class DispatchCenter(QWidget):
Layout.addWidget(self.main_button)
def start_main_task(self):
"""开始任务"""
"""从主调度台开始任务"""
if self.object.currentIndex() == -1:
logger.warning("未选择调度对象")
logger.warning("未选择调度对象", module="调度中枢")
MainInfoBar.push_info_bar(
"warning", "未选择调度对象", "请选择后再开始任务", 5000
)
return None
if self.mode.currentIndex() == -1:
logger.warning("未选择调度模式")
logger.warning("未选择调度模式", module="调度中枢")
MainInfoBar.push_info_bar(
"warning", "未选择调度模式", "请选择后再开始任务", 5000
)
return None
if self.object.currentData() in Config.running_list:
logger.warning(f"任务已存在:{self.object.currentData()}")
logger.warning(
f"任务已存在:{self.object.currentData()}", module="调度中枢"
)
MainInfoBar.push_info_bar(
"warning", "任务已存在", self.object.currentData(), 5000
)
@@ -413,7 +457,7 @@ class DispatchCenter(QWidget):
== "General"
and self.mode.currentData() == "人工排查"
):
logger.warning("通用脚本类型不存在人工排查功能")
logger.warning("通用脚本类型不存在人工排查功能", module="调度中枢")
MainInfoBar.push_info_bar(
"warning", "不支持的任务", "通用脚本无人工排查功能", 5000
)
@@ -421,7 +465,9 @@ class DispatchCenter(QWidget):
if "调度队列" in self.object.currentData():
logger.info(f"用户添加任务:{self.object.currentData()}")
logger.info(
f"用户添加任务:{self.object.currentData()}", module="调度中枢"
)
TaskManager.add_task(
f"{self.mode.currentText()}_主调度台",
self.object.currentData(),
@@ -430,7 +476,9 @@ class DispatchCenter(QWidget):
elif "脚本" in self.object.currentData():
logger.info(f"用户添加任务:{self.object.currentData()}")
logger.info(
f"用户添加任务:{self.object.currentData()}", module="调度中枢"
)
TaskManager.add_task(
f"{self.mode.currentText()}_主调度台",
"自定义队列",
@@ -476,7 +524,11 @@ class DispatchCenter(QWidget):
self.task_cards: List[StatefulItemCard] = []
def create_task(self, task_list: list):
"""创建任务队列"""
"""
创建任务队列
:param task_list: 包含任务信息的任务列表
"""
while self.Layout.count() > 0:
item = self.Layout.takeAt(0)
@@ -495,7 +547,11 @@ class DispatchCenter(QWidget):
self.Layout.addStretch(1)
def update_task(self, task_list: list):
"""更新任务队列"""
"""
更新任务队列信息
:param task_list: 包含任务信息的任务列表
"""
for i in range(len(task_list)):
@@ -514,7 +570,11 @@ class DispatchCenter(QWidget):
self.user_cards: List[StatefulItemCard] = []
def create_user(self, user_list: list):
"""创建用户队列"""
"""
创建用户队列
:param user_list: 包含用户信息的用户列表
"""
while self.Layout.count() > 0:
item = self.Layout.takeAt(0)
@@ -533,7 +593,11 @@ class DispatchCenter(QWidget):
self.Layout.addStretch(1)
def update_user(self, user_list: list):
"""更新用户队列"""
"""
更新用户队列信息
:param user_list: 包含用户信息的用户列表
"""
for i in range(len(user_list)):

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
import zipfile
import requests
import subprocess
@@ -46,7 +45,7 @@ from PySide6.QtCore import QThread, Signal, QTimer, QEventLoop
from typing import List, Dict, Union
from app.core import Config
from app.core import Config, logger
from app.services import System
@@ -83,6 +82,8 @@ class DownloadProcess(QThread):
self.setObjectName(f"DownloadProcess-{url}-{start_byte}-{end_byte}")
logger.info(f"创建下载子线程:{self.objectName()}", module="下载子线程")
self.url = url
self.start_byte = start_byte
self.end_byte = end_byte
@@ -97,7 +98,8 @@ class DownloadProcess(QThread):
self.download_path.unlink()
logger.info(
f"开始下载:{self.url},范围:{self.start_byte}-{self.end_byte},存储地址:{self.download_path}"
f"开始下载:{self.url},范围:{self.start_byte}-{self.end_byte},存储地址:{self.download_path}",
module="下载子线程",
)
headers = (
@@ -129,13 +131,17 @@ class DownloadProcess(QThread):
self.check_times -= 1
logger.error(
f"连接失败:{self.url},状态码:{response.status_code},剩余重试次数:{self.check_times}"
f"连接失败:{self.url},状态码:{response.status_code},剩余重试次数:{self.check_times}",
module="下载子线程",
)
time.sleep(1)
continue
logger.info(f"连接成功:{self.url},状态码:{response.status_code}")
logger.info(
f"连接成功:{self.url},状态码:{response.status_code}",
module="下载子线程",
)
downloaded_size = 0
with self.download_path.open(mode="wb") as f:
@@ -155,13 +161,14 @@ class DownloadProcess(QThread):
if self.download_path.exists():
self.download_path.unlink()
self.accomplish.emit(0)
logger.info(f"下载中止:{self.url}")
logger.info(f"下载中止:{self.url}", module="下载子线程")
else:
self.accomplish.emit(time.time() - start_time)
logger.success(
f"下载完成:{self.url},实际下载大小:{downloaded_size} 字节,耗时:{time.time() - start_time:.2f}"
f"下载完成:{self.url},实际下载大小:{downloaded_size} 字节,耗时:{time.time() - start_time:.2f}",
module="下载子线程",
)
break
@@ -172,7 +179,8 @@ class DownloadProcess(QThread):
self.check_times -= 1
logger.exception(
f"下载出错:{self.url},错误信息:{e},剩余重试次数:{self.check_times}"
f"下载出错:{self.url},错误信息:{e},剩余重试次数:{self.check_times}",
module="下载子线程",
)
time.sleep(1)
@@ -181,7 +189,7 @@ class DownloadProcess(QThread):
if self.download_path.exists():
self.download_path.unlink()
self.accomplish.emit(0)
logger.error(f"下载失败:{self.url}")
logger.error(f"下载失败:{self.url}", module="下载子线程")
class ZipExtractProcess(QThread):
@@ -195,6 +203,8 @@ class ZipExtractProcess(QThread):
self.setObjectName(f"ZipExtractProcess-{name}")
logger.info(f"创建解压子线程:{self.objectName()}", module="解压子线程")
self.name = name
self.app_path = app_path
self.download_path = download_path
@@ -204,7 +214,10 @@ class ZipExtractProcess(QThread):
try:
logger.info(f"开始解压:{self.download_path}{self.app_path}")
logger.info(
f"开始解压:{self.download_path}{self.app_path}",
module="解压子线程",
)
while True:
@@ -215,7 +228,10 @@ class ZipExtractProcess(QThread):
with zipfile.ZipFile(self.download_path, "r") as zip_ref:
zip_ref.extractall(self.app_path)
self.accomplish.emit()
logger.success(f"解压完成:{self.download_path}{self.app_path}")
logger.success(
f"解压完成:{self.download_path}{self.app_path}",
module="解压子线程",
)
break
except PermissionError:
if self.name == "AUTO_MAA":
@@ -223,7 +239,10 @@ class ZipExtractProcess(QThread):
System.kill_process(self.app_path / "AUTO_MAA.exe")
else:
self.info.emit(f"解压出错:{self.name}正在运行,正在等待其关闭")
logger.warning(f"解压出错:{self.name}正在运行,正在等待其关闭")
logger.warning(
f"解压出错:{self.name}正在运行,正在等待其关闭",
module="解压子线程",
)
time.sleep(1)
except Exception as e:
@@ -231,7 +250,7 @@ class ZipExtractProcess(QThread):
e = str(e)
e = "\n".join([e[_ : _ + 75] for _ in range(0, len(e), 75)])
self.info.emit(f"解压更新时出错:\n{e}")
logger.exception(f"解压更新时出错:{e}")
logger.exception(f"解压更新时出错:{e}", module="解压子线程")
return None
@@ -277,17 +296,27 @@ class DownloadManager(QDialog):
def run(self) -> None:
logger.info(
f"开始执行下载任务:{self.name},版本:{version_text(self.version)}",
module="下载管理器",
)
if self.name == "AUTO_MAA":
if self.config["mode"] == "Proxy":
self.test_speed_task1()
self.speed_test_accomplish.connect(self.download_task1)
self.start_test_speed()
self.speed_test_accomplish.connect(self.start_download)
elif self.config["mode"] == "MirrorChyan":
self.download_task1()
self.start_download()
elif self.config["mode"] == "MirrorChyan":
self.download_task1()
self.start_download()
def get_download_url(self, mode: str) -> Union[str, Dict[str, str]]:
"""获取下载链接"""
"""
生成下载链接
:param mode: "测速""下载"
:return: 测速模式返回 url 字典,下载模式返回 url 字符串
"""
url_dict = {}
@@ -362,7 +391,8 @@ class DownloadManager(QDialog):
if response.status_code == 200:
return response.url
def test_speed_task1(self) -> None:
def start_test_speed(self) -> None:
"""启动测速任务下载4MB文件以测试下载速度"""
if self.isInterruptionRequested:
return None
@@ -370,7 +400,7 @@ class DownloadManager(QDialog):
url_dict = self.get_download_url("测速")
self.test_speed_result: Dict[str, float] = {}
logger.info(f"测速链接:{url_dict}")
logger.info(f"开始测速任务,链接:{url_dict}", module="下载管理器")
for name, url in url_dict.items():
@@ -387,10 +417,11 @@ class DownloadManager(QDialog):
)
self.test_speed_result[name] = -1
self.download_process_dict[name].accomplish.connect(
partial(self.test_speed_task2, name)
partial(self.check_test_speed, name)
)
self.download_process_dict[name].start()
# 创建防超时定时器30秒后强制停止测速
timer = QTimer(self)
timer.setSingleShot(True)
timer.timeout.connect(partial(self.kill_speed_test, name))
@@ -401,11 +432,22 @@ class DownloadManager(QDialog):
self.update_progress(0, 1, 0)
def kill_speed_test(self, name: str) -> None:
"""
强制停止测速任务
:param name: 测速任务的名称
"""
if name in self.download_process_dict:
self.download_process_dict[name].requestInterruption()
def test_speed_task2(self, name: str, t: float) -> None:
def check_test_speed(self, name: str, t: float) -> None:
"""
更新测速子任务wc信息并检查测速任务是否允许结束
:param name: 测速任务的名称
:param t: 测速任务的耗时
"""
# 计算下载速度
if self.isInterruptionRequested:
@@ -453,12 +495,13 @@ class DownloadManager(QDialog):
# 保存测速结果
self.config["speed_result"] = self.test_speed_result
logger.info(f"测速结果:{self.test_speed_result}")
logger.success(f"测速完成,结果:{self.test_speed_result}", module="下载管理器")
self.update_info("测速完成!")
self.speed_test_accomplish.emit()
def download_task1(self) -> None:
def start_download(self) -> None:
"""开始下载任务"""
if self.isInterruptionRequested:
return None
@@ -466,6 +509,8 @@ class DownloadManager(QDialog):
url = self.get_download_url("下载")
self.downloaded_size_list: List[List[int, bool]] = []
logger.info(f"开始下载任务,链接:{url}", module="下载管理器")
response = requests.head(
url,
timeout=10,
@@ -506,20 +551,27 @@ class DownloadManager(QDialog):
)
self.downloaded_size_list.append([0, False])
self.download_process_dict[f"part{i}"].progress.connect(
partial(self.download_task2, i)
partial(self.update_download, i)
)
self.download_process_dict[f"part{i}"].accomplish.connect(
partial(self.download_task3, i)
partial(self.check_download, i)
)
self.download_process_dict[f"part{i}"].start()
def download_task2(self, index: str, current: int) -> None:
"""更新下载进度"""
def update_download(self, index: str, current: int) -> None:
"""
更新子任务下载进度,将信息更新到 UI 上
:param index: 下载任务的索引
:param current: 当前下载大小
"""
# 更新指定线程的下载进度
self.downloaded_size_list[index][0] = current
self.downloaded_size = sum([_[0] for _ in self.downloaded_size_list])
self.update_progress(0, self.file_size, self.downloaded_size)
# 速度每秒更新一次
if time.time() - self.last_time >= 1.0:
self.speed = (
(self.downloaded_size - self.last_download_size)
@@ -538,7 +590,13 @@ class DownloadManager(QDialog):
f"正在下载:{self.name} 已下载:{self.downloaded_size / 1048576:.2f}/{self.file_size / 1048576:.2f} MB {self.downloaded_size / self.file_size * 100:.2f}% 下载速度:{self.speed:.2f} KB/s",
)
def download_task3(self, index: str, t: float) -> None:
def check_download(self, index: str, t: float) -> None:
"""
更新下载子任务完成信息,检查下载任务是否完成,完成后自动执行后续处理任务
:param index: 下载任务的索引
:param t: 下载任务的耗时
"""
# 标记下载线程完成
self.downloaded_size_list[index][1] = True
@@ -560,7 +618,8 @@ class DownloadManager(QDialog):
# 合并下载的分段文件
logger.info(
f"所有分段下载完成:{self.name},开始合并分段文件到 {self.download_path}"
f"所有分段下载完成:{self.name},开始合并分段文件到 {self.download_path}",
module="下载管理器",
)
with self.download_path.open(mode="wb") as outfile:
for i in range(self.config["thread_numb"]):
@@ -571,7 +630,8 @@ class DownloadManager(QDialog):
self.download_path.with_suffix(f".part{i}").unlink()
logger.success(
f"合并完成:{self.name},下载文件大小:{self.download_path.stat().st_size} 字节"
f"合并完成:{self.name},下载文件大小:{self.download_path.stat().st_size} 字节",
module="下载管理器",
)
self.update_info("正在解压更新文件")
@@ -610,9 +670,21 @@ class DownloadManager(QDialog):
self.download_accomplish.emit()
def update_info(self, text: str) -> None:
"""
更新信息文本
:param text: 要显示的信息文本
"""
self.info.setText(text)
def update_progress(self, begin: int, end: int, current: int) -> None:
"""
更新进度条
:param begin: 进度条起始值
:param end: 进度条结束值
:param current: 进度条当前值
"""
if begin == 0 and end == 0:
self.progress_2.setVisible(False)
@@ -626,7 +698,7 @@ class DownloadManager(QDialog):
def requestInterruption(self) -> None:
"""请求中断下载任务"""
logger.info("收到下载任务中止请求")
logger.info("收到下载任务中止请求", module="下载管理器")
self.isInterruptionRequested = True

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import (
QWidget,
QVBoxLayout,
@@ -51,11 +50,12 @@ from pathlib import Path
from typing import List, Dict
from app.core import Config, SoundPlayer
from app.core import Config, SoundPlayer, logger
from .Widget import StatefulItemCard, QuantifiedItemCard, QuickExpandGroupCard
class History(QWidget):
"""历史记录界面"""
def __init__(self, parent=None):
super().__init__(parent)
@@ -81,10 +81,21 @@ class History(QWidget):
self.history_card_list = []
def reload_history(self, mode: str, start_date: QDate, end_date: QDate) -> None:
"""加载历史记录界面"""
"""
加载历史记录界面
:param mode: 查询模式
:param start_date: 查询范围起始日期
:param end_date: 查询范围结束日期
"""
logger.info(
f"查询历史记录: {mode}, {start_date.toString()}, {end_date.toString()}",
module="历史记录",
)
SoundPlayer.play("历史记录查询")
# 清空已有的历史记录卡片
while self.content_layout.count() > 0:
item = self.content_layout.takeAt(0)
if item.spacerItem():
@@ -100,6 +111,7 @@ class History(QWidget):
datetime(end_date.year(), end_date.month(), end_date.day()),
)
# 生成历史记录卡片并添加到布局中
for date, user_dict in history_dict.items():
self.history_card_list.append(self.HistoryCard(date, user_dict, self))
@@ -154,7 +166,13 @@ class History(QWidget):
Layout.addWidget(self.search)
def select_date(self, date: str) -> None:
"""选中最近一段时间并启动查询"""
"""
选中最近一段时间并启动查询
:param date: 选择的时间段("week""month"
"""
logger.info(f"选择最近{date}的记录并开始查询", module="历史记录")
server_date = Config.server_date()
if date == "week":
@@ -187,6 +205,7 @@ class History(QWidget):
self.user_history_card_list = []
# 生成用户历史记录卡片并添加到布局中
for user, info in user_dict.items():
self.user_history_card_list.append(
self.UserHistoryCard(user, info, self)
@@ -219,7 +238,12 @@ class History(QWidget):
self.update_info("数据总览")
def get_statistics(self, mode: str) -> dict:
"""生成GUI相应结构化统计数据"""
"""
生成GUI相应结构化统计数据
:param mode: 查询模式
:return: 结构化统计数据
"""
history_info = Config.merge_statistic_info(
self.user_history if mode == "数据总览" else [Path(mode)]
@@ -244,7 +268,11 @@ class History(QWidget):
return statistics_info
def update_info(self, index: str) -> None:
"""更新信息"""
"""
更新信息到UI界面
:param index: 选择的索引
"""
# 移除已有统计信息UI组件
while self.statistics_card.count() > 0:
@@ -254,8 +282,10 @@ class History(QWidget):
elif item.widget():
item.widget().deleteLater()
# 统计信息上传至 UI
if index == "数据总览":
# 生成数据统计信息卡片组
for name, item_list in self.get_statistics("数据总览").items():
statistics_card = self.StatisticsCard(name, item_list, self)
@@ -268,10 +298,12 @@ class History(QWidget):
single_history = self.get_statistics(index)
log_path = Path(index).with_suffix(".log")
# 生成单个历史记录的统计信息卡片组
for name, item_list in single_history.items():
statistics_card = self.StatisticsCard(name, item_list, self)
self.statistics_card.addWidget(statistics_card)
# 显示日志信息并绑定点击事件
with log_path.open("r", encoding="utf-8") as f:
log = f.read()
@@ -291,6 +323,7 @@ class History(QWidget):
self.setMinimumHeight(300)
class IndexCard(HeaderCardWidget):
"""历史记录索引卡片组"""
index_changed = Signal(str)
@@ -304,9 +337,11 @@ class History(QWidget):
self.index_cards: List[StatefulItemCard] = []
# 生成索引卡片信息
index_list = Config.merge_statistic_info(history_list)["index"]
index_list.insert(0, ["数据总览", "运行", "数据总览"])
# 生成索引卡片组件并绑定点击事件
for index in index_list:
self.index_cards.append(StatefulItemCard(index[:2]))
@@ -318,6 +353,7 @@ class History(QWidget):
self.Layout.addStretch(1)
class StatisticsCard(HeaderCardWidget):
"""历史记录统计信息卡片组"""
def __init__(self, name: str, item_list: list, parent=None):
super().__init__(parent)
@@ -340,6 +376,7 @@ class History(QWidget):
self.Layout.addStretch(1)
class LogCard(HeaderCardWidget):
"""历史记录日志卡片"""
def __init__(self, parent=None):
super().__init__(parent)

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import (
QWidget,
QVBoxLayout,
@@ -49,7 +48,7 @@ import json
from datetime import datetime
from pathlib import Path
from app.core import Config, MainInfoBar, Network
from app.core import Config, MainInfoBar, Network, logger
from .Widget import Banner, IconButton
@@ -160,8 +159,12 @@ class Home(QWidget):
def get_home_image(self) -> None:
"""获取主页图片"""
logger.info("获取主页图片", module="主页")
if Config.get(Config.function_HomeImageMode) == "默认":
pass
logger.info("使用默认主页图片", module="主页")
elif Config.get(Config.function_HomeImageMode) == "自定义":
file_path, _ = QFileDialog.getOpenFileName(
@@ -180,7 +183,7 @@ class Home(QWidget):
/ f"resources/images/Home/BannerCustomize{Path(file_path).suffix}",
)
logger.info(f"自定义主页图片更换成功:{file_path}")
logger.info(f"自定义主页图片更换成功:{file_path}", module="主页")
MainInfoBar.push_info_bar(
"success",
"主页图片更换成功",
@@ -189,7 +192,7 @@ class Home(QWidget):
)
else:
logger.warning("自定义主页图片更换失败:未选择图片文件")
logger.warning("自定义主页图片更换失败:未选择图片文件", module="主页")
MainInfoBar.push_info_bar(
"warning",
"主页图片更换失败",
@@ -198,7 +201,7 @@ class Home(QWidget):
)
elif Config.get(Config.function_HomeImageMode) == "主题图像":
# 从远程服务器获取最新主题图像
# 从远程服务器获取最新主题图像信息
network = Network.add_task(
mode="get",
url="https://gitee.com/DLmaster_361/AUTO_MAA/raw/server/theme_image.json",
@@ -209,7 +212,8 @@ class Home(QWidget):
theme_image = network_result["response_json"]
else:
logger.warning(
f"获取最新主题图像时出错:{network_result['error_message']}"
f"获取最新主题图像时出错:{network_result['error_message']}",
module="主页",
)
MainInfoBar.push_info_bar(
"warning",
@@ -230,6 +234,7 @@ class Home(QWidget):
else:
time_local = datetime.strptime("2000-01-01 00:00", "%Y-%m-%d %H:%M")
# 检查主题图像是否需要更新
if not (
Config.app_path / "resources/images/Home/BannerTheme.jpg"
).exists() or (
@@ -253,7 +258,9 @@ class Home(QWidget):
) as f:
json.dump(theme_image, f, ensure_ascii=False, indent=4)
logger.success(f"主题图像「{theme_image["name"]}」下载成功")
logger.success(
f"主题图像「{theme_image["name"]}」下载成功", module="主页"
)
MainInfoBar.push_info_bar(
"success",
"主题图像下载成功",
@@ -264,7 +271,8 @@ class Home(QWidget):
else:
logger.warning(
f"下载最新主题图像时出错:{network_result['error_message']}"
f"下载最新主题图像时出错:{network_result['error_message']}",
module="主页",
)
MainInfoBar.push_info_bar(
"warning",
@@ -275,18 +283,16 @@ class Home(QWidget):
else:
logger.info("主题图像已是最新")
logger.info("主题图像已是最新", module="主页")
MainInfoBar.push_info_bar(
"info",
"主题图像已是最新",
"主题图像已是最新!",
3000,
"info", "主题图像已是最新", "主题图像已是最新!", 3000
)
self.set_banner()
def set_banner(self):
"""设置主页图像"""
if Config.get(Config.function_HomeImageMode) == "默认":
self.banner.set_banner_image(
str(Config.app_path / "resources/images/Home/BannerDefault.png")
@@ -366,7 +372,7 @@ class ButtonGroup(SimpleCardWidget):
doc_button = IconButton(
FluentIcon.CHAT.icon(color=QColor("#fff")),
tip_title="官方社群",
tip_content="加入官方群聊AUTO_MAA绝赞DeBug中",
tip_content="加入官方群聊AUTO_MAA绝赞DeBug中",
isTooltip=True,
)
doc_button.setIconSize(QSize(32, 32))

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import QApplication, QSystemTrayIcon
from qfluentwidgets import (
Action,
@@ -45,7 +44,7 @@ from datetime import datetime, timedelta
import shutil
import darkdetect
from app.core import Config, TaskManager, MainTimer, MainInfoBar, SoundPlayer
from app.core import Config, logger, TaskManager, MainTimer, MainInfoBar, SoundPlayer
from app.services import Notify, Crypto, System
from .home import Home
from .member_manager import MemberManager
@@ -57,6 +56,7 @@ from .setting import Setting
class AUTO_MAA(MSFluentWindow):
"""AUTO_MAA主界面"""
def __init__(self):
super().__init__()
@@ -77,9 +77,11 @@ class AUTO_MAA(MSFluentWindow):
self.splashScreen = SplashScreen(self.windowIcon(), self)
self.show_ui("显示主窗口", if_quick=True)
# 设置主窗口的引用,便于各组件访问
Config.main_window = self.window()
# 创建窗口
# 创建各子窗口
logger.info("正在创建各子窗口", module="主窗口")
self.home = Home(self)
self.plan_manager = PlanManager(self)
self.member_manager = MemberManager(self)
@@ -138,8 +140,10 @@ class AUTO_MAA(MSFluentWindow):
NavigationItemPosition.BOTTOM,
)
self.stackedWidget.currentChanged.connect(self.__currentChanged)
logger.success("各子窗口创建完成", module="主窗口")
# 创建系统托盘及其菜单
logger.info("正在创建系统托盘", module="主窗口")
self.tray = QSystemTrayIcon(
QIcon(str(Config.app_path / "resources/icons/AUTO_MAA.ico")), self
)
@@ -181,9 +185,11 @@ class AUTO_MAA(MSFluentWindow):
# 设置托盘菜单
self.tray.setContextMenu(self.tray_menu)
self.tray.activated.connect(self.on_tray_activated)
logger.success("系统托盘创建完成", module="主窗口")
self.set_min_method()
# 绑定各组件信号
Config.sub_info_changed.connect(self.member_manager.refresh_dashboard)
Config.power_sign_changed.connect(self.dispatch_center.update_power_sign)
TaskManager.create_gui.connect(self.dispatch_center.add_board)
@@ -205,6 +211,8 @@ class AUTO_MAA(MSFluentWindow):
self.themeListener.systemThemeChanged.connect(self.switch_theme)
self.themeListener.start()
logger.success("AUTO_MAA主程序初始化完成", module="主窗口")
def switch_theme(self) -> None:
"""切换主题"""
@@ -348,8 +356,10 @@ class AUTO_MAA(MSFluentWindow):
def start_up_task(self) -> None:
"""启动时任务"""
# 清理旧日志
self.clean_old_logs()
logger.info("开始执行启动时任务", module="主窗口")
# 清理旧历史记录
Config.clean_old_history()
# 清理安装包
if (Config.app_path / "AUTO_MAA-Setup.exe").exists():
@@ -373,6 +383,9 @@ class AUTO_MAA(MSFluentWindow):
self.start_main_task()
# 启动定时器
MainTimer.start()
# 获取公告
self.setting.show_notice(if_first=True)
@@ -420,41 +433,16 @@ class AUTO_MAA(MSFluentWindow):
)
System.set_power("KillSelf")
def clean_old_logs(self):
"""
删除超过用户设定天数的日志文件(基于目录日期)
"""
if Config.get(Config.function_HistoryRetentionTime) == 0:
logger.info("由于用户设置日志永久保留,跳过日志清理")
return
deleted_count = 0
for date_folder in (Config.app_path / "history").iterdir():
if not date_folder.is_dir():
continue # 只处理日期文件夹
try:
# 只检查 `YYYY-MM-DD` 格式的文件夹
folder_date = datetime.strptime(date_folder.name, "%Y-%m-%d")
if datetime.now() - folder_date > timedelta(
days=Config.get(Config.function_HistoryRetentionTime)
):
shutil.rmtree(date_folder, ignore_errors=True)
deleted_count += 1
logger.info(f"已删除超期日志目录: {date_folder}")
except ValueError:
logger.warning(f"非日期格式的目录: {date_folder}")
logger.info(f"清理完成: {deleted_count} 个日期目录")
logger.success("启动时任务执行完成", module="主窗口")
def start_main_task(self) -> None:
"""启动主任务"""
logger.info("正在启动主任务", module="主窗口")
if "调度队列_1" in Config.queue_dict:
logger.info("自动添加任务调度队列_1")
logger.info("自动添加任务调度队列_1", module="主窗口")
TaskManager.add_task(
"自动代理_主调度台",
"调度队列_1",
@@ -463,18 +451,22 @@ class AUTO_MAA(MSFluentWindow):
elif "脚本_1" in Config.member_dict:
logger.info("自动添加任务脚本_1")
logger.info("自动添加任务脚本_1", module="主窗口")
TaskManager.add_task(
"自动代理_主调度台", "自定义队列", {"Queue": {"Member_1": "脚本_1"}}
)
else:
logger.warning("启动主任务失败:未找到有效的主任务配置文件")
logger.warning(
"启动主任务失败:未找到有效的主任务配置文件", module="主窗口"
)
MainInfoBar.push_info_bar(
"warning", "启动主任务失败", "「调度队列_1」与「脚本_1」均不存在", -1
)
logger.success("主任务启动完成", module="主窗口")
def __currentChanged(self, index: int) -> None:
"""切换界面时任务"""
@@ -489,20 +481,18 @@ class AUTO_MAA(MSFluentWindow):
def closeEvent(self, event: QCloseEvent):
"""清理残余进程"""
logger.info("保存窗口位置与大小信息", module="主窗口")
self.show_ui("隐藏到托盘", if_quick=True)
# 清理各功能线程
MainTimer.Timer.stop()
MainTimer.Timer.deleteLater()
MainTimer.LongTimer.stop()
MainTimer.LongTimer.deleteLater()
MainTimer.stop()
TaskManager.stop_task("ALL")
# 关闭主题监听
self.themeListener.terminate()
self.themeListener.deleteLater()
logger.info("AUTO_MAA主程序关闭")
logger.info("----------------END----------------")
logger.info("AUTO_MAA主程序关闭", module="主窗口")
logger.info("----------------END----------------", module="主窗口")
event.accept()

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import (
QWidget,
QFileDialog,
@@ -61,6 +60,7 @@ import json
from app.core import (
Config,
logger,
MainInfoBar,
TaskManager,
MaaConfig,
@@ -109,31 +109,22 @@ class MemberManager(QWidget):
layout = QVBoxLayout(self)
self.tools = CommandBar()
self.member_manager = self.MemberSettingBox(self)
# 逐个添加动作
self.tools.addActions(
[
Action(FluentIcon.ADD_TO, "新建脚本实例", triggered=self.add_member),
Action(
FluentIcon.ADD_TO, "新建脚本实例", triggered=self.add_setting_box
),
Action(
FluentIcon.REMOVE_FROM,
"删除脚本实例",
triggered=self.del_setting_box,
FluentIcon.REMOVE_FROM, "删除脚本实例", triggered=self.del_member
),
]
)
self.tools.addSeparator()
self.tools.addActions(
[
Action(
FluentIcon.LEFT_ARROW, "移动", triggered=self.left_setting_box
),
Action(
FluentIcon.RIGHT_ARROW, "向右移动", triggered=self.right_setting_box
),
Action(FluentIcon.LEFT_ARROW, "向左移动", triggered=self.left_member),
Action(FluentIcon.RIGHT_ARROW, "移动", triggered=self.right_member),
]
)
self.tools.addSeparator()
@@ -156,7 +147,7 @@ class MemberManager(QWidget):
layout.addWidget(self.tools)
layout.addWidget(self.member_manager)
def add_setting_box(self):
def add_member(self):
"""添加一个脚本实例"""
choice = ComboBoxMessageBox(
@@ -167,10 +158,15 @@ class MemberManager(QWidget):
)
if choice.exec() and choice.input[0].currentIndex() != -1:
logger.info(
f"添加脚本实例: {choice.input[0].currentText()}", module="脚本管理"
)
if choice.input[0].currentText() == "MAA":
index = len(Config.member_dict) + 1
# 初始化 MAA 配置
maa_config = MaaConfig()
maa_config.load(
Config.app_path / f"config/MaaConfig/脚本_{index}/config.json",
@@ -188,12 +184,13 @@ class MemberManager(QWidget):
"UserData": {},
}
# 添加 MAA 实例设置界面
self.member_manager.add_SettingBox(
index, self.MemberSettingBox.MaaSettingBox
)
self.member_manager.switch_SettingBox(index)
logger.success(f"MAA实例 脚本_{index} 添加成功")
logger.success(f"MAA实例 脚本_{index} 添加成功", module="脚本管理")
MainInfoBar.push_info_bar(
"success", "操作成功", f"添加 MAA 实例 脚本_{index}", 3000
)
@@ -203,6 +200,7 @@ class MemberManager(QWidget):
index = len(Config.member_dict) + 1
# 初始化通用配置
general_config = GeneralConfig()
general_config.load(
Config.app_path / f"config/GeneralConfig/脚本_{index}/config.json",
@@ -220,31 +218,32 @@ class MemberManager(QWidget):
"SubData": {},
}
# 添加通用实例设置界面
self.member_manager.add_SettingBox(
index, self.MemberSettingBox.GeneralSettingBox
)
self.member_manager.switch_SettingBox(index)
logger.success(f"通用实例 脚本_{index} 添加成功")
logger.success(f"通用实例 脚本_{index} 添加成功", module="脚本管理")
MainInfoBar.push_info_bar(
"success", "操作成功", f"添加通用实例 脚本_{index}", 3000
)
SoundPlayer.play("添加脚本实例")
def del_setting_box(self):
def del_member(self):
"""删除一个脚本实例"""
name = self.member_manager.pivot.currentRouteKey()
if name is None:
logger.warning("删除脚本实例时未选择脚本实例")
logger.warning("删除脚本实例时未选择脚本实例", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("删除脚本实例时调度队列未停止运行")
logger.warning("删除脚本实例时调度队列未停止运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
@@ -253,8 +252,11 @@ class MemberManager(QWidget):
choice = MessageBox("确认", f"确定要删除 {name} 实例吗?", self.window())
if choice.exec():
logger.info(f"正在删除脚本实例: {name}", module="脚本管理")
self.member_manager.clear_SettingBox()
# 删除脚本实例的配置文件并同步修改相应配置项
shutil.rmtree(Config.member_dict[name]["Path"])
Config.change_queue(name, "禁用")
for i in range(int(name[3:]) + 1, len(Config.member_dict) + 1):
@@ -266,19 +268,19 @@ class MemberManager(QWidget):
self.member_manager.show_SettingBox(max(int(name[3:]) - 1, 1))
logger.success(f"脚本实例 {name} 删除成功")
logger.success(f"脚本实例 {name} 删除成功", module="脚本管理")
MainInfoBar.push_info_bar(
"success", "操作成功", f"删除脚本实例 {name}", 3000
)
SoundPlayer.play("删除脚本实例")
def left_setting_box(self):
def left_member(self):
"""向左移动脚本实例"""
name = self.member_manager.pivot.currentRouteKey()
if name is None:
logger.warning("向左移动脚本实例时未选择脚本实例")
logger.warning("向左移动脚本实例时未选择脚本实例", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000
)
@@ -287,21 +289,24 @@ class MemberManager(QWidget):
index = int(name[3:])
if index == 1:
logger.warning("向左移动脚本实例时已到达最左端")
logger.warning("向左移动脚本实例时已到达最左端", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "已经是第一个脚本实例", "无法向左移动", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("向左移动脚本实例时调度队列未停止运行")
logger.warning("向左移动脚本实例时调度队列未停止运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
logger.info(f"正在向左移动脚本实例: {name}", module="脚本管理")
self.member_manager.clear_SettingBox()
# 移动脚本实例配置文件并同步修改配置项
Config.member_dict[name]["Path"].rename(
Config.member_dict[name]["Path"].with_name("脚本_0")
)
@@ -317,16 +322,16 @@ class MemberManager(QWidget):
self.member_manager.show_SettingBox(index - 1)
logger.success(f"脚本实例 {name} 左移成功")
logger.success(f"脚本实例 {name} 左移成功", module="脚本管理")
MainInfoBar.push_info_bar("success", "操作成功", f"左移脚本实例 {name}", 3000)
def right_setting_box(self):
def right_member(self):
"""向右移动脚本实例"""
name = self.member_manager.pivot.currentRouteKey()
if name is None:
logger.warning("向右移动脚本实例时未选择脚本实例")
logger.warning("向右移动脚本实例时未选择脚本实例", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000
)
@@ -335,21 +340,24 @@ class MemberManager(QWidget):
index = int(name[3:])
if index == len(Config.member_dict):
logger.warning("向右移动脚本实例时已到达最右端")
logger.warning("向右移动脚本实例时已到达最右端", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "已经是最后一个脚本实例", "无法向右移动", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("向右移动脚本实例时调度队列未停止运行")
logger.warning("向右移动脚本实例时调度队列未停止运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
logger.info(f"正在向右移动脚本实例: {name}", module="脚本管理")
self.member_manager.clear_SettingBox()
# 移动脚本实例配置文件并同步修改配置项
Config.member_dict[name]["Path"].rename(
Config.member_dict[name]["Path"].with_name("脚本_0")
)
@@ -365,7 +373,7 @@ class MemberManager(QWidget):
self.member_manager.show_SettingBox(index + 1)
logger.success(f"脚本实例 {name} 右移成功")
logger.success(f"脚本实例 {name} 右移成功", module="脚本管理")
MainInfoBar.push_info_bar("success", "操作成功", f"右移脚本实例 {name}", 3000)
def member_downloader(self):
@@ -373,7 +381,7 @@ class MemberManager(QWidget):
if not Config.get(Config.update_MirrorChyanCDK):
logger.warning("脚本下载器未设置CDK")
logger.warning("脚本下载器未设置CDK", module="脚本管理")
MainInfoBar.push_info_bar(
"warning",
"未设置Mirror酱CDK",
@@ -392,7 +400,10 @@ class MemberManager(QWidget):
if network_result["status_code"] == 200:
apps_info = network_result["response_json"]
else:
logger.warning(f"获取应用列表时出错:{network_result['error_message']}")
logger.warning(
f"获取应用列表时出错:{network_result['error_message']}",
module="脚本管理",
)
MainInfoBar.push_info_bar(
"warning",
"获取应用列表时出错",
@@ -419,7 +430,9 @@ class MemberManager(QWidget):
str(Config.app_path / f"script/{app_rid}"),
)
if not folder:
logger.warning(f"选择{app_name}下载目录时未选择文件夹")
logger.warning(
f"选择{app_name}下载目录时未选择文件夹", module="脚本管理"
)
MainInfoBar.push_info_bar(
"warning", "警告", f"未选择{app_name}下载目录", 5000
)
@@ -442,7 +455,10 @@ class MemberManager(QWidget):
if app_info["code"] != 0:
logger.error(f"获取版本信息时出错:{app_info["msg"]}")
logger.error(
f"获取应用版本信息时出错:{app_info["msg"]}",
module="脚本管理",
)
error_remark_dict = {
1001: "获取版本信息的URL参数不正确",
@@ -475,7 +491,10 @@ class MemberManager(QWidget):
return None
logger.warning(f"获取版本信息时出错:{network_result['error_message']}")
logger.warning(
f"获取版本信息时出错:{network_result['error_message']}",
module="脚本管理",
)
MainInfoBar.push_info_bar(
"warning",
"获取版本信息时出错",
@@ -484,6 +503,8 @@ class MemberManager(QWidget):
)
return None
# 创建下载管理器并开始下载
logger.info(f"开始下载{app_name},下载目录:{folder}", module="脚本管理")
self.downloader = DownloadManager(
Path(folder),
app_rid,
@@ -502,6 +523,7 @@ class MemberManager(QWidget):
self.downloader.run()
def show_password(self):
"""显示或隐藏密码"""
if Config.PASSWORD == "":
choice = LineEditMessageBox(
@@ -529,6 +551,7 @@ class MemberManager(QWidget):
def reload_plan_name(self):
"""刷新计划表名称"""
# 生成计划列表信息
plan_list = [
["固定"] + [_ for _ in Config.plan_dict.keys()],
["固定"]
@@ -541,6 +564,8 @@ class MemberManager(QWidget):
for k, v in Config.plan_dict.items()
],
]
# 刷新所有脚本实例的计划表名称
for member in self.member_manager.script_list:
if isinstance(member, MemberManager.MemberSettingBox.MaaSettingBox):
@@ -616,7 +641,12 @@ class MemberManager(QWidget):
self.show_SettingBox(1)
def show_SettingBox(self, index) -> None:
"""加载所有子界面"""
"""
加载所有子界面并切换到指定子界面
:param index: 要切换到的子界面索引
:type index: int
"""
Config.search_member()
@@ -629,7 +659,14 @@ class MemberManager(QWidget):
self.switch_SettingBox(index)
def switch_SettingBox(self, index: int, if_chang_pivot: bool = True) -> None:
"""切换到指定的子界面"""
"""
切换到指定的子界面
:param index: 要切换到的子界面索引
:type index: int
:param if_chang_pivot: 是否更改导航栏的当前项
:type if_chang_pivot: bool
"""
if len(Config.member_dict) == 0:
return None
@@ -666,7 +703,14 @@ class MemberManager(QWidget):
self.pivot.clear()
def add_SettingBox(self, uid: int, type: Type) -> None:
"""添加指定类型设置子界面"""
"""
添加指定类型设置子界面
:param uid: 脚本实例的唯一标识符
:type uid: int
:param type: 要添加的设置子界面类型
:type type: Type
"""
if type == self.MaaSettingBox:
setting_box = self.MaaSettingBox(uid, self)
@@ -762,6 +806,7 @@ class MemberManager(QWidget):
self.viewLayout.addLayout(Layout)
def PathClicked(self):
"""选择MAA目录并验证"""
folder = QFileDialog.getExistingDirectory(
self,
@@ -769,7 +814,9 @@ class MemberManager(QWidget):
self.config.get(self.config.MaaSet_Path),
)
if not folder or self.config.get(self.config.MaaSet_Path) == folder:
logger.warning("选择MAA目录时未选择文件夹或未更改文件夹")
logger.warning(
"选择MAA目录时未选择文件夹或未更改文件夹", module="脚本管理"
)
MainInfoBar.push_info_bar(
"warning", "警告", "未选择文件夹或未更改文件夹", 5000
)
@@ -778,7 +825,9 @@ class MemberManager(QWidget):
not (Path(folder) / "config/gui.json").exists()
or not (Path(folder) / "MAA.exe").exists()
):
logger.warning("选择MAA目录时未找到MAA程序或配置文件")
logger.warning(
"选择MAA目录时未找到MAA程序或配置文件", module="脚本管理"
)
MainInfoBar.push_info_bar(
"warning", "警告", "未找到MAA程序或配置文件", 5000
)
@@ -938,6 +987,9 @@ class MemberManager(QWidget):
index = len(Config.member_dict[self.name]["UserData"]) + 1
logger.info(f"正在添加 {self.name} 用户_{index}", module="脚本管理")
# 初始化用户配置信息
user_config = MaaUserConfig()
user_config.load(
Config.member_dict[self.name]["Path"]
@@ -952,10 +1004,13 @@ class MemberManager(QWidget):
"Config": user_config,
}
# 添加用户设置面板
self.user_manager.add_userSettingBox(index)
self.user_manager.switch_SettingBox(f"用户_{index}")
logger.success(f"{self.name} 用户_{index} 添加成功")
logger.success(
f"{self.name} 用户_{index} 添加成功", module="脚本管理"
)
MainInfoBar.push_info_bar(
"success", "操作成功", f"{self.name} 添加 用户_{index}", 3000
)
@@ -967,20 +1022,20 @@ class MemberManager(QWidget):
name = self.user_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择用户")
logger.warning("未选择用户", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择用户", "请先选择一个用户", 5000
)
return None
if name == "用户仪表盘":
logger.warning("试图删除用户仪表盘")
logger.warning("试图删除用户仪表盘", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择用户", "请勿尝试删除用户仪表盘", 5000
)
return None
if self.name in Config.running_list:
logger.warning("所属脚本正在运行")
logger.warning("所属脚本正在运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "所属脚本正在运行", "请先停止任务", 5000
)
@@ -991,8 +1046,11 @@ class MemberManager(QWidget):
)
if choice.exec():
logger.info(f"正在删除 {self.name} {name}", module="脚本管理")
self.user_manager.clear_SettingBox()
# 删除用户配置文件并同步修改相应配置项
shutil.rmtree(
Config.member_dict[self.name]["UserData"][name]["Path"]
)
@@ -1015,7 +1073,9 @@ class MemberManager(QWidget):
f"用户_{max(int(name[3:]) - 1, 1)}"
)
logger.success(f"{self.name} {name} 删除成功")
logger.success(
f"{self.name} {name} 删除成功", module="脚本管理"
)
MainInfoBar.push_info_bar(
"success", "操作成功", f"{self.name} 删除 {name}", 3000
)
@@ -1027,13 +1087,13 @@ class MemberManager(QWidget):
name = self.user_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择用户")
logger.warning("未选择用户", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择用户", "请先选择一个用户", 5000
)
return None
if name == "用户仪表盘":
logger.warning("试图移动用户仪表盘")
logger.warning("试图移动用户仪表盘", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择用户", "请勿尝试移动用户仪表盘", 5000
)
@@ -1042,21 +1102,24 @@ class MemberManager(QWidget):
index = int(name[3:])
if index == 1:
logger.warning("向前移动用户时已到达最左端")
logger.warning("向前移动用户时已到达最左端", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "已经是第一个用户", "无法向前移动", 5000
)
return None
if self.name in Config.running_list:
logger.warning("所属脚本正在运行")
logger.warning("所属脚本正在运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "所属脚本正在运行", "请先停止任务", 5000
)
return None
logger.info(f"正在向前移动 {self.name} {name}", module="脚本管理")
self.user_manager.clear_SettingBox()
# 移动用户配置文件并同步修改配置项
Config.member_dict[self.name]["UserData"][name]["Path"].rename(
Config.member_dict[self.name]["UserData"][name][
"Path"
@@ -1075,7 +1138,7 @@ class MemberManager(QWidget):
self.user_manager.show_SettingBox(f"用户_{index - 1}")
logger.success(f"{self.name} {name} 前移成功")
logger.success(f"{self.name} {name} 前移成功", module="脚本管理")
MainInfoBar.push_info_bar(
"success", "操作成功", f"{self.name} 前移 {name}", 3000
)
@@ -1086,13 +1149,13 @@ class MemberManager(QWidget):
name = self.user_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择用户")
logger.warning("未选择用户", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择用户", "请先选择一个用户", 5000
)
return None
if name == "用户仪表盘":
logger.warning("试图删除用户仪表盘")
logger.warning("试图删除用户仪表盘", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择用户", "请勿尝试移动用户仪表盘", 5000
)
@@ -1101,19 +1164,21 @@ class MemberManager(QWidget):
index = int(name[3:])
if index == len(Config.member_dict[self.name]["UserData"]):
logger.warning("向后移动用户时已到达最右端")
logger.warning("向后移动用户时已到达最右端", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "已经是最后一个用户", "无法向后移动", 5000
)
return None
if self.name in Config.running_list:
logger.warning("所属脚本正在运行")
logger.warning("所属脚本正在运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "所属脚本正在运行", "请先停止任务", 5000
)
return None
logger.info(f"正在向后移动 {self.name} {name}", module="脚本管理")
self.user_manager.clear_SettingBox()
Config.member_dict[self.name]["UserData"][name]["Path"].rename(
@@ -1134,7 +1199,7 @@ class MemberManager(QWidget):
self.user_manager.show_SettingBox(f"用户_{index + 1}")
logger.success(f"{self.name} {name} 后移成功")
logger.success(f"{self.name} {name} 后移成功", module="脚本管理")
MainInfoBar.push_info_bar(
"success", "操作成功", f"{self.name} 后移 {name}", 3000
)
@@ -1180,7 +1245,12 @@ class MemberManager(QWidget):
self.show_SettingBox("用户仪表盘")
def show_SettingBox(self, index: str) -> None:
"""加载所有子界面"""
"""
加载所有子界面并切换到指定子界面
:param index: 要切换到的子界面索引或名称
:type index: str
"""
Config.search_maa_user(self.name)
@@ -1192,7 +1262,14 @@ class MemberManager(QWidget):
def switch_SettingBox(
self, index: str, if_change_pivot: bool = True
) -> None:
"""切换到指定的子界面"""
"""
切换到指定的子界面
:param index: 要切换到的子界面索引或名称
:type index: str
:param if_change_pivot: 是否更改导航栏的当前项
:type if_change_pivot: bool
"""
if len(Config.member_dict[self.name]["UserData"]) == 0:
index = "用户仪表盘"
@@ -1214,7 +1291,7 @@ class MemberManager(QWidget):
)
def clear_SettingBox(self) -> None:
"""清空所有子界面"""
"""清空除用户仪表盘外所有子界面"""
for sub_interface in self.script_list:
Config.stage_refreshed.disconnect(
@@ -1232,7 +1309,12 @@ class MemberManager(QWidget):
self.pivot.addItem(routeKey="用户仪表盘", text="用户仪表盘")
def add_userSettingBox(self, uid: int) -> None:
"""添加一个用户设置界面"""
"""
添加一个用户设置界面
:param uid: 用户的唯一标识符
:type uid: int
"""
setting_box = self.UserMemberSettingBox(self.name, uid, self)
@@ -1292,6 +1374,12 @@ class MemberManager(QWidget):
Config.PASSWORD_refreshed.connect(self.load_info)
def load_info(self):
"""加载用户信息到仪表盘"""
logger.info(
f"正在加载 {self.name} 用户信息到仪表盘",
module="脚本管理",
)
self.user_data = Config.member_dict[self.name]["UserData"]
@@ -1452,6 +1540,10 @@ class MemberManager(QWidget):
int(name[3:]) - 1, 11, button
)
logger.success(
f"{self.name} 用户仪表盘成功加载信息", module="脚本管理"
)
class UserMemberSettingBox(HeaderCardWidget):
"""用户管理子页面"""
@@ -1915,6 +2007,7 @@ class MemberManager(QWidget):
self.switch_infrastructure()
def switch_mode(self) -> None:
"""切换用户配置模式"""
if self.config.get(self.config.Info_Mode) == "简洁":
@@ -1931,6 +2024,7 @@ class MemberManager(QWidget):
self.card_Routine.setVisible(True)
def switch_stage_mode(self) -> None:
"""切换关卡配置模式"""
for card, name in zip(
[
@@ -1967,6 +2061,7 @@ class MemberManager(QWidget):
)
def switch_infrastructure(self) -> None:
"""切换基建配置模式"""
if (
self.config.get(self.config.Info_InfrastMode)
@@ -1988,6 +2083,7 @@ class MemberManager(QWidget):
)
def refresh_stage(self):
"""刷新关卡配置"""
self.card_Stage.reLoadOptions(
Config.stage_dict["ALL"]["value"],
@@ -2011,6 +2107,7 @@ class MemberManager(QWidget):
)
def refresh_password(self):
"""刷新密码配置"""
self.card_Password.setValue(
self.card_Password.qconfig.get(
@@ -2054,7 +2151,7 @@ class MemberManager(QWidget):
"""配置MAA子配置"""
if self.name in Config.running_list:
logger.warning("所属脚本正在运行")
logger.warning("所属脚本正在运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "所属脚本正在运行", "请先停止任务", 5000
)
@@ -2463,7 +2560,12 @@ class MemberManager(QWidget):
self.addGroupWidget(widget)
def change_path(self, old_path: Path, new_path: Path) -> None:
"""根据脚本根目录重新计算配置文件路径"""
"""
根据脚本根目录重新计算配置文件路径
:param old_path: 旧路径
:param new_path: 新路径
"""
path_list = [
self.config.Script_ScriptPath,
@@ -2491,7 +2593,8 @@ class MemberManager(QWidget):
self.config.set(configItem, str(old_path))
logger.warning(
f"配置路径 {new_path} 不在脚本根目录下,已重置为 {old_path}"
f"配置路径 {new_path} 不在脚本根目录下,已重置为 {old_path}",
module="脚本管理",
)
MainInfoBar.push_info_bar(
"warning", "路径异常", "所选路径不在脚本根目录下", 5000
@@ -2738,6 +2841,11 @@ class MemberManager(QWidget):
index = len(Config.member_dict[self.name]["SubData"]) + 1
logger.info(
f"正在添加 {self.name} 的配置_{index}", module="脚本管理"
)
# 初始化通用配置
sub_config = GeneralSubConfig()
sub_config.load(
Config.member_dict[self.name]["Path"]
@@ -2752,10 +2860,13 @@ class MemberManager(QWidget):
"Config": sub_config,
}
# 添加通用配置页面
self.sub_manager.add_SettingBox(index)
self.sub_manager.switch_SettingBox(f"配置_{index}")
logger.success(f"{self.name} 配置_{index} 添加成功")
logger.success(
f"{self.name} 配置_{index} 添加成功", module="脚本管理"
)
MainInfoBar.push_info_bar(
"success", "操作成功", f"{self.name} 添加 配置_{index}", 3000
)
@@ -2767,20 +2878,20 @@ class MemberManager(QWidget):
name = self.sub_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择配置")
logger.warning("未选择配置", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择配置", "请先选择一个配置", 5000
)
return None
if name == "配置仪表盘":
logger.warning("试图删除配置仪表盘")
logger.warning("试图删除配置仪表盘", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择配置", "请勿尝试删除配置仪表盘", 5000
)
return None
if self.name in Config.running_list:
logger.warning("所属脚本正在运行")
logger.warning("所属脚本正在运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "所属脚本正在运行", "请先停止任务", 5000
)
@@ -2791,8 +2902,13 @@ class MemberManager(QWidget):
)
if choice.exec():
logger.info(
f"正在删除 {self.name} 的配置_{name}", module="脚本管理"
)
self.sub_manager.clear_SettingBox()
# 删除配置文件并同步到相关配置项
shutil.rmtree(
Config.member_dict[self.name]["SubData"][name]["Path"]
)
@@ -2815,7 +2931,9 @@ class MemberManager(QWidget):
f"配置_{max(int(name[3:]) - 1, 1)}"
)
logger.success(f"{self.name} {name} 删除成功")
logger.success(
f"{self.name} {name} 删除成功", module="脚本管理"
)
MainInfoBar.push_info_bar(
"success", "操作成功", f"{self.name} 删除 {name}", 3000
)
@@ -2827,13 +2945,13 @@ class MemberManager(QWidget):
name = self.sub_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择配置")
logger.warning("未选择配置", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择配置", "请先选择一个配置", 5000
)
return None
if name == "配置仪表盘":
logger.warning("试图移动配置仪表盘")
logger.warning("试图移动配置仪表盘", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择配置", "请勿尝试移动配置仪表盘", 5000
)
@@ -2842,21 +2960,26 @@ class MemberManager(QWidget):
index = int(name[3:])
if index == 1:
logger.warning("向前移动配置时已到达最左端")
logger.warning("向前移动配置时已到达最左端", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "已经是第一个配置", "无法向前移动", 5000
)
return None
if self.name in Config.running_list:
logger.warning("所属脚本正在运行")
logger.warning("所属脚本正在运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "所属脚本正在运行", "请先停止任务", 5000
)
return None
logger.info(
f"正在将 {self.name} 的配置_{name} 前移", module="脚本管理"
)
self.sub_manager.clear_SettingBox()
# 移动配置文件并同步到相关配置项
Config.member_dict[self.name]["SubData"][name]["Path"].rename(
Config.member_dict[self.name]["SubData"][name][
"Path"
@@ -2875,7 +2998,7 @@ class MemberManager(QWidget):
self.sub_manager.show_SettingBox(f"配置_{index - 1}")
logger.success(f"{self.name} {name} 前移成功")
logger.success(f"{self.name} {name} 前移成功", module="脚本管理")
MainInfoBar.push_info_bar(
"success", "操作成功", f"{self.name} 前移 {name}", 3000
)
@@ -2886,13 +3009,13 @@ class MemberManager(QWidget):
name = self.sub_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择配置")
logger.warning("未选择配置", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择配置", "请先选择一个配置", 5000
)
return None
if name == "配置仪表盘":
logger.warning("试图删除配置仪表盘")
logger.warning("试图删除配置仪表盘", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "未选择配置", "请勿尝试移动配置仪表盘", 5000
)
@@ -2901,21 +3024,26 @@ class MemberManager(QWidget):
index = int(name[3:])
if index == len(Config.member_dict[self.name]["SubData"]):
logger.warning("向后移动配置时已到达最右端")
logger.warning("向后移动配置时已到达最右端", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "已经是最后一个配置", "无法向后移动", 5000
)
return None
if self.name in Config.running_list:
logger.warning("所属脚本正在运行")
logger.warning("所属脚本正在运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "所属脚本正在运行", "请先停止任务", 5000
)
return None
logger.info(
f"正在将 {self.name} 的配置_{name} 后移", module="脚本管理"
)
self.sub_manager.clear_SettingBox()
# 移动配置文件并同步到相关配置项
Config.member_dict[self.name]["SubData"][name]["Path"].rename(
Config.member_dict[self.name]["SubData"][name][
"Path"
@@ -2934,7 +3062,7 @@ class MemberManager(QWidget):
self.sub_manager.show_SettingBox(f"配置_{index + 1}")
logger.success(f"{self.name} {name} 后移成功")
logger.success(f"{self.name} {name} 后移成功", module="脚本管理")
MainInfoBar.push_info_bar(
"success", "操作成功", f"{self.name} 后移 {name}", 3000
)
@@ -2980,7 +3108,11 @@ class MemberManager(QWidget):
self.show_SettingBox("配置仪表盘")
def show_SettingBox(self, index: str) -> None:
"""加载所有子界面"""
"""
加载所有子界面
:param index: 要显示的子界面索引
"""
Config.search_general_sub(self.name)
@@ -2992,7 +3124,12 @@ class MemberManager(QWidget):
def switch_SettingBox(
self, index: str, if_change_pivot: bool = True
) -> None:
"""切换到指定的子界面"""
"""
切换到指定的子界面
:param index: 要切换到的子界面索引
:param if_change_pivot: 是否更改 pivot 的当前项
"""
if len(Config.member_dict[self.name]["SubData"]) == 0:
index = "配置仪表盘"
@@ -3026,7 +3163,11 @@ class MemberManager(QWidget):
self.pivot.addItem(routeKey="配置仪表盘", text="配置仪表盘")
def add_SettingBox(self, uid: int) -> None:
"""添加一个配置设置界面"""
"""
添加一个配置设置界面
:param uid: 配置的唯一标识符
"""
setting_box = self.SubMemberSettingBox(self.name, uid, self)
@@ -3073,6 +3214,12 @@ class MemberManager(QWidget):
Config.PASSWORD_refreshed.connect(self.load_info)
def load_info(self):
"""加载配置仪表盘信息"""
logger.info(
f"正在加载 {self.name} 的配置仪表盘信息",
module="脚本管理",
)
self.sub_data = Config.member_dict[self.name]["SubData"]
@@ -3127,6 +3274,10 @@ class MemberManager(QWidget):
int(name[3:]) - 1, 4, button
)
logger.success(
f"{self.name} 配置仪表盘信息加载成功", module="脚本管理"
)
class SubMemberSettingBox(HeaderCardWidget):
"""配置管理子页面"""
@@ -3302,7 +3453,7 @@ class MemberManager(QWidget):
"""配置子配置"""
if self.name in Config.running_list:
logger.warning("所属脚本正在运行")
logger.warning("所属脚本正在运行", module="脚本管理")
MainInfoBar.push_info_bar(
"warning", "所属脚本正在运行", "请先停止任务", 5000
)

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import (
QWidget,
QVBoxLayout,
@@ -43,7 +42,7 @@ from qfluentwidgets import (
from typing import List, Dict, Union
import shutil
from app.core import Config, MainInfoBar, MaaPlanConfig, SoundPlayer
from app.core import Config, MainInfoBar, MaaPlanConfig, SoundPlayer, logger
from .Widget import (
ComboBoxMessageBox,
LineEditSettingCard,
@@ -66,27 +65,20 @@ class PlanManager(QWidget):
layout = QVBoxLayout(self)
self.tools = CommandBar()
self.plan_manager = self.PlanSettingBox(self)
# 逐个添加动作
self.tools.addActions(
[
Action(FluentIcon.ADD_TO, "新建计划表", triggered=self.add_setting_box),
Action(
FluentIcon.REMOVE_FROM, "删除计划表", triggered=self.del_setting_box
),
Action(FluentIcon.ADD_TO, "新建计划表", triggered=self.add_plan),
Action(FluentIcon.REMOVE_FROM, "删除计划表", triggered=self.del_plan),
]
)
self.tools.addSeparator()
self.tools.addActions(
[
Action(
FluentIcon.LEFT_ARROW, "移动", triggered=self.left_setting_box
),
Action(
FluentIcon.RIGHT_ARROW, "向右移动", triggered=self.right_setting_box
),
Action(FluentIcon.LEFT_ARROW, "向左移动", triggered=self.left_plan),
Action(FluentIcon.RIGHT_ARROW, "移动", triggered=self.right_plan),
]
)
self.tools.addSeparator()
@@ -94,7 +86,7 @@ class PlanManager(QWidget):
layout.addWidget(self.tools)
layout.addWidget(self.plan_manager)
def add_setting_box(self):
def add_plan(self):
"""添加一个计划表"""
choice = ComboBoxMessageBox(
@@ -109,6 +101,7 @@ class PlanManager(QWidget):
index = len(Config.plan_dict) + 1
# 初始化 MaaPlanConfig
maa_plan_config = MaaPlanConfig()
maa_plan_config.load(
Config.app_path / f"config/MaaPlanConfig/计划_{index}/config.json",
@@ -122,29 +115,30 @@ class PlanManager(QWidget):
"Config": maa_plan_config,
}
# 添加计划表到界面
self.plan_manager.add_MaaPlanSettingBox(index)
self.plan_manager.switch_SettingBox(index)
logger.success(f"计划管理 计划_{index} 添加成功")
logger.success(f"计划管理 计划_{index} 添加成功", module="计划管理")
MainInfoBar.push_info_bar(
"success", "操作成功", f"添加计划表 计划_{index}", 3000
)
SoundPlayer.play("添加计划表")
def del_setting_box(self):
def del_plan(self):
"""删除一个计划表"""
name = self.plan_manager.pivot.currentRouteKey()
if name is None:
logger.warning("删除计划表时未选择计划表")
logger.warning("删除计划表时未选择计划表", module="计划管理")
MainInfoBar.push_info_bar(
"warning", "未选择计划表", "请选择一个计划表", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("删除计划表时调度队列未停止运行")
logger.warning("删除计划表时调度队列未停止运行", module="计划管理")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
@@ -153,8 +147,11 @@ class PlanManager(QWidget):
choice = MessageBox("确认", f"确定要删除 {name} 吗?", self.window())
if choice.exec():
logger.info(f"正在删除计划表 {name}", module="计划管理")
self.plan_manager.clear_SettingBox()
# 删除计划表配置文件并同步到相关配置项
shutil.rmtree(Config.plan_dict[name]["Path"])
Config.change_plan(name, "固定")
for i in range(int(name[3:]) + 1, len(Config.plan_dict) + 1):
@@ -166,17 +163,17 @@ class PlanManager(QWidget):
self.plan_manager.show_SettingBox(max(int(name[3:]) - 1, 1))
logger.success(f"计划表 {name} 删除成功")
logger.success(f"计划表 {name} 删除成功", module="计划管理")
MainInfoBar.push_info_bar("success", "操作成功", f"删除计划表 {name}", 3000)
SoundPlayer.play("删除计划表")
def left_setting_box(self):
def left_plan(self):
"""向左移动计划表"""
name = self.plan_manager.pivot.currentRouteKey()
if name is None:
logger.warning("向左移动计划表时未选择计划表")
logger.warning("向左移动计划表时未选择计划表", module="计划管理")
MainInfoBar.push_info_bar(
"warning", "未选择计划表", "请选择一个计划表", 5000
)
@@ -185,21 +182,24 @@ class PlanManager(QWidget):
index = int(name[3:])
if index == 1:
logger.warning("向左移动计划表时已到达最左端")
logger.warning("向左移动计划表时已到达最左端", module="计划管理")
MainInfoBar.push_info_bar(
"warning", "已经是第一个计划表", "无法向左移动", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("向左移动计划表时调度队列未停止运行")
logger.warning("向左移动计划表时调度队列未停止运行", module="计划管理")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
logger.info(f"正在左移计划表 {name}", module="计划管理")
self.plan_manager.clear_SettingBox()
# 移动配置文件并同步到相关配置项
Config.plan_dict[name]["Path"].rename(
Config.plan_dict[name]["Path"].with_name("计划_0")
)
@@ -215,16 +215,16 @@ class PlanManager(QWidget):
self.plan_manager.show_SettingBox(index - 1)
logger.success(f"计划表 {name} 左移成功")
logger.success(f"计划表 {name} 左移成功", module="计划管理")
MainInfoBar.push_info_bar("success", "操作成功", f"左移计划表 {name}", 3000)
def right_setting_box(self):
def right_plan(self):
"""向右移动计划表"""
name = self.plan_manager.pivot.currentRouteKey()
if name is None:
logger.warning("向右移动计划表时未选择计划表")
logger.warning("向右移动计划表时未选择计划表", module="计划管理")
MainInfoBar.push_info_bar(
"warning", "未选择计划表", "请选择一个计划表", 5000
)
@@ -233,21 +233,24 @@ class PlanManager(QWidget):
index = int(name[3:])
if index == len(Config.plan_dict):
logger.warning("向右移动计划表时已到达最右端")
logger.warning("向右移动计划表时已到达最右端", module="计划管理")
MainInfoBar.push_info_bar(
"warning", "已经是最后一个计划表", "无法向右移动", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("向右移动计划表时调度队列未停止运行")
logger.warning("向右移动计划表时调度队列未停止运行", module="计划管理")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
logger.info(f"正在右移计划表 {name}", module="计划管理")
self.plan_manager.clear_SettingBox()
# 移动配置文件并同步到相关配置项
Config.plan_dict[name]["Path"].rename(
Config.plan_dict[name]["Path"].with_name("计划_0")
)
@@ -263,7 +266,7 @@ class PlanManager(QWidget):
self.plan_manager.show_SettingBox(index + 1)
logger.success(f"计划表 {name} 右移成功")
logger.success(f"计划表 {name} 右移成功", module="计划管理")
MainInfoBar.push_info_bar("success", "操作成功", f"右移计划表 {name}", 3000)
class PlanSettingBox(QWidget):
@@ -297,7 +300,11 @@ class PlanManager(QWidget):
self.show_SettingBox(1)
def show_SettingBox(self, index) -> None:
"""加载所有子界面"""
"""
加载所有子界面并切换到指定的子界面
:param index: 要显示的子界面索引
"""
Config.search_plan()
@@ -308,7 +315,12 @@ class PlanManager(QWidget):
self.switch_SettingBox(index)
def switch_SettingBox(self, index: int, if_chang_pivot: bool = True) -> None:
"""切换到指定的子界面"""
"""
切换到指定的子界面
:param index: 要切换到的子界面索引
:param if_chang_pivot: 是否更改 pivot 的当前项
"""
if len(Config.plan_dict) == 0:
return None
@@ -331,7 +343,11 @@ class PlanManager(QWidget):
self.pivot.clear()
def add_MaaPlanSettingBox(self, uid: int) -> None:
"""添加一个MAA设置界面"""
"""
添加一个MAA设置界面
:param uid: MAA计划表的唯一标识符
"""
maa_plan_setting_box = self.MaaPlanSettingBox(uid, self)
@@ -475,6 +491,7 @@ class PlanManager(QWidget):
)
def refresh_stage(self):
"""刷新关卡列表"""
for group, name_dict in self.item_dict.items():

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import (
QWidget,
QVBoxLayout,
@@ -42,7 +41,7 @@ from qfluentwidgets import (
)
from typing import List
from app.core import QueueConfig, Config, MainInfoBar, SoundPlayer
from app.core import QueueConfig, Config, MainInfoBar, SoundPlayer, logger
from .Widget import (
SwitchSettingCard,
ComboBoxSettingCard,
@@ -70,36 +69,31 @@ class QueueManager(QWidget):
# 逐个添加动作
self.tools.addActions(
[
Action(FluentIcon.ADD_TO, "新建调度队列", triggered=self.add_queue),
Action(
FluentIcon.ADD_TO, "新建调度队列", triggered=self.add_setting_box
),
Action(
FluentIcon.REMOVE_FROM,
"删除调度队列",
triggered=self.del_setting_box,
FluentIcon.REMOVE_FROM, "删除调度队列", triggered=self.del_queue
),
]
)
self.tools.addSeparator()
self.tools.addActions(
[
Action(
FluentIcon.LEFT_ARROW, "移动", triggered=self.left_setting_box
),
Action(
FluentIcon.RIGHT_ARROW, "向右移动", triggered=self.right_setting_box
),
Action(FluentIcon.LEFT_ARROW, "向左移动", triggered=self.left_queue),
Action(FluentIcon.RIGHT_ARROW, "移动", triggered=self.right_queue),
]
)
layout.addWidget(self.tools)
layout.addWidget(self.queue_manager)
def add_setting_box(self):
def add_queue(self):
"""添加一个调度队列"""
index = len(Config.queue_dict) + 1
logger.info(f"正在添加调度队列_{index}", module="队列管理")
# 初始化队列配置
queue_config = QueueConfig()
queue_config.load(
Config.app_path / f"config/QueueConfig/调度队列_{index}.json", queue_config
@@ -111,27 +105,28 @@ class QueueManager(QWidget):
"Config": queue_config,
}
# 添加到配置界面
self.queue_manager.add_SettingBox(index)
self.queue_manager.switch_SettingBox(index)
logger.success(f"调度队列_{index} 添加成功")
logger.success(f"调度队列_{index} 添加成功", module="队列管理")
MainInfoBar.push_info_bar("success", "操作成功", f"添加 调度队列_{index}", 3000)
SoundPlayer.play("添加调度队列")
def del_setting_box(self):
def del_queue(self):
"""删除一个调度队列实例"""
name = self.queue_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择调度队列")
logger.warning("未选择调度队列", module="队列管理")
MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000
)
return None
if name in Config.running_list:
logger.warning("调度队列正在运行")
logger.warning("调度队列正在运行", module="队列管理")
MainInfoBar.push_info_bar(
"warning", "调度队列正在运行", "请先停止调度队列", 5000
)
@@ -140,8 +135,11 @@ class QueueManager(QWidget):
choice = MessageBox("确认", f"确定要删除 {name} 吗?", self.window())
if choice.exec():
logger.info(f"正在删除调度队列 {name}", module="队列管理")
self.queue_manager.clear_SettingBox()
# 删除队列配置文件并同步到相关配置项
Config.queue_dict[name]["Path"].unlink()
for i in range(int(name[5:]) + 1, len(Config.queue_dict) + 1):
if Config.queue_dict[f"调度队列_{i}"]["Path"].exists():
@@ -153,17 +151,17 @@ class QueueManager(QWidget):
self.queue_manager.show_SettingBox(max(int(name[5:]) - 1, 1))
logger.success(f"{name} 删除成功")
logger.success(f"{name} 删除成功", module="队列管理")
MainInfoBar.push_info_bar("success", "操作成功", f"删除 {name}", 3000)
SoundPlayer.play("删除调度队列")
def left_setting_box(self):
def left_queue(self):
"""向左移动调度队列实例"""
name = self.queue_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择调度队列")
logger.warning("未选择调度队列", module="队列管理")
MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000
)
@@ -172,21 +170,24 @@ class QueueManager(QWidget):
index = int(name[5:])
if index == 1:
logger.warning("向左移动调度队列时已到达最左端")
logger.warning("向左移动调度队列时已到达最左端", module="队列管理")
MainInfoBar.push_info_bar(
"warning", "已经是第一个调度队列", "无法向左移动", 5000
)
return None
if name in Config.running_list or f"调度队列_{index-1}" in Config.running_list:
logger.warning("相关调度队列正在运行")
logger.warning("相关调度队列正在运行", module="队列管理")
MainInfoBar.push_info_bar(
"warning", "相关调度队列正在运行", "请先停止调度队列", 5000
)
return None
logger.info(f"正在左移调度队列 {name}", module="队列管理")
self.queue_manager.clear_SettingBox()
# 移动配置文件并同步到相关配置项
Config.queue_dict[name]["Path"].rename(
Config.queue_dict[name]["Path"].with_name("调度队列_0.json")
)
@@ -199,16 +200,16 @@ class QueueManager(QWidget):
self.queue_manager.show_SettingBox(index - 1)
logger.success(f"{name} 左移成功")
logger.success(f"{name} 左移成功", module="队列管理")
MainInfoBar.push_info_bar("success", "操作成功", f"左移 {name}", 3000)
def right_setting_box(self):
def right_queue(self):
"""向右移动调度队列实例"""
name = self.queue_manager.pivot.currentRouteKey()
if name is None:
logger.warning("未选择调度队列")
logger.warning("未选择调度队列", module="队列管理")
MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000
)
@@ -217,21 +218,24 @@ class QueueManager(QWidget):
index = int(name[5:])
if index == len(Config.queue_dict):
logger.warning("向右移动调度队列时已到达最右端")
logger.warning("向右移动调度队列时已到达最右端", module="队列管理")
MainInfoBar.push_info_bar(
"warning", "已经是最后一个调度队列", "无法向右移动", 5000
)
return None
if name in Config.running_list or f"调度队列_{index+1}" in Config.running_list:
logger.warning("相关调度队列正在运行")
logger.warning("相关调度队列正在运行", module="队列管理")
MainInfoBar.push_info_bar(
"warning", "相关调度队列正在运行", "请先停止调度队列", 5000
)
return None
logger.info(f"正在右移调度队列 {name}", module="队列管理")
self.queue_manager.clear_SettingBox()
# 移动配置文件并同步到相关配置项
Config.queue_dict[name]["Path"].rename(
Config.queue_dict[name]["Path"].with_name("调度队列_0.json")
)
@@ -244,12 +248,13 @@ class QueueManager(QWidget):
self.queue_manager.show_SettingBox(index + 1)
logger.success(f"{name} 右移成功")
logger.success(f"{name} 右移成功", module="队列管理")
MainInfoBar.push_info_bar("success", "操作成功", f"右移 {name}", 3000)
def reload_member_name(self):
"""刷新调度队列成员"""
# 获取成员列表
member_list = [
["禁用"] + [_ for _ in Config.member_dict.keys()],
["未启用"]
@@ -337,7 +342,12 @@ class QueueManager(QWidget):
self.switch_SettingBox(index)
def switch_SettingBox(self, index: int, if_change_pivot: bool = True) -> None:
"""切换到指定的子界面"""
"""
切换到指定的子界面并切换到指定的子页面
:param index: 要切换到的子界面索引
:param if_change_pivot: 是否更改导航栏当前项
"""
if len(Config.queue_dict) == 0:
return None

View File

@@ -25,7 +25,6 @@ v4.4
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import QWidget, QVBoxLayout
from PySide6.QtGui import QIcon
from PySide6.QtCore import Qt
@@ -49,7 +48,7 @@ from packaging import version
from pathlib import Path
from typing import Dict, Union
from app.core import Config, MainInfoBar, Network, SoundPlayer
from app.core import Config, MainInfoBar, Network, SoundPlayer, logger
from app.services import Crypto, System, Notify
from .downloader import DownloadManager
from .Widget import (
@@ -124,7 +123,7 @@ class Setting(QWidget):
self.window(),
)
if choice.exec():
logger.success("确认授权bilibili游戏隐私政策")
logger.success("确认授权bilibili游戏隐私政策", module="设置界面")
MainInfoBar.push_info_bar(
"success", "操作成功", "已确认授权bilibili游戏隐私政策", 3000
)
@@ -132,7 +131,7 @@ class Setting(QWidget):
Config.set(Config.function_IfAgreeBilibili, False)
else:
logger.info("取消授权bilibili游戏隐私政策")
logger.info("取消授权bilibili游戏隐私政策", module="设置界面")
MainInfoBar.push_info_bar(
"info", "操作成功", "已取消授权bilibili游戏隐私政策", 3000
)
@@ -158,7 +157,7 @@ class Setting(QWidget):
MuMu_splash_ads_path.touch()
logger.success("开启跳过MuMu启动广告功能")
logger.success("开启跳过MuMu启动广告功能", module="设置界面")
MainInfoBar.push_info_bar(
"success", "操作成功", "已开启跳过MuMu启动广告功能", 3000
)
@@ -170,7 +169,7 @@ class Setting(QWidget):
if MuMu_splash_ads_path.exists() and MuMu_splash_ads_path.is_file():
MuMu_splash_ads_path.unlink()
logger.info("关闭跳过MuMu启动广告功能")
logger.info("关闭跳过MuMu启动广告功能", module="设置界面")
MainInfoBar.push_info_bar(
"info", "操作成功", "已关闭跳过MuMu启动广告功能", 3000
)
@@ -181,6 +180,8 @@ class Setting(QWidget):
if Config.key_path.exists():
return None
logger.info("未设置管理密钥,开始要求用户进行设置", module="设置界面")
while True:
choice = LineEditMessageBox(
@@ -188,6 +189,7 @@ class Setting(QWidget):
)
if choice.exec() and choice.input.text() != "":
Crypto.get_PASSWORD(choice.input.text())
logger.success("成功设置管理密钥", module="设置界面")
break
else:
choice = MessageBox(
@@ -207,10 +209,7 @@ class Setting(QWidget):
while if_change:
choice = LineEditMessageBox(
self.window(),
"请输入旧的管理密钥",
"旧管理密钥",
"密码",
self.window(), "请输入旧的管理密钥", "旧管理密钥", "密码"
)
if choice.exec() and choice.input.text() != "":
@@ -231,6 +230,7 @@ class Setting(QWidget):
# 修改管理密钥
Crypto.change_PASSWORD(PASSWORD_old, choice.input.text())
logger.success("成功修改管理密钥", module="设置界面")
MainInfoBar.push_info_bar(
"success", "操作成功", "管理密钥修改成功", 3000
)
@@ -291,6 +291,7 @@ class Setting(QWidget):
# 重置管理密钥
Crypto.reset_PASSWORD(choice.input.text())
logger.success("成功重置管理密钥", module="设置界面")
MainInfoBar.push_info_bar(
"success", "操作成功", "管理密钥重置成功", 3000
)
@@ -316,7 +317,12 @@ class Setting(QWidget):
)
def check_update(self, if_show: bool = False, if_first: bool = False) -> None:
"""检查版本更新,调起文件下载进程"""
"""
检查版本更新,调起更新线程
:param if_show: 是否显示更新信息
:param if_first: 是否为启动时检查更新
"""
current_version = list(map(int, Config.VERSION.split(".")))
@@ -339,7 +345,9 @@ class Setting(QWidget):
if version_info["code"] != 0:
logger.error(f"获取版本信息时出错:{version_info['msg']}")
logger.error(
f"获取版本信息时出错:{version_info['msg']}", module="设置界面"
)
error_remark_dict = {
1001: "获取版本信息的URL参数不正确",
@@ -372,7 +380,10 @@ class Setting(QWidget):
return None
logger.warning(f"获取版本信息时出错:{network_result['error_message']}")
logger.warning(
f"获取版本信息时出错:{network_result['error_message']}",
module="设置界面",
)
MainInfoBar.push_info_bar(
"warning",
"获取版本信息时出错",
@@ -470,11 +481,12 @@ class Setting(QWidget):
download_info = network_result["response_json"]
else:
logger.warning(
f"获取应用列表时出错:{network_result['error_message']}"
f"获取下载信息时出错:{network_result['error_message']}",
module="设置界面",
)
MainInfoBar.push_info_bar(
"warning",
"获取应用列表时出错",
"获取下载信息时出错",
f"网络错误:{network_result['status_code']}",
5000,
)
@@ -492,6 +504,8 @@ class Setting(QWidget):
"download_dict": download_info["download_dict"],
}
logger.info("开始执行更新任务", module="设置界面")
self.downloader = DownloadManager(
Config.app_path, "AUTO_MAA", remote_version, download_config
)
@@ -526,6 +540,9 @@ class Setting(QWidget):
SoundPlayer.play("无新版本")
def start_setup(self) -> None:
"""启动安装程序"""
logger.info("启动安装程序", module="设置界面")
subprocess.Popen(
[
Config.app_path / "AUTO_MAA-Setup.exe",
@@ -555,7 +572,10 @@ class Setting(QWidget):
if network_result["status_code"] == 200:
notice = network_result["response_json"]
else:
logger.warning(f"获取最新公告时出错:{network_result['error_message']}")
logger.warning(
f"获取最新公告时出错:{network_result['error_message']}",
module="设置界面",
)
MainInfoBar.push_info_bar(
"warning",
"获取最新公告时出错",