feat(core): 恢复基本所有原功能,数据文件版本更新
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -29,12 +29,11 @@ from loguru import logger
|
||||
import sqlite3
|
||||
import json
|
||||
import sys
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
from typing import Dict, Union
|
||||
from qfluentwidgets import (
|
||||
QConfig,
|
||||
ConfigItem,
|
||||
qconfig,
|
||||
OptionsConfigItem,
|
||||
RangeConfigItem,
|
||||
FolderValidator,
|
||||
@@ -60,7 +59,7 @@ class AppConfig:
|
||||
|
||||
self.PASSWORD = ""
|
||||
self.running_list = []
|
||||
self.if_silence_needed = 0
|
||||
self.silence_list = []
|
||||
self.if_database_opened = False
|
||||
|
||||
# 检查文件完整性
|
||||
@@ -73,9 +72,6 @@ class AppConfig:
|
||||
(self.app_path / "config").mkdir(parents=True, exist_ok=True)
|
||||
(self.app_path / "data").mkdir(parents=True, exist_ok=True)
|
||||
(self.app_path / "debug").mkdir(parents=True, exist_ok=True)
|
||||
# (self.app_path / "data/MAAconfig/simple").mkdir(parents=True, exist_ok=True)
|
||||
# (self.app_path / "data/MAAconfig/beta").mkdir(parents=True, exist_ok=True)
|
||||
# (self.app_path / "data/MAAconfig/Default").mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 生成版本信息文件
|
||||
if not self.version_path.exists():
|
||||
@@ -95,22 +91,14 @@ class AppConfig:
|
||||
|
||||
self.init_logger()
|
||||
self.init_config()
|
||||
# self.check_database()
|
||||
self.check_data()
|
||||
logger.info("程序配置管理模块初始化完成")
|
||||
|
||||
def init_logger(self) -> None:
|
||||
"""初始化日志记录器"""
|
||||
|
||||
# logger.remove(0)
|
||||
logger.remove(0)
|
||||
|
||||
# logger.add(
|
||||
# sink=sys.stdout,
|
||||
# level="DEBUG",
|
||||
# format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <level>{message}</level>",
|
||||
# enqueue=True,
|
||||
# backtrace=True,
|
||||
# diagnose=True,
|
||||
# )
|
||||
logger.add(
|
||||
sink=self.log_path,
|
||||
level="DEBUG",
|
||||
@@ -122,6 +110,11 @@ class AppConfig:
|
||||
retention="1 month",
|
||||
compression="zip",
|
||||
)
|
||||
logger.info("===================================")
|
||||
logger.info("AUTO_MAA 主程序")
|
||||
logger.info("版本号: v4.2.1.1")
|
||||
logger.info(f"根目录: {self.app_path}")
|
||||
logger.info("===================================")
|
||||
|
||||
logger.info("日志记录器初始化完成")
|
||||
|
||||
@@ -142,89 +135,248 @@ class AppConfig:
|
||||
"CREATE TABLE adminx(admin text,id text,server text,day int,status text,last date,game text,game_1 text,game_2 text,routine text,annihilation text,infrastructure text,password byte,notes text,numb int,mode text,uid int)"
|
||||
)
|
||||
self.cur.execute("CREATE TABLE version(v text)")
|
||||
self.cur.execute("INSERT INTO version VALUES(?)", ("v1.3",))
|
||||
self.cur.execute("INSERT INTO version VALUES(?)", ("v1.4",))
|
||||
self.db.commit()
|
||||
|
||||
logger.info("用户数据库初始化完成")
|
||||
|
||||
def check_database(self) -> None:
|
||||
"""检查用户数据库文件并处理数据库版本更新"""
|
||||
def check_data(self) -> None:
|
||||
"""检查用户数据文件并处理数据文件版本更新"""
|
||||
|
||||
# 生成用户数据库
|
||||
# 生成主数据库
|
||||
if not self.database_path.exists():
|
||||
db = sqlite3.connect(self.database_path)
|
||||
cur = db.cursor()
|
||||
cur.execute(
|
||||
"CREATE TABLE adminx(admin text,id text,server text,day int,status text,last date,game text,game_1 text,game_2 text,routine text,annihilation text,infrastructure text,password byte,notes text,numb int,mode text,uid int)"
|
||||
)
|
||||
cur.execute("CREATE TABLE version(v text)")
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.3",))
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.4",))
|
||||
db.commit()
|
||||
cur.close()
|
||||
db.close()
|
||||
|
||||
# 数据库版本更新
|
||||
# 数据文件版本更新
|
||||
db = sqlite3.connect(self.database_path)
|
||||
cur = db.cursor()
|
||||
cur.execute("SELECT * FROM version WHERE True")
|
||||
version = cur.fetchall()
|
||||
# v1.0-->v1.1
|
||||
if version[0][0] == "v1.0":
|
||||
cur.execute("SELECT * FROM adminx WHERE True")
|
||||
data = cur.fetchall()
|
||||
cur.execute("DROP TABLE IF EXISTS adminx")
|
||||
cur.execute(
|
||||
"CREATE TABLE adminx(admin text,id text,server text,day int,status text,last date,game text,game_1 text,game_2 text,routines text,annihilation text,infrastructure text,password byte,notes text,numb int,mode text,uid int)"
|
||||
)
|
||||
for i in range(len(data)):
|
||||
|
||||
if version[0][0] != "v1.4":
|
||||
logger.info("数据文件版本更新开始")
|
||||
if_streaming = False
|
||||
# v1.0-->v1.1
|
||||
if version[0][0] == "v1.0" or if_streaming:
|
||||
logger.info("数据文件版本更新:v1.0-->v1.1")
|
||||
if_streaming = True
|
||||
cur.execute("SELECT * FROM adminx WHERE True")
|
||||
data = cur.fetchall()
|
||||
cur.execute("DROP TABLE IF EXISTS adminx")
|
||||
cur.execute(
|
||||
"INSERT INTO adminx VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
|
||||
(
|
||||
data[i][0], # 0 0 0
|
||||
data[i][1], # 1 1 -
|
||||
"Official", # 2 2 -
|
||||
data[i][2], # 3 3 1
|
||||
data[i][3], # 4 4 2
|
||||
data[i][4], # 5 5 3
|
||||
data[i][5], # 6 6 -
|
||||
data[i][6], # 7 7 -
|
||||
data[i][7], # 8 8 -
|
||||
"y", # 9 - 4
|
||||
data[i][8], # 10 9 5
|
||||
data[i][9], # 11 10 -
|
||||
data[i][10], # 12 11 6
|
||||
data[i][11], # 13 12 7
|
||||
data[i][12], # 14 - -
|
||||
"simple", # 15 - -
|
||||
data[i][13], # 16 - -
|
||||
),
|
||||
"CREATE TABLE adminx(admin text,id text,server text,day int,status text,last date,game text,game_1 text,game_2 text,routines text,annihilation text,infrastructure text,password byte,notes text,numb int,mode text,uid int)"
|
||||
)
|
||||
cur.execute("DELETE FROM version WHERE v = ?", ("v1.0",))
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.1",))
|
||||
db.commit()
|
||||
# v1.1-->v1.2
|
||||
if version[0][0] == "v1.1":
|
||||
cur.execute("SELECT * FROM adminx WHERE True")
|
||||
data = cur.fetchall()
|
||||
for i in range(len(data)):
|
||||
cur.execute(
|
||||
"UPDATE adminx SET infrastructure = 'n' WHERE mode = ? AND uid = ?",
|
||||
(
|
||||
data[i][15],
|
||||
data[i][16],
|
||||
),
|
||||
for i in range(len(data)):
|
||||
cur.execute(
|
||||
"INSERT INTO adminx VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",
|
||||
(
|
||||
data[i][0], # 0 0 0
|
||||
data[i][1], # 1 1 -
|
||||
"Official", # 2 2 -
|
||||
data[i][2], # 3 3 1
|
||||
data[i][3], # 4 4 2
|
||||
data[i][4], # 5 5 3
|
||||
data[i][5], # 6 6 -
|
||||
data[i][6], # 7 7 -
|
||||
data[i][7], # 8 8 -
|
||||
"y", # 9 - 4
|
||||
data[i][8], # 10 9 5
|
||||
data[i][9], # 11 10 -
|
||||
data[i][10], # 12 11 6
|
||||
data[i][11], # 13 12 7
|
||||
data[i][12], # 14 - -
|
||||
"simple", # 15 - -
|
||||
data[i][13], # 16 - -
|
||||
),
|
||||
)
|
||||
cur.execute("DELETE FROM version WHERE v = ?", ("v1.0",))
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.1",))
|
||||
db.commit()
|
||||
# v1.1-->v1.2
|
||||
if version[0][0] == "v1.1" or if_streaming:
|
||||
logger.info("数据文件版本更新:v1.1-->v1.2")
|
||||
if_streaming = True
|
||||
cur.execute("SELECT * FROM adminx WHERE True")
|
||||
data = cur.fetchall()
|
||||
for i in range(len(data)):
|
||||
cur.execute(
|
||||
"UPDATE adminx SET infrastructure = 'n' WHERE mode = ? AND uid = ?",
|
||||
(
|
||||
data[i][15],
|
||||
data[i][16],
|
||||
),
|
||||
)
|
||||
cur.execute("DELETE FROM version WHERE v = ?", ("v1.1",))
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.2",))
|
||||
db.commit()
|
||||
# v1.2-->v1.3
|
||||
if version[0][0] == "v1.2" or if_streaming:
|
||||
logger.info("数据文件版本更新:v1.2-->v1.3")
|
||||
if_streaming = True
|
||||
cur.execute("ALTER TABLE adminx RENAME COLUMN routines TO routine")
|
||||
cur.execute("DELETE FROM version WHERE v = ?", ("v1.2",))
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.3",))
|
||||
db.commit()
|
||||
# v1.3-->v1.4
|
||||
if version[0][0] == "v1.3" or if_streaming:
|
||||
logger.info("数据文件版本更新:v1.3-->v1.4")
|
||||
if_streaming = True
|
||||
(self.app_path / "config/MaaConfig").mkdir(parents=True, exist_ok=True)
|
||||
shutil.move(
|
||||
self.app_path / "data/MaaConfig",
|
||||
self.app_path / "config/MaaConfig",
|
||||
)
|
||||
cur.execute("DELETE FROM version WHERE v = ?", ("v1.1",))
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.2",))
|
||||
db.commit()
|
||||
# v1.2-->v1.3
|
||||
if version[0][0] == "v1.2":
|
||||
cur.execute("ALTER TABLE adminx RENAME COLUMN routines TO routine")
|
||||
cur.execute("DELETE FROM version WHERE v = ?", ("v1.2",))
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.3",))
|
||||
db.commit()
|
||||
cur.close()
|
||||
db.close()
|
||||
(self.app_path / "config/MaaConfig/MaaConfig").rename(
|
||||
self.app_path / "config/MaaConfig/脚本_1"
|
||||
)
|
||||
shutil.copy(
|
||||
self.database_path,
|
||||
self.app_path / "config/MaaConfig/脚本_1/user_data.db",
|
||||
)
|
||||
cur.execute("DROP TABLE IF EXISTS adminx")
|
||||
cur.execute("DELETE FROM version WHERE v = ?", ("v1.3",))
|
||||
cur.execute("INSERT INTO version VALUES(?)", ("v1.4",))
|
||||
db.commit()
|
||||
with (self.app_path / "config/gui.json").open(
|
||||
"r", encoding="utf-8"
|
||||
) as f:
|
||||
info = json.load(f)
|
||||
maa_config = {
|
||||
"MaaSet": {
|
||||
"Name": "",
|
||||
"Path": info["Default"]["MaaSet.path"],
|
||||
},
|
||||
"RunSet": {
|
||||
"AnnihilationTimeLimit": info["Default"][
|
||||
"TimeLimit.annihilation"
|
||||
],
|
||||
"RoutineTimeLimit": info["Default"]["TimeLimit.routine"],
|
||||
"RunTimesLimit": info["Default"]["TimesLimit.run"],
|
||||
},
|
||||
}
|
||||
with (self.app_path / "config/MaaConfig/脚本_1/config.json").open(
|
||||
"w", encoding="utf-8"
|
||||
) as f:
|
||||
json.dump(maa_config, f, ensure_ascii=False, indent=4)
|
||||
config = {
|
||||
"Function": {
|
||||
"BossKey": info["Default"]["SelfSet.BossKey"],
|
||||
"IfAllowSleep": bool(
|
||||
info["Default"]["SelfSet.IfSleep"] == "True"
|
||||
),
|
||||
"IfSilence": bool(
|
||||
info["Default"]["SelfSet.IfSilence"] == "True"
|
||||
),
|
||||
},
|
||||
"Notify": {
|
||||
"IfPushPlyer": True,
|
||||
"IfSendErrorOnly": bool(
|
||||
info["Default"]["SelfSet.IfSendMail.OnlyError"] == "True"
|
||||
),
|
||||
"IfSendMail": bool(
|
||||
info["Default"]["SelfSet.IfSendMail"] == "True"
|
||||
),
|
||||
"MailAddress": info["Default"]["SelfSet.MailAddress"],
|
||||
},
|
||||
"Start": {
|
||||
"IfRunDirectly": bool(
|
||||
info["Default"]["SelfSet.IfProxyDirectly"] == "True"
|
||||
),
|
||||
"IfSelfStart": bool(
|
||||
info["Default"]["SelfSet.IfSelfStart"] == "True"
|
||||
),
|
||||
},
|
||||
"UI": {
|
||||
"IfShowTray": bool(
|
||||
info["Default"]["SelfSet.IfToTray"] == "True"
|
||||
),
|
||||
"IfToTray": bool(info["Default"]["SelfSet.IfToTray"] == "True"),
|
||||
"location": info["Default"]["SelfSet.UIlocation"],
|
||||
"maximized": bool(
|
||||
info["Default"]["SelfSet.UImaximized"] == "True"
|
||||
),
|
||||
"size": info["Default"]["SelfSet.UIsize"],
|
||||
},
|
||||
"Update": {"IfAutoUpdate": False},
|
||||
}
|
||||
with (self.app_path / "config/config.json").open(
|
||||
"w", encoding="utf-8"
|
||||
) as f:
|
||||
json.dump(config, f, ensure_ascii=False, indent=4)
|
||||
queue_config = {
|
||||
"QueueSet": {"Enabled": True, "Name": ""},
|
||||
"Queue": {
|
||||
"Member_1": "脚本_1",
|
||||
"Member_10": "禁用",
|
||||
"Member_2": "禁用",
|
||||
"Member_3": "禁用",
|
||||
"Member_4": "禁用",
|
||||
"Member_5": "禁用",
|
||||
"Member_6": "禁用",
|
||||
"Member_7": "禁用",
|
||||
"Member_8": "禁用",
|
||||
"Member_9": "禁用",
|
||||
},
|
||||
"Time": {
|
||||
"TimeEnabled_0": bool(
|
||||
info["Default"]["TimeSet.set1"] == "True"
|
||||
),
|
||||
"TimeEnabled_1": bool(
|
||||
info["Default"]["TimeSet.set2"] == "True"
|
||||
),
|
||||
"TimeEnabled_2": bool(
|
||||
info["Default"]["TimeSet.set3"] == "True"
|
||||
),
|
||||
"TimeEnabled_3": bool(
|
||||
info["Default"]["TimeSet.set4"] == "True"
|
||||
),
|
||||
"TimeEnabled_4": bool(
|
||||
info["Default"]["TimeSet.set5"] == "True"
|
||||
),
|
||||
"TimeEnabled_5": bool(
|
||||
info["Default"]["TimeSet.set6"] == "True"
|
||||
),
|
||||
"TimeEnabled_6": bool(
|
||||
info["Default"]["TimeSet.set7"] == "True"
|
||||
),
|
||||
"TimeEnabled_7": bool(
|
||||
info["Default"]["TimeSet.set8"] == "True"
|
||||
),
|
||||
"TimeEnabled_8": bool(
|
||||
info["Default"]["TimeSet.set9"] == "True"
|
||||
),
|
||||
"TimeEnabled_9": bool(
|
||||
info["Default"]["TimeSet.set10"] == "True"
|
||||
),
|
||||
"TimeSet_0": info["Default"]["TimeSet.run1"],
|
||||
"TimeSet_1": info["Default"]["TimeSet.run2"],
|
||||
"TimeSet_2": info["Default"]["TimeSet.run3"],
|
||||
"TimeSet_3": info["Default"]["TimeSet.run4"],
|
||||
"TimeSet_4": info["Default"]["TimeSet.run5"],
|
||||
"TimeSet_5": info["Default"]["TimeSet.run6"],
|
||||
"TimeSet_6": info["Default"]["TimeSet.run7"],
|
||||
"TimeSet_7": info["Default"]["TimeSet.run8"],
|
||||
"TimeSet_8": info["Default"]["TimeSet.run9"],
|
||||
"TimeSet_9": info["Default"]["TimeSet.run10"],
|
||||
},
|
||||
}
|
||||
(self.app_path / "config/QueueConfig").mkdir(
|
||||
parents=True, exist_ok=True
|
||||
)
|
||||
with (self.app_path / "config/QueueConfig/调度队列_1.json").open(
|
||||
"w", encoding="utf-8"
|
||||
) as f:
|
||||
json.dump(queue_config, f, ensure_ascii=False, indent=4)
|
||||
(self.app_path / "config/gui.json").unlink()
|
||||
cur.close()
|
||||
db.close()
|
||||
logger.info("数据文件版本更新完成")
|
||||
|
||||
def open_database(self, mode: str, index: str = None) -> None:
|
||||
"""打开数据库"""
|
||||
@@ -244,6 +396,42 @@ class AppConfig:
|
||||
self.db.close()
|
||||
self.if_database_opened = False
|
||||
|
||||
def change_user_info(
|
||||
self,
|
||||
data_path: Path,
|
||||
modes: list,
|
||||
uids: list,
|
||||
days: list,
|
||||
lasts: list,
|
||||
notes: list,
|
||||
numbs: list,
|
||||
) -> None:
|
||||
"""将代理完成后发生改动的用户信息同步至本地数据库"""
|
||||
|
||||
db = sqlite3.connect(data_path / "user_data.db")
|
||||
cur = db.cursor()
|
||||
|
||||
for index in range(len(uids)):
|
||||
cur.execute(
|
||||
"UPDATE adminx SET day = ? WHERE mode = ? AND uid = ?",
|
||||
(days[index], modes[index], uids[index]),
|
||||
)
|
||||
cur.execute(
|
||||
"UPDATE adminx SET last = ? WHERE mode = ? AND uid = ?",
|
||||
(lasts[index], modes[index], uids[index]),
|
||||
)
|
||||
cur.execute(
|
||||
"UPDATE adminx SET notes = ? WHERE mode = ? AND uid = ?",
|
||||
(notes[index], modes[index], uids[index]),
|
||||
)
|
||||
cur.execute(
|
||||
"UPDATE adminx SET numb = ? WHERE mode = ? AND uid = ?",
|
||||
(numbs[index], modes[index], uids[index]),
|
||||
)
|
||||
db.commit()
|
||||
cur.close()
|
||||
db.close()
|
||||
|
||||
def save_history(self, key: str, content: dict) -> None:
|
||||
"""保存历史记录"""
|
||||
|
||||
@@ -334,7 +522,6 @@ class GlobalConfig(QConfig):
|
||||
ui_size = ConfigItem("UI", "size", "1200x700")
|
||||
ui_location = ConfigItem("UI", "location", "100x100")
|
||||
ui_maximized = ConfigItem("UI", "maximized", False, BoolValidator())
|
||||
ui_MainIndex = RangeConfigItem("UI", "MainIndex", 0, RangeValidator(0, 3))
|
||||
|
||||
notify_IfPushPlyer = ConfigItem("Notify", "IfPushPlyer", False, BoolValidator())
|
||||
notify_IfSendMail = ConfigItem("Notify", "IfSendMail", False, BoolValidator())
|
||||
|
||||
@@ -26,76 +26,126 @@ v4.2
|
||||
"""
|
||||
|
||||
from loguru import logger
|
||||
from PySide6 import QtCore
|
||||
from typing import Dict, Union, List
|
||||
from PySide6.QtCore import QThread, QObject, Signal
|
||||
from qfluentwidgets import Dialog
|
||||
from pathlib import Path
|
||||
from typing import Dict, Union
|
||||
|
||||
from .config import Config
|
||||
from .main_info_bar import MainInfoBar
|
||||
from app.models import MaaManager
|
||||
from app.services import Notify
|
||||
|
||||
|
||||
class Task(QtCore.QThread):
|
||||
class Task(QThread):
|
||||
"""业务线程"""
|
||||
|
||||
push_info_bar = QtCore.Signal(str, str, str, int)
|
||||
update_user_info = QtCore.Signal(list, list, list, list, list, list)
|
||||
create_task_list = QtCore.Signal(list)
|
||||
create_user_list = QtCore.Signal(list)
|
||||
update_task_list = QtCore.Signal(list)
|
||||
update_user_list = QtCore.Signal(list)
|
||||
update_log_text = QtCore.Signal(str)
|
||||
accomplish = QtCore.Signal(list)
|
||||
push_info_bar = Signal(str, str, str, int)
|
||||
question = Signal(str, str)
|
||||
question_response = Signal(bool)
|
||||
update_user_info = Signal(Path, list, list, list, list, list, list)
|
||||
create_task_list = Signal(list)
|
||||
create_user_list = Signal(list)
|
||||
update_task_list = Signal(list)
|
||||
update_user_list = Signal(list)
|
||||
update_log_text = Signal(str)
|
||||
accomplish = Signal(list)
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
mode: str,
|
||||
name: str,
|
||||
info: Dict[str, Dict[str, Union[str, int, bool]]],
|
||||
):
|
||||
super(Task, self).__init__()
|
||||
|
||||
self.mode = mode
|
||||
self.name = name
|
||||
self.info = info
|
||||
|
||||
self.logs = []
|
||||
|
||||
self.question_response.connect(lambda: print("response"))
|
||||
|
||||
def run(self):
|
||||
|
||||
self.member_dict = self.search_member()
|
||||
self.task_list = [
|
||||
[value, "等待"]
|
||||
for _, value in self.info["Queue"].items()
|
||||
if value != "禁用"
|
||||
]
|
||||
if "设置MAA" in self.mode:
|
||||
|
||||
self.create_task_list.emit(self.task_list)
|
||||
logger.info(f"任务开始:设置{self.name}")
|
||||
self.push_info_bar.emit("info", "设置MAA", self.name, 3000)
|
||||
|
||||
for i in range(len(self.task_list)):
|
||||
self.task = MaaManager(
|
||||
self.mode,
|
||||
Config.app_path / f"config/MaaConfig/{self.name}",
|
||||
(
|
||||
None
|
||||
if "全局" in self.mode
|
||||
else Config.app_path
|
||||
/ f"config/MaaConfig/{self.name}/beta/{self.info["SetMaaInfo"]["UserId"]}/{self.info["SetMaaInfo"]["SetType"]}"
|
||||
),
|
||||
)
|
||||
self.task.push_info_bar.connect(self.push_info_bar.emit)
|
||||
self.task.accomplish.connect(lambda: self.accomplish.emit([]))
|
||||
|
||||
if self.isInterruptionRequested():
|
||||
break
|
||||
self.task.run()
|
||||
|
||||
self.task_list[i][1] = "运行"
|
||||
self.update_task_list.emit(self.task_list)
|
||||
else:
|
||||
|
||||
if self.task_list[i][0] not in Config.running_list:
|
||||
self.member_dict = self.search_member()
|
||||
self.task_list = [
|
||||
[value, "等待"]
|
||||
for _, value in self.info["Queue"].items()
|
||||
if value != "禁用"
|
||||
]
|
||||
|
||||
self.create_task_list.emit(self.task_list)
|
||||
|
||||
for i in range(len(self.task_list)):
|
||||
|
||||
if self.isInterruptionRequested():
|
||||
break
|
||||
|
||||
self.task_list[i][1] = "运行"
|
||||
self.update_task_list.emit(self.task_list)
|
||||
|
||||
if self.task_list[i][0] in Config.running_list:
|
||||
|
||||
self.task_list[i][1] = "跳过"
|
||||
self.update_task_list.emit(self.task_list)
|
||||
logger.info(f"跳过任务:{self.task_list[i][0]}")
|
||||
self.push_info_bar.emit(
|
||||
"info", "跳过任务", self.task_list[i][0], 3000
|
||||
)
|
||||
continue
|
||||
|
||||
Config.running_list.append(self.task_list[i][0])
|
||||
logger.info(f"任务开始:{self.task_list[i][0]}")
|
||||
self.push_info_bar.emit("info", "任务开始", self.task_list[i][0], 5000)
|
||||
self.push_info_bar.emit("info", "任务开始", self.task_list[i][0], 3000)
|
||||
|
||||
if self.member_dict[self.task_list[i][0]][0] == "Maa":
|
||||
|
||||
self.task = MaaManager(
|
||||
"自动代理",
|
||||
self.mode[0:4],
|
||||
self.member_dict[self.task_list[i][0]][1],
|
||||
)
|
||||
|
||||
self.task.question.connect(self.question.emit)
|
||||
self.question_response.disconnect()
|
||||
self.question_response.connect(self.task.question_response.emit)
|
||||
self.task.push_info_bar.connect(self.push_info_bar.emit)
|
||||
self.task.create_user_list.connect(self.create_user_list.emit)
|
||||
self.task.update_user_list.connect(self.update_user_list.emit)
|
||||
self.task.update_log_text.connect(self.update_log_text.emit)
|
||||
self.task.update_user_info.connect(self.update_user_info.emit)
|
||||
self.task.update_user_info.connect(
|
||||
lambda modes, uids, days, lasts, notes, numbs: self.update_user_info.emit(
|
||||
self.member_dict[self.task_list[i][0]][1],
|
||||
modes,
|
||||
uids,
|
||||
days,
|
||||
lasts,
|
||||
notes,
|
||||
numbs,
|
||||
)
|
||||
)
|
||||
self.task.accomplish.connect(
|
||||
lambda log: self.save_log(self.task_list[i][0], log)
|
||||
)
|
||||
@@ -106,15 +156,9 @@ class Task(QtCore.QThread):
|
||||
|
||||
self.task_list[i][1] = "完成"
|
||||
logger.info(f"任务完成:{self.task_list[i][0]}")
|
||||
self.push_info_bar.emit("info", "任务完成", self.task_list[i][0], 5000)
|
||||
self.push_info_bar.emit("info", "任务完成", self.task_list[i][0], 3000)
|
||||
|
||||
else:
|
||||
|
||||
self.task_list[i][1] = "跳过"
|
||||
logger.info(f"跳过任务:{self.task_list[i][0]}")
|
||||
self.push_info_bar.emit("info", "跳过任务", self.task_list[i][0], 5000)
|
||||
|
||||
self.accomplish.emit(self.logs)
|
||||
self.accomplish.emit(self.logs)
|
||||
|
||||
def search_member(self) -> dict:
|
||||
"""搜索所有脚本实例并固定相关配置信息"""
|
||||
@@ -135,12 +179,12 @@ class Task(QtCore.QThread):
|
||||
self.logs.append([name, log])
|
||||
|
||||
|
||||
class TaskManager(QtCore.QObject):
|
||||
class TaskManager(QObject):
|
||||
"""业务调度器"""
|
||||
|
||||
create_gui = QtCore.Signal(Task)
|
||||
connect_gui = QtCore.Signal(Task)
|
||||
push_info_bar = QtCore.Signal(str, str, str, int)
|
||||
create_gui = Signal(Task)
|
||||
connect_gui = Signal(Task)
|
||||
push_info_bar = Signal(str, str, str, int)
|
||||
|
||||
def __init__(self):
|
||||
super(TaskManager, self).__init__()
|
||||
@@ -162,16 +206,20 @@ class TaskManager(QtCore.QObject):
|
||||
MainInfoBar.push_info_bar("info", "任务开始", name, 3000)
|
||||
|
||||
Config.running_list.append(name)
|
||||
self.task_list[name] = Task(name, info)
|
||||
self.task_list[name] = Task(mode, name, info)
|
||||
self.task_list[name].question.connect(
|
||||
lambda title, content: self.push_dialog(name, title, content)
|
||||
)
|
||||
self.task_list[name].push_info_bar.connect(MainInfoBar.push_info_bar)
|
||||
self.task_list[name].update_user_info.connect(Config.change_user_info)
|
||||
self.task_list[name].accomplish.connect(
|
||||
lambda logs: self.remove_task(name, logs)
|
||||
)
|
||||
|
||||
if mode == "新窗口":
|
||||
if "新窗口" in mode:
|
||||
self.create_gui.emit(self.task_list[name])
|
||||
|
||||
elif mode == "主窗口":
|
||||
elif "主窗口" in mode:
|
||||
self.connect_gui.emit(self.task_list[name])
|
||||
|
||||
self.task_list[name].start()
|
||||
@@ -217,5 +265,14 @@ class TaskManager(QtCore.QObject):
|
||||
self.task_list.pop(name)
|
||||
Config.running_list.remove(name)
|
||||
|
||||
def push_dialog(self, name: str, title: str, content: str):
|
||||
"""推送对话框"""
|
||||
|
||||
choice = Dialog(title, content, None)
|
||||
choice.yesButton.setText("是")
|
||||
choice.cancelButton.setText("否")
|
||||
|
||||
self.task_list[name].question_response.emit(bool(choice.exec_()))
|
||||
|
||||
|
||||
Task_manager = TaskManager()
|
||||
|
||||
@@ -27,9 +27,10 @@ v4.2
|
||||
|
||||
from loguru import logger
|
||||
from PySide6.QtWidgets import QWidget
|
||||
from PySide6 import QtCore
|
||||
from PySide6.QtCore import QTimer
|
||||
import json
|
||||
import datetime
|
||||
import pyautogui
|
||||
|
||||
from .config import Config
|
||||
from .task_manager import Task_manager
|
||||
@@ -44,7 +45,7 @@ class MainTimer(QWidget):
|
||||
):
|
||||
super().__init__(parent)
|
||||
|
||||
self.Timer = QtCore.QTimer()
|
||||
self.Timer = QTimer()
|
||||
self.Timer.timeout.connect(self.timed_start)
|
||||
self.Timer.timeout.connect(self.set_silence)
|
||||
self.Timer.start(1000)
|
||||
@@ -77,24 +78,29 @@ class MainTimer(QWidget):
|
||||
and name not in Config.running_list
|
||||
):
|
||||
|
||||
logger.info(f"按时间调起任务:{name}")
|
||||
Task_manager.add_task("新窗口", name, info)
|
||||
logger.info(f"定时任务:{name}")
|
||||
Task_manager.add_task("自动代理_新窗口", name, info)
|
||||
|
||||
def set_silence(self):
|
||||
"""设置静默模式"""
|
||||
# # 临时
|
||||
# windows = System.get_window_info()
|
||||
# if any(emulator_path in _ for _ in windows):
|
||||
# try:
|
||||
# pyautogui.hotkey(*boss_key)
|
||||
# except pyautogui.FailSafeException as e:
|
||||
# 执行日志记录,暂时缺省
|
||||
logger.debug(Config.running_list)
|
||||
|
||||
def set_last_time(self):
|
||||
"""设置上次运行时间"""
|
||||
|
||||
pass
|
||||
windows = System.get_window_info()
|
||||
if any(
|
||||
str(emulator_path) in window
|
||||
for window in windows
|
||||
for emulator_path in Config.silence_list
|
||||
):
|
||||
try:
|
||||
pyautogui.hotkey(
|
||||
*[
|
||||
_.strip().lower()
|
||||
for _ in Config.global_config.get(
|
||||
Config.global_config.function_BossKey
|
||||
).split("+")
|
||||
]
|
||||
)
|
||||
except pyautogui.FailSafeException as e:
|
||||
logger.warning(f"FailSafeException: {e}")
|
||||
|
||||
def search_queue(self) -> list:
|
||||
"""搜索所有调度队列实例"""
|
||||
|
||||
@@ -25,7 +25,7 @@ v4.2
|
||||
作者:DLmaster_361
|
||||
"""
|
||||
from loguru import logger
|
||||
from PySide6 import QtCore
|
||||
from PySide6.QtCore import QObject, Signal, QEventLoop
|
||||
import json
|
||||
import sqlite3
|
||||
import datetime
|
||||
@@ -33,24 +33,23 @@ import subprocess
|
||||
import shutil
|
||||
import time
|
||||
from pathlib import Path
|
||||
from typing import List, Dict, Union
|
||||
from typing import List
|
||||
|
||||
from app.core import Config
|
||||
from app.services import Notify
|
||||
|
||||
|
||||
class MaaManager(QtCore.QObject):
|
||||
class MaaManager(QObject):
|
||||
"""MAA控制器"""
|
||||
|
||||
question = QtCore.Signal(str, str)
|
||||
question_response = QtCore.Signal(int)
|
||||
update_user_info = QtCore.Signal(list, list, list, list, list, list)
|
||||
push_info_bar = QtCore.Signal(str, str, str, int)
|
||||
create_user_list = QtCore.Signal(list)
|
||||
update_user_list = QtCore.Signal(list)
|
||||
update_log_text = QtCore.Signal(str)
|
||||
accomplish = QtCore.Signal(dict)
|
||||
get_json = QtCore.Signal(list)
|
||||
question = Signal(str, str)
|
||||
question_response = Signal(bool)
|
||||
update_user_info = Signal(list, list, list, list, list, list)
|
||||
push_info_bar = Signal(str, str, str, int)
|
||||
create_user_list = Signal(list)
|
||||
update_user_list = Signal(list)
|
||||
update_log_text = Signal(str)
|
||||
accomplish = Signal(dict)
|
||||
|
||||
isInterruptionRequested = False
|
||||
|
||||
@@ -58,24 +57,29 @@ class MaaManager(QtCore.QObject):
|
||||
self,
|
||||
mode: str,
|
||||
config_path: Path,
|
||||
user_config_path: Path = None,
|
||||
):
|
||||
super(MaaManager, self).__init__()
|
||||
|
||||
self.mode = mode
|
||||
self.config_path = config_path
|
||||
self.user_config_path = user_config_path
|
||||
|
||||
with (self.config_path / "config.json").open("r", encoding="utf-8") as f:
|
||||
self.set = json.load(f)
|
||||
|
||||
db = sqlite3.connect(self.config_path / "user_data.db")
|
||||
cur = db.cursor()
|
||||
cur.execute("SELECT * FROM adminx WHERE True")
|
||||
self.data = cur.fetchall()
|
||||
self.data = [list(row) for row in self.data]
|
||||
cur.close()
|
||||
db.close()
|
||||
if "设置MAA" not in self.mode:
|
||||
|
||||
self.get_json_path = [0, 0, 0]
|
||||
db = sqlite3.connect(self.config_path / "user_data.db")
|
||||
cur = db.cursor()
|
||||
cur.execute("SELECT * FROM adminx WHERE True")
|
||||
self.data = cur.fetchall()
|
||||
self.data = [list(row) for row in self.data]
|
||||
cur.close()
|
||||
db.close()
|
||||
|
||||
else:
|
||||
self.data = []
|
||||
|
||||
def configure(self):
|
||||
"""提取配置信息"""
|
||||
@@ -84,12 +88,6 @@ class MaaManager(QtCore.QObject):
|
||||
self.maa_set_path = self.maa_root_path / "config/gui.json"
|
||||
self.maa_log_path = self.maa_root_path / "debug/gui.log"
|
||||
self.maa_exe_path = self.maa_root_path / "MAA.exe"
|
||||
self.boss_key = [
|
||||
_.strip().lower()
|
||||
for _ in Config.global_config.get(
|
||||
Config.global_config.function_BossKey
|
||||
).split("+")
|
||||
]
|
||||
|
||||
def run(self):
|
||||
"""主进程,运行MAA代理进程"""
|
||||
@@ -177,8 +175,18 @@ class MaaManager(QtCore.QObject):
|
||||
shell=True,
|
||||
creationflags=subprocess.CREATE_NO_WINDOW,
|
||||
)
|
||||
# 添加静默进程数量标记
|
||||
Config.if_silence_needed += 1
|
||||
# 添加静默进程标记
|
||||
if Config.global_config.get(
|
||||
Config.global_config.function_IfSilence
|
||||
):
|
||||
with self.maa_set_path.open(
|
||||
mode="r", encoding="utf-8"
|
||||
) as f:
|
||||
set = json.load(f)
|
||||
self.emulator_path = Path(
|
||||
set["Configurations"]["Default"]["Start.EmulatorPath"]
|
||||
)
|
||||
Config.silence_list.append(self.emulator_path)
|
||||
# 记录是否超时的标记
|
||||
self.if_time_out = False
|
||||
|
||||
@@ -233,8 +241,11 @@ class MaaManager(QtCore.QObject):
|
||||
self.update_log_text.emit(
|
||||
"检测到MAA进程完成代理任务\n正在等待相关程序结束\n请等待10s"
|
||||
)
|
||||
# 移除静默进程数量标记
|
||||
Config.if_silence_needed -= 1
|
||||
# 移除静默进程标记
|
||||
if Config.global_config.get(
|
||||
Config.global_config.function_IfSilence
|
||||
):
|
||||
Config.silence_list.remove(self.emulator_path)
|
||||
for _ in range(10):
|
||||
if self.isInterruptionRequested:
|
||||
break
|
||||
@@ -254,8 +265,11 @@ class MaaManager(QtCore.QObject):
|
||||
creationflags=subprocess.CREATE_NO_WINDOW,
|
||||
)
|
||||
killprocess.wait()
|
||||
# 移除静默进程数量标记
|
||||
Config.if_silence_needed -= 1
|
||||
# 移除静默进程标记
|
||||
if Config.global_config.get(
|
||||
Config.global_config.function_IfSilence
|
||||
):
|
||||
Config.silence_list.remove(self.emulator_path)
|
||||
# 推送异常通知
|
||||
Notify.push_notification(
|
||||
"用户自动代理出现异常!",
|
||||
@@ -375,24 +389,18 @@ class MaaManager(QtCore.QObject):
|
||||
break
|
||||
# 登录失败,询问是否结束循环
|
||||
elif not self.isInterruptionRequested:
|
||||
self.question_title = "操作提示"
|
||||
self.question_info = "MAA未能正确登录到PRTS,是否重试?"
|
||||
self.question_choice = "wait"
|
||||
self.question.emit()
|
||||
while self.question_choice == "wait":
|
||||
time.sleep(1)
|
||||
if self.question_choice == "No":
|
||||
|
||||
if not self.push_question(
|
||||
"操作提示", "MAA未能正确登录到PRTS,是否重试?"
|
||||
):
|
||||
break
|
||||
|
||||
# 登录成功,录入人工排查情况
|
||||
if run_book[0] and not self.isInterruptionRequested:
|
||||
self.question_title = "操作提示"
|
||||
self.question_info = "请检查用户代理情况,如无异常请按下确认键。"
|
||||
self.question_choice = "wait"
|
||||
self.question.emit()
|
||||
while self.question_choice == "wait":
|
||||
time.sleep(1)
|
||||
if self.question_choice == "Yes":
|
||||
|
||||
if self.push_question(
|
||||
"操作提示", "请检查用户代理情况,是否将该用户标记为异常?"
|
||||
):
|
||||
run_book[1] = True
|
||||
|
||||
# 结果录入用户备注栏
|
||||
@@ -441,13 +449,16 @@ class MaaManager(QtCore.QObject):
|
||||
# 检测时间间隔
|
||||
time.sleep(1)
|
||||
|
||||
# 保存MAA配置文件
|
||||
if "全局" in self.mode:
|
||||
self.get_json.emit(["Default"])
|
||||
elif "用户" in self.mode:
|
||||
self.get_json.emit(self.get_json_path)
|
||||
(self.config_path / "Default").mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy(self.maa_set_path, self.config_path / "Default")
|
||||
|
||||
end_log = ""
|
||||
elif "用户" in self.mode:
|
||||
self.user_config_path.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy(self.maa_set_path, self.user_config_path)
|
||||
logger.debug(self.user_config_path)
|
||||
|
||||
end_log = ""
|
||||
|
||||
# 导出结果
|
||||
if self.mode in ["自动代理", "人工排查"]:
|
||||
@@ -517,6 +528,18 @@ class MaaManager(QtCore.QObject):
|
||||
logger.info("申请中止本次任务")
|
||||
self.isInterruptionRequested = True
|
||||
|
||||
def push_question(self, title: str, message: str) -> bool:
|
||||
|
||||
self.question.emit(title, message)
|
||||
loop = QEventLoop()
|
||||
self.question_response.connect(self._capture_response)
|
||||
self.question_response.connect(loop.quit)
|
||||
loop.exec()
|
||||
return self.response
|
||||
|
||||
def _capture_response(self, response: bool) -> None:
|
||||
self.response = response
|
||||
|
||||
def get_maa_log(self, start_time):
|
||||
"""获取MAA日志"""
|
||||
|
||||
@@ -586,16 +609,8 @@ class MaaManager(QtCore.QObject):
|
||||
|
||||
# 预导入MAA配置文件
|
||||
if mode == "设置MAA_用户":
|
||||
set_book = ["simple", "beta"]
|
||||
if (
|
||||
self.config_path
|
||||
/ f"{set_book[self.get_json_path[0]]}/{self.get_json_path[1]}/{self.get_json_path[2]}/gui.json"
|
||||
).exists():
|
||||
shutil.copy(
|
||||
self.config_path
|
||||
/ f"{set_book[self.get_json_path[0]]}/{self.get_json_path[1]}/{self.get_json_path[2]}/gui.json",
|
||||
self.maa_set_path,
|
||||
)
|
||||
if self.user_config_path.exists():
|
||||
shutil.copy(self.user_config_path / "gui.json", self.maa_set_path)
|
||||
else:
|
||||
shutil.copy(
|
||||
self.config_path / "Default/gui.json",
|
||||
@@ -638,12 +653,14 @@ class MaaManager(QtCore.QObject):
|
||||
data["Configurations"]["Default"][
|
||||
"MainFunction.PostActions"
|
||||
] = "12" # 完成后退出MAA和模拟器
|
||||
data["Global"]["Start.RunDirectly"] = "True" # 启动MAA后直接运行
|
||||
data["Global"][
|
||||
data["Configurations"]["Default"][
|
||||
"Start.RunDirectly"
|
||||
] = "True" # 启动MAA后直接运行
|
||||
data["Configurations"]["Default"][
|
||||
"Start.OpenEmulatorAfterLaunch"
|
||||
] = "True" # 启动MAA后自动开启模拟器
|
||||
|
||||
if Config.if_silence_needed > 0:
|
||||
if Config.global_config.get(Config.global_config.function_IfSilence):
|
||||
data["Global"]["Start.MinimizeDirectly"] = "True" # 启动MAA后直接最小化
|
||||
data["Global"]["GUI.UseTray"] = "True" # 显示托盘图标
|
||||
data["Global"]["GUI.MinimizeToTray"] = "True" # 最小化时隐藏至托盘
|
||||
@@ -845,15 +862,21 @@ class MaaManager(QtCore.QObject):
|
||||
data["Configurations"]["Default"][
|
||||
"MainFunction.PostActions"
|
||||
] = "8" # 完成后退出MAA
|
||||
data["Global"]["Start.RunDirectly"] = "True" # 启动MAA后直接运行
|
||||
data["Configurations"]["Default"][
|
||||
"Start.RunDirectly"
|
||||
] = "True" # 启动MAA后直接运行
|
||||
data["Global"]["Start.MinimizeDirectly"] = "True" # 启动MAA后直接最小化
|
||||
data["Global"]["GUI.UseTray"] = "True" # 显示托盘图标
|
||||
data["Global"]["GUI.MinimizeToTray"] = "True" # 最小化时隐藏至托盘
|
||||
# 启动MAA后自动开启模拟器
|
||||
if "启动模拟器" in mode:
|
||||
data["Global"]["Start.OpenEmulatorAfterLaunch"] = "True"
|
||||
data["Configurations"]["Default"][
|
||||
"Start.OpenEmulatorAfterLaunch"
|
||||
] = "True"
|
||||
elif "仅切换账号" in mode:
|
||||
data["Global"]["Start.OpenEmulatorAfterLaunch"] = "False"
|
||||
data["Configurations"]["Default"][
|
||||
"Start.OpenEmulatorAfterLaunch"
|
||||
] = "False"
|
||||
|
||||
if self.data[index][15] == "simple":
|
||||
|
||||
@@ -915,12 +938,14 @@ class MaaManager(QtCore.QObject):
|
||||
data["Configurations"]["Default"][
|
||||
"MainFunction.PostActions"
|
||||
] = "0" # 完成后无动作
|
||||
data["Global"]["Start.RunDirectly"] = "False" # 启动MAA后直接运行
|
||||
data["Global"][
|
||||
data["Configurations"]["Default"][
|
||||
"Start.RunDirectly"
|
||||
] = "False" # 启动MAA后直接运行
|
||||
data["Configurations"]["Default"][
|
||||
"Start.OpenEmulatorAfterLaunch"
|
||||
] = "False" # 启动MAA后自动开启模拟器
|
||||
|
||||
if Config.if_silence_needed > 0:
|
||||
if Config.global_config.get(Config.global_config.function_IfSilence):
|
||||
data["Global"][
|
||||
"Start.MinimizeDirectly"
|
||||
] = "False" # 启动MAA后直接最小化
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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):
|
||||
|
||||
|
||||
539
app/ui/else.py
539
app/ui/else.py
@@ -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")
|
||||
@@ -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()
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -25,7 +25,6 @@ v1.1
|
||||
作者:DLmaster_361
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import zipfile
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -28,7 +28,6 @@ v4.2
|
||||
import os
|
||||
import json
|
||||
import shutil
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
from app import version_text
|
||||
|
||||
Reference in New Issue
Block a user