Compare commits

...

26 Commits

Author SHA1 Message Date
DLmaster
f45dc3a34c chore(utils): 修改代理优先级 2025-02-04 22:47:26 +08:00
DLmaster
1c17f3d878 Merge branch 'dev' 2025-02-04 22:36:34 +08:00
DLmaster
75e4d2b290 fix(utils): 修复更新器异常并覆盖版本 2025-02-04 22:34:17 +08:00
DLmaster
32fe941735 Merge branch 'dev' 2025-02-04 21:52:20 +08:00
DLmaster
27633b1017 Merge branch 'DLMS_dev' into dev 2025-02-04 18:56:27 +08:00
DLmaster
c34ca0dea9 fix(utils): 更新代理镜像 2025-02-04 18:56:09 +08:00
DLmaster
0574e9c6cb fix(gui): 调整部分选项文案 2025-02-04 18:48:58 +08:00
DLmaster
b7f09141f1 feat(core): 添加更新类别可选项 2025-02-04 18:27:19 +08:00
DLmaster
022e59e65c fix(gha): pr时不再自动发版 2025-02-04 15:56:21 +08:00
DLmaster
a0731331a8 fix(gui): 修复高级MAA配置序号错位;修复高级用户无法配置问题 2025-02-04 15:17:15 +08:00
DLmaster
4b01222648 Merge branch 'dev' into DLMS_dev 2025-02-04 14:16:07 +08:00
DLmaster
cae4b26c89 Merge branch 'dev' of https://github.com/DLmaster361/AUTO_MAA into dev 2025-02-04 14:08:27 +08:00
DLmaster
427c2332f5 chore: 补充版本信息 2025-02-04 14:08:13 +08:00
heziziziscool
6f0aec329b 新增代理成功消息推送渠道Server酱与企业微信群机器人推送 2025-02-04 14:07:45 +08:00
DLmaster
4e4d1d068f chore: 补充版本信息 2025-02-03 20:12:19 +08:00
DLmaster
074f4f2ca9 Merge branch 'hz_dev' into dev 2025-02-03 20:05:34 +08:00
heziziziscool
c51f9ad901 新增代理成功消息推送渠道Server酱与企业微信群机器人推送 2025-02-03 19:22:36 +08:00
heziziziscool
792452c048 Revert "revert 提交到main"
This reverts commit 662eb0bc7f.
2025-02-03 19:00:01 +08:00
heziziziscool
662eb0bc7f revert 提交到main 2025-02-03 18:57:40 +08:00
heziziziscool
94a9bdbb93 Revert "- 新增Server酱与企业微信群机器人推送代理成功渠道。"
This reverts commit df96183f42.
2025-02-03 18:54:09 +08:00
heziziziscool
df96183f42 - 新增Server酱与企业微信群机器人推送代理成功渠道。 2025-02-03 18:49:46 +08:00
DLmaster
a5b4f6f59f fix(gui): 修复主调度台运行时选项变动问题 2025-02-03 16:20:26 +08:00
DLmaster
6f7497cbe9 fix(utils): 修复更新器文件夹定位问题 2025-02-03 09:47:10 +08:00
DLmaster
dbdc2144b7 Merge branch 'dev' 2025-02-02 09:26:20 +08:00
DLmaster
e34106f857 Merge branch 'fix_inf_dev' into dev 2025-02-02 01:20:01 +08:00
DLmaster
c3c07804cd fix(core): 修复自定义基建无法正常使用的问题
feat(core): 添加用户每日代理次数上限功能
2025-02-02 01:19:46 +08:00
16 changed files with 324 additions and 112 deletions

View File

@@ -26,11 +26,6 @@ on:
paths-ignore: paths-ignore:
- '**.md' - '**.md'
- 'LICENSE' - 'LICENSE'
pull_request:
branches: [ "main" ]
paths-ignore:
- '**.md'
- 'LICENSE'
permissions: permissions:
contents: read contents: read

View File

@@ -26,11 +26,6 @@ on:
paths-ignore: paths-ignore:
- '**.md' - '**.md'
- 'LICENSE' - 'LICENSE'
pull_request:
branches: [ "dev" ]
paths-ignore:
- '**.md'
- 'LICENSE'
permissions: permissions:
contents: read contents: read

View File

