feat(core): 恢复基本所有原功能,数据文件版本更新

This commit is contained in:
DLmaster
2025-01-27 10:38:17 +08:00
parent c625354dec
commit 126799d2a2
61 changed files with 836 additions and 8093 deletions

View File

@@ -36,32 +36,23 @@ from qfluentwidgets import (
CardWidget,
IconWidget,
BodyLabel,
qconfig,
Pivot,
ScrollArea,
FluentIcon,
MessageBox,
HeaderCardWidget,
CommandBar,
FluentIcon,
TextBrowser,
ComboBox,
setTheme,
Theme,
SubtitleLabel,
PushButton,
ElevatedCardWidget,
)
from PySide6.QtUiTools import QUiLoader
from PySide6 import QtCore
from PySide6.QtCore import Qt
from PySide6.QtGui import QTextCursor
from typing import List, Dict
import json
import shutil
uiLoader = QUiLoader()
from app.core import Config, Task_manager, Task, MainInfoBar
from app.services import Notify
class DispatchCenter(QWidget):
@@ -88,7 +79,7 @@ class DispatchCenter(QWidget):
)
self.update_top_bar()
self.Layout.addWidget(self.pivot, 0, QtCore.Qt.AlignHCenter)
self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter)
self.Layout.addWidget(self.stackedWidget)
self.Layout.setContentsMargins(0, 0, 0, 0)
@@ -259,7 +250,7 @@ class DispatchBox(QWidget):
)
return None
name = self.object.currentText().split(" - ")[1]
name = self.object.currentText().split(" - ")[-1]
if name in Config.running_list:
logger.warning(f"任务已存在:{name}")
@@ -274,7 +265,18 @@ class DispatchBox(QWidget):
info = json.load(f)
logger.info(f"用户添加任务:{name}")
Task_manager.add_task("主窗口", name, info)
Task_manager.add_task(f"{self.mode.currentText()}_主窗口", name, info)
elif self.object.currentText().split(" - ")[0] == "实例":
if self.object.currentText().split(" - ")[1] == "Maa":
info = {"Queue": {"Member_1": name}}
logger.info(f"用户添加任务:{name}")
Task_manager.add_task(
f"{self.mode.currentText()}_主窗口", "用户自定义队列", info
)
class DispatchInfoCard(HeaderCardWidget):
@@ -389,6 +391,14 @@ class DispatchBox(QWidget):
self.viewLayout.setContentsMargins(3, 0, 3, 3)
self.viewLayout.addWidget(self.text)
self.text.textChanged.connect(self.to_end)
def to_end(self):
"""滚动到底部"""
self.text.moveCursor(QTextCursor.End)
self.text.ensureCursorVisible()
class ItemCard(CardWidget):

View File

