feat(ui): 新增无人值守模式

This commit is contained in:
DLmaster361
2025-05-04 15:18:26 +08:00
parent 418c3d4742
commit 41412e1ef4
10 changed files with 79 additions and 53 deletions

View File

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

View File

@@ -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 = []

View File

@@ -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}")

View File

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

View File

@@ -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):
"""定时启动代理任务""" """定时启动代理任务"""

View File

@@ -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:

View File

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

View File

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

View File

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

View File

@@ -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/"
} }
} }