@@ -189,13 +189,9 @@ MAA多账号管理与自动化软件
# 关于 # 关于
## 未来开发方向 ## 项目开发情况
- [ ] 尝试接入更多开源社区成果 可在[《AUTO_MAA开发者协作文档》](https://docs.qq.com/aio/DQ3Z5eHNxdmxFQmZX)的`开发任务`页面中查看开发进度。
- [ ] 支持对MAA运行状况的进一步识别
- [x] 添加更多通知手段
- [x] GUI界面美化
- [ ] 软件相关web功能开发
## 贡献者 ## 贡献者

View File

@@ -39,6 +39,8 @@ from qfluentwidgets import (
FolderValidator, FolderValidator,
BoolValidator, BoolValidator,
RangeValidator, RangeValidator,
OptionsValidator,
qconfig,
) )
@@ -125,6 +127,15 @@ class AppConfig:
self.queue_config = QueueConfig() self.queue_config = QueueConfig()
self.maa_config = MaaConfig() self.maa_config = MaaConfig()
config_list = self.search_config()
for config in config_list:
if config[0] == "Maa":
qconfig.load(config[1], self.maa_config)
self.maa_config.save()
elif config[0] == "Queue":
qconfig.load(config[1], self.queue_config)
self.queue_config.save()
logger.info("配置类初始化完成") logger.info("配置类初始化完成")
def init_database(self, mode: str) -> None: def init_database(self, mode: str) -> None:
@@ -378,6 +389,22 @@ class AppConfig:
db.close() db.close()
logger.info("数据文件版本更新完成") logger.info("数据文件版本更新完成")
def search_config(self) -> list:
"""搜索所有子配置文件"""
config_list = []
if (self.app_path / "config/MaaConfig").exists():
for subdir in (self.app_path / "config/MaaConfig").iterdir():
if subdir.is_dir():
config_list.append(["Maa", subdir / "config.json"])
if (self.app_path / "config/QueueConfig").exists():
for json_file in (self.app_path / "config/QueueConfig").glob("*.json"):
config_list.append(["Queue", json_file])
return config_list
def open_database(self, mode: str, index: str = None) -> None: def open_database(self, mode: str, index: str = None) -> None:
"""打开数据库""" """打开数据库"""
@@ -459,6 +486,7 @@ class AppConfig:
self.maa_config.set(self.maa_config.MaaSet_Name, "") self.maa_config.set(self.maa_config.MaaSet_Name, "")
self.maa_config.set(self.maa_config.MaaSet_Path, ".") self.maa_config.set(self.maa_config.MaaSet_Path, ".")
self.maa_config.set(self.maa_config.RunSet_ProxyTimesLimit, 0)
self.maa_config.set(self.maa_config.RunSet_AnnihilationTimeLimit, 40) self.maa_config.set(self.maa_config.RunSet_AnnihilationTimeLimit, 40)
self.maa_config.set(self.maa_config.RunSet_RoutineTimeLimit, 10) self.maa_config.set(self.maa_config.RunSet_RoutineTimeLimit, 10)
self.maa_config.set(self.maa_config.RunSet_RunTimesLimit, 3) self.maa_config.set(self.maa_config.RunSet_RunTimesLimit, 3)
@@ -529,8 +557,21 @@ class GlobalConfig(QConfig):
"Notify", "IfSendErrorOnly", False, BoolValidator() "Notify", "IfSendErrorOnly", False, BoolValidator()
) )
notify_MailAddress = ConfigItem("Notify", "MailAddress", "") notify_MailAddress = ConfigItem("Notify", "MailAddress", "")
notify_IfServerChan = ConfigItem("Notify", "IfServerChan", False, BoolValidator())
notify_ServerChanKey = ConfigItem("Notify", "ServerChanKey", "")
notify_ServerChanChannel = ConfigItem("Notify", "ServerChanChannel", "")
notify_ServerChanTag = ConfigItem("Notify", "ServerChanTag", "")
notify_IfCompanyWebHookBot = ConfigItem(
"Notify", "IfCompanyWebHookBot", False, BoolValidator()
)
notify_CompanyWebHookBotUrl = ConfigItem("Notify", "CompanyWebHookBotUrl", "")
notify_IfPushDeer = ConfigItem("Notify", "IfPushDeer", False, BoolValidator())
notify_IfPushDeerKey = ConfigItem("Notify", "PushDeerKey", "")
update_IfAutoUpdate = ConfigItem("Update", "IfAutoUpdate", False, BoolValidator()) update_IfAutoUpdate = ConfigItem("Update", "IfAutoUpdate", False, BoolValidator())
update_UpdateType = OptionsConfigItem(
"Update", "UpdateType", "main", OptionsValidator(["main", "dev"])
)
class QueueConfig(QConfig): class QueueConfig(QConfig):
@@ -587,6 +628,9 @@ class MaaConfig(QConfig):
MaaSet_Name = ConfigItem("MaaSet", "Name", "") MaaSet_Name = ConfigItem("MaaSet", "Name", "")
MaaSet_Path = ConfigItem("MaaSet", "Path", ".", FolderValidator()) MaaSet_Path = ConfigItem("MaaSet", "Path", ".", FolderValidator())
RunSet_ProxyTimesLimit = RangeConfigItem(
"RunSet", "ProxyTimesLimit", 0, RangeValidator(0, 1024)
)
RunSet_AnnihilationTimeLimit = RangeConfigItem( RunSet_AnnihilationTimeLimit = RangeConfigItem(
"RunSet", "AnnihilationTimeLimit", 40, RangeValidator(1, 1024) "RunSet", "AnnihilationTimeLimit", 40, RangeValidator(1, 1024)
) )

View File

@@ -217,10 +217,10 @@ class TaskManager(QObject):
lambda logs: self.remove_task(name, logs) lambda logs: self.remove_task(name, logs)
) )
if "窗口" in mode: if "调度台" in mode:
self.create_gui.emit(self.task_list[name]) self.create_gui.emit(self.task_list[name])
elif "窗口" in mode: elif "调度台" in mode:
self.connect_gui.emit(self.task_list[name]) self.connect_gui.emit(self.task_list[name])
self.task_list[name].start() self.task_list[name].start()

View File

@@ -81,7 +81,7 @@ class MainTimer(QWidget):
): ):
logger.info(f"定时任务:{name}") logger.info(f"定时任务:{name}")
Task_manager.add_task("自动代理_新窗口", name, info) Task_manager.add_task("自动代理_新调度台", name, info)
def set_silence(self): def set_silence(self):
"""设置静默模式""" """设置静默模式"""

View File