@@ -1,539 +0,0 @@
class Main(QWidget):
ES_CONTINUOUS = 0x80000000
ES_SYSTEM_REQUIRED = 0x00000001
def __init__(self, config: AppConfig, notify: Notification, crypto: CryptoHandler):
super().__init__()
Config = config
Notify = notify
Crypto = crypto
# uiLoader.registerCustomWidget(PushButton)
# uiLoader.registerCustomWidget(LineEdit)
# uiLoader.registerCustomWidget(TextBrowser)
# uiLoader.registerCustomWidget(TableWidget)
# uiLoader.registerCustomWidget(TimePicker)
# uiLoader.registerCustomWidget(SpinBox)
# uiLoader.registerCustomWidget(CheckBox)
# uiLoader.registerCustomWidget(HeaderCardWidget)
# uiLoader.registerCustomWidget(BodyLabel)
# # 导入ui配置
# self.ui = uiLoader.load(Config.app_path / "resources/gui/main.ui")
# self.ui.setWindowIcon(
# QIcon(str(Config.app_path / "resources/icons/AUTO_MAA.ico"))
# )
# # 初始化控件
# self.main_tab: QTabWidget = self.ui.findChild(QTabWidget, "tabWidget_main")
# self.main_tab.currentChanged.connect(self.change_config)
# self.user_set: QToolBox = self.ui.findChild(QToolBox, "toolBox_userset")
# self.user_set.currentChanged.connect(lambda: self.update_user_info("normal"))
# self.user_list_simple: TableWidget = self.ui.findChild(
# TableWidget, "tableWidget_userlist_simple"
# )
# self.user_list_simple.itemChanged.connect(
# lambda item: self.change_user_Item(item, "simple")
# )
# self.user_list_beta: TableWidget = self.ui.findChild(
# TableWidget, "tableWidget_userlist_beta"
# )
# self.user_list_beta.itemChanged.connect(
# lambda item: self.change_user_Item(item, "beta")
# )
# self.user_add: PushButton = self.ui.findChild(PushButton, "pushButton_new")
# self.user_add.setIcon(FluentIcon.ADD_TO)
# self.user_add.clicked.connect(self.add_user)
# self.user_del: PushButton = self.ui.findChild(PushButton, "pushButton_del")
# self.user_del.setIcon(FluentIcon.REMOVE_FROM)
# self.user_del.clicked.connect(self.del_user)
# self.user_switch: PushButton = self.ui.findChild(
# PushButton, "pushButton_switch"
# )
# self.user_switch.setIcon(FluentIcon.MOVE)
# self.user_switch.clicked.connect(self.switch_user)
# self.read_PASSWORD: PushButton = self.ui.findChild(
# PushButton, "pushButton_password"
# )
# self.read_PASSWORD.setIcon(FluentIcon.HIDE)
# self.read_PASSWORD.clicked.connect(lambda: self.read("key"))
# self.refresh: PushButton = self.ui.findChild(PushButton, "pushButton_refresh")
# self.refresh.setIcon(FluentIcon.SYNC)
# self.refresh.clicked.connect(lambda: self.update_user_info("clear"))
# self.run_now: PushButton = self.ui.findChild(PushButton, "pushButton_runnow")
# self.run_now.setIcon(FluentIcon.PLAY)
# self.run_now.clicked.connect(lambda: self.maa_starter("自动代理"))
# self.check_start: PushButton = self.ui.findChild(
# PushButton, "pushButton_checkstart"
# )
# self.check_start.setIcon(FluentIcon.PLAY)
# self.check_start.clicked.connect(lambda: self.maa_starter("人工排查"))
# self.maa_path: LineEdit = self.ui.findChild(LineEdit, "lineEdit_MAApath")
# self.maa_path.textChanged.connect(self.change_config)
# self.maa_path.setReadOnly(True)
# self.get_maa_path: PushButton = self.ui.findChild(
# PushButton, "pushButton_getMAApath"
# )
# self.get_maa_path.setIcon(FluentIcon.FOLDER)
# self.get_maa_path.clicked.connect(lambda: self.read("file_path_maa"))
# self.set_maa: PushButton = self.ui.findChild(PushButton, "pushButton_setMAA")
# self.set_maa.setIcon(FluentIcon.SETTING)
# self.set_maa.clicked.connect(lambda: self.maa_starter("设置MAA_全局"))
# self.routine: SpinBox = self.ui.findChild(SpinBox, "spinBox_routine")
# self.routine.valueChanged.connect(self.change_config)
# self.annihilation: SpinBox = self.ui.findChild(SpinBox, "spinBox_annihilation")
# self.annihilation.valueChanged.connect(self.change_config)
# self.num: SpinBox = self.ui.findChild(SpinBox, "spinBox_numt")
# self.num.valueChanged.connect(self.change_config)
# self.if_self_start: CheckBox = self.ui.findChild(
# CheckBox, "checkBox_ifselfstart"
# )
# self.if_self_start.stateChanged.connect(self.change_config)
# self.if_sleep: CheckBox = self.ui.findChild(CheckBox, "checkBox_IfAllowSleep")
# self.if_sleep.stateChanged.connect(self.change_config)
# self.if_proxy_directly: CheckBox = self.ui.findChild(
# CheckBox, "checkBox_ifproxydirectly"
# )
# self.if_proxy_directly.stateChanged.connect(self.change_config)
# self.if_send_mail: CheckBox = self.ui.findChild(CheckBox, "checkBox_ifsendmail")
# self.if_send_mail.stateChanged.connect(self.change_config)
# self.mail_address: LineEdit = self.ui.findChild(
# LineEdit, "lineEdit_mailaddress"
# )
# self.mail_address.textChanged.connect(self.change_config)
# self.if_send_error_only: CheckBox = self.ui.findChild(
# CheckBox, "checkBox_ifonlyerror"
# )
# self.if_send_error_only.stateChanged.connect(self.change_config)
# self.if_silence: CheckBox = self.ui.findChild(CheckBox, "checkBox_silence")
# self.if_silence.stateChanged.connect(self.change_config)
# self.boss_key: LineEdit = self.ui.findChild(LineEdit, "lineEdit_boss")
# self.boss_key.textChanged.connect(self.change_config)
# self.if_to_tray: CheckBox = self.ui.findChild(CheckBox, "checkBox_iftotray")
# self.if_to_tray.stateChanged.connect(self.change_config)
# self.check_update: PushButton = self.ui.findChild(
# PushButton, "pushButton_check_update"
# )
# self.check_update.setIcon(FluentIcon.UPDATE)
# self.check_update.clicked.connect(self.check_version)
# self.tips: TextBrowser = self.ui.findChild(TextBrowser, "textBrowser_tips")
# self.tips.setOpenExternalLinks(True)
# self.run_text: TextBrowser = self.ui.findChild(TextBrowser, "textBrowser_run")
# self.wait_text: TextBrowser = self.ui.findChild(TextBrowser, "textBrowser_wait")
# self.over_text: TextBrowser = self.ui.findChild(TextBrowser, "textBrowser_over")
# self.error_text: TextBrowser = self.ui.findChild(
# TextBrowser, "textBrowser_error"
# )
# self.log_text: TextBrowser = self.ui.findChild(TextBrowser, "textBrowser_log")
# self.start_time: List[Tuple[CheckBox, TimePicker]] = []
# for i in range(10):
# self.start_time.append(
# [
# self.ui.findChild(CheckBox, f"checkBox_t{i + 1}"),
# self.ui.findChild(TimePicker, f"timeEdit_{i + 1}"),
# ]
# )
# self.start_time[i][0].stateChanged.connect(self.change_config)
# self.start_time[i][1].timeChanged.connect(self.change_config)
# self.change_password: PushButton = self.ui.findChild(
# PushButton, "pushButton_changePASSWORD"
# )
# self.change_password.setIcon(FluentIcon.VPN)
# self.change_password.clicked.connect(self.change_PASSWORD)
# 初始化线程
self.MaaManager = MaaManager(Config)
self.MaaManager.question.connect(lambda: self.read("question_runner"))
self.MaaManager.update_gui.connect(self.update_board)
self.MaaManager.update_user_info.connect(self.change_user_info)
self.MaaManager.push_notification.connect(Notify.push_notification)
self.MaaManager.send_mail.connect(Notify.send_mail)
self.MaaManager.accomplish.connect(lambda: self.maa_ender("自动代理_结束"))
self.MaaManager.get_json.connect(self.get_maa_config)
self.MaaManager.set_silence.connect(self.switch_silence)
# self.last_time = "0000-00-00 00:00"
# self.Timer = QtCore.QTimer()
# self.Timer.timeout.connect(self.set_theme)
# self.Timer.timeout.connect(self.set_system)
# self.Timer.timeout.connect(self.timed_start)
# self.Timer.start(1000)
# 载入GUI数据
# self.update_user_info("normal")
# self.update_config()
# 启动后直接开始代理
if Config.content["Default"]["SelfSet.IfProxyDirectly"] == "True":
self.maa_starter("自动代理")
# def update_config(self):
# """将Config中的程序配置同步至GUI界面"""
# # 阻止GUI程序配置被立即读入程序形成死循环
# self.if_update_config = False
# self.main_tab.setCurrentIndex(
# Config.content["Default"]["SelfSet.MainIndex"]
# )
# self.maa_path.setText(str(Path(Config.content["Default"]["MaaSet.path"])))
# self.routine.setValue(Config.content["Default"]["TimeLimit.routine"])
# self.annihilation.setValue(
# Config.content["Default"]["TimeLimit.annihilation"]
# )
# self.num.setValue(Config.content["Default"]["TimesLimit.run"])
# self.mail_address.setText(Config.content["Default"]["SelfSet.MailAddress"])
# self.boss_key.setText(Config.content["Default"]["SelfSet.BossKey"])
# self.if_self_start.setChecked(
# bool(Config.content["Default"]["SelfSet.IfSelfStart"] == "True")
# )
# self.if_sleep.setChecked(
# bool(Config.content["Default"]["SelfSet.IfAllowSleep"] == "True")
# )
# self.if_proxy_directly.setChecked(
# bool(Config.content["Default"]["SelfSet.IfProxyDirectly"] == "True")
# )
# self.if_send_mail.setChecked(
# bool(Config.content["Default"]["SelfSet.IfSendMail"] == "True")
# )
# self.mail_address.setVisible(
# bool(Config.content["Default"]["SelfSet.IfSendMail"] == "True")
# )
# self.if_send_error_only.setChecked(
# bool(
# Config.content["Default"]["SelfSet.IfSendMail.OnlyError"] == "True"
# )
# )
# self.if_send_error_only.setVisible(
# bool(Config.content["Default"]["SelfSet.IfSendMail"] == "True")
# )
# self.if_silence.setChecked(
# bool(Config.content["Default"]["SelfSet.IfSilence"] == "True")
# )
# self.boss_key.setVisible(
# bool(Config.content["Default"]["SelfSet.IfSilence"] == "True")
# )
# self.if_to_tray.setChecked(
# bool(Config.content["Default"]["SelfSet.IfToTray"] == "True")
# )
# for i in range(10):
# self.start_time[i][0].setChecked(
# bool(Config.content["Default"][f"TimeSet.set{i + 1}"] == "True")
# )
# time = QtCore.QTime(
# int(Config.content["Default"][f"TimeSet.run{i + 1}"][:2]),
# int(Config.content["Default"][f"TimeSet.run{i + 1}"][3:]),
# )
# self.start_time[i][1].setTime(time)
# self.if_update_config = True
# 同步用户信息更改至GUI
self.update_user_info("normal")
def change_config(self):
"""将GUI中发生修改的程序配置同步至Config变量"""
# 验证能否写入Config变量
if not self.if_update_config:
return None
# 验证MAA路径
if Path(Config.content["Default"]["MaaSet.path"]) != Path(
self.maa_path.text()
):
if (Path(self.maa_path.text()) / "MAA.exe").exists() and (
Path(self.maa_path.text()) / "config/gui.json"
).exists():
Config.content["Default"]["MaaSet.path"] = str(
Path(self.maa_path.text())
)
self.get_maa_config(["Default"])
else:
choice = MessageBox(
"错误",
"该路径下未找到MAA.exe或MAA配置文件请重新设置MAA路径",
self.ui,
)
if choice.exec():
pass
Config.content["Default"][
"SelfSet.MainIndex"
] = self.main_tab.currentIndex()
Config.content["Default"]["TimeLimit.routine"] = self.routine.value()
Config.content["Default"][
"TimeLimit.annihilation"
] = self.annihilation.value()
Config.content["Default"]["TimesLimit.run"] = self.num.value()
Config.content["Default"]["SelfSet.MailAddress"] = self.mail_address.text()
Config.content["Default"]["SelfSet.BossKey"] = self.boss_key.text()
if self.if_sleep.isChecked():
Config.content["Default"]["SelfSet.IfAllowSleep"] = "True"
else:
Config.content["Default"]["SelfSet.IfAllowSleep"] = "False"
if self.if_self_start.isChecked():
Config.content["Default"]["SelfSet.IfSelfStart"] = "True"
else:
Config.content["Default"]["SelfSet.IfSelfStart"] = "False"
if self.if_proxy_directly.isChecked():
Config.content["Default"]["SelfSet.IfProxyDirectly"] = "True"
else:
Config.content["Default"]["SelfSet.IfProxyDirectly"] = "False"
if self.if_send_mail.isChecked():
Config.content["Default"]["SelfSet.IfSendMail"] = "True"
else:
Config.content["Default"]["SelfSet.IfSendMail"] = "False"
if self.if_send_error_only.isChecked():
Config.content["Default"]["SelfSet.IfSendMail.OnlyError"] = "True"
else:
Config.content["Default"]["SelfSet.IfSendMail.OnlyError"] = "False"
if self.if_silence.isChecked():
Config.content["Default"]["SelfSet.IfSilence"] = "True"
else:
Config.content["Default"]["SelfSet.IfSilence"] = "False"
if self.if_to_tray.isChecked():
Config.content["Default"]["SelfSet.IfToTray"] = "True"
else:
Config.content["Default"]["SelfSet.IfToTray"] = "False"
for i in range(10):
if self.start_time[i][0].isChecked():
Config.content["Default"][f"TimeSet.set{i + 1}"] = "True"
else:
Config.content["Default"][f"TimeSet.set{i + 1}"] = "False"
time = self.start_time[i][1].getTime().toString("HH:mm")
Config.content["Default"][f"TimeSet.run{i + 1}"] = time
# 将配置信息同步至本地JSON文件
Config.save_config()
# 同步程序配置至GUI
self.update_config()
def get_maa_config(self, info):
"""获取MAA配置文件"""
# 获取全局MAA配置文件
if info == ["Default"]:
shutil.copy(
Path(Config.content["Default"]["MaaSet.path"])
/ "config/gui.json",
Config.app_path / "data/MAAconfig/Default",
)
# 获取基建配置文件
# 获取高级用户MAA配置文件
elif info[2] in ["routine", "annihilation"]:
(
Config.app_path
/ f"data/MAAconfig/{self.user_mode_list[info[0]]}/{info[1]}/{info[2]}"
).mkdir(parents=True, exist_ok=True)
shutil.copy(
Path(Config.content["Default"]["MaaSet.path"])
/ "config/gui.json",
Config.app_path
/ f"data/MAAconfig/{self.user_mode_list[info[0]]}/{info[1]}/{info[2]}",
)
def set_theme(self):
"""手动更新主题色到组件"""
self.user_list_simple.setStyleSheet("QTableWidget::item {}")
self.user_list_beta.setStyleSheet("QTableWidget::item {}")
def switch_silence(self, mode, emulator_path, boss_key):
"""切换静默模式"""
if mode == "启用":
self.Timer.timeout.disconnect()
self.Timer.timeout.connect(self.set_theme)
self.Timer.timeout.connect(self.set_system)
self.Timer.timeout.connect(self.timed_start)
self.Timer.timeout.connect(
lambda: self.set_silence(emulator_path, boss_key)
)
elif mode == "禁用":
self.Timer.timeout.disconnect()
self.Timer.timeout.connect(self.set_theme)
self.Timer.timeout.connect(self.set_system)
self.Timer.timeout.connect(self.timed_start)
def maa_starter(self, mode):
"""启动MaaManager线程运行任务"""
# 检查MAA路径是否可用
if (
not (
Path(Config.content["Default"]["MaaSet.path"]) / "MAA.exe"
).exists()
and (
Path(Config.content["Default"]["MaaSet.path"]) / "config/gui.json"
).exists()
):
choice = MessageBox("错误", "您还未正确配置MAA路径", self.ui)
choice.cancelButton.hide()
choice.buttonLayout.insertStretch(1)
if choice.exec():
return None
self.maa_running_set(f"{mode}_开始")
# 配置参数
self.MaaManager.mode = mode
Config.cur.execute("SELECT * FROM adminx WHERE True")
data = Config.cur.fetchall()
self.MaaManager.data = [list(row) for row in data]
# 启动执行线程
self.MaaManager.start()
def maa_ender(self, mode):
"""中止MAA线程"""
self.switch_silence("禁用", "", [])
self.MaaManager.requestInterruption()
self.MaaManager.wait()
self.maa_running_set(mode)
def maa_running_set(self, mode):
"""处理MAA运行过程中的GUI组件变化"""
if "开始" in mode:
self.MaaManager.accomplish.disconnect()
self.user_add.setEnabled(False)
self.user_del.setEnabled(False)
self.user_switch.setEnabled(False)
self.set_maa.setEnabled(False)
self.update_user_info("read_only")
if mode == "自动代理_开始":
self.MaaManager.accomplish.connect(
lambda: self.maa_ender("自动代理_结束")
)
self.check_start.setEnabled(False)
self.run_now.clicked.disconnect()
self.run_now.setText("结束运行")
self.run_now.clicked.connect(lambda: self.maa_ender("自动代理_结束"))
elif mode == "人工排查_开始":
self.MaaManager.accomplish.connect(
lambda: self.maa_ender("人工排查_结束")
)
self.run_now.setEnabled(False)
self.check_start.clicked.disconnect()
self.check_start.setText("中止排查")
self.check_start.clicked.connect(
lambda: self.maa_ender("人工排查_结束")
)
elif mode == "设置MAA_全局_开始" or mode == "设置MAA_用户_开始":
self.MaaManager.accomplish.connect(
lambda: self.maa_ender("设置MAA_结束")
)
self.run_now.setEnabled(False)
self.check_start.setEnabled(False)
elif "结束" in mode:
shutil.copy(
Config.app_path / "data/MAAconfig/Default/gui.json",
Path(Config.content["Default"]["MaaSet.path"]) / "config",
)
self.user_add.setEnabled(True)
self.user_del.setEnabled(True)
self.user_switch.setEnabled(True)
self.set_maa.setEnabled(True)
self.update_user_info("editable")
if mode == "自动代理_结束":
self.check_start.setEnabled(True)
self.run_now.clicked.disconnect()
self.run_now.setText("立即执行")
self.run_now.clicked.connect(lambda: self.maa_starter("自动代理"))
elif mode == "人工排查_结束":
self.run_now.setEnabled(True)
self.check_start.clicked.disconnect()
self.check_start.setText("开始排查")
self.check_start.clicked.connect(lambda: self.maa_starter("人工排查"))
elif mode == "设置MAA_结束":
self.run_now.setEnabled(True)
self.check_start.setEnabled(True)
def server_date(self):
"""获取当前的服务器日期"""
dt = datetime.datetime.now()
if dt.time() < datetime.datetime.min.time().replace(hour=4):
dt = dt - datetime.timedelta(days=1)
return dt.strftime("%Y-%m-%d")

