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

@@ -22,7 +22,7 @@ name: Build AUTO_MAA
on:
push:
branches: [ "main","fluent-gui-dev" ]
branches: [ "main","dev" ]
paths-ignore:
- '**.md'
- 'LICENSE'

View File

View File

@@ -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())

View File

@@ -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()

View File

@@ -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:
"""搜索所有调度队列实例"""

View File

@@ -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后直接最小化

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)

View File

@@ -25,7 +25,6 @@ v1.1
作者DLmaster_361
"""
import os
import sys
import json
import zipfile

View File

@@ -28,7 +28,6 @@ v4.2
import os
import json
import shutil
import subprocess
from pathlib import Path
from app import version_text

View File

@@ -1,335 +0,0 @@
{
"Configurations": {
"Default": {
"Announcement.AnnouncementInfo": "# 生息演算内容拓展Ⅱ\n\n生息演算内容拓展之后加了点剧情 现在的版本制造刷点数的自己过一下这个剧情后再过三天到下个定量之日再开始任务还是能用的, 靠一直开局刷点数的会卡住, 得等修了之后更新才能用。 \n\n# 停止资源版本自动更新\n\n现停止提供资源版本自动更新手动更新方式参考 [链接](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/10033)\n\n仓库地址 [https://github.com/MaaAssistantArknights/MaaResource](https://github.com/MaaAssistantArknights/MaaResource)\n\n# 长期公告\n\n请不要在明日方舟及鹰角在各平台包括不限于森空岛、B 站、微博)的官方动态下讨论任何关于 MAA 内容。 \n\n请勿参加内鬼消息的传播禁止将内鬼消息发送至任何 MAA 群。 \n\n<img src=\"https://ota.maa.plus/MaaAssistantArknights/api/announcements/img/NoSkland.jpg\" width=\"100%\" /><br>\n",
"Announcement.DoNotRemindThisAnnouncementAgain": "True",
"Announcement.DoNotShowAnnouncement": "False",
"AutoRecruit.AutoRecruitFirstList": "",
"AutoRecruit.ChooseLevel3": "True",
"AutoRecruit.ChooseLevel3.Time": "540",
"AutoRecruit.ChooseLevel4": "True",
"AutoRecruit.ChooseLevel4.Time": "540",
"AutoRecruit.ChooseLevel5": "True",
"AutoRecruit.ChooseLevel5.Time": "540",
"AutoRecruit.ForceRefresh": "True",
"AutoRecruit.IsLevel3UseShortTime": "False",
"AutoRecruit.IsLevel3UseShortTime2": "False",
"AutoRecruit.MaxTimes": "4",
"AutoRecruit.NotChooseLevel1": "False",
"AutoRecruit.RefreshLevel3": "True",
"AutoRecruit.SelectExtraTags": "0",
"Bluestacks.Config.Keyword": "",
"Bluestacks.Config.Path": "",
"Connect.AdbLiteEnabled": "False",
"Connect.AdbPath": "C:\\Program Files\\Netease\\MuMu Player 12\\shell\\adb.exe",
"Connect.AdbReplaced": "False",
"Connect.Address": "127.0.0.1:16416",
"Connect.AddressHistory": "[\"127.0.0.1:16416\",\"127.0.0.1:16448\",\"127.0.0.1:16384\"]",
"Connect.AllowADBHardRestart": "True",
"Connect.AllowADBRestart": "True",
"Connect.AlwaysAutoDetect": "False",
"Connect.AutoDetect": "False",
"Connect.ConnectConfig": "MuMuEmulator12",
"Connect.KillAdbOnExit": "True",
"Connect.LdPlayerEmulatorPath": "C:\\leidian\\LDPlayer9",
"Connect.LdPlayerExtras.Enabled": "False",
"Connect.LdPlayerIndex": "0",
"Connect.MuMu12Display": "0",
"Connect.MuMu12EmulatorPath": "C:\\Program Files\\Netease\\MuMu Player 12",
"Connect.MuMu12Extras.Enabled": "True",
"Connect.MuMu12Index": "2",
"Connect.MumuBridgeConnection": "False",
"Connect.RetryOnDisconnected": "True",
"Connect.TouchMode": "minitouch",
"Copilot.AddUserAdditional": "False",
"Copilot.CopilotTaskList": "",
"Copilot.LoopTimes": "1",
"Copilot.UserAdditional": "",
"ExternalNotification.Bark.SendKey": "",
"ExternalNotification.Bark.Server": "https://api.day.app",
"ExternalNotification.Discord.BotToken": "",
"ExternalNotification.Discord.UserId": "",
"ExternalNotification.Discord.WebhookUrl": "",
"ExternalNotification.Enabled": "Off",
"ExternalNotification.Qmsg.Bot": "",
"ExternalNotification.Qmsg.Key": "",
"ExternalNotification.Qmsg.Server": "",
"ExternalNotification.Qmsg.User": "",
"ExternalNotification.ServerChan.SendKey": "",
"ExternalNotification.Smtp.From": "",
"ExternalNotification.Smtp.Password": "",
"ExternalNotification.Smtp.Port": "",
"ExternalNotification.Smtp.RequiresAuthentication": "false",
"ExternalNotification.Smtp.Server": "",
"ExternalNotification.Smtp.To": "",
"ExternalNotification.Smtp.User": "",
"ExternalNotification.Smtp.UseSsl": "false",
"ExternalNotification.Telegram.BotToken": "",
"ExternalNotification.Telegram.ChatId": "",
"Fight.RemainingSanityStage": "",
"Fight.UseExpiringMedicine": "True",
"Fight.UseRemainingSanityStage": "False",
"Gacha.ShowDisclaimerNoMore": "False",
"GUI.AllowUseStoneSave": "False",
"GUI.CustomStageCode": "True",
"GUI.HideSeries": "False",
"GUI.HideUnavailableStage": "False",
"GUI.MinimizeToTray": "False",
"GUI.Placement": "{\"Length\":44,\"Flags\":0,\"ShowCmd\":1,\"MinPosition\":{\"X\":-1,\"Y\":-1},\"MaxPosition\":{\"X\":-1,\"Y\":-1},\"NormalPosition\":{\"Left\":680,\"Top\":314,\"Right\":1880,\"Bottom\":1214}}",
"GUI.Placement.Load": "True",
"GUI.Placement.SaveOnClosing": "True",
"GUI.UseAlternateStage": "False",
"GUI.UseLogItemDateFormat": "False",
"GUI.UseTray": "True",
"GUI.WindowTitlePrefix": "",
"Guide.StepIndex": "4",
"Infrast.ContinueTraining": "True",
"Infrast.Control.IsChecked": "True",
"Infrast.CustomInfrastEnabled": "False",
"Infrast.CustomInfrastFile": "D:\\AUTO\\MAA\\合成玉排班.json",
"Infrast.CustomInfrastPlanIndex": "2",
"Infrast.CustomInfrastPlanShowInFightSettings": "False",
"Infrast.DefaultInfrast": "user_defined",
"Infrast.Dorm.IsChecked": "True",
"Infrast.DormFilterNotStationedEnabled": "True",
"Infrast.DormThreshold": "30",
"Infrast.DormTrustEnabled": "False",
"Infrast.IsCustomInfrastFileReadOnly": "False",
"Infrast.Mfg.IsChecked": "True",
"Infrast.Office.IsChecked": "True",
"Infrast.Order.Control": "2",
"Infrast.Order.Dorm": "6",
"Infrast.Order.Mfg": "0",
"Infrast.Order.Office": "5",
"Infrast.Order.Power": "3",
"Infrast.Order.Processing": "7",
"Infrast.Order.Reception": "4",
"Infrast.Order.Trade": "1",
"Infrast.Order.Training": "8",
"Infrast.OriginiumShardAutoReplenishment": "True",
"Infrast.Power.IsChecked": "True",
"Infrast.Processing.IsChecked": "True",
"Infrast.Reception.IsChecked": "True",
"Infrast.Trade.IsChecked": "True",
"Infrast.Training.IsChecked": "True",
"Infrast.UsesOfDrones": "Money",
"MainFunction.ActionAfterCompleted": "ExitEmulatorAndSelf",
"MainFunction.Drops.Enable": "False",
"MainFunction.Drops.ItemId": "",
"MainFunction.Drops.ItemName": "不选择",
"MainFunction.Drops.Quantity": "5",
"MainFunction.InverseMode": "False",
"MainFunction.PostActions": "12",
"MainFunction.Series.Quantity": "6",
"MainFunction.Stage1": "1-7",
"MainFunction.Stage2": "",
"MainFunction.Stage3": "",
"MainFunction.TimesLimited": "False",
"MainFunction.TimesLimited.Quantity": "5",
"MainFunction.UseMedicine": "False",
"MainFunction.UseMedicine.Quantity": "999",
"MainFunction.UseStone.Quantity": "0",
"Mall.CreditBlackListNew": "碳;家具;加急许可",
"Mall.CreditFirstListNew": "招聘许可",
"Mall.CreditForceShoppingIfCreditFull": "False",
"Mall.CreditOnlyBuyDiscount": "False",
"Mall.CreditShopping": "True",
"Mall.CreditVisitFriends": "True",
"Mall.CreditVisitFriendsEnabled": "True",
"Mall.CreditVisitOnceADay": "True",
"Mall.CreidtReserveMaxCredit": "False",
"Mall.LastCreditVisitFriendsTime": "2025/01/01 00:00:00",
"Mission.ReceiveAward": "True",
"Mission.ReceiveFreeRecruit": "True",
"Mission.ReceiveMail": "True",
"Mission.ReceiveMining": "False",
"Mission.ReceiveOrundum": "True",
"Mission.ReceiveSpecialAccess": "False",
"OperBox.Data": "",
"Peep.TargetFps": "20",
"Penguin.EnablePenguin": "True",
"Penguin.Id": "121289881",
"Penguin.IsDrGrandet": "False",
"Performance.AllowDeprecatedGpu": "false",
"Performance.PreferredGpuDescription": "Intel(R) UHD Graphics",
"Performance.PreferredGpuInstancePath": "PCI\\VEN_8086&DEV_A788&SUBSYS_35381043&REV_04\\3&11583659&0&10",
"Performance.UseGpu": "true",
"Reclamation.Mode": "1",
"Reclamation.Reclamation2ExEnable": "False",
"Reclamation.Reclamation2ExProduct": "",
"Reclamation.ReclamationIncrementMode": "0",
"Reclamation.ReclamationMaxCraftCountPerRound": "16",
"Reclamation.Theme": "Tales",
"Reclamation.ToolToCraft": "",
"Recruit.AutoSetTime": "True",
"Recruit.ChooseLevel3": "False",
"Recruit.ChooseLevel4": "True",
"Recruit.ChooseLevel5": "True",
"Recruit.ChooseLevel6": "True",
"Recruit.IsLevel3UseShortTime": "False",
"Recruit.IsLevel3UseShortTime2": "False",
"Recruit.ShowPotential": "True",
"RemoteControl.RemoteControlDeviceIdentity": "",
"RemoteControl.RemoteControlGetTaskEndpointUri": "",
"RemoteControl.RemoteControlReportStatusUri": "",
"RemoteControl.RemoteControlUserIdentity": "",
"Roguelike.CollectibleModeShopping": "False",
"Roguelike.CollectibleModeSquad": "",
"Roguelike.CoreChar": "",
"Roguelike.DeepExplorationAutoIterate": "False",
"Roguelike.DeploymentWithPause": "False",
"Roguelike.Difficulty": "2",
"Roguelike.ExitAtFinalBoss": "False",
"Roguelike.InvestmentEnabled": "True",
"Roguelike.InvestmentEnterSecondFloor": "True",
"Roguelike.InvestsCount": "999",
"Roguelike.Mode": "0",
"Roguelike.MonthlySquadAutoIterate": "False",
"Roguelike.MonthlySquadCheckComms": "False",
"Roguelike.RefreshTraderWithDice": "False",
"Roguelike.Roguelike3FirstFloorFoldartal": "False",
"Roguelike.Roguelike3NewSquad2StartingFoldartal": "False",
"Roguelike.Roguelike3NewSquad2StartingFoldartals": "",
"Roguelike.Roguelike3StartFloorFoldartal": "",
"Roguelike.RoguelikeDelayAbortUntilCombatComplete": "False",
"Roguelike.RoguelikeEnableNonfriendSupport": "False",
"Roguelike.RoguelikeExpectedCollapsalParadigms": "",
"Roguelike.RoguelikeOnlyStartWithEliteTwo": "False",
"Roguelike.RoguelikeStartWithEliteTwo": "False",
"Roguelike.RoguelikeTheme": "Sarkaz",
"Roguelike.RoguelikeUseSupportUnit": "False",
"Roguelike.Roles": "",
"Roguelike.Squad": "",
"Roguelike.StartsCount": "99999",
"Roguelike.StartWithSeed": "False",
"Roguelike.StopAtMaxLevel": "False",
"Roguelike.StopWhenInvestmentFull": "False",
"Start.AccountName": "152****",
"Start.AutoRestartOnDrop": "True",
"Start.BlockSleep": "False",
"Start.BlockSleepWithScreenOn": "True",
"Start.ClientType": "Official",
"Start.CopilotWithScript": "False",
"Start.EmulatorAddCommand": "-v 1",
"Start.EmulatorPath": "C:\\Program Files\\Netease\\MuMu Player 12\\shell\\MuMuPlayer.exe",
"Start.EmulatorWaitSeconds": "30",
"Start.EndsWithScript": "",
"Start.ManualStopWithScript": "False",
"Start.MinimizeDirectly": "False",
"Start.MinimizingStartup": "True",
"Start.OpenEmulatorAfterLaunch": "False",
"Start.RunDirectly": "False",
"Start.StartEmulator": "True",
"Start.StartsWithScript": "",
"TaskQueue.AutoRoguelike.IsChecked": "False",
"TaskQueue.Base.IsChecked": "True",
"TaskQueue.Combat.IsChecked": "True",
"TaskQueue.Mall.IsChecked": "True",
"TaskQueue.Mission.IsChecked": "True",
"TaskQueue.Order.AutoRoguelike": "6",
"TaskQueue.Order.Base": "2",
"TaskQueue.Order.Combat": "3",
"TaskQueue.Order.Mall": "4",
"TaskQueue.Order.Mission": "5",
"TaskQueue.Order.Reclamation": "7",
"TaskQueue.Order.ReclamationAlgorithm2": "7",
"TaskQueue.Order.Recruiting": "1",
"TaskQueue.Order.WakeUp": "0",
"TaskQueue.Reclamation.IsChecked": "False",
"TaskQueue.ReclamationAlgorithm2.IsChecked": "False",
"TaskQueue.Recruiting.IsChecked": "True",
"TaskQueue.WakeUp.IsChecked": "True",
"VersionUpdate.AutoDownloadUpdatePackage": "True",
"VersionUpdate.AutoInstallUpdatePackage": "True",
"VersionUpdate.body": "## v5.6.0-beta.2\n\n### 新增 | New\n\n* 外部通知支持多选 (#10395) @ABA2396\n* add Qmsg notification (#10358) @octopusYan\n* 允许手动指定WPFGUI中干员名称显示语言 (#10310) @ABA2396 @Manicsteiner\n* GetLocalizedNames for Infrast and Copilot output (#10335) @Constrat\n* Reclamation for YostarJP (#10414) @Manicsteiner\n* 生息演算添加沙中之火选择项 @ABA2396\n* 适配「词祭」界面主题 (#10331) @Constrat @ManicSteiner @HX3N @SherkeyXD\n\n### 改进 | Improved\n\n* 全肉鸽招募适配娜仁图亚、艾拉 (#10385) @Daydreamer114\n* Mumu截图增强路径清空时不再检查路径是否存在 @status102\n* duplicates templates from I.S. (#10376) @Constrat\n* 优化外部通知界面显示 (#10363) @ABA2396\n* 更新 bug issue 模板 (#10357) @Rbqwow\n* 重构 OperBox 输出与显示 (#10320) @ABA2396\n* 重构定时器和重启询问 (#10078) @ABA2396\n* Win10以上系统在退出时Wpf不再清除Toast (#10307) @status102\n* 第一次启动时默认不勾选肉鸽和生息演算 @ABA2396\n* 优化动编队日志输出 @ABA2396\n* 优化生息演算 (#10411) @Alan-Charred @status102 @ABA2396\n\n### 修复 | Fix\n\n* FC rerun navigation fix EN @Constrat\n* 生息演算主题读取配置错误 @ABA2396\n* 萨卡兹肉鸽多选招募券模板错误 @ABA2396\n* 肉鸽编队检测在未触底时返回 true (#10396) @Alan-Charred\n* DoDragDrop 拖动操作已在进行中 (#10368) @ABA2396\n* insert delay after SquadConfirm @Constrat\n* 使用匹配后偏移代替每日任务 @status102\n* add ocrReplace for JP \"Reclamation2CopiousCoppice\" (#10362) @Daydreamer114\n* 勾选启动MAA后直接最小化后点击隐藏托盘图标后无法显示MAA @ABA2396\n* add delay after selecting clue @Constrat\n* SL 导航错误 @ABA2396\n* 修复调试版本判断条件 @SherkeyXD\n* 多配置下公告和更新日志显示异常 @ABA2396\n* 修复保全战斗在core干员重复时只会放1次bug (#10306) @status102\n* ProxyType 重启不生效 @ABA2396\n* EN needs templates for clue exchange the number font is different, score too low @Constrat\n* sarkaz 仓库识别错误 @ABA2396\n\n### 文档 | Docs\n\n* 贡献者头像添加 105 上限 (#10351) @MistEO\n\n### 其他 | Other\n\n* `std::ranges::views::join` with LLVM clang 16 on darwin (#10309) @Cryolitia\n* impossiblity of fetch-depth modification. reverting + generic perfs @Constrat\n* rev-list instead of rev-parse @Constrat\n* revert to simple if @Constrat\n* fetching depth 0 @Constrat\n* roi 错误 @ABA2396\n* remove \"\" in nightly fix #10308 @Constrat\n* 生息演算2刷开局清空编队干员 (#10359) @Daydreamer114\n* 重构 FightSettingsUserControl (#10407) @ABA2396\n* CopilotViewModel (#10099) @Manicsteiner\n* git blame ignore @Constrat\n* 优化界面显示 @ABA2396\n* smoking-test中肉鸽参数更新 @SherkeyXD\n* 使用变换后的图像进行技能按钮识别 (#10293) @horror-proton\n* OTA打包时对跳过的版本做删除处理 (#10020) @SherkeyXD\n* 公招错误时保存截图 @zzyyyl\n* 调用PowerManagement.Shutdown();后再次调用Bootstrapper.Shutdown(); @ABA2396\n* 关机前尝试保存配置 @ABA2396\n* 调整令牌关闭强度 @ABA2396\n* 迁移公告相关配置 (#10399) @status102\n* bump maa-cli to 0.4.12 (#10390) @wangl-cc\n* 调整 check link 提示样式 @ABA2396\n* 对comment中的未知链接进行提醒 (#10379) @IzakyL @ABA2396\n* update ignore templates @Constrat\n* 获取任务端口无效时不进行轮询 (#10321) @ABA2396\n* use CsWin32 source generator instead of random pinvoke library (#10361) @dantmnf\n* 删除子模块 @ABA2396\n* remove MaaDeps submodule (#10354) @dantmnf\n* RoguelikeRoutingTaskPlugin.h missing VS22 filter @Constrat\n* bump zzyyyl/issue-checker from 1.8 to 1.9 @zzyyyl\n* 公招识别拥有全干员时不显示未拥有干员数量 @ABA2396\n* YostarJP ocr fix @Manicsteiner\n* JP ZH-TW GPU option & reclamation translation @Manicsteiner\n* KR GpuDeprecated translation @HX3N\n* fix WPF Warning @SherkeyXD\n* 修改过时的Binding方法 @SherkeyXD\n* YostarJP FC navigation (#10316) @Manicsteiner\n* 整理 tasks.json 中记录的肉鸽插件参数 (#10290) @Alan-Charred\n* clearout git blame @Constrat\n* MuMu12EmulatorPath Placeholder 添加示例提示 @ABA2396\n* remove last checked commit @Constrat\n* auto blame ignore @github-actions[bot]\n* git blame added styling commits (#10283) @Constrat\n* smoking-test添加领取奖励的测试 @SherkeyXD\n* 移除tasks中的默认值 @SherkeyXD\n\n**Full Changelog**: [v5.6.0-beta.1 -> v5.6.0-beta.2](https://github.com/MaaAssistantArknights/MaaAssistantArknights/compare/v5.6.0-beta.1...v5.6.0-beta.2)\n",
"VersionUpdate.doNotShowUpdate": "False",
"VersionUpdate.isfirstboot": "True",
"VersionUpdate.name": "v5.6.0-beta.2",
"VersionUpdate.package": "",
"VersionUpdate.Proxy": "",
"VersionUpdate.ResourceApi": "https://s3.maa-org.net:25240/maaassistantarknights/MaaAssistantArknights/MaaAssistantArknights/",
"VersionUpdate.ScheduledUpdateCheck": "True",
"VersionUpdate.UpdateCheck": "True",
"VersionUpdate.VersionType": "Beta",
"Visit.CreditFightSelectFormation": "0",
"Visit.CreditFightTaskEnabled": "False",
"Visit.LastCreditFightTaskTime": "2024/03/27 00:00:00",
"Yituliu.EnableYituliu": "True"
}
},
"Current": "Default",
"Global": {
"GUI.Cheers": "False",
"GUI.CustomCulture": "",
"GUI.Hangover": "False",
"GUI.HideCloseButton": "False",
"GUI.InverseClearMode": "Clear",
"GUI.LastBuyWineTime": "2024/04/15 00:00:00",
"GUI.Localization": "zh-cn",
"GUI.LogItemDateFormatString": "HH:mm:ss",
"GUI.MinimizeToTray": "True",
"GUI.OperNameLanguage": "OperNameLanguageMAA",
"GUI.Placement": "{\"Length\":44,\"Flags\":0,\"ShowCmd\":1,\"MinPosition\":{\"X\":-1,\"Y\":-1},\"MaxPosition\":{\"X\":-1,\"Y\":-1},\"NormalPosition\":{\"Left\":934,\"Top\":297,\"Right\":2134,\"Bottom\":1197}}",
"GUI.Placement.Load": "True",
"GUI.Placement.SaveOnClosing": "True",
"GUI.SoberLanguage": "zh-cn",
"GUI.UseTray": "True",
"GUI.WindowTitleScrollable": "False",
"GUI.WindowTitleSelectShowList": "3",
"HotKeys": "{\"ShowGui\":{\"Key\":56,\"Modifiers\":7}}",
"Roguelike.RoguelikeStartWithSelectList": "Roguelike@LastReward Roguelike@LastReward4 Sarkaz@Roguelike@LastReward5",
"Start.MinimizeDirectly": "False",
"Start.OpenEmulatorAfterLaunch": "True",
"Start.RunDirectly": "True",
"Timer.CustomConfig": "False",
"Timer.ForceScheduledStart": "False",
"Timer.ShowWindowBeforeForceScheduledStart": "False",
"Timer.Timer1": "False",
"Timer.Timer1.Config": "Default",
"Timer.Timer1Hour": "0",
"Timer.Timer1Min": "0",
"Timer.Timer2": "False",
"Timer.Timer2.Config": "Default",
"Timer.Timer2Hour": "3",
"Timer.Timer2Min": "0",
"Timer.Timer3": "False",
"Timer.Timer3.Config": "Default",
"Timer.Timer3Hour": "6",
"Timer.Timer3Min": "0",
"Timer.Timer4": "False",
"Timer.Timer4.Config": "Default",
"Timer.Timer4Hour": "9",
"Timer.Timer4Min": "0",
"Timer.Timer5": "False",
"Timer.Timer5.Config": "Default",
"Timer.Timer5Hour": "12",
"Timer.Timer5Min": "0",
"Timer.Timer6": "False",
"Timer.Timer6.Config": "Default",
"Timer.Timer6Hour": "15",
"Timer.Timer6Min": "0",
"Timer.Timer7": "False",
"Timer.Timer7.Config": "Default",
"Timer.Timer7Hour": "18",
"Timer.Timer7Min": "0",
"Timer.Timer8": "False",
"Timer.Timer8.Config": "Default",
"Timer.Timer8Hour": "21",
"Timer.Timer8Min": "0",
"VersionUpdate.AllowNightlyUpdates": "False",
"VersionUpdate.AutoDownloadUpdatePackage": "True",
"VersionUpdate.AutoInstallUpdatePackage": "True",
"VersionUpdate.body": "## v5.12.0-beta.1\n\n### 真的没有摸鱼吗 | Highlight\n\n* 添加了种子存钱的功能,在选择 **萨卡兹** 主题,**刷源石锭** 模式,**点刺成锭分队** or **后勤分队** 时,高级设置中会出现 **启用种子刷钱(美愿)** 选项。\n* 种子固定为存钱种,若使用后勤存钱,请确保解锁美愿。种子难度为 6 难,由于难度设置仍然生效,可设为 “当前” 或 16 难(若有需要)。\n* 公招选择 **手动确认 1/5/6 星** 后,若出现 1/5/6 星,将不会计数,继续在下一个招募格内招募。\n\n#### 其他\n\n* 【**萨卡兹的无终奇语**】 【**内容拓展·二**】的资源内容暂时没有更新,在新增关卡中会出现 “关卡识别错误” 的情况,可能会尽快修复。\n* 新增了部分导航,改进了肉鸽流程\n* 修复博朗台模式等待异常\n* 修复了一些已知问题\n\n### 新增 | New\n\n* 繁中服「源石塵行動」復刻活動導航 @momomochi987\n* 点刺、后勤种子存钱 (#11521) @Daydreamer114 @ABA2396\n* 肉鸽满级自动停止选项 (#11466) @BxFS @Constrat @momomochi987 @status102\n* 为肉鸽开始探索添加 cd 识别 (#11443) @Daydreamer114\n* 萨卡兹肉鸽冰川期作战策略 @Daydreamer114\n* 萨卡兹内容拓展II点刺进入商店获得构想 (#11509) @Daydreamer114\n* 不自动招募1/5/6星干员时不计入最大确认招募次数 (#11380) @Roland125 @horror-proton\n* 干员识别排除当前客户端未出干员 @ABA2396\n* 肉鸽开局干员列表排除当前客户端未出干员 @ABA2396\n\n### 改进 | Improved\n\n* 新增投掷手干员组并调整优先级 @Daydreamer114\n* 优化傀影肉鸽雪山上的来客ew部署 (#11195) @Daydreamer114\n\n### 修复 | Fix\n\n* 肉鸽烧热水没烧出来会从预设难度开始而不是返回n0 @ABA2396\n* 删除傀影肉鸽远方来客意义不明的撤退 (#11194) @Daydreamer114\n* 博朗台计算等待时间失败数据处理 @status102\n* 修正nothing to select情况下的判断逻辑 @Roland125\n* update Collect Rewards template for EN fix #11485 @Constrat\n* tw OcrReplace 肉鸽招募助战 (#11487) @Saratoga-Official\n* 繁中服作戰失敗畫面卡住 (#11479) @momomochi987\n* InitialDrop.png更新 @Constrat @BxFS\n* txwy duplicates in tasks.json @Constrat\n* 更新 \"视相\" 主题后未关闭退出基建弹窗时无法回到主界面 @ABA2396\n* `手动输入关卡名` 与 `使用剩余理智` 选项无法保存 @ABA2396\n\n### 文档 | Docs\n\n* 肉鸽辅助协议文档翻译 (#11360) @Windsland52\n* 为肉鸽参数 start_with_seed 添加文档 (#11531) @Daydreamer114\n\n### 其他 | Other\n\n* manual recursion + robocopy for smoke-testing (#11458) @Constrat\n* implement cache for smoke-test (#11457) @Constrat\n* Release 模式下,如文件夹中包含 DEBUG.txt 也会输出 DBG 日志 (#11496) @ABA2396\n* ProcessTask的Action 新增 Input (#11521) @Daydreamer114 @ABA2396\n* increase fetch depth for release nightly-ota to generate tags (might need successive increases) @Constrat\n* delay and retry downloads on resource updater (#11504) @Constrat\n* use read/write secret to delete cache on pr merge @Constrat\n* checkout depth for nightly ota @Constrat\n* 移动企鹅物流及一图流上报设置 至 运行设置 @status102\n* Translations update from MAA Weblate (#11524) @AlisaAkiron\n* ignore blame for e3d63894b28b2ef5e2405e144a32a6981de5e1b2 oxipng optimization @Constrat\n* disable link checker in issues and PRs (#11506) @Constrat\n* use API for cache-deletion @Constrat\n* 移除不再使用的代码 for 最小化启动模拟器 @status102\n* move `push tag` later in the workflow in case or errors (#11480) @Constrat\n* 上报添加 User-Agent @ABA2396\n* 修改上报抬头 @ABA2396\n* Use %B to consider header for skip changelog @Constrat\n* try setup dotnet cache @Constrat\n* EN duplicates in tasks.json + SSS Buffs @Constrat\n* YostarJP phantom roguelike game pass, SSS#6 (#11473) @Manicsteiner\n* battle_data 未实装干员添加字段提示 @ABA2396\n* 别用 1234567890ABCDEF 去连模拟器了 @ABA2396\n* Revert \"refactor: move resource copy to test script\" @Constrat\n* `启动 MAA 后直接运行` 和 `启动 MAA 后自动开启模拟器` 改为独立配置 @ABA2396\n* 只有一个配置的时候不显示 `此选项页为全局配置` @ABA2396\n* 当前配置不存在时尝试读取全局配置 @ABA2396\n* Config序列化参数不转义中文 @status102\n\n**Full Changelog**: [v5.11.1 -> v5.12.0-beta.1](https://github.com/MaaAssistantArknights/MaaAssistantArknights/compare/v5.11.1...v5.12.0-beta.1)\n",
"VersionUpdate.doNotShowUpdate": "False",
"VersionUpdate.HasAcknowledgedNightlyWarning": "False",
"VersionUpdate.isfirstboot": "False",
"VersionUpdate.name": "v5.12.0-beta.1",
"VersionUpdate.package": "",
"VersionUpdate.Proxy": "127.0.0.1:26561",
"VersionUpdate.ProxyType": "http",
"VersionUpdate.ResourceApi": "https://maa-ota.annangela.cn/MaaAssistantArknights/MaaAssistantArknights/",
"VersionUpdate.ScheduledUpdateCheck": "True",
"VersionUpdate.UpdateCheck": "True",
"VersionUpdate.VersionType": "Beta"
}
}

View File

@@ -1,15 +0,0 @@
{
"MaaSet": {
"Name": "12332",
"Path": "D:/AUTO/MAA"
},
"RunSet": {
"AnnihilationTimeLimit": 40,
"RoutineTimeLimit": 10,
"RunTimesLimit": 3
},
"QFluentWidgets": {
"ThemeColor": "#ff009faa",
"ThemeMode": "Auto"
}
}

View File

@@ -1,335 +0,0 @@
{
"Configurations": {
"Default": {
"Announcement.AnnouncementInfo": "# 生息演算内容拓展Ⅱ\n\n生息演算内容拓展之后加了点剧情 现在的版本制造刷点数的自己过一下这个剧情后再过三天到下个定量之日再开始任务还是能用的, 靠一直开局刷点数的会卡住, 得等修了之后更新才能用。 \n\n# 停止资源版本自动更新\n\n现停止提供资源版本自动更新手动更新方式参考 [链接](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues/10033)\n\n仓库地址 [https://github.com/MaaAssistantArknights/MaaResource](https://github.com/MaaAssistantArknights/MaaResource)\n\n# 长期公告\n\n请不要在明日方舟及鹰角在各平台包括不限于森空岛、B 站、微博)的官方动态下讨论任何关于 MAA 内容。 \n\n请勿参加内鬼消息的传播禁止将内鬼消息发送至任何 MAA 群。 \n\n<img src=\"https://ota.maa.plus/MaaAssistantArknights/api/announcements/img/NoSkland.jpg\" width=\"100%\" /><br>\n",
"Announcement.DoNotRemindThisAnnouncementAgain": "True",
"Announcement.DoNotShowAnnouncement": "False",
"AutoRecruit.AutoRecruitFirstList": "",
"AutoRecruit.ChooseLevel3": "True",
"AutoRecruit.ChooseLevel3.Time": "540",
"AutoRecruit.ChooseLevel4": "True",
"AutoRecruit.ChooseLevel4.Time": "540",
"AutoRecruit.ChooseLevel5": "True",
"AutoRecruit.ChooseLevel5.Time": "540",
"AutoRecruit.ForceRefresh": "True",
"AutoRecruit.IsLevel3UseShortTime": "False",
"AutoRecruit.IsLevel3UseShortTime2": "False",
"AutoRecruit.MaxTimes": "4",
"AutoRecruit.NotChooseLevel1": "False",
"AutoRecruit.RefreshLevel3": "True",
"AutoRecruit.SelectExtraTags": "0",
"Bluestacks.Config.Keyword": "",
"Bluestacks.Config.Path": "",
"Connect.AdbLiteEnabled": "False",
"Connect.AdbPath": "C:\\Program Files\\Netease\\MuMu Player 12\\shell\\adb.exe",
"Connect.AdbReplaced": "False",
"Connect.Address": "127.0.0.1:16416",
"Connect.AddressHistory": "[\"127.0.0.1:16416\",\"127.0.0.1:16448\",\"127.0.0.1:16384\"]",
"Connect.AllowADBHardRestart": "True",
"Connect.AllowADBRestart": "True",
"Connect.AlwaysAutoDetect": "False",
"Connect.AutoDetect": "False",
"Connect.ConnectConfig": "MuMuEmulator12",
"Connect.KillAdbOnExit": "True",
"Connect.LdPlayerEmulatorPath": "C:\\leidian\\LDPlayer9",
"Connect.LdPlayerExtras.Enabled": "False",
"Connect.LdPlayerIndex": "0",
"Connect.MuMu12Display": "0",
"Connect.MuMu12EmulatorPath": "C:\\Program Files\\Netease\\MuMu Player 12",
"Connect.MuMu12Extras.Enabled": "True",
"Connect.MuMu12Index": "2",
"Connect.MumuBridgeConnection": "False",
"Connect.RetryOnDisconnected": "True",
"Connect.TouchMode": "minitouch",
"Copilot.AddUserAdditional": "False",
"Copilot.CopilotTaskList": "",
"Copilot.LoopTimes": "1",
"Copilot.UserAdditional": "",
"ExternalNotification.Bark.SendKey": "",
"ExternalNotification.Bark.Server": "https://api.day.app",
"ExternalNotification.Discord.BotToken": "",
"ExternalNotification.Discord.UserId": "",
"ExternalNotification.Discord.WebhookUrl": "",
"ExternalNotification.Enabled": "Off",
"ExternalNotification.Qmsg.Bot": "",
"ExternalNotification.Qmsg.Key": "",
"ExternalNotification.Qmsg.Server": "",
"ExternalNotification.Qmsg.User": "",
"ExternalNotification.ServerChan.SendKey": "",
"ExternalNotification.Smtp.From": "",
"ExternalNotification.Smtp.Password": "",
"ExternalNotification.Smtp.Port": "",
"ExternalNotification.Smtp.RequiresAuthentication": "false",
"ExternalNotification.Smtp.Server": "",
"ExternalNotification.Smtp.To": "",
"ExternalNotification.Smtp.User": "",
"ExternalNotification.Smtp.UseSsl": "false",
"ExternalNotification.Telegram.BotToken": "",
"ExternalNotification.Telegram.ChatId": "",
"Fight.RemainingSanityStage": "",
"Fight.UseExpiringMedicine": "True",
"Fight.UseRemainingSanityStage": "False",
"Gacha.ShowDisclaimerNoMore": "False",
"GUI.AllowUseStoneSave": "False",
"GUI.CustomStageCode": "True",
"GUI.HideSeries": "False",
"GUI.HideUnavailableStage": "False",
"GUI.MinimizeToTray": "False",
"GUI.Placement": "{\"Length\":44,\"Flags\":0,\"ShowCmd\":1,\"MinPosition\":{\"X\":-1,\"Y\":-1},\"MaxPosition\":{\"X\":-1,\"Y\":-1},\"NormalPosition\":{\"Left\":680,\"Top\":314,\"Right\":1880,\"Bottom\":1214}}",
"GUI.Placement.Load": "True",
"GUI.Placement.SaveOnClosing": "True",
"GUI.UseAlternateStage": "False",
"GUI.UseLogItemDateFormat": "False",
"GUI.UseTray": "True",
"GUI.WindowTitlePrefix": "",
"Guide.StepIndex": "4",
"Infrast.ContinueTraining": "True",
"Infrast.Control.IsChecked": "True",
"Infrast.CustomInfrastEnabled": "False",
"Infrast.CustomInfrastFile": "D:\\AUTO\\MAA\\合成玉排班.json",
"Infrast.CustomInfrastPlanIndex": "2",
"Infrast.CustomInfrastPlanShowInFightSettings": "False",
"Infrast.DefaultInfrast": "user_defined",
"Infrast.Dorm.IsChecked": "True",
"Infrast.DormFilterNotStationedEnabled": "True",
"Infrast.DormThreshold": "30",
"Infrast.DormTrustEnabled": "False",
"Infrast.IsCustomInfrastFileReadOnly": "False",
"Infrast.Mfg.IsChecked": "True",
"Infrast.Office.IsChecked": "True",
"Infrast.Order.Control": "2",
"Infrast.Order.Dorm": "6",
"Infrast.Order.Mfg": "0",
"Infrast.Order.Office": "5",
"Infrast.Order.Power": "3",
"Infrast.Order.Processing": "7",
"Infrast.Order.Reception": "4",
"Infrast.Order.Trade": "1",
"Infrast.Order.Training": "8",
"Infrast.OriginiumShardAutoReplenishment": "True",
"Infrast.Power.IsChecked": "True",
"Infrast.Processing.IsChecked": "True",
"Infrast.Reception.IsChecked": "True",
"Infrast.Trade.IsChecked": "True",
"Infrast.Training.IsChecked": "True",
"Infrast.UsesOfDrones": "Money",
"MainFunction.ActionAfterCompleted": "ExitEmulatorAndSelf",
"MainFunction.Drops.Enable": "False",
"MainFunction.Drops.ItemId": "",
"MainFunction.Drops.ItemName": "不选择",
"MainFunction.Drops.Quantity": "5",
"MainFunction.InverseMode": "False",
"MainFunction.PostActions": "0",
"MainFunction.Series.Quantity": "6",
"MainFunction.Stage1": "1-7",
"MainFunction.Stage2": "",
"MainFunction.Stage3": "",
"MainFunction.TimesLimited": "False",
"MainFunction.TimesLimited.Quantity": "5",
"MainFunction.UseMedicine": "False",
"MainFunction.UseMedicine.Quantity": "999",
"MainFunction.UseStone.Quantity": "0",
"Mall.CreditBlackListNew": "碳;家具;加急许可",
"Mall.CreditFirstListNew": "招聘许可",
"Mall.CreditForceShoppingIfCreditFull": "False",
"Mall.CreditOnlyBuyDiscount": "False",
"Mall.CreditShopping": "True",
"Mall.CreditVisitFriends": "True",
"Mall.CreditVisitFriendsEnabled": "True",
"Mall.CreditVisitOnceADay": "True",
"Mall.CreidtReserveMaxCredit": "False",
"Mall.LastCreditVisitFriendsTime": "2025/01/01 00:00:00",
"Mission.ReceiveAward": "True",
"Mission.ReceiveFreeRecruit": "True",
"Mission.ReceiveMail": "True",
"Mission.ReceiveMining": "False",
"Mission.ReceiveOrundum": "True",
"Mission.ReceiveSpecialAccess": "False",
"OperBox.Data": "",
"Peep.TargetFps": "20",
"Penguin.EnablePenguin": "True",
"Penguin.Id": "121289881",
"Penguin.IsDrGrandet": "False",
"Performance.AllowDeprecatedGpu": "false",
"Performance.PreferredGpuDescription": "Intel(R) UHD Graphics",
"Performance.PreferredGpuInstancePath": "PCI\\VEN_8086&DEV_A788&SUBSYS_35381043&REV_04\\3&11583659&0&10",
"Performance.UseGpu": "true",
"Reclamation.Mode": "1",
"Reclamation.Reclamation2ExEnable": "False",
"Reclamation.Reclamation2ExProduct": "",
"Reclamation.ReclamationIncrementMode": "0",
"Reclamation.ReclamationMaxCraftCountPerRound": "16",
"Reclamation.Theme": "Tales",
"Reclamation.ToolToCraft": "",
"Recruit.AutoSetTime": "True",
"Recruit.ChooseLevel3": "False",
"Recruit.ChooseLevel4": "True",
"Recruit.ChooseLevel5": "True",
"Recruit.ChooseLevel6": "True",
"Recruit.IsLevel3UseShortTime": "False",
"Recruit.IsLevel3UseShortTime2": "False",
"Recruit.ShowPotential": "True",
"RemoteControl.RemoteControlDeviceIdentity": "",
"RemoteControl.RemoteControlGetTaskEndpointUri": "",
"RemoteControl.RemoteControlReportStatusUri": "",
"RemoteControl.RemoteControlUserIdentity": "",
"Roguelike.CollectibleModeShopping": "False",
"Roguelike.CollectibleModeSquad": "",
"Roguelike.CoreChar": "",
"Roguelike.DeepExplorationAutoIterate": "False",
"Roguelike.DeploymentWithPause": "False",
"Roguelike.Difficulty": "2",
"Roguelike.ExitAtFinalBoss": "False",
"Roguelike.InvestmentEnabled": "True",
"Roguelike.InvestmentEnterSecondFloor": "True",
"Roguelike.InvestsCount": "999",
"Roguelike.Mode": "0",
"Roguelike.MonthlySquadAutoIterate": "False",
"Roguelike.MonthlySquadCheckComms": "False",
"Roguelike.RefreshTraderWithDice": "False",
"Roguelike.Roguelike3FirstFloorFoldartal": "False",
"Roguelike.Roguelike3NewSquad2StartingFoldartal": "False",
"Roguelike.Roguelike3NewSquad2StartingFoldartals": "",
"Roguelike.Roguelike3StartFloorFoldartal": "",
"Roguelike.RoguelikeDelayAbortUntilCombatComplete": "False",
"Roguelike.RoguelikeEnableNonfriendSupport": "False",
"Roguelike.RoguelikeExpectedCollapsalParadigms": "",
"Roguelike.RoguelikeOnlyStartWithEliteTwo": "False",
"Roguelike.RoguelikeStartWithEliteTwo": "False",
"Roguelike.RoguelikeTheme": "Sarkaz",
"Roguelike.RoguelikeUseSupportUnit": "False",
"Roguelike.Roles": "",
"Roguelike.Squad": "",
"Roguelike.StartsCount": "99999",
"Roguelike.StartWithSeed": "False",
"Roguelike.StopAtMaxLevel": "False",
"Roguelike.StopWhenInvestmentFull": "False",
"Start.AccountName": "152",
"Start.AutoRestartOnDrop": "True",
"Start.BlockSleep": "False",
"Start.BlockSleepWithScreenOn": "True",
"Start.ClientType": "Official",
"Start.CopilotWithScript": "False",
"Start.EmulatorAddCommand": "-v 1",
"Start.EmulatorPath": "C:\\Program Files\\Netease\\MuMu Player 12\\shell\\MuMuPlayer.exe",
"Start.EmulatorWaitSeconds": "30",
"Start.EndsWithScript": "",
"Start.ManualStopWithScript": "False",
"Start.MinimizeDirectly": "False",
"Start.MinimizingStartup": "True",
"Start.OpenEmulatorAfterLaunch": "False",
"Start.RunDirectly": "False",
"Start.StartEmulator": "True",
"Start.StartsWithScript": "",
"TaskQueue.AutoRoguelike.IsChecked": "True",
"TaskQueue.Base.IsChecked": "False",
"TaskQueue.Combat.IsChecked": "False",
"TaskQueue.Mall.IsChecked": "False",
"TaskQueue.Mission.IsChecked": "False",
"TaskQueue.Order.AutoRoguelike": "6",
"TaskQueue.Order.Base": "2",
"TaskQueue.Order.Combat": "3",
"TaskQueue.Order.Mall": "4",
"TaskQueue.Order.Mission": "5",
"TaskQueue.Order.Reclamation": "7",
"TaskQueue.Order.ReclamationAlgorithm2": "7",
"TaskQueue.Order.Recruiting": "1",
"TaskQueue.Order.WakeUp": "0",
"TaskQueue.Reclamation.IsChecked": "False",
"TaskQueue.ReclamationAlgorithm2.IsChecked": "False",
"TaskQueue.Recruiting.IsChecked": "False",
"TaskQueue.WakeUp.IsChecked": "True",
"VersionUpdate.AutoDownloadUpdatePackage": "True",
"VersionUpdate.AutoInstallUpdatePackage": "True",
"VersionUpdate.body": "## v5.6.0-beta.2\n\n### 新增 | New\n\n* 外部通知支持多选 (#10395) @ABA2396\n* add Qmsg notification (#10358) @octopusYan\n* 允许手动指定WPFGUI中干员名称显示语言 (#10310) @ABA2396 @Manicsteiner\n* GetLocalizedNames for Infrast and Copilot output (#10335) @Constrat\n* Reclamation for YostarJP (#10414) @Manicsteiner\n* 生息演算添加沙中之火选择项 @ABA2396\n* 适配「词祭」界面主题 (#10331) @Constrat @ManicSteiner @HX3N @SherkeyXD\n\n### 改进 | Improved\n\n* 全肉鸽招募适配娜仁图亚、艾拉 (#10385) @Daydreamer114\n* Mumu截图增强路径清空时不再检查路径是否存在 @status102\n* duplicates templates from I.S. (#10376) @Constrat\n* 优化外部通知界面显示 (#10363) @ABA2396\n* 更新 bug issue 模板 (#10357) @Rbqwow\n* 重构 OperBox 输出与显示 (#10320) @ABA2396\n* 重构定时器和重启询问 (#10078) @ABA2396\n* Win10以上系统在退出时Wpf不再清除Toast (#10307) @status102\n* 第一次启动时默认不勾选肉鸽和生息演算 @ABA2396\n* 优化动编队日志输出 @ABA2396\n* 优化生息演算 (#10411) @Alan-Charred @status102 @ABA2396\n\n### 修复 | Fix\n\n* FC rerun navigation fix EN @Constrat\n* 生息演算主题读取配置错误 @ABA2396\n* 萨卡兹肉鸽多选招募券模板错误 @ABA2396\n* 肉鸽编队检测在未触底时返回 true (#10396) @Alan-Charred\n* DoDragDrop 拖动操作已在进行中 (#10368) @ABA2396\n* insert delay after SquadConfirm @Constrat\n* 使用匹配后偏移代替每日任务 @status102\n* add ocrReplace for JP \"Reclamation2CopiousCoppice\" (#10362) @Daydreamer114\n* 勾选启动MAA后直接最小化后点击隐藏托盘图标后无法显示MAA @ABA2396\n* add delay after selecting clue @Constrat\n* SL 导航错误 @ABA2396\n* 修复调试版本判断条件 @SherkeyXD\n* 多配置下公告和更新日志显示异常 @ABA2396\n* 修复保全战斗在core干员重复时只会放1次bug (#10306) @status102\n* ProxyType 重启不生效 @ABA2396\n* EN needs templates for clue exchange the number font is different, score too low @Constrat\n* sarkaz 仓库识别错误 @ABA2396\n\n### 文档 | Docs\n\n* 贡献者头像添加 105 上限 (#10351) @MistEO\n\n### 其他 | Other\n\n* `std::ranges::views::join` with LLVM clang 16 on darwin (#10309) @Cryolitia\n* impossiblity of fetch-depth modification. reverting + generic perfs @Constrat\n* rev-list instead of rev-parse @Constrat\n* revert to simple if @Constrat\n* fetching depth 0 @Constrat\n* roi 错误 @ABA2396\n* remove \"\" in nightly fix #10308 @Constrat\n* 生息演算2刷开局清空编队干员 (#10359) @Daydreamer114\n* 重构 FightSettingsUserControl (#10407) @ABA2396\n* CopilotViewModel (#10099) @Manicsteiner\n* git blame ignore @Constrat\n* 优化界面显示 @ABA2396\n* smoking-test中肉鸽参数更新 @SherkeyXD\n* 使用变换后的图像进行技能按钮识别 (#10293) @horror-proton\n* OTA打包时对跳过的版本做删除处理 (#10020) @SherkeyXD\n* 公招错误时保存截图 @zzyyyl\n* 调用PowerManagement.Shutdown();后再次调用Bootstrapper.Shutdown(); @ABA2396\n* 关机前尝试保存配置 @ABA2396\n* 调整令牌关闭强度 @ABA2396\n* 迁移公告相关配置 (#10399) @status102\n* bump maa-cli to 0.4.12 (#10390) @wangl-cc\n* 调整 check link 提示样式 @ABA2396\n* 对comment中的未知链接进行提醒 (#10379) @IzakyL @ABA2396\n* update ignore templates @Constrat\n* 获取任务端口无效时不进行轮询 (#10321) @ABA2396\n* use CsWin32 source generator instead of random pinvoke library (#10361) @dantmnf\n* 删除子模块 @ABA2396\n* remove MaaDeps submodule (#10354) @dantmnf\n* RoguelikeRoutingTaskPlugin.h missing VS22 filter @Constrat\n* bump zzyyyl/issue-checker from 1.8 to 1.9 @zzyyyl\n* 公招识别拥有全干员时不显示未拥有干员数量 @ABA2396\n* YostarJP ocr fix @Manicsteiner\n* JP ZH-TW GPU option & reclamation translation @Manicsteiner\n* KR GpuDeprecated translation @HX3N\n* fix WPF Warning @SherkeyXD\n* 修改过时的Binding方法 @SherkeyXD\n* YostarJP FC navigation (#10316) @Manicsteiner\n* 整理 tasks.json 中记录的肉鸽插件参数 (#10290) @Alan-Charred\n* clearout git blame @Constrat\n* MuMu12EmulatorPath Placeholder 添加示例提示 @ABA2396\n* remove last checked commit @Constrat\n* auto blame ignore @github-actions[bot]\n* git blame added styling commits (#10283) @Constrat\n* smoking-test添加领取奖励的测试 @SherkeyXD\n* 移除tasks中的默认值 @SherkeyXD\n\n**Full Changelog**: [v5.6.0-beta.1 -> v5.6.0-beta.2](https://github.com/MaaAssistantArknights/MaaAssistantArknights/compare/v5.6.0-beta.1...v5.6.0-beta.2)\n",
"VersionUpdate.doNotShowUpdate": "False",
"VersionUpdate.isfirstboot": "True",
"VersionUpdate.name": "v5.6.0-beta.2",
"VersionUpdate.package": "",
"VersionUpdate.Proxy": "",
"VersionUpdate.ResourceApi": "https://s3.maa-org.net:25240/maaassistantarknights/MaaAssistantArknights/MaaAssistantArknights/",
"VersionUpdate.ScheduledUpdateCheck": "True",
"VersionUpdate.UpdateCheck": "True",
"VersionUpdate.VersionType": "Beta",
"Visit.CreditFightSelectFormation": "0",
"Visit.CreditFightTaskEnabled": "False",
"Visit.LastCreditFightTaskTime": "2024/03/27 00:00:00",
"Yituliu.EnableYituliu": "True"
}
},
"Current": "Default",
"Global": {
"GUI.Cheers": "False",
"GUI.CustomCulture": "",
"GUI.Hangover": "False",
"GUI.HideCloseButton": "False",
"GUI.InverseClearMode": "Clear",
"GUI.LastBuyWineTime": "2024/04/15 00:00:00",
"GUI.Localization": "zh-cn",
"GUI.LogItemDateFormatString": "HH:mm:ss",
"GUI.MinimizeToTray": "True",
"GUI.OperNameLanguage": "OperNameLanguageMAA",
"GUI.Placement": "{\"Length\":44,\"Flags\":0,\"ShowCmd\":1,\"MinPosition\":{\"X\":-1,\"Y\":-1},\"MaxPosition\":{\"X\":-1,\"Y\":-1},\"NormalPosition\":{\"Left\":934,\"Top\":297,\"Right\":2134,\"Bottom\":1197}}",
"GUI.Placement.Load": "True",
"GUI.Placement.SaveOnClosing": "True",
"GUI.SoberLanguage": "zh-cn",
"GUI.UseTray": "True",
"GUI.WindowTitleScrollable": "False",
"GUI.WindowTitleSelectShowList": "3",
"HotKeys": "{\"ShowGui\":{\"Key\":56,\"Modifiers\":7}}",
"Roguelike.RoguelikeStartWithSelectList": "Roguelike@LastReward Roguelike@LastReward4 Sarkaz@Roguelike@LastReward5",
"Start.MinimizeDirectly": "False",
"Start.OpenEmulatorAfterLaunch": "False",
"Start.RunDirectly": "False",
"Timer.CustomConfig": "False",
"Timer.ForceScheduledStart": "False",
"Timer.ShowWindowBeforeForceScheduledStart": "False",
"Timer.Timer1": "False",
"Timer.Timer1.Config": "Default",
"Timer.Timer1Hour": "0",
"Timer.Timer1Min": "0",
"Timer.Timer2": "False",
"Timer.Timer2.Config": "Default",
"Timer.Timer2Hour": "3",
"Timer.Timer2Min": "0",
"Timer.Timer3": "False",
"Timer.Timer3.Config": "Default",
"Timer.Timer3Hour": "6",
"Timer.Timer3Min": "0",
"Timer.Timer4": "False",
"Timer.Timer4.Config": "Default",
"Timer.Timer4Hour": "9",
"Timer.Timer4Min": "0",
"Timer.Timer5": "False",
"Timer.Timer5.Config": "Default",
"Timer.Timer5Hour": "12",
"Timer.Timer5Min": "0",
"Timer.Timer6": "False",
"Timer.Timer6.Config": "Default",
"Timer.Timer6Hour": "15",
"Timer.Timer6Min": "0",
"Timer.Timer7": "False",
"Timer.Timer7.Config": "Default",
"Timer.Timer7Hour": "18",
"Timer.Timer7Min": "0",
"Timer.Timer8": "False",
"Timer.Timer8.Config": "Default",
"Timer.Timer8Hour": "21",
"Timer.Timer8Min": "0",
"VersionUpdate.AllowNightlyUpdates": "False",
"VersionUpdate.AutoDownloadUpdatePackage": "True",
"VersionUpdate.AutoInstallUpdatePackage": "True",
"VersionUpdate.body": "## v5.12.0-beta.1\n\n### 真的没有摸鱼吗 | Highlight\n\n* 添加了种子存钱的功能,在选择 **萨卡兹** 主题,**刷源石锭** 模式,**点刺成锭分队** or **后勤分队** 时,高级设置中会出现 **启用种子刷钱(美愿)** 选项。\n* 种子固定为存钱种,若使用后勤存钱,请确保解锁美愿。种子难度为 6 难,由于难度设置仍然生效,可设为 “当前” 或 16 难(若有需要)。\n* 公招选择 **手动确认 1/5/6 星** 后,若出现 1/5/6 星,将不会计数,继续在下一个招募格内招募。\n\n#### 其他\n\n* 【**萨卡兹的无终奇语**】 【**内容拓展·二**】的资源内容暂时没有更新,在新增关卡中会出现 “关卡识别错误” 的情况,可能会尽快修复。\n* 新增了部分导航,改进了肉鸽流程\n* 修复博朗台模式等待异常\n* 修复了一些已知问题\n\n### 新增 | New\n\n* 繁中服「源石塵行動」復刻活動導航 @momomochi987\n* 点刺、后勤种子存钱 (#11521) @Daydreamer114 @ABA2396\n* 肉鸽满级自动停止选项 (#11466) @BxFS @Constrat @momomochi987 @status102\n* 为肉鸽开始探索添加 cd 识别 (#11443) @Daydreamer114\n* 萨卡兹肉鸽冰川期作战策略 @Daydreamer114\n* 萨卡兹内容拓展II点刺进入商店获得构想 (#11509) @Daydreamer114\n* 不自动招募1/5/6星干员时不计入最大确认招募次数 (#11380) @Roland125 @horror-proton\n* 干员识别排除当前客户端未出干员 @ABA2396\n* 肉鸽开局干员列表排除当前客户端未出干员 @ABA2396\n\n### 改进 | Improved\n\n* 新增投掷手干员组并调整优先级 @Daydreamer114\n* 优化傀影肉鸽雪山上的来客ew部署 (#11195) @Daydreamer114\n\n### 修复 | Fix\n\n* 肉鸽烧热水没烧出来会从预设难度开始而不是返回n0 @ABA2396\n* 删除傀影肉鸽远方来客意义不明的撤退 (#11194) @Daydreamer114\n* 博朗台计算等待时间失败数据处理 @status102\n* 修正nothing to select情况下的判断逻辑 @Roland125\n* update Collect Rewards template for EN fix #11485 @Constrat\n* tw OcrReplace 肉鸽招募助战 (#11487) @Saratoga-Official\n* 繁中服作戰失敗畫面卡住 (#11479) @momomochi987\n* InitialDrop.png更新 @Constrat @BxFS\n* txwy duplicates in tasks.json @Constrat\n* 更新 \"视相\" 主题后未关闭退出基建弹窗时无法回到主界面 @ABA2396\n* `手动输入关卡名` 与 `使用剩余理智` 选项无法保存 @ABA2396\n\n### 文档 | Docs\n\n* 肉鸽辅助协议文档翻译 (#11360) @Windsland52\n* 为肉鸽参数 start_with_seed 添加文档 (#11531) @Daydreamer114\n\n### 其他 | Other\n\n* manual recursion + robocopy for smoke-testing (#11458) @Constrat\n* implement cache for smoke-test (#11457) @Constrat\n* Release 模式下,如文件夹中包含 DEBUG.txt 也会输出 DBG 日志 (#11496) @ABA2396\n* ProcessTask的Action 新增 Input (#11521) @Daydreamer114 @ABA2396\n* increase fetch depth for release nightly-ota to generate tags (might need successive increases) @Constrat\n* delay and retry downloads on resource updater (#11504) @Constrat\n* use read/write secret to delete cache on pr merge @Constrat\n* checkout depth for nightly ota @Constrat\n* 移动企鹅物流及一图流上报设置 至 运行设置 @status102\n* Translations update from MAA Weblate (#11524) @AlisaAkiron\n* ignore blame for e3d63894b28b2ef5e2405e144a32a6981de5e1b2 oxipng optimization @Constrat\n* disable link checker in issues and PRs (#11506) @Constrat\n* use API for cache-deletion @Constrat\n* 移除不再使用的代码 for 最小化启动模拟器 @status102\n* move `push tag` later in the workflow in case or errors (#11480) @Constrat\n* 上报添加 User-Agent @ABA2396\n* 修改上报抬头 @ABA2396\n* Use %B to consider header for skip changelog @Constrat\n* try setup dotnet cache @Constrat\n* EN duplicates in tasks.json + SSS Buffs @Constrat\n* YostarJP phantom roguelike game pass, SSS#6 (#11473) @Manicsteiner\n* battle_data 未实装干员添加字段提示 @ABA2396\n* 别用 1234567890ABCDEF 去连模拟器了 @ABA2396\n* Revert \"refactor: move resource copy to test script\" @Constrat\n* `启动 MAA 后直接运行` 和 `启动 MAA 后自动开启模拟器` 改为独立配置 @ABA2396\n* 只有一个配置的时候不显示 `此选项页为全局配置` @ABA2396\n* 当前配置不存在时尝试读取全局配置 @ABA2396\n* Config序列化参数不转义中文 @status102\n\n**Full Changelog**: [v5.11.1 -> v5.12.0-beta.1](https://github.com/MaaAssistantArknights/MaaAssistantArknights/compare/v5.11.1...v5.12.0-beta.1)\n",
"VersionUpdate.doNotShowUpdate": "False",
"VersionUpdate.HasAcknowledgedNightlyWarning": "False",
"VersionUpdate.isfirstboot": "False",
"VersionUpdate.name": "v5.12.0-beta.1",
"VersionUpdate.package": "",
"VersionUpdate.Proxy": "127.0.0.1:26561",
"VersionUpdate.ProxyType": "http",
"VersionUpdate.ResourceApi": "https://maa-ota.annangela.cn/MaaAssistantArknights/MaaAssistantArknights/",
"VersionUpdate.ScheduledUpdateCheck": "True",
"VersionUpdate.UpdateCheck": "True",
"VersionUpdate.VersionType": "Beta"
}
}

View File

@@ -1,15 +0,0 @@
{
"MaaSet": {
"Name": "132",
"Path": "D:/AUTO/MAA"
},
"RunSet": {
"AnnihilationTimeLimit": 44,
"RoutineTimeLimit": 13,
"RunTimesLimit": 1
},
"QFluentWidgets": {
"ThemeColor": "#ff009faa",
"ThemeMode": "Auto"
}
}

View File

@@ -1,44 +0,0 @@
{
"QueueSet": {
"Enabled": true,
"Name": "1121"
},
"Queue": {
"Member_1": "脚本_2",
"Member_10": "禁用",
"Member_2": "脚本_1",
"Member_3": "脚本_2",
"Member_4": "禁用",
"Member_5": "禁用",
"Member_6": "禁用",
"Member_7": "禁用",
"Member_8": "禁用",
"Member_9": "禁用"
},
"QFluentWidgets": {
"ThemeColor": "#ff009faa",
"ThemeMode": "Auto"
},
"Time": {
"TimeEnabled_0": true,
"TimeEnabled_1": false,
"TimeEnabled_2": false,
"TimeEnabled_3": false,
"TimeEnabled_4": false,
"TimeEnabled_5": false,
"TimeEnabled_6": false,
"TimeEnabled_7": false,
"TimeEnabled_8": false,
"TimeEnabled_9": false,
"TimeSet_0": "20:33",
"TimeSet_1": "01:00",
"TimeSet_2": "00:00",
"TimeSet_3": "01:00",
"TimeSet_4": "00:00",
"TimeSet_5": "00:00",
"TimeSet_6": "00:00",
"TimeSet_7": "00:00",
"TimeSet_8": "00:00",
"TimeSet_9": "00:00"
}
}

View File

@@ -1,44 +0,0 @@
{
"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": "禁用"
},
"QFluentWidgets": {
"ThemeColor": "#ff009faa",
"ThemeMode": "Auto"
},
"Time": {
"TimeEnabled_0": true,
"TimeEnabled_1": false,
"TimeEnabled_2": false,
"TimeEnabled_3": false,
"TimeEnabled_4": false,
"TimeEnabled_5": false,
"TimeEnabled_6": false,
"TimeEnabled_7": false,
"TimeEnabled_8": false,
"TimeEnabled_9": false,
"TimeSet_0": "19:48",
"TimeSet_1": "04:00",
"TimeSet_2": "01:00",
"TimeSet_3": "00:00",
"TimeSet_4": "00:00",
"TimeSet_5": "00:00",
"TimeSet_6": "00:00",
"TimeSet_7": "00:00",
"TimeSet_8": "00:00",
"TimeSet_9": "00:00"
}
}

View File

@@ -1,44 +0,0 @@
{
"QueueSet": {
"Enabled": false,
"Name": ""
},
"Queue": {
"Member_1": "禁用",
"Member_10": "禁用",
"Member_2": "禁用",
"Member_3": "禁用",
"Member_4": "禁用",
"Member_5": "禁用",
"Member_6": "禁用",
"Member_7": "禁用",
"Member_8": "禁用",
"Member_9": "禁用"
},
"QFluentWidgets": {
"ThemeColor": "#ff009faa",
"ThemeMode": "Auto"
},
"Time": {
"TimeEnabled_0": false,
"TimeEnabled_1": false,
"TimeEnabled_2": false,
"TimeEnabled_3": false,
"TimeEnabled_4": false,
"TimeEnabled_5": false,
"TimeEnabled_6": false,
"TimeEnabled_7": false,
"TimeEnabled_8": false,
"TimeEnabled_9": false,
"TimeSet_0": "02:00",
"TimeSet_1": "00:00",
"TimeSet_2": "00:00",
"TimeSet_3": "00:00",
"TimeSet_4": "00:00",
"TimeSet_5": "00:00",
"TimeSet_6": "00:00",
"TimeSet_7": "00:00",
"TimeSet_8": "00:00",
"TimeSet_9": "00:00"
}
}

View File

@@ -1,32 +0,0 @@
{
"Function": {
"BossKey": "",
"IfAllowSleep": false,
"IfSilence": false
},
"Notify": {
"IfPushPlyer": false,
"IfSendErrorOnly": false,
"IfSendMail": false,
"MailAddress": ""
},
"Start": {
"IfRunDirectly": false,
"IfSelfStart": false
},
"QFluentWidgets": {
"ThemeColor": "#ff009faa",
"ThemeMode": "Auto"
},
"UI": {
"IfShowTray": false,
"IfToTray": false,
"MainIndex": 0,
"location": "100x100",
"maximized": false,
"size": "1200x700"
},
"Update": {
"IfAutoUpdate": false
}
}

View File

@@ -1,18 +0,0 @@
{
"脚本_1": {
"History": "任务开始时间2025-01-25 17:49:28结束时间2025-01-25 17:50:50\n已完成数0未完成数1\n\n代理未成功的用户\n新用户\n",
"Time": "2025-01-25 17:49:28"
},
"调度队列_2": {
"Time": "2025-01-24 19:35:19",
"History": "任务名称脚本_1任务开始时间2025-01-24 19:35:19结束时间2025-01-24 19:36:21\n已完成数0未完成数1\n\n代理未成功的用户\n新用户\n\n"
},
"脚本_2": {
"History": "任务开始时间2025-01-26 07:56:52结束时间2025-01-26 07:56:56\n已完成数0未完成数1\n\n代理未成功的用户\n新用户\n",
"Time": "2025-01-26 07:56:52"
},
"调度队列_1": {
"Time": "2025-01-26 07:56:52",
"History": "任务名称脚本_2任务开始时间2025-01-26 07:56:52结束时间2025-01-26 07:56:56\n 已完成数0未完成数1\n \n 代理未成功的用户:\n 新用户\n \n"
}
}

View File

@@ -1,5 +0,0 @@
龙门币CE-6
技能CA-5
红票AP-5
经验LS-6
剿灭模式Annihilation

View File

@@ -1 +0,0 @@
8hK<EFBFBD><EFBFBD>OՎA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><04>H~KEU<45>X<EFBFBD><58>DbH<>-,

View File

@@ -1 +0,0 @@
356125d2ad32e482fcc4fe7ad4a6027fc4c5dc1616664837960bd7faeafddf71450d3eb875ff76a5729c200d2365d899149cca47cc42e9910f356a019e366c2537597131ff398cb728c17459a8e08ef716d2824cc76d6a668e6dede654265bf226c9b6a20cb7ace2a4b0a7369284f1deb4cdcd8503085797ce612002d9bbe9b4230cd1288c20d0866cd36fc4bcde1da1dccfff579c31e735c6cb575f7e763a2e38f0a06bd493ed9ec2ae5156f01e2b8d0bd3b79d78e248c9d87480f1d8a1a5fd0b4313096d7879f805a2560e81a1918e85beb777fe01a30af532c76e93eea8cfdbbd3281d0cceea5025da6291492f6ea83ba51

Binary file not shown.

View File

@@ -1,9 +0,0 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAszLXtgtcSrV7gZ5I2Vu0
aeTG41PE5A6XrrFp8xSA1Wvqaap9WSqr/pkUQr/jzkT27EKMHEc+hP15eh6xG3Oc
o7hC0up2CMC2vb00Lvy2FQ4wkKqjpgLQdLD8+RHz8ms6WvcJ5ipw39DI342BPAja
xpsqquU0PTqJ+1cZtLOx6pGL5IgvxFjgLYwlLzR/3htasH4z3zMhK1yNiew6ve+J
/BosWH42p5Tab9AL0xirnamHGJB1Djful+PUHjMRms8jt0t+0dDvPhphZsbnv2N+
aTpa9EymC1tMowB++cfCmIO0QqWgp+ekr4tymLhpAkL/yBDOeNXNNbJWd4MqAVUE
ZQIDAQAB
-----END PUBLIC KEY-----

View File

@@ -1 +0,0 @@
12b6b63c4519307f4fb5868e171dbf0afd8d55a742a01e2eb251586073ecfb7b46836463

File diff suppressed because it is too large Load Diff

10
log.txt
View File

@@ -1,10 +0,0 @@
任务开始时间2025-01-23 16:39:04结束时间2025-01-23 16:39:12
已完成数0未完成数4
代理未成功的用户:
新用户
未开始代理的用户:
新用户
新用户
新用户

View File

@@ -32,7 +32,8 @@ from qfluentwidgets import FluentTranslator
import sys
if __name__ == "__main__":
# @logger.catch
def main():
application = QApplication(sys.argv)
QApplication.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings)
@@ -46,3 +47,8 @@ if __name__ == "__main__":
window.show_ui("显示主窗口")
window.start_up_task()
sys.exit(application.exec())
if __name__ == "__main__":
main()

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,8 @@
{
"main_version": "4.2.0.1",
"main_version": "4.2.1.1",
"updater_version": "1.1.0.1",
"announcement": "\n# 这是一个预览版本!\n# 这个版本仅能进行用于展示页面,未实现任何功能!!!\n- 若不慎更新到此版本请前往官方仓库下载4.2.0版本压缩包替换本地文件即可回退版本",
"announcement": "\n## 新增功能\n- 调度队列上线支持MAA多开\n## 修复BUG\n- 添加了一堆BUG确信\n## 程序优化\n- 界面重构,引入`QFluentWidgets`美化界面",
"notice": "公告系统测试中~",
"proxy_list": [
"",
"https://gitproxy.click/",