@@ -113,13 +113,15 @@ class MaaManager(QObject):
return None return None
# 整理用户数据,筛选需代理的用户 # 整理用户数据,筛选需代理的用户
self.data = sorted(self.data, key=lambda x: (-len(x[15]), x[16])) if "设置MAA" not in self.mode:
user_list: List[List[str, str, int]] = [
[_[0], "等待", index] self.data = sorted(self.data, key=lambda x: (-len(x[15]), x[16]))
for index, _ in enumerate(self.data) user_list: List[List[str, str, int]] = [
if (_[3] != 0 and _[4] == "y") [_[0], "等待", index]
] for index, _ in enumerate(self.data)
self.create_user_list.emit(user_list) if (_[3] != 0 and _[4] == "y")
]
self.create_user_list.emit(user_list)
# 自动代理模式 # 自动代理模式
if self.mode == "自动代理": if self.mode == "自动代理":
@@ -137,8 +139,16 @@ class MaaManager(QObject):
if self.isInterruptionRequested: if self.isInterruptionRequested:
break break
user[1] = "运行" if (
self.update_user_list.emit(user_list) self.set["RunSet"]["ProxyTimesLimit"] == 0
or self.data[user[2]][14] < self.set["RunSet"]["ProxyTimesLimit"]
):
user[1] = "运行"
self.update_user_list.emit(user_list)
else:
user[1] = "跳过"
self.update_user_list.emit(user_list)
continue
# 初始化代理情况记录和模式替换记录 # 初始化代理情况记录和模式替换记录
run_book = [False for _ in range(2)] run_book = [False for _ in range(2)]
@@ -520,6 +530,14 @@ class MaaManager(QObject):
f"{self.mode[:4]}任务报告", f"{self.mode[:4]}任务报告",
f"{end_log}\n\nAUTO_MAA 敬上\n\n我们根据您在 AUTO_MAA 中的设置发送了这封电子邮件,本邮件无需回复\n", f"{end_log}\n\nAUTO_MAA 敬上\n\n我们根据您在 AUTO_MAA 中的设置发送了这封电子邮件,本邮件无需回复\n",
) )
Notify.ServerChanPush(
f"{self.mode[:4]}任务报告",
f"{end_log}\n\nAUTO_MAA 敬上",
)
Notify.CompanyWebHookBotPush(
f"{self.mode[:4]}任务报告",
f"{end_log}AUTO_MAA 敬上",
)
self.accomplish.emit({"Time": begin_time, "History": end_log}) self.accomplish.emit({"Time": begin_time, "History": end_log})
@@ -851,7 +869,10 @@ class MaaManager(QObject):
] = "False" # 自定义基建配置文件只读 ] = "False" # 自定义基建配置文件只读
data["Configurations"]["Default"][ data["Configurations"]["Default"][
"Infrast.CustomInfrastFile" "Infrast.CustomInfrastFile"
] = f"{self.config_path}/simple/{self.data[index][16]}/infrastructure/infrastructure.json" # 自定义基建配置文件地址 ] = str(
self.config_path
/ f"simple/{self.data[index][16]}/infrastructure/infrastructure.json"
) # 自定义基建配置文件地址
# 人工排查配置 # 人工排查配置
elif "人工排查" in mode: elif "人工排查" in mode:

View File

@@ -24,13 +24,16 @@ AUTO_MAA通知服务
v4.2 v4.2
作者DLmaster_361 作者DLmaster_361
""" """
import requests
from loguru import logger
from plyer import notification from plyer import notification
import smtplib import smtplib
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.header import Header from email.header import Header
from email.utils import formataddr from email.utils import formataddr
from serverchan_sdk import sc_send
from app.core import Config from app.core import Config
@@ -96,5 +99,62 @@ class Notification:
finally: finally:
smtpObj.quit() smtpObj.quit()
def ServerChanPush(self, title, content):
"""使用Server酱推送通知"""
if Config.global_config.get(Config.global_config.notify_IfServerChan):
send_key = Config.global_config.get(Config.global_config.notify_ServerChanKey)
option = {}
is_valid = lambda s: s == "" or (s == '|'.join(s.split('|')) and (s.count('|') == 0 or all(s.split('|'))))
"""
is_valid => True, 如果启用的话需要正确设置Tag和Channel。
允许空的Tag和Channel即不启用但不允许例如a||b|a|ba|b|||||
"""
send_tag = Config.global_config.get(Config.global_config.notify_ServerChanTag)
send_channel = Config.global_config.get(Config.global_config.notify_ServerChanChannel)
if is_valid(send_tag):
option['tags'] = send_tag
else:
option['tags'] = ''
logger.warning('请正确设置Auto_MAA中ServerChan的Tag。')
if is_valid(send_channel):
option['channel'] = send_channel
else:
option['channel'] = ''
logger.warning('请正确设置Auto_MAA中ServerChan的Channel。')
response = sc_send(send_key, title, content, option)
if response["code"] == 0:
logger.info("Server酱推送通知成功")
return True
else:
logger.info("Server酱推送通知失败")
logger.error(response)
return f'使用Server酱推送通知时出错\n{response["data"]['error']}'
def CompanyWebHookBotPush(self, title, content):
"""使用企业微信群机器人推送通知"""
if Config.global_config.get(Config.global_config.notify_IfCompanyWebHookBot):
content = f'{title}\n{content}'
data = {
"msgtype": "text",
"text": {
"content": content
}
}
response = requests.post(
url=Config.global_config.get(Config.global_config.notify_CompanyWebHookBotUrl),
json=data
)
if response.json()["errcode"] == 0:
logger.info("企业微信群机器人推送通知成功")
return True
else:
logger.info("企业微信群机器人推送通知失败")
logger.error(response.json())
return f'使用企业微信群机器人推送通知时出错:\n{response.json()["errmsg"]}'
Notify = Notification() Notify = Notification()

View File