View File

@@ -45,7 +45,7 @@ from qfluentwidgets import (
qconfig,
)
from PySide6.QtGui import QIcon, QCloseEvent
from PySide6 import QtCore
from PySide6.QtCore import Qt
from app.core import Config, Task_manager, Main_timer, MainInfoBar
from app.services import Notify, Crypto, System
@@ -180,8 +180,6 @@ class AUTO_MAA(MSFluentWindow):
def start_up_task(self) -> None:
"""启动时任务"""
logger.debug(f"{Config.app_path}, {Config.app_path_sys}")
# 加载配置
qconfig.load(Config.config_path, Config.global_config)
@@ -197,7 +195,7 @@ class AUTO_MAA(MSFluentWindow):
info = InfoBar.info(
title="更新检查",
content=result,
orient=QtCore.Qt.Horizontal,
orient=Qt.Horizontal,
isClosable=True,
position=InfoBarPosition.BOTTOM_LEFT,
duration=-1,
@@ -332,13 +330,14 @@ class AUTO_MAA(MSFluentWindow):
self.show_ui("隐藏到托盘", if_quick=True)
# 清理各功能线程
# self.main.Timer.stop()
# self.main.Timer.deleteLater()
# self.main.MaaManager.requestInterruption()
# self.main.MaaManager.quit()
# self.main.MaaManager.wait()
Main_timer.Timer.stop()
Main_timer.Timer.deleteLater()
Task_manager.stop_task("ALL")
# 关闭数据库连接
Config.close_database()
logger.info("AUTO_MAA主程序关闭")
logger.info("===================================")
event.accept()

View File

@@ -44,12 +44,10 @@ from qfluentwidgets import (
MessageBox,
HeaderCardWidget,
CommandBar,
setTheme,
Theme,
ExpandGroupSettingCard,
PushSettingCard,
)
from PySide6 import QtCore
from PySide6.QtCore import Qt
from functools import partial
from pathlib import Path
from typing import List
@@ -57,8 +55,8 @@ import datetime
import json
import shutil
from app.core import Config, MainInfoBar
from app.services import Notify, Crypto
from app.core import Config, MainInfoBar, Task_manager
from app.services import Crypto
from .Widget import (
InputMessageBox,
LineEditSettingCard,
@@ -77,8 +75,6 @@ class MemberManager(QWidget):
self.setObjectName("脚本管理")
setTheme(Theme.AUTO)
layout = QVBoxLayout(self)
self.tools = CommandBar()
@@ -157,6 +153,17 @@ class MemberManager(QWidget):
name = self.member_manager.pivot.currentRouteKey()
if name == None:
logger.warning("删除脚本实例时未选择脚本实例")
MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("删除脚本实例时调度队列未停止运行")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
choice = MessageBox(
@@ -192,12 +199,27 @@ class MemberManager(QWidget):
name = self.member_manager.pivot.currentRouteKey()
if name == None:
logger.warning("向左移动脚本实例时未选择脚本实例")
MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000
)
return None
member_list = self.member_manager.search_member()
index = int(name[3:])
if index == 1:
logger.warning("向左移动脚本实例时已到达最左端")
MainInfoBar.push_info_bar(
"warning", "已经是第一个脚本实例", "无法向左移动", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("向左移动脚本实例时调度队列未停止运行")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
type_right = [_[1] for _ in member_list if _[0] == name]
@@ -226,12 +248,27 @@ class MemberManager(QWidget):
name = self.member_manager.pivot.currentRouteKey()
if name == None:
logger.warning("向右移动脚本实例时未选择脚本实例")
MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000
)
return None
member_list = self.member_manager.search_member()
index = int(name[3:])
if index == len(member_list):
logger.warning("向右移动脚本实例时已到达最右端")
MainInfoBar.push_info_bar(
"warning", "已经是最后一个脚本实例", "无法向右移动", 5000
)
return None
if len(Config.running_list) > 0:
logger.warning("向右移动脚本实例时调度队列未停止运行")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
type_left = [_[1] for _ in member_list if _[0] == name]
@@ -323,7 +360,7 @@ class MemberSettingBox(QWidget):
self.script_list: List[MaaSettingBox] = []
self.Layout.addWidget(self.pivot, 0, QtCore.Qt.AlignHCenter)
self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter)
self.Layout.addWidget(self.stackedWidget)
self.Layout.setContentsMargins(0, 0, 0, 0)
@@ -433,7 +470,7 @@ class MaaSettingBox(QWidget):
content_widget = QWidget()
content_layout = QVBoxLayout(content_widget)
self.app_setting = self.AppSettingCard(self, uid)
self.app_setting = self.AppSettingCard(self, self.objectName())
self.user_setting = self.UserSettingCard(self, self.objectName())
content_layout.addWidget(self.app_setting)
@@ -448,12 +485,12 @@ class MaaSettingBox(QWidget):
class AppSettingCard(HeaderCardWidget):
def __init__(self, parent=None, uid: int = None):
def __init__(self, parent=None, name: str = None):
super().__init__(parent)
self.setTitle("MAA实例")
self.uid = uid
self.name = name
Layout = QVBoxLayout()
@@ -484,6 +521,9 @@ class MaaSettingBox(QWidget):
Config.maa_config.get(Config.maa_config.MaaSet_Path)
)
)
self.card_Set.clicked.connect(
lambda: Task_manager.add_task("设置MAA_全局", self.name, None)
)
Layout.addWidget(self.card_Name)
Layout.addWidget(self.card_Path)
@@ -514,12 +554,12 @@ class MaaSettingBox(QWidget):
)
return None
(Config.app_path / f"config/MaaConfig/脚本_{self.uid}/Default").mkdir(
(Config.app_path / f"config/MaaConfig/{self.name}/Default").mkdir(
parents=True, exist_ok=True
)
shutil.copy(
Path(folder) / "config/gui.json",
Config.app_path / f"config/MaaConfig/脚本_{self.uid}/Default/gui.json",
Config.app_path / f"config/MaaConfig/{self.name}/Default/gui.json",
)
Config.maa_config.set(Config.maa_config.MaaSet_Path, folder)
self.card_Path.setContent(folder)
@@ -572,11 +612,7 @@ class MaaSettingBox(QWidget):
class UserSettingCard(HeaderCardWidget):
def __init__(
self,
parent=None,
name: str = None,
):
def __init__(self, parent=None, name: str = None):
super().__init__(parent)
self.setTitle("用户列表")
@@ -626,6 +662,14 @@ class MaaSettingBox(QWidget):
self.viewLayout.addLayout(Layout)
def set_more(self):
"""用户选项配置"""
if len(Config.running_list) > 0:
logger.warning("配置用户选项时调度队列未停止运行")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
Config.cur.execute("SELECT * FROM adminx WHERE True")
data = Config.cur.fetchall()
@@ -665,21 +709,39 @@ class MaaSettingBox(QWidget):
/ f"config/MaaConfig/{self.name}/simple/{choice.input[0].currentIndex()}/infrastructure",
)
else:
choice = MessageBox(
"错误",
"未选择自定义基建文件",
self.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent(),
logger.warning("未选择自定义基建文件")
MainInfoBar.push_info_bar(
"warning", "警告", "未选择自定义基建文件", 5000
)
choice.cancelButton.hide()
choice.buttonLayout.insertStretch(1)
if choice.exec():
pass
elif self.user_list.pivot.currentRouteKey() == f"{self.name}_高级用户列表":
user_list = [_[0] for _ in data if _[15] == "beta"]
set_list = ["MAA日常配置", "MAA剿灭配置"]
choice = SetMessageBox(
self.parent().parent().parent().parent().parent().parent().parent(),
"用户选项配置",
["选择要配置的用户", "选择要配置的选项"],
[user_list, set_list],
)
if (
choice.exec()
and choice.input[0].currentIndex() != -1
and choice.input[1].currentIndex() != -1
):
set_book = ["routine", "annihilation"]
Task_manager.add_task(
"设置MAA_用户",
self.name,
{
"SetMaaInfo": {
"UserId": choice.input[0].currentIndex(),
"SetType": set_book[choice.input[1].currentIndex()],
}
},
)
class UserListBox(QWidget):
@@ -762,9 +824,7 @@ class MaaSettingBox(QWidget):
self.user_list_simple.setBorderVisible(True)
self.user_list_simple.setBorderRadius(10)
self.user_list_simple.setWordWrap(False)
self.user_list_simple.setVerticalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff
)
self.user_list_simple.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.user_list_simple.setHorizontalHeaderLabels(
[
"用户名",
@@ -789,9 +849,7 @@ class MaaSettingBox(QWidget):
self.user_list_beta.setBorderVisible(True)
self.user_list_beta.setBorderRadius(10)
self.user_list_beta.setWordWrap(False)
self.user_list_beta.setVerticalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff
)
self.user_list_beta.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.user_list_beta.setHorizontalHeaderLabels(
[
"用户名",
@@ -818,7 +876,7 @@ class MaaSettingBox(QWidget):
routeKey=f"{name}_高级用户列表", text=f"高级用户列表"
)
self.Layout.addWidget(self.pivot, 0, QtCore.Qt.AlignHCenter)
self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter)
self.Layout.addWidget(self.stackedWidget)
self.Layout.setContentsMargins(0, 0, 0, 0)
@@ -909,22 +967,17 @@ class MaaSettingBox(QWidget):
item = QTableWidgetItem(
f"今日已代理{data_simple[i][14]}"
)
item.setFlags(
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
)
item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
elif j == 12:
if Config.PASSWORD == "":
item = QTableWidgetItem("******")
item.setFlags(
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
)
item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
else:
result = Crypto.decryptx(value, Config.PASSWORD)
item = QTableWidgetItem(result)
if result == "管理密钥错误":
item.setFlags(
QtCore.Qt.ItemIsSelectable
| QtCore.Qt.ItemIsEnabled
Qt.ItemIsSelectable | Qt.ItemIsEnabled
)
else:
item = QTableWidgetItem(str(value))
@@ -983,22 +1036,17 @@ class MaaSettingBox(QWidget):
item = QTableWidgetItem(
f"今日已代理{data_beta[i][14]}"
)
item.setFlags(
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
)
item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
elif j == 12:
if Config.PASSWORD == "":
item = QTableWidgetItem("******")
item.setFlags(
QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
)
item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
else:
result = Crypto.decryptx(value, Config.PASSWORD)
item = QTableWidgetItem(result)
if result == "管理密钥错误":
item.setFlags(
QtCore.Qt.ItemIsSelectable
| QtCore.Qt.ItemIsEnabled
Qt.ItemIsSelectable | Qt.ItemIsEnabled
)
else:
item = QTableWidgetItem(str(value))
@@ -1178,6 +1226,13 @@ class MaaSettingBox(QWidget):
def del_user(self) -> None:
"""删除选中的首位用户"""
if len(Config.running_list) > 0:
logger.warning("删除用户时调度队列未停止运行")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
# 获取对应的行索引
if "简洁用户列表" in self.pivot.currentRouteKey():
row = self.user_list_simple.currentRow()
@@ -1190,23 +1245,11 @@ class MaaSettingBox(QWidget):
# 判断选择合理性
if row == -1:
choice = MessageBox(
"错误",
"请选中一个用户后再执行删除操作",
self.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent(),
logger.warning("删除用户时未选中用户")
MainInfoBar.push_info_bar(
"warning", "未选择用户", "请先选择一个用户", 5000
)
choice.cancelButton.hide()
choice.buttonLayout.insertStretch(1)
if choice.exec():
return None
return None
# 确认待删除用户信息
Config.cur.execute(
@@ -1280,6 +1323,13 @@ class MaaSettingBox(QWidget):
def up_user(self):
"""向上移动用户"""
if len(Config.running_list) > 0:
logger.warning("向上移动用户时调度队列未停止运行")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
# 获取对应的行索引
if "简洁用户列表" in self.pivot.currentRouteKey():
row = self.user_list_simple.currentRow()
@@ -1290,23 +1340,11 @@ class MaaSettingBox(QWidget):
# 判断选择合理性
if row == -1:
choice = MessageBox(
"错误",
"请选中一个用户后再执行向下移动操作",
self.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent(),
logger.warning("向上移动用户时未选中用户")
MainInfoBar.push_info_bar(
"warning", "未选中用户", "请先选择一个用户", 5000
)
choice.cancelButton.hide()
choice.buttonLayout.insertStretch(1)
if choice.exec():
return None
return None
if row == 0:
return None
@@ -1380,6 +1418,13 @@ class MaaSettingBox(QWidget):
def down_user(self):
"""向下移动用户"""
if len(Config.running_list) > 0:
logger.warning("向下移动用户时调度队列未停止运行")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
# 获取对应的行索引
if "简洁用户列表" in self.pivot.currentRouteKey():
row = self.user_list_simple.currentRow()
@@ -1392,23 +1437,11 @@ class MaaSettingBox(QWidget):
# 判断选择合理性
if row == -1:
choice = MessageBox(
"错误",
"请选中一个用户后再执行向下移动操作",
self.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent(),
logger.warning("向下移动用户时未选中用户")
MainInfoBar.push_info_bar(
"warning", "未选中用户", "请先选择一个用户", 5000
)
choice.cancelButton.hide()
choice.buttonLayout.insertStretch(1)
if choice.exec():
return None
return None
if row == current_numb - 1:
return None
@@ -1482,6 +1515,13 @@ class MaaSettingBox(QWidget):
def switch_user(self) -> None:
"""切换用户配置模式"""
if len(Config.running_list) > 0:
logger.warning("切换用户配置模式时调度队列未停止运行")
MainInfoBar.push_info_bar(
"warning", "调度中心正在执行任务", "请等待或手动中止任务", 5000
)
return None
# 获取当前用户配置模式信息
if "简洁用户列表" in self.pivot.currentRouteKey():
row = self.user_list_simple.currentRow()
@@ -1492,23 +1532,11 @@ class MaaSettingBox(QWidget):
# 判断选择合理性
if row == -1:
choice = MessageBox(
"错误",
"请选中一个用户后再执行切换操作",
self.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent()
.parent(),
logger.warning("切换用户配置模式时未选中用户")
MainInfoBar.push_info_bar(
"warning", "未选中用户", "请先选择一个用户", 5000
)
choice.cancelButton.hide()
choice.buttonLayout.insertStretch(1)
if choice.exec():
return None
return None
# 确认待切换用户信息
Config.cur.execute(

View File

@@ -24,7 +24,7 @@ AUTO_MAA调度队列界面
v4.2
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import (
QWidget,
QVBoxLayout,
@@ -41,20 +41,14 @@ from qfluentwidgets import (
HeaderCardWidget,
TextBrowser,
CommandBar,
setTheme,
Theme,
SwitchSettingCard,
)
from PySide6.QtUiTools import QUiLoader
from PySide6 import QtCore
from PySide6.QtCore import Qt
from typing import List
import json
import shutil
uiLoader = QUiLoader()
from app.core import Config
from app.services import Notify
from app.core import Config, MainInfoBar
from .Widget import (
LineEditSettingCard,
TimeEditSettingCard,
@@ -72,8 +66,6 @@ class QueueManager(QWidget):
self.setObjectName("调度队列")
setTheme(Theme.AUTO)
layout = QVBoxLayout(self)
self.tools = CommandBar()
@@ -129,6 +121,17 @@ class QueueManager(QWidget):
name = self.queue_manager.pivot.currentRouteKey()
if name == None:
logger.warning("未选择调度队列")
MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000
)
return None
if name in Config.running_list:
logger.warning("调度队列正在运行")
MainInfoBar.push_info_bar(
"warning", "调度队列正在运行", "请先停止调度队列", 5000
)
return None
choice = MessageBox(
@@ -161,11 +164,26 @@ class QueueManager(QWidget):
name = self.queue_manager.pivot.currentRouteKey()
if name == None:
logger.warning("未选择调度队列")
MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000
)
return None
index = int(name[5:])
if index == 1:
logger.warning("向左移动调度队列时已到达最左端")
MainInfoBar.push_info_bar(
"warning", "已经是第一个调度队列", "无法向左移动", 5000
)
return None
if name in Config.running_list or f"调度队列_{index-1}" in Config.running_list:
logger.warning("相关调度队列正在运行")
MainInfoBar.push_info_bar(
"warning", "相关调度队列正在运行", "请先停止调度队列", 5000
)
return None
self.queue_manager.clear_SettingBox()
@@ -189,12 +207,27 @@ class QueueManager(QWidget):
name = self.queue_manager.pivot.currentRouteKey()
if name == None:
logger.warning("未选择调度队列")
MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000
)
return None
queue_list = self.queue_manager.search_queue()
index = int(name[5:])
if index == len(queue_list):
logger.warning("向右移动调度队列时已到达最右端")
MainInfoBar.push_info_bar(
"warning", "已经是最后一个调度队列", "无法向右移动", 5000
)
return None
if name in Config.running_list or f"调度队列_{index+1}" in Config.running_list:
logger.warning("相关调度队列正在运行")
MainInfoBar.push_info_bar(
"warning", "相关调度队列正在运行", "请先停止调度队列", 5000
)
return None
self.queue_manager.clear_SettingBox()
@@ -235,7 +268,7 @@ class QueueSettingBox(QWidget):
self.script_list: List[QueueMemberSettingBox] = []
self.Layout.addWidget(self.pivot, 0, QtCore.Qt.AlignHCenter)
self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter)
self.Layout.addWidget(self.stackedWidget)
self.Layout.setContentsMargins(0, 0, 0, 0)

View File

@@ -25,34 +25,31 @@ v4.2
作者DLmaster_361
"""
from loguru import logger
from PySide6.QtWidgets import (
QWidget,
QApplication,
QVBoxLayout,
QVBoxLayout,
)
from qfluentwidgets import (
ScrollArea,
FluentIcon,
setTheme,
Theme,
MessageBox,
Dialog,
HyperlinkCard,
HeaderCardWidget,
SwitchSettingCard,
ExpandGroupSettingCard,
PushSettingCard,
)
from PySide6.QtUiTools import QUiLoader
from PySide6 import QtCore
import json
import subprocess
import time
import requests
uiLoader = QUiLoader()
from app.core import Config, MainInfoBar
from app.services import Notify, Crypto, System
from app.services import Crypto, System
from app.utils import Updater, version_text
from .Widget import InputMessageBox, LineEditSettingCard
@@ -67,8 +64,6 @@ class Setting(QWidget):
self.setObjectName("设置")
setTheme(Theme.AUTO)
layout = QVBoxLayout()
scrollArea = ScrollArea()
@@ -89,7 +84,7 @@ class Setting(QWidget):
self.start.card_IfSelfStart.checkedChanged.connect(System.set_SelfStart)
self.security.card_changePASSWORD.clicked.connect(self.change_PASSWORD)
self.updater.card_CheckUpdate.clicked.connect(self.get_update)
self.other.card_Tips.clicked.connect(self.show_tips)
self.other.card_Notice.clicked.connect(self.show_notice)
content_layout.addWidget(self.function)
content_layout.addWidget(self.start)
@@ -379,7 +374,7 @@ class Setting(QWidget):
else:
MainInfoBar.push_info_bar("success", "更新检查", "已是最新版本~", 3000)
def update_main(self):
def update_main(self) -> None:
"""更新主程序"""
subprocess.Popen(
@@ -390,14 +385,41 @@ class Setting(QWidget):
self.close()
QApplication.quit()
def show_tips(self):
"""显示小贴士"""
def show_notice(self):
"""显示公告"""
choice = Dialog("小贴士", "这里什么都没有~", self)
# 从远程服务器获取最新版本信息
for _ in range(3):
try:
response = requests.get(
"https://gitee.com/DLmaster_361/AUTO_MAA/raw/main/resources/version.json"
)
version_remote = response.json()
break
except Exception as e:
err = e
time.sleep(0.1)
else:
logger.warning(f"获取最新公告时出错:\n{err}")
choice = Dialog(
"网络错误",
f"获取最新公告时出错:\n{err}",
self,
)
choice.cancelButton.hide()
choice.buttonLayout.insertStretch(1)
if choice.exec():
return None
if "notice" in version_remote:
notice = version_remote["notice"]
else:
notice = "暂无公告~"
choice = Dialog("公告", notice, self)
choice.cancelButton.hide()
choice.buttonLayout.insertStretch(1)
if choice.exec():
pass
choice.exec()
class FunctionSettingCard(HeaderCardWidget):
@@ -416,12 +438,7 @@ class FunctionSettingCard(HeaderCardWidget):
configItem=Config.global_config.function_IfAllowSleep,
)
self.card_IfSilence = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT,
title="静默模式",
content="将各代理窗口置于后台运行,减少对前台的干扰",
configItem=Config.global_config.function_IfSilence,
)
self.card_IfSilence = self.SilenceSettingCard(self)
# 添加各组到设置卡中
Layout.addWidget(self.card_IfAllowSleep)
@@ -429,6 +446,43 @@ class FunctionSettingCard(HeaderCardWidget):
self.viewLayout.addLayout(Layout)
class SilenceSettingCard(ExpandGroupSettingCard):
def __init__(self, parent=None):
super().__init__(
FluentIcon.SETTING,
"静默模式",
"将各代理窗口置于后台运行,减少对前台的干扰",
parent,
)
widget = QWidget()
Layout = QVBoxLayout(widget)
self.card_IfSilence = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT,
title="静默模式",
content="是否启用静默模式",
configItem=Config.global_config.function_IfSilence,
)
self.card_BossKey = LineEditSettingCard(
text="请输入安卓模拟器老版键",
icon=FluentIcon.PAGE_RIGHT,
title="模拟器老版键",
content="输入模拟器老版快捷键,以“+”分隔",
configItem=Config.global_config.function_BossKey,
)
Layout.addWidget(self.card_IfSilence)
Layout.addWidget(self.card_BossKey)
# 调整内部布局
self.viewLayout.setContentsMargins(0, 0, 0, 0)
self.viewLayout.setSpacing(0)
self.addGroupWidget(widget)
class StartSettingCard(HeaderCardWidget):
@@ -449,7 +503,7 @@ class StartSettingCard(HeaderCardWidget):
self.card_IfRunDirectly = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT,
title="启动后直接运行",
content="启动AUTO_MAA后自动运行任务",
content="启动AUTO_MAA后自动运行任务(暂不可用)",
configItem=Config.global_config.start_IfRunDirectly,
)
@@ -618,15 +672,48 @@ class OtherSettingCard(HeaderCardWidget):
self.setTitle("其他")
Layout = QVBoxLayout()
self.card_Tips = PushSettingCard(
self.card_Notice = PushSettingCard(
text="查看",
icon=FluentIcon.PAGE_RIGHT,
title="小贴士",
content="查看AUTO_MAA的小贴士",
title="公告",
content="查看AUTO_MAA的最新公告",
)
self.card_Association = self.AssociationSettingCard()
Layout.addWidget(self.card_Tips)
Layout = QVBoxLayout()
Layout.addWidget(self.card_Notice)
Layout.addWidget(self.card_Association)
self.viewLayout.addLayout(Layout)
class AssociationSettingCard(ExpandGroupSettingCard):
def __init__(self, parent=None):
super().__init__(
FluentIcon.SETTING,
"AUTO_MAA官方社群",
"加入AUTO_MAA官方社群获取更多帮助",
parent,
)
self.card_GitHubRepository = HyperlinkCard(
url="https://github.com/DLmaster361/AUTO_MAA",
text="访问GitHub仓库",
icon=FluentIcon.GITHUB,
title="GitHub",
content="查看AUTO_MAA的源代码提交问题和建议欢迎参与开发",
)
self.card_QQGroup = HyperlinkCard(
url="https://qm.qq.com/q/bd9fISNoME",
text="加入官方QQ交流群",
icon=FluentIcon.CHAT,
title="QQ群",
content="与AUTO_MAA开发者和用户交流",
)
widget = QWidget()
Layout = QVBoxLayout(widget)
Layout.addWidget(self.card_GitHubRepository)
Layout.addWidget(self.card_QQGroup)
self.viewLayout.setContentsMargins(0, 0, 0, 0)
self.viewLayout.setSpacing(0)
self.addGroupWidget(widget)