feat(ui): 新增无人值守模式
This commit is contained in:
15
.github/workflows/build-app.yml
vendored
15
.github/workflows/build-app.yml
vendored
@@ -135,18 +135,3 @@ jobs:
|
|||||||
- name: Upload Release to Server
|
- name: Upload Release to Server
|
||||||
run: |
|
run: |
|
||||||
scp -r artifacts/* ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}:/home/user/files/AUTO_MAA/
|
scp -r artifacts/* ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }}:/home/user/files/AUTO_MAA/
|
||||||
- name: Install obsutil
|
|
||||||
run: |
|
|
||||||
wget https://obs-community.obs.cn-north-1.myhuaweicloud.com/obsutil/current/obsutil_linux_amd64.tar.gz
|
|
||||||
tar -xzvf obsutil_linux_amd64.tar.gz --strip-components=1
|
|
||||||
chmod 755 obsutil
|
|
||||||
./obsutil version
|
|
||||||
- name: Upload Release to Huawei OBS
|
|
||||||
env:
|
|
||||||
OBS_AK: ${{ secrets.OBS_AK }}
|
|
||||||
OBS_SK: ${{ secrets.OBS_SK }}
|
|
||||||
OBS_ENDPOINT: ${{ secrets.OBS_ENDPOINT }}
|
|
||||||
OBS_BUCKET: ${{ secrets.OBS_BUCKET }}
|
|
||||||
run: |
|
|
||||||
./obsutil config -i $OBS_AK -k $OBS_SK -e $OBS_ENDPOINT
|
|
||||||
./obsutil cp artifacts/ obs://$OBS_BUCKET/releases/ -r -f
|
|
||||||
|
|||||||
@@ -103,6 +103,9 @@ class GlobalConfig(QConfig):
|
|||||||
"Function", "IfSilence", False, BoolValidator()
|
"Function", "IfSilence", False, BoolValidator()
|
||||||
)
|
)
|
||||||
self.function_BossKey = ConfigItem("Function", "BossKey", "")
|
self.function_BossKey = ConfigItem("Function", "BossKey", "")
|
||||||
|
self.function_UnattendedMode = ConfigItem(
|
||||||
|
"Function", "UnattendedMode", False, BoolValidator()
|
||||||
|
)
|
||||||
self.function_IfAgreeBilibili = ConfigItem(
|
self.function_IfAgreeBilibili = ConfigItem(
|
||||||
"Function", "IfAgreeBilibili", False, BoolValidator()
|
"Function", "IfAgreeBilibili", False, BoolValidator()
|
||||||
)
|
)
|
||||||
@@ -633,6 +636,7 @@ class AppConfig(GlobalConfig):
|
|||||||
self.gameid_path = self.app_path / "data/gameid.txt"
|
self.gameid_path = self.app_path / "data/gameid.txt"
|
||||||
self.version_path = self.app_path / "resources/version.json"
|
self.version_path = self.app_path / "resources/version.json"
|
||||||
|
|
||||||
|
self.main_window = None
|
||||||
self.PASSWORD = ""
|
self.PASSWORD = ""
|
||||||
self.running_list = []
|
self.running_list = []
|
||||||
self.silence_list = []
|
self.silence_list = []
|
||||||
|
|||||||
@@ -29,17 +29,15 @@ from loguru import logger
|
|||||||
from PySide6.QtCore import Qt
|
from PySide6.QtCore import Qt
|
||||||
from qfluentwidgets import InfoBar, InfoBarPosition
|
from qfluentwidgets import InfoBar, InfoBarPosition
|
||||||
|
|
||||||
|
from .config import Config
|
||||||
|
|
||||||
|
|
||||||
class _MainInfoBar:
|
class _MainInfoBar:
|
||||||
"""信息通知栏"""
|
"""信息通知栏"""
|
||||||
|
|
||||||
def __init__(self, main_window=None):
|
|
||||||
|
|
||||||
self.main_window = main_window
|
|
||||||
|
|
||||||
def push_info_bar(self, mode: str, title: str, content: str, time: int):
|
def push_info_bar(self, mode: str, title: str, content: str, time: int):
|
||||||
"""推送到信息通知栏"""
|
"""推送到信息通知栏"""
|
||||||
if self.main_window is None:
|
if Config.main_window is None:
|
||||||
logger.error("信息通知栏未设置父窗口")
|
logger.error("信息通知栏未设置父窗口")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@@ -61,7 +59,7 @@ class _MainInfoBar:
|
|||||||
isClosable=True,
|
isClosable=True,
|
||||||
position=InfoBarPosition.TOP_RIGHT,
|
position=InfoBarPosition.TOP_RIGHT,
|
||||||
duration=time,
|
duration=time,
|
||||||
parent=self.main_window,
|
parent=Config.main_window,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
logger.error(f"未知的通知栏模式: {mode}")
|
logger.error(f"未知的通知栏模式: {mode}")
|
||||||
|
|||||||
@@ -173,10 +173,9 @@ class _TaskManager(QObject):
|
|||||||
create_gui = Signal(Task)
|
create_gui = Signal(Task)
|
||||||
connect_gui = Signal(Task)
|
connect_gui = Signal(Task)
|
||||||
|
|
||||||
def __init__(self, main_window=None):
|
def __init__(self):
|
||||||
super(_TaskManager, self).__init__()
|
super(_TaskManager, self).__init__()
|
||||||
|
|
||||||
self.main_window = main_window
|
|
||||||
self.task_dict: Dict[str, Task] = {}
|
self.task_dict: Dict[str, Task] = {}
|
||||||
|
|
||||||
def add_task(
|
def add_task(
|
||||||
@@ -279,7 +278,7 @@ class _TaskManager(QObject):
|
|||||||
}
|
}
|
||||||
|
|
||||||
choice = ProgressRingMessageBox(
|
choice = ProgressRingMessageBox(
|
||||||
self.main_window,
|
Config.main_window,
|
||||||
f"{mode_book[Config.queue_dict[name]["Config"].get(Config.queue_dict[name]["Config"].queueSet_AfterAccomplish)]}倒计时",
|
f"{mode_book[Config.queue_dict[name]["Config"].get(Config.queue_dict[name]["Config"].queueSet_AfterAccomplish)]}倒计时",
|
||||||
)
|
)
|
||||||
if choice.exec():
|
if choice.exec():
|
||||||
@@ -325,7 +324,7 @@ class _TaskManager(QObject):
|
|||||||
def push_dialog(self, name: str, title: str, content: str):
|
def push_dialog(self, name: str, title: str, content: str):
|
||||||
"""推送对话框"""
|
"""推送对话框"""
|
||||||
|
|
||||||
choice = MessageBox(title, content, self.main_window)
|
choice = MessageBox(title, content, Config.main_window)
|
||||||
choice.yesButton.setText("是")
|
choice.yesButton.setText("是")
|
||||||
choice.cancelButton.setText("否")
|
choice.cancelButton.setText("否")
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,9 @@ class _MainTimer(QWidget):
|
|||||||
"""长时间定期检定任务"""
|
"""长时间定期检定任务"""
|
||||||
|
|
||||||
Config.get_gameid()
|
Config.get_gameid()
|
||||||
|
Config.main_window.setting.show_notice()
|
||||||
|
if Config.get(Config.update_IfAutoUpdate):
|
||||||
|
Config.main_window.setting.check_update()
|
||||||
|
|
||||||
def timed_start(self):
|
def timed_start(self):
|
||||||
"""定时启动代理任务"""
|
"""定时启动代理任务"""
|
||||||
|
|||||||
@@ -44,9 +44,7 @@ class _SystemHandler:
|
|||||||
ES_CONTINUOUS = 0x80000000
|
ES_CONTINUOUS = 0x80000000
|
||||||
ES_SYSTEM_REQUIRED = 0x00000001
|
ES_SYSTEM_REQUIRED = 0x00000001
|
||||||
|
|
||||||
def __init__(self, main_window: QWidget = None):
|
def __init__(self):
|
||||||
|
|
||||||
self.main_window = main_window
|
|
||||||
|
|
||||||
self.set_Sleep()
|
self.set_Sleep()
|
||||||
self.set_SelfStart()
|
self.set_SelfStart()
|
||||||
@@ -112,7 +110,7 @@ class _SystemHandler:
|
|||||||
|
|
||||||
elif mode == "KillSelf":
|
elif mode == "KillSelf":
|
||||||
|
|
||||||
self.main_window.close()
|
Config.main_window.close()
|
||||||
QApplication.quit()
|
QApplication.quit()
|
||||||
|
|
||||||
elif sys.platform.startswith("linux"):
|
elif sys.platform.startswith("linux"):
|
||||||
@@ -138,7 +136,7 @@ class _SystemHandler:
|
|||||||
|
|
||||||
elif mode == "KillSelf":
|
elif mode == "KillSelf":
|
||||||
|
|
||||||
self.main_window.close()
|
Config.main_window.close()
|
||||||
QApplication.quit()
|
QApplication.quit()
|
||||||
|
|
||||||
def is_startup(self) -> bool:
|
def is_startup(self) -> bool:
|
||||||
|
|||||||
@@ -77,9 +77,7 @@ class AUTO_MAA(MSFluentWindow):
|
|||||||
self.splashScreen = SplashScreen(self.windowIcon(), self)
|
self.splashScreen = SplashScreen(self.windowIcon(), self)
|
||||||
self.show_ui("显示主窗口", if_quick=True)
|
self.show_ui("显示主窗口", if_quick=True)
|
||||||
|
|
||||||
TaskManager.main_window = self.window()
|
Config.main_window = self.window()
|
||||||
MainInfoBar.main_window = self.window()
|
|
||||||
System.main_window = self.window()
|
|
||||||
|
|
||||||
# 创建主窗口
|
# 创建主窗口
|
||||||
self.home = Home(self)
|
self.home = Home(self)
|
||||||
@@ -269,11 +267,11 @@ class AUTO_MAA(MSFluentWindow):
|
|||||||
self.start_main_task()
|
self.start_main_task()
|
||||||
|
|
||||||
# 获取公告
|
# 获取公告
|
||||||
self.setting.show_notice(if_show=False)
|
self.setting.show_notice(if_first=True)
|
||||||
|
|
||||||
# 检查更新
|
# 检查更新
|
||||||
if Config.get(Config.update_IfAutoUpdate):
|
if Config.get(Config.update_IfAutoUpdate):
|
||||||
self.setting.check_update()
|
self.setting.check_update(if_first=True)
|
||||||
|
|
||||||
# 直接最小化
|
# 直接最小化
|
||||||
if Config.get(Config.start_IfMinimizeDirectly):
|
if Config.get(Config.start_IfMinimizeDirectly):
|
||||||
|
|||||||
@@ -87,9 +87,9 @@ class Setting(QWidget):
|
|||||||
self.start.card_IfSelfStart.checkedChanged.connect(System.set_SelfStart)
|
self.start.card_IfSelfStart.checkedChanged.connect(System.set_SelfStart)
|
||||||
self.security.card_changePASSWORD.clicked.connect(self.change_PASSWORD)
|
self.security.card_changePASSWORD.clicked.connect(self.change_PASSWORD)
|
||||||
self.updater.card_CheckUpdate.clicked.connect(
|
self.updater.card_CheckUpdate.clicked.connect(
|
||||||
lambda: self.check_update(if_click=True)
|
lambda: self.check_update(if_show=True)
|
||||||
)
|
)
|
||||||
self.other.card_Notice.clicked.connect(self.show_notice)
|
self.other.card_Notice.clicked.connect(lambda: self.show_notice(if_show=True))
|
||||||
|
|
||||||
content_layout.addWidget(self.function)
|
content_layout.addWidget(self.function)
|
||||||
content_layout.addWidget(self.start)
|
content_layout.addWidget(self.start)
|
||||||
@@ -255,12 +255,12 @@ class Setting(QWidget):
|
|||||||
if choice.exec():
|
if choice.exec():
|
||||||
break
|
break
|
||||||
|
|
||||||
def check_update(self, if_click: bool = False) -> None:
|
def check_update(self, if_show: bool = False, if_first: bool = False) -> None:
|
||||||
"""检查版本更新,调起文件下载进程"""
|
"""检查版本更新,调起文件下载进程"""
|
||||||
|
|
||||||
current_version = list(map(int, Config.VERSION.split(".")))
|
current_version = list(map(int, Config.VERSION.split(".")))
|
||||||
|
|
||||||
if Network.if_running and if_click:
|
if Network.if_running and if_show:
|
||||||
MainInfoBar.push_info_bar(
|
MainInfoBar.push_info_bar(
|
||||||
"warning", "请求速度过快", "上个网络请求还未结束,请稍等片刻", 5000
|
"warning", "请求速度过快", "上个网络请求还未结束,请稍等片刻", 5000
|
||||||
)
|
)
|
||||||
@@ -330,8 +330,14 @@ class Setting(QWidget):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
# 有版本更新
|
if (
|
||||||
if version.parse(version_text(remote_version)) > version.parse(
|
if_show
|
||||||
|
or (
|
||||||
|
not if_show
|
||||||
|
and if_first
|
||||||
|
and not Config.get(Config.function_UnattendedMode)
|
||||||
|
)
|
||||||
|
) and version.parse(version_text(remote_version)) > version.parse(
|
||||||
version_text(current_version)
|
version_text(current_version)
|
||||||
):
|
):
|
||||||
|
|
||||||
@@ -407,11 +413,26 @@ class Setting(QWidget):
|
|||||||
self.window().close()
|
self.window().close()
|
||||||
QApplication.quit()
|
QApplication.quit()
|
||||||
|
|
||||||
# 无版本更新
|
elif (
|
||||||
else:
|
if_show
|
||||||
MainInfoBar.push_info_bar("success", "更新检查", "已是最新版本~", 3000)
|
or if_first
|
||||||
|
or version.parse(version_text(remote_version))
|
||||||
|
> version.parse(version_text(current_version))
|
||||||
|
):
|
||||||
|
|
||||||
def show_notice(self, if_show: bool = True) -> None:
|
if version.parse(version_text(remote_version)) > version.parse(
|
||||||
|
version_text(current_version)
|
||||||
|
):
|
||||||
|
MainInfoBar.push_info_bar(
|
||||||
|
"info",
|
||||||
|
"发现新版本",
|
||||||
|
f"{version_text(current_version)} --> {version_text(remote_version)}",
|
||||||
|
3600000,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
MainInfoBar.push_info_bar("success", "更新检查", "已是最新版本~", 3000)
|
||||||
|
|
||||||
|
def show_notice(self, if_show: bool = False, if_first: bool = False) -> None:
|
||||||
"""显示公告"""
|
"""显示公告"""
|
||||||
|
|
||||||
# 从远程服务器获取最新公告
|
# 从远程服务器获取最新公告
|
||||||
@@ -450,9 +471,11 @@ class Setting(QWidget):
|
|||||||
}
|
}
|
||||||
|
|
||||||
if if_show or (
|
if if_show or (
|
||||||
datetime.now()
|
if_first
|
||||||
|
and datetime.now()
|
||||||
> datetime.strptime(notice["time"], "%Y-%m-%d %H:%M")
|
> datetime.strptime(notice["time"], "%Y-%m-%d %H:%M")
|
||||||
> time_local
|
> time_local
|
||||||
|
and not Config.get(Config.function_UnattendedMode)
|
||||||
):
|
):
|
||||||
|
|
||||||
choice = NoticeMessageBox(self.window(), "公告", notice["notice_dict"])
|
choice = NoticeMessageBox(self.window(), "公告", notice["notice_dict"])
|
||||||
@@ -464,6 +487,17 @@ class Setting(QWidget):
|
|||||||
) as f:
|
) as f:
|
||||||
json.dump(notice, f, ensure_ascii=False, indent=4)
|
json.dump(notice, f, ensure_ascii=False, indent=4)
|
||||||
|
|
||||||
|
elif (
|
||||||
|
datetime.now()
|
||||||
|
> datetime.strptime(notice["time"], "%Y-%m-%d %H:%M")
|
||||||
|
> time_local
|
||||||
|
):
|
||||||
|
|
||||||
|
MainInfoBar.push_info_bar(
|
||||||
|
"info", "有新公告", "请前往设置界面查看公告", 3600000
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class FunctionSettingCard(HeaderCardWidget):
|
class FunctionSettingCard(HeaderCardWidget):
|
||||||
|
|
||||||
@@ -498,6 +532,14 @@ class FunctionSettingCard(HeaderCardWidget):
|
|||||||
parent=self,
|
parent=self,
|
||||||
)
|
)
|
||||||
self.card_IfSilence = self.SilenceSettingCard(self)
|
self.card_IfSilence = self.SilenceSettingCard(self)
|
||||||
|
self.card_UnattendedMode = SwitchSettingCard(
|
||||||
|
icon=FluentIcon.PAGE_RIGHT,
|
||||||
|
title="无人值守模式",
|
||||||
|
content="开启后AUTO_MAA不再主动弹出对话框,以免影响代理任务运行",
|
||||||
|
qconfig=Config,
|
||||||
|
configItem=Config.function_UnattendedMode,
|
||||||
|
parent=self,
|
||||||
|
)
|
||||||
self.card_IfAgreeBilibili = SwitchSettingCard(
|
self.card_IfAgreeBilibili = SwitchSettingCard(
|
||||||
icon=FluentIcon.PAGE_RIGHT,
|
icon=FluentIcon.PAGE_RIGHT,
|
||||||
title="托管bilibili游戏隐私政策",
|
title="托管bilibili游戏隐私政策",
|
||||||
@@ -520,6 +562,7 @@ class FunctionSettingCard(HeaderCardWidget):
|
|||||||
Layout.addWidget(self.card_HistoryRetentionTime)
|
Layout.addWidget(self.card_HistoryRetentionTime)
|
||||||
Layout.addWidget(self.card_IfAllowSleep)
|
Layout.addWidget(self.card_IfAllowSleep)
|
||||||
Layout.addWidget(self.card_IfSilence)
|
Layout.addWidget(self.card_IfSilence)
|
||||||
|
Layout.addWidget(self.card_UnattendedMode)
|
||||||
Layout.addWidget(self.card_IfAgreeBilibili)
|
Layout.addWidget(self.card_IfAgreeBilibili)
|
||||||
Layout.addWidget(self.card_IfSkipMumuSplashAds)
|
Layout.addWidget(self.card_IfSkipMumuSplashAds)
|
||||||
self.viewLayout.addLayout(Layout)
|
self.viewLayout.addLayout(Layout)
|
||||||
|
|||||||
@@ -613,11 +613,7 @@ class DownloadManager(QDialog):
|
|||||||
|
|
||||||
class AUTO_MAA_Downloader(QApplication):
|
class AUTO_MAA_Downloader(QApplication):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self, app_path: Path, name: str, main_version: list, config: dict
|
||||||
app_path: Path,
|
|
||||||
name: str,
|
|
||||||
main_version: list,
|
|
||||||
config: dict,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
"announcement": "\n## 新增功能\n- 屏蔽MuMu模拟器开屏广告功能上线\n- 更新器支持多线程下载\n- 添加强制关闭ADB与模拟器等增强任务项\n## 修复BUG\n- 修复统计信息HTML模板公招匹配错误\n- 修复密码显示按钮动画异常\n- 修复`检测到MAA未能实际执行任务`报错被异常屏蔽\n- 修复MAA超时判定异常失效\n## 程序优化\n- 关机等电源操作添加100s倒计时\n- 人工排查弹窗方法优化\n- 人工排查时自动屏蔽静默操作\n- 公告样式优化",
|
"announcement": "\n## 新增功能\n- 屏蔽MuMu模拟器开屏广告功能上线\n- 更新器支持多线程下载\n- 添加强制关闭ADB与模拟器等增强任务项\n## 修复BUG\n- 修复统计信息HTML模板公招匹配错误\n- 修复密码显示按钮动画异常\n- 修复`检测到MAA未能实际执行任务`报错被异常屏蔽\n- 修复MAA超时判定异常失效\n## 程序优化\n- 关机等电源操作添加100s倒计时\n- 人工排查弹窗方法优化\n- 人工排查时自动屏蔽静默操作\n- 公告样式优化",
|
||||||
"version_info": {
|
"version_info": {
|
||||||
"4.3.6.2": {
|
"4.3.6.2": {
|
||||||
|
"新增功能": [
|
||||||
|
"新增`无人值守模式`"
|
||||||
|
],
|
||||||
"修复BUG": [
|
"修复BUG": [
|
||||||
"修复软件窗口最大化异常问题",
|
"修复软件窗口最大化异常问题",
|
||||||
"修复异常操作导致窗口离开屏幕后难以复原的问题",
|
"修复异常操作导致窗口离开屏幕后难以复原的问题",
|
||||||
@@ -52,7 +55,6 @@
|
|||||||
"https://ghfast.top/"
|
"https://ghfast.top/"
|
||||||
],
|
],
|
||||||
"download_dict": {
|
"download_dict": {
|
||||||
"官方下载站-jp": "https://jp-download.fearr.xyz/AUTO_MAA/",
|
"官方下载站-jp": "https://jp-download.fearr.xyz/AUTO_MAA/"
|
||||||
"官方下载站-hw": "http://hwobs.fearr.xyz/releases/artifacts/"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user