@@ -77,7 +77,6 @@ class DispatchCenter(QWidget):
onClick=self.update_top_bar, onClick=self.update_top_bar,
icon=FluentIcon.CAFE, icon=FluentIcon.CAFE,
) )
self.update_top_bar()
self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter) self.Layout.addWidget(self.pivot, 0, Qt.AlignHCenter)
self.Layout.addWidget(self.stackedWidget) self.Layout.addWidget(self.stackedWidget)
@@ -120,6 +119,12 @@ class DispatchCenter(QWidget):
def connect_main_board(self, task: Task) -> None: def connect_main_board(self, task: Task) -> None:
"""连接主调度台""" """连接主调度台"""
self.script_list["主调度台"].top_bar.Lable.setText(
f"{task.name} - {task.mode.replace("_主调度台","")}模式"
)
self.script_list["主调度台"].top_bar.Lable.show()
self.script_list["主调度台"].top_bar.object.hide()
self.script_list["主调度台"].top_bar.mode.hide()
self.script_list["主调度台"].top_bar.button.clicked.disconnect() self.script_list["主调度台"].top_bar.button.clicked.disconnect()
self.script_list["主调度台"].top_bar.button.setText("中止任务") self.script_list["主调度台"].top_bar.button.setText("中止任务")
self.script_list["主调度台"].top_bar.button.clicked.connect( self.script_list["主调度台"].top_bar.button.clicked.connect(
@@ -145,6 +150,9 @@ class DispatchCenter(QWidget):
def disconnect_main_board(self, name: str) -> None: def disconnect_main_board(self, name: str) -> None:
"""断开主调度台""" """断开主调度台"""
self.script_list["主调度台"].top_bar.Lable.hide()
self.script_list["主调度台"].top_bar.object.show()
self.script_list["主调度台"].top_bar.mode.show()
self.script_list["主调度台"].top_bar.button.clicked.disconnect() self.script_list["主调度台"].top_bar.button.clicked.disconnect()
self.script_list["主调度台"].top_bar.button.setText("开始任务") self.script_list["主调度台"].top_bar.button.setText("开始任务")
self.script_list["主调度台"].top_bar.button.clicked.connect( self.script_list["主调度台"].top_bar.button.clicked.connect(
@@ -170,6 +178,8 @@ class DispatchCenter(QWidget):
self.script_list["主调度台"].top_bar.object.clear() self.script_list["主调度台"].top_bar.object.clear()
self.script_list["主调度台"].top_bar.object.addItems(list) self.script_list["主调度台"].top_bar.object.addItems(list)
self.script_list["主调度台"].top_bar.object.setCurrentIndex(-1)
self.script_list["主调度台"].top_bar.mode.setCurrentIndex(-1)
class DispatchBox(QWidget): class DispatchBox(QWidget):
@@ -208,17 +218,18 @@ class DispatchBox(QWidget):
if name == "主调度台": if name == "主调度台":
self.Lable = SubtitleLabel("", self)
self.Lable.hide()
self.object = ComboBox() self.object = ComboBox()
self.object.setCurrentIndex(-1)
self.object.setPlaceholderText("请选择调度对象") self.object.setPlaceholderText("请选择调度对象")
self.mode = ComboBox() self.mode = ComboBox()
self.mode.addItems(["自动代理", "人工排查"]) self.mode.addItems(["自动代理", "人工排查"])
self.mode.setCurrentIndex(-1)
self.mode.setPlaceholderText("请选择调度模式") self.mode.setPlaceholderText("请选择调度模式")
self.button = PushButton("开始任务") self.button = PushButton("开始任务")
self.button.clicked.connect(self.start_task) self.button.clicked.connect(self.start_task)
Layout.addWidget(self.Lable)
Layout.addWidget(self.object) Layout.addWidget(self.object)
Layout.addWidget(self.mode) Layout.addWidget(self.mode)
Layout.addStretch(1) Layout.addStretch(1)
@@ -265,7 +276,7 @@ class DispatchBox(QWidget):
info = json.load(f) info = json.load(f)
logger.info(f"用户添加任务:{name}") logger.info(f"用户添加任务:{name}")
Task_manager.add_task(f"{self.mode.currentText()}_主窗口", name, info) Task_manager.add_task(f"{self.mode.currentText()}_主调度台", name, info)
elif self.object.currentText().split(" - ")[0] == "实例": elif self.object.currentText().split(" - ")[0] == "实例":
@@ -275,7 +286,7 @@ class DispatchBox(QWidget):
logger.info(f"用户添加任务:{name}") logger.info(f"用户添加任务:{name}")
Task_manager.add_task( Task_manager.add_task(
f"{self.mode.currentText()}_主窗口", "用户自定义队列", info f"{self.mode.currentText()}_主调度台", "用户自定义队列", info
) )
class DispatchInfoCard(HeaderCardWidget): class DispatchInfoCard(HeaderCardWidget):

View File

@@ -182,6 +182,7 @@ class AUTO_MAA(MSFluentWindow):
# 加载配置 # 加载配置
qconfig.load(Config.config_path, Config.global_config) qconfig.load(Config.config_path, Config.global_config)
Config.global_config.save()
# 检查密码 # 检查密码
self.setting.check_PASSWORD() self.setting.check_PASSWORD()

View File

@@ -578,6 +578,14 @@ class MaaSettingBox(QWidget):
widget = QWidget() widget = QWidget()
Layout = QVBoxLayout(widget) Layout = QVBoxLayout(widget)
self.ProxyTimesLimit = SpinBoxSettingCard(
(0, 1024),
FluentIcon.PAGE_RIGHT,
"用户单日代理次数上限",
"当用户本日代理成功次数超过该阈值时跳过代理阈值为“0”时视为无代理次数上限",
Config.maa_config.RunSet_ProxyTimesLimit,
)
self.AnnihilationTimeLimit = SpinBoxSettingCard( self.AnnihilationTimeLimit = SpinBoxSettingCard(
(1, 1024), (1, 1024),
FluentIcon.PAGE_RIGHT, FluentIcon.PAGE_RIGHT,
@@ -602,6 +610,7 @@ class MaaSettingBox(QWidget):
Config.maa_config.RunSet_RunTimesLimit, Config.maa_config.RunSet_RunTimesLimit,
) )
Layout.addWidget(self.ProxyTimesLimit)
Layout.addWidget(self.AnnihilationTimeLimit) Layout.addWidget(self.AnnihilationTimeLimit)
Layout.addWidget(self.RoutineTimeLimit) Layout.addWidget(self.RoutineTimeLimit)
Layout.addWidget(self.RunTimesLimit) Layout.addWidget(self.RunTimesLimit)
@@ -674,6 +683,7 @@ class MaaSettingBox(QWidget):
Config.cur.execute("SELECT * FROM adminx WHERE True") Config.cur.execute("SELECT * FROM adminx WHERE True")
data = Config.cur.fetchall() data = Config.cur.fetchall()
data = sorted(data, key=lambda x: (-len(x[15]), x[16]))
if self.user_list.pivot.currentRouteKey() == f"{self.name}_简洁用户列表": if self.user_list.pivot.currentRouteKey() == f"{self.name}_简洁用户列表":
@@ -707,7 +717,7 @@ class MaaSettingBox(QWidget):
shutil.copy( shutil.copy(
file_path, file_path,
Config.app_path Config.app_path
/ f"config/MaaConfig/{self.name}/simple/{choice.input[0].currentIndex()}/infrastructure", / f"config/MaaConfig/{self.name}/simple/{choice.input[0].currentIndex()}/infrastructure/infrastructure.json",
) )
else: else:
logger.warning("未选择自定义基建文件") logger.warning("未选择自定义基建文件")
@@ -867,6 +877,9 @@ class MaaSettingBox(QWidget):
self.user_list_simple.itemChanged.connect( self.user_list_simple.itemChanged.connect(
lambda item: self.change_user_Item(item, "simple") lambda item: self.change_user_Item(item, "simple")
) )
self.user_list_beta.itemChanged.connect(
lambda item: self.change_user_Item(item, "beta")
)
self.stackedWidget.addWidget(self.user_list_simple) self.stackedWidget.addWidget(self.user_list_simple)
self.pivot.addItem( self.pivot.addItem(
@@ -963,11 +976,9 @@ class MaaSettingBox(QWidget):
elif j == 5: elif j == 5:
curdate = server_date() curdate = server_date()
if curdate != value: if curdate != value:
item = QTableWidgetItem("今日未代理") item = QTableWidgetItem("未代理")
else: else:
item = QTableWidgetItem( item = QTableWidgetItem(f"已代理{data_simple[i][14]}")
f"今日已代理{data_simple[i][14]}"
)
item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
elif j == 12: elif j == 12:
if Config.PASSWORD == "": if Config.PASSWORD == "":
@@ -1032,11 +1043,9 @@ class MaaSettingBox(QWidget):
elif j == 5: elif j == 5:
curdate = server_date() curdate = server_date()
if curdate != value: if curdate != value:
item = QTableWidgetItem("今日未代理") item = QTableWidgetItem("未代理")
else: else:
item = QTableWidgetItem( item = QTableWidgetItem(f"已代理{data_beta[i][14]}")
f"今日已代理{data_beta[i][14]}"
)
item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) item.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
elif j == 12: elif j == 12:
if Config.PASSWORD == "": if Config.PASSWORD == "":
@@ -1348,6 +1357,10 @@ class MaaSettingBox(QWidget):
return None return None
if row == 0: if row == 0:
logger.warning("向上移动用户时已到达最上端")
MainInfoBar.push_info_bar(
"warning", "已经是第一个用户", "无法向上移动", 5000
)
return None return None
Config.cur.execute( Config.cur.execute(
@@ -1445,6 +1458,10 @@ class MaaSettingBox(QWidget):
return None return None
if row == current_numb - 1: if row == current_numb - 1:
logger.warning("向下移动用户时已到达最下端")
MainInfoBar.push_info_bar(
"warning", "已经是最后一个用户", "无法向下移动", 5000
)
return None return None
Config.cur.execute( Config.cur.execute(

View File

@@ -42,6 +42,7 @@ from qfluentwidgets import (
SwitchSettingCard, SwitchSettingCard,
ExpandGroupSettingCard, ExpandGroupSettingCard,
PushSettingCard, PushSettingCard,
ComboBoxSettingCard,
) )
from datetime import datetime from datetime import datetime
import json import json
@@ -207,7 +208,7 @@ class Setting(QWidget):
for _ in range(3): for _ in range(3):
try: try:
response = requests.get( response = requests.get(
"https://gitee.com/DLmaster_361/AUTO_MAA/raw/main/resources/version.json" f"https://gitee.com/DLmaster_361/AUTO_MAA/raw/{Config.global_config.get(Config.global_config.update_UpdateType)}/resources/version.json"
) )
version_remote = response.json() version_remote = response.json()
break break
@@ -249,7 +250,7 @@ class Setting(QWidget):
for _ in range(3): for _ in range(3):
try: try:
response = requests.get( response = requests.get(
"https://gitee.com/DLmaster_361/AUTO_MAA/raw/main/resources/version.json" f"https://gitee.com/DLmaster_361/AUTO_MAA/raw/{Config.global_config.get(Config.global_config.update_UpdateType)}/resources/version.json"
) )
version_remote = response.json() version_remote = response.json()
break break
@@ -390,24 +391,19 @@ class FunctionSettingCard(HeaderCardWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setTitle("功能") self.setTitle("功能")
Layout = QVBoxLayout()
self.card_IfAllowSleep = SwitchSettingCard( self.card_IfAllowSleep = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="启动时阻止系统休眠", title="启动时阻止系统休眠",
content="仅阻止电脑自动休眠,不会影响屏幕是否熄灭", content="仅阻止电脑自动休眠,不会影响屏幕是否熄灭",
configItem=Config.global_config.function_IfAllowSleep, configItem=Config.global_config.function_IfAllowSleep,
) )
self.card_IfSilence = self.SilenceSettingCard(self) self.card_IfSilence = self.SilenceSettingCard(self)
# 添加各组到设置卡中 Layout = QVBoxLayout()
Layout.addWidget(self.card_IfAllowSleep) Layout.addWidget(self.card_IfAllowSleep)
Layout.addWidget(self.card_IfSilence) Layout.addWidget(self.card_IfSilence)
self.viewLayout.addLayout(Layout) self.viewLayout.addLayout(Layout)
class SilenceSettingCard(ExpandGroupSettingCard): class SilenceSettingCard(ExpandGroupSettingCard):
@@ -420,16 +416,12 @@ class FunctionSettingCard(HeaderCardWidget):
parent, parent,
) )
widget = QWidget()
Layout = QVBoxLayout(widget)
self.card_IfSilence = SwitchSettingCard( self.card_IfSilence = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="静默模式", title="静默模式",
content="是否启用静默模式", content="是否启用静默模式",
configItem=Config.global_config.function_IfSilence, configItem=Config.global_config.function_IfSilence,
) )
self.card_BossKey = LineEditSettingCard( self.card_BossKey = LineEditSettingCard(
text="请输入安卓模拟器老版键", text="请输入安卓模拟器老版键",
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
@@ -438,13 +430,12 @@ class FunctionSettingCard(HeaderCardWidget):
configItem=Config.global_config.function_BossKey, configItem=Config.global_config.function_BossKey,
) )
widget = QWidget()
Layout = QVBoxLayout(widget)
Layout.addWidget(self.card_IfSilence) Layout.addWidget(self.card_IfSilence)
Layout.addWidget(self.card_BossKey) Layout.addWidget(self.card_BossKey)
# 调整内部布局
self.viewLayout.setContentsMargins(0, 0, 0, 0) self.viewLayout.setContentsMargins(0, 0, 0, 0)
self.viewLayout.setSpacing(0) self.viewLayout.setSpacing(0)
self.addGroupWidget(widget) self.addGroupWidget(widget)
@@ -452,18 +443,14 @@ class StartSettingCard(HeaderCardWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setTitle("启动") self.setTitle("启动")
Layout = QVBoxLayout()
self.card_IfSelfStart = SwitchSettingCard( self.card_IfSelfStart = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="开机时自动启动", title="开机时自动启动",
content="将AUTO_MAA添加到开机启动项", content="将AUTO_MAA添加到开机启动项",
configItem=Config.global_config.start_IfSelfStart, configItem=Config.global_config.start_IfSelfStart,
) )
self.card_IfRunDirectly = SwitchSettingCard( self.card_IfRunDirectly = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="启动后直接运行", title="启动后直接运行",
@@ -471,12 +458,9 @@ class StartSettingCard(HeaderCardWidget):
configItem=Config.global_config.start_IfRunDirectly, configItem=Config.global_config.start_IfRunDirectly,
) )
# 添加各组到设置卡中 Layout = QVBoxLayout()
Layout.addWidget( Layout.addWidget(self.card_IfSelfStart)
self.card_IfSelfStart,
)
Layout.addWidget(self.card_IfRunDirectly) Layout.addWidget(self.card_IfRunDirectly)
self.viewLayout.addLayout(Layout) self.viewLayout.addLayout(Layout)
@@ -484,18 +468,14 @@ class UiSettingCard(HeaderCardWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setTitle("界面") self.setTitle("界面")
Layout = QVBoxLayout()
self.card_IfShowTray = SwitchSettingCard( self.card_IfShowTray = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="显示托盘图标", title="显示托盘图标",
content="常态显示托盘图标", content="常态显示托盘图标",
configItem=Config.global_config.ui_IfShowTray, configItem=Config.global_config.ui_IfShowTray,
) )
self.card_IfToTray = SwitchSettingCard( self.card_IfToTray = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="最小化到托盘", title="最小化到托盘",
@@ -503,10 +483,9 @@ class UiSettingCard(HeaderCardWidget):
configItem=Config.global_config.ui_IfToTray, configItem=Config.global_config.ui_IfToTray,
) )
# 添加各组到设置卡中 Layout = QVBoxLayout()
Layout.addWidget(self.card_IfShowTray) Layout.addWidget(self.card_IfShowTray)
Layout.addWidget(self.card_IfToTray) Layout.addWidget(self.card_IfToTray)
self.viewLayout.addLayout(Layout) self.viewLayout.addLayout(Layout)
@@ -517,20 +496,28 @@ class NotifySettingCard(HeaderCardWidget):
self.setTitle("通知") self.setTitle("通知")
Layout = QVBoxLayout() self.card_IfSendErrorOnly = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT,
title="仅推送异常信息",
content="仅在任务出现异常时推送通知",
configItem=Config.global_config.notify_IfSendErrorOnly,
)
self.card_IfPushPlyer = SwitchSettingCard( self.card_IfPushPlyer = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="推送系统通知", title="推送系统通知",
content="推送系统级通知,不会在通知中心停留", content="推送系统级通知,不会在通知中心停留",
configItem=Config.global_config.notify_IfPushPlyer, configItem=Config.global_config.notify_IfPushPlyer,
) )
self.card_SendMail = self.SendMailSettingCard(self) self.card_SendMail = self.SendMailSettingCard(self)
self.card_ServerChan = self.ServerChanSettingCard(self)
self.card_CompanyWebhookBot = self.CompanyWechatPushSettingCard(self)
Layout = QVBoxLayout()
Layout.addWidget(self.card_IfSendErrorOnly)
Layout.addWidget(self.card_IfPushPlyer) Layout.addWidget(self.card_IfPushPlyer)
Layout.addWidget(self.card_SendMail) Layout.addWidget(self.card_SendMail)
Layout.addWidget(self.card_ServerChan)
Layout.addWidget(self.card_CompanyWebhookBot)
self.viewLayout.addLayout(Layout) self.viewLayout.addLayout(Layout)
class SendMailSettingCard(ExpandGroupSettingCard): class SendMailSettingCard(ExpandGroupSettingCard):
@@ -543,17 +530,13 @@ class NotifySettingCard(HeaderCardWidget):
parent, parent,
) )
widget = QWidget()
Layout = QVBoxLayout(widget)
self.card_IfSendMail = SwitchSettingCard( self.card_IfSendMail = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="推送邮件通知", title="推送邮件通知",
content="是否启用邮件通知功能", content="是否启用邮件通知功能",
configItem=Config.global_config.notify_IfSendMail, configItem=Config.global_config.notify_IfSendMail,
) )
self.card_MailAddress = LineEditSettingCard(
self.MailAddress = LineEditSettingCard(
text="请输入邮箱地址", text="请输入邮箱地址",
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="邮箱地址", title="邮箱地址",
@@ -561,21 +544,90 @@ class NotifySettingCard(HeaderCardWidget):
configItem=Config.global_config.notify_MailAddress, configItem=Config.global_config.notify_MailAddress,
) )
self.card_IfSendErrorOnly = SwitchSettingCard( widget = QWidget()
icon=FluentIcon.PAGE_RIGHT, Layout = QVBoxLayout(widget)
title="仅推送异常信息",
content="仅在任务出现异常时推送通知",
configItem=Config.global_config.notify_IfSendErrorOnly,
)
Layout.addWidget(self.card_IfSendMail) Layout.addWidget(self.card_IfSendMail)
Layout.addWidget(self.MailAddress) Layout.addWidget(self.card_MailAddress)
Layout.addWidget(self.card_IfSendErrorOnly)
# 调整内部布局
self.viewLayout.setContentsMargins(0, 0, 0, 0) self.viewLayout.setContentsMargins(0, 0, 0, 0)
self.viewLayout.setSpacing(0) self.viewLayout.setSpacing(0)
self.addGroupWidget(widget)
class ServerChanSettingCard(ExpandGroupSettingCard):
def __init__(self, parent=None):
super().__init__(
FluentIcon.SETTING,
"推送ServerChan通知",
"通过ServerChan通知推送任务结果",
parent,
)
self.card_IfServerChan = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT,
title="推送SeverChan通知",
content="是否启用SeverChan通知功能",
configItem=Config.global_config.notify_IfServerChan,
)
self.card_ServerChanKey = LineEditSettingCard(
text="请输入SendKey",
icon=FluentIcon.PAGE_RIGHT,
title="SendKey",
content="Server酱的SendKeySC3与SCT都可以",
configItem=Config.global_config.notify_ServerChanKey,
)
self.card_ServerChanChannel = LineEditSettingCard(
text="请输入需要推送的Channel代码SCT生效",
icon=FluentIcon.PAGE_RIGHT,
title="ServerChanChannel代码",
content="可以留空,留空则默认。可以多个,请使用“|”隔开",
configItem=Config.global_config.notify_ServerChanChannel,
)
self.card_ServerChanTag = LineEditSettingCard(
text="请输入加入推送的TagSC3生效",
icon=FluentIcon.PAGE_RIGHT,
title="Tag内容",
content="可以留空,留空则默认。可以多个,请使用“|”隔开",
configItem=Config.global_config.notify_ServerChanTag,
)
widget = QWidget()
Layout = QVBoxLayout(widget)
Layout.addWidget(self.card_IfServerChan)
Layout.addWidget(self.card_ServerChanKey)
Layout.addWidget(self.card_ServerChanChannel)
Layout.addWidget(self.card_ServerChanTag)
self.viewLayout.setContentsMargins(0, 0, 0, 0)
self.viewLayout.setSpacing(0)
self.addGroupWidget(widget)
class CompanyWechatPushSettingCard(ExpandGroupSettingCard):
def __init__(self, parent=None):
super().__init__(
FluentIcon.SETTING,
"推送企业微信机器人通知",
"通过企业微信机器人Webhook通知推送任务结果",
parent,
)
self.card_IfCompanyWechat = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT,
title="推送企业微信机器人通知",
content="是否启用企业微信机器人通知功能",
configItem=Config.global_config.notify_IfCompanyWebHookBot,
)
self.card_CompanyWebHookBotUrl = LineEditSettingCard(
text="请输入Webhook的Url",
icon=FluentIcon.PAGE_RIGHT,
title="WebhookUrl",
content="企业微信群机器人的Webhook地址",
configItem=Config.global_config.notify_CompanyWebHookBotUrl,
)
widget = QWidget()
Layout = QVBoxLayout(widget)
Layout.addWidget(self.card_IfCompanyWechat)
Layout.addWidget(self.card_CompanyWebHookBotUrl)
self.viewLayout.setContentsMargins(0, 0, 0, 0)
self.viewLayout.setSpacing(0)
self.addGroupWidget(widget) self.addGroupWidget(widget)
@@ -583,11 +635,8 @@ class SecuritySettingCard(HeaderCardWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setTitle("安全") self.setTitle("安全")
Layout = QVBoxLayout()
self.card_changePASSWORD = PushSettingCard( self.card_changePASSWORD = PushSettingCard(
text="修改", text="修改",
icon=FluentIcon.VPN, icon=FluentIcon.VPN,
@@ -595,8 +644,8 @@ class SecuritySettingCard(HeaderCardWidget):
content="修改用于解密用户密码的管理密钥", content="修改用于解密用户密码的管理密钥",
) )
Layout = QVBoxLayout()
Layout.addWidget(self.card_changePASSWORD) Layout.addWidget(self.card_changePASSWORD)
self.viewLayout.addLayout(Layout) self.viewLayout.addLayout(Layout)
@@ -604,18 +653,21 @@ class UpdaterSettingCard(HeaderCardWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setTitle("更新") self.setTitle("更新")
Layout = QVBoxLayout()
self.card_IfAutoUpdate = SwitchSettingCard( self.card_IfAutoUpdate = SwitchSettingCard(
icon=FluentIcon.PAGE_RIGHT, icon=FluentIcon.PAGE_RIGHT,
title="自动检查更新", title="自动检查更新",
content="将在启动时自动检查AUTO_MAA是否有新版本", content="将在启动时自动检查AUTO_MAA是否有新版本",
configItem=Config.global_config.update_IfAutoUpdate, configItem=Config.global_config.update_IfAutoUpdate,
) )
self.card_UpdateType = ComboBoxSettingCard(
configItem=Config.global_config.update_UpdateType,
icon=FluentIcon.PAGE_RIGHT,
title="版本更新类别",
content="选择AUTO_MAA的更新类别",
texts=["稳定版", "公测版"],
)
self.card_CheckUpdate = PushSettingCard( self.card_CheckUpdate = PushSettingCard(
text="检查更新", text="检查更新",
icon=FluentIcon.UPDATE, icon=FluentIcon.UPDATE,
@@ -623,9 +675,10 @@ class UpdaterSettingCard(HeaderCardWidget):
content="检查AUTO_MAA是否有新版本", content="检查AUTO_MAA是否有新版本",
) )
Layout = QVBoxLayout()
Layout.addWidget(self.card_IfAutoUpdate) Layout.addWidget(self.card_IfAutoUpdate)
Layout.addWidget(self.card_UpdateType)
Layout.addWidget(self.card_CheckUpdate) Layout.addWidget(self.card_CheckUpdate)
self.viewLayout.addLayout(Layout) self.viewLayout.addLayout(Layout)
@@ -633,7 +686,6 @@ class OtherSettingCard(HeaderCardWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setTitle("其他") self.setTitle("其他")
self.card_Notice = PushSettingCard( self.card_Notice = PushSettingCard(
@@ -642,10 +694,18 @@ class OtherSettingCard(HeaderCardWidget):
title="公告", title="公告",
content="查看AUTO_MAA的最新公告", content="查看AUTO_MAA的最新公告",
) )
self.card_UserDocs = HyperlinkCard(
url="https://docs.qq.com/aio/DQ2NwUHRiWGtMWHBy",
text="查看使用指南",
icon=FluentIcon.PAGE_RIGHT,
title="使用指南",
content="查看AUTO_MAA的使用教程和文档",
)
self.card_Association = self.AssociationSettingCard() self.card_Association = self.AssociationSettingCard()
Layout = QVBoxLayout() Layout = QVBoxLayout()
Layout.addWidget(self.card_Notice) Layout.addWidget(self.card_Notice)
Layout.addWidget(self.card_UserDocs)
Layout.addWidget(self.card_Association) Layout.addWidget(self.card_Association)
self.viewLayout.addLayout(Layout) self.viewLayout.addLayout(Layout)

View File

@@ -230,7 +230,7 @@ class UpdateProcess(QThread):
"https://gh.llkk.cc/", "https://gh.llkk.cc/",
"https://github.akams.cn/", "https://github.akams.cn/",
"https://www.ghproxy.cn/", "https://www.ghproxy.cn/",
"https://ghp.ci/", "https://ghfast.top/",
] ]
time.sleep(1) time.sleep(1)
@@ -319,7 +319,7 @@ class AUTO_MAA_Updater(QApplication):
if __name__ == "__main__": if __name__ == "__main__":
# 获取软件自身的路径 # 获取软件自身的路径
app_path = Path.cwd() app_path = Path(sys.argv[0]).resolve().parent
# 从本地版本信息文件获取当前版本信息 # 从本地版本信息文件获取当前版本信息
if (app_path / "resources/version.json").exists(): if (app_path / "resources/version.json").exists():
@@ -333,11 +333,22 @@ if __name__ == "__main__":
else: else:
main_version_current = [0, 0, 0, 0] main_version_current = [0, 0, 0, 0]
# 从本地配置文件获取更新类型
if (app_path / "config/config.json").exists():
with (app_path / "config/config.json").open(mode="r", encoding="utf-8") as f:
config = json.load(f)
if "Update" in config and "UpdateType" in config["Update"]:
update_type = config["Update"]["UpdateType"]
else:
update_type = "main"
else:
update_type = "main"
# 从远程服务器获取最新版本信息 # 从远程服务器获取最新版本信息
for _ in range(3): for _ in range(3):
try: try:
response = requests.get( response = requests.get(
"https://gitee.com/DLmaster_361/AUTO_MAA/raw/main/resources/version.json" f"https://gitee.com/DLmaster_361/AUTO_MAA/raw/{update_type}/resources/version.json"
) )
version_remote = response.json() version_remote = response.json()
main_version_remote = list( main_version_remote = list(

View File

@@ -8,4 +8,5 @@ pywin32
pyautogui pyautogui
pycryptodome pycryptodome
requests requests
serverchan_sdk
nuitka==2.6 nuitka==2.6

View File

@@ -9,6 +9,6 @@
"https://gh.llkk.cc/", "https://gh.llkk.cc/",
"https://github.akams.cn/", "https://github.akams.cn/",
"https://www.ghproxy.cn/", "https://www.ghproxy.cn/",
"https://ghp.ci/" "https://ghfast.top/"
] ]
} }

View File

@@ -1,7 +1,7 @@
{ {
"main_version": "4.2.2.0", "main_version": "4.2.2.2",
"updater_version": "1.1.1.0", "updater_version": "1.1.1.3",
"announcement": "\n## 新增功能\n- 调度队列上线支持MAA多开 #12\n- 公告系统上线\n## 修复BUG\n- 修复手机号码不全时引发的混乱\n- 添加了一堆BUG确信\n## 程序优化\n- 界面重构,引入`QFluentWidgets`美化界面", "announcement": "\n## 新增功能\n- 添加用户每日代理次数上限功能 #15\n- 新增代理成功消息推送渠道Server酱与企业微信群机器人推送\n- 添加更新类别可选项\n## 修复BUG\n- 修复自定义基建无法正常使用的问题\n- 修正人工排查文案\n- 修复高级MAA配置序号错位\n- 修复高级用户列表无法配置问题\n- 修复主调度台选项乱动问题\n- 修复更新器文件夹定位问题\n## 程序优化\n- 无",
"proxy_list": [ "proxy_list": [
"", "",
"https://gitproxy.click/", "https://gitproxy.click/",
@@ -9,6 +9,6 @@
"https://gh.llkk.cc/", "https://gh.llkk.cc/",
"https://github.akams.cn/", "https://github.akams.cn/",
"https://www.ghproxy.cn/", "https://www.ghproxy.cn/",
"https://ghp.ci/" "https://ghfast.top/"
] ]
} }