feat(core): 计划表功能上线

This commit is contained in:
DLmaster361
2025-05-25 21:12:22 +08:00
parent 740797a689
commit de1058a28c
9 changed files with 626 additions and 271 deletions

View File

@@ -388,9 +388,7 @@ class MaaUserConfig(LQConfig):
self.Info_Mode = OptionsConfigItem( self.Info_Mode = OptionsConfigItem(
"Info", "Mode", "简洁", OptionsValidator(["简洁", "详细"]) "Info", "Mode", "简洁", OptionsValidator(["简洁", "详细"])
) )
self.Info_GameIdMode = OptionsConfigItem( self.Info_GameIdMode = ConfigItem("Info", "GameIdMode", "固定")
"Info", "GameIdMode", "固定", OptionsValidator(["固定"])
)
self.Info_Server = OptionsConfigItem( self.Info_Server = OptionsConfigItem(
"Info", "Server", "Official", OptionsValidator(["Official", "Bilibili"]) "Info", "Server", "Official", OptionsValidator(["Official", "Bilibili"])
) )
@@ -461,6 +459,29 @@ class MaaUserConfig(LQConfig):
"Notify", "CompanyWebHookBotUrl", "" "Notify", "CompanyWebHookBotUrl", ""
) )
def get_plan_info(self) -> Dict[str, Union[str, int]]:
"""获取当前的计划下信息"""
if self.get(self.Info_GameIdMode) == "固定":
return {
"MedicineNumb": self.get(self.Info_MedicineNumb),
"SeriesNumb": self.get(self.Info_SeriesNumb),
"GameId": self.get(self.Info_GameId),
"GameId_1": self.get(self.Info_GameId_1),
"GameId_2": self.get(self.Info_GameId_2),
"GameId_Remain": self.get(self.Info_GameId_Remain),
}
elif "计划" in self.get(self.Info_GameIdMode):
plan = Config.plan_dict[self.get(self.Info_GameIdMode)]["Config"]
return {
"MedicineNumb": plan.get(plan.get_current_info("MedicineNumb")),
"SeriesNumb": plan.get(plan.get_current_info("SeriesNumb")),
"GameId": plan.get(plan.get_current_info("GameId")),
"GameId_1": plan.get(plan.get_current_info("GameId_1")),
"GameId_2": plan.get(plan.get_current_info("GameId_2")),
"GameId_Remain": plan.get(plan.get_current_info("GameId_Remain")),
}
class MaaPlanConfig(LQConfig): class MaaPlanConfig(LQConfig):
"""MAA计划表配置""" """MAA计划表配置"""
@@ -468,7 +489,10 @@ class MaaPlanConfig(LQConfig):
def __init__(self) -> None: def __init__(self) -> None:
super().__init__() super().__init__()
self.Info_Name = ConfigItem("Info", "Name", "新表格") self.Info_Name = ConfigItem("Info", "Name", "")
self.Info_Mode = OptionsConfigItem(
"Info", "Mode", "ALL", OptionsValidator(["ALL", "Weekly"])
)
self.config_item_dict: dict[str, Dict[str, ConfigItem]] = {} self.config_item_dict: dict[str, Dict[str, ConfigItem]] = {}
@@ -514,6 +538,18 @@ class MaaPlanConfig(LQConfig):
]: ]:
setattr(self, f"{group}_{name}", self.config_item_dict[group][name]) setattr(self, f"{group}_{name}", self.config_item_dict[group][name])
def get_current_info(self, name: str) -> ConfigItem:
"""获取当前的计划表配置项"""
if self.get(self.Info_Mode) == "ALL":
return self.config_item_dict["ALL"][name]
elif self.get(self.Info_Mode) == "Weekly":
today = datetime.now().strftime("%A")
if today in self.config_item_dict:
return self.config_item_dict[today][name]
else:
return self.config_item_dict["ALL"][name]
class AppConfig(GlobalConfig): class AppConfig(GlobalConfig):
@@ -615,7 +651,7 @@ class AppConfig(GlobalConfig):
logger.warning(f"无法从MAA服务器获取活动关卡信息:{Network.error_message}") logger.warning(f"无法从MAA服务器获取活动关卡信息:{Network.error_message}")
gameid_infos = [] gameid_infos = []
gameid_dict = {"value": [], "text": []} ss_gameid_dict = {"value": [], "text": []}
for gameid_info in gameid_infos: for gameid_info in gameid_infos:
@@ -628,85 +664,48 @@ class AppConfig(GlobalConfig):
gameid_info["Activity"]["UtcExpireTime"], "%Y/%m/%d %H:%M:%S" gameid_info["Activity"]["UtcExpireTime"], "%Y/%m/%d %H:%M:%S"
) )
): ):
gameid_dict["value"].append(gameid_info["Value"]) ss_gameid_dict["value"].append(gameid_info["Value"])
gameid_dict["text"].append(gameid_info["Value"]) ss_gameid_dict["text"].append(gameid_info["Value"])
# 生成全部关卡信息
self.gameid_dict["ALL"]["value"] = gameid_dict["value"] + [
"-",
"1-7",
"R8-11",
"12-17-HARD",
"CE-6",
"AP-5",
"CA-5",
"LS-6",
"SK-5",
"PR-A-1",
"PR-A-2",
"PR-B-1",
"PR-B-2",
"PR-C-1",
"PR-C-2",
"PR-D-1",
"PR-D-2",
]
self.gameid_dict["ALL"]["text"] = gameid_dict["text"] + [
"当前/上次",
"1-7",
"R8-11",
"12-17-HARD",
"龙门币-6/5",
"红票-5",
"技能-5",
"经验-6/5",
"碳-5",
"奶/盾芯片",
"奶/盾芯片组",
"术/狙芯片",
"术/狙芯片组",
"先/辅芯片",
"先/辅芯片组",
"近/特芯片",
"近/特芯片组",
]
# # 生成本日关卡信息
# days = self.server_date().isoweekday()
# 生成每日关卡信息 # 生成每日关卡信息
for day in range(1, 8): gameid_daily_info = [
{"value": "-", "text": "当前/上次", "days": [1, 2, 3, 4, 5, 6, 7]},
{"value": "1-7", "text": "1-7", "days": [1, 2, 3, 4, 5, 6, 7]},
{"value": "R8-11", "text": "R8-11", "days": [1, 2, 3, 4, 5, 6, 7]},
{
"value": "12-17-HARD",
"text": "12-17-HARD",
"days": [1, 2, 3, 4, 5, 6, 7],
},
{"value": "CE-6", "text": "龙门币-6/5", "days": [2, 4, 6, 7]},
{"value": "AP-5", "text": "红票-5", "days": [1, 4, 6, 7]},
{"value": "CA-5", "text": "技能-5", "days": [2, 3, 5, 7]},
{"value": "LS-6", "text": "经验-6/5", "days": [1, 2, 3, 4, 5, 6, 7]},
{"value": "SK-5", "text": "碳-5", "days": [1, 3, 5, 6]},
{"value": "PR-A-1", "text": "奶/盾芯片", "days": [1, 4, 5, 7]},
{"value": "PR-A-2", "text": "奶/盾芯片组", "days": [1, 4, 5, 7]},
{"value": "PR-B-1", "text": "术/狙芯片", "days": [1, 2, 5, 6]},
{"value": "PR-B-2", "text": "术/狙芯片组", "days": [1, 2, 5, 6]},
{"value": "PR-C-1", "text": "先/辅芯片", "days": [3, 4, 6, 7]},
{"value": "PR-C-2", "text": "先/辅芯片组", "days": [3, 4, 6, 7]},
{"value": "PR-D-1", "text": "近/特芯片", "days": [2, 3, 6, 7]},
{"value": "PR-D-2", "text": "近/特芯片组", "days": [2, 3, 6, 7]},
]
gameid_list = [ for day in range(0, 8):
{"value": "-", "text": "当前/上次", "days": [1, 2, 3, 4, 5, 6, 7]},
{"value": "1-7", "text": "1-7", "days": [1, 2, 3, 4, 5, 6, 7]},
{"value": "R8-11", "text": "R8-11", "days": [1, 2, 3, 4, 5, 6, 7]},
{
"value": "12-17-HARD",
"text": "12-17-HARD",
"days": [1, 2, 3, 4, 5, 6, 7],
},
{"value": "CE-6", "text": "龙门币-6/5", "days": [2, 4, 6, 7]},
{"value": "AP-5", "text": "红票-5", "days": [1, 4, 6, 7]},
{"value": "CA-5", "text": "技能-5", "days": [2, 3, 5, 7]},
{"value": "LS-6", "text": "经验-6/5", "days": [1, 2, 3, 4, 5, 6, 7]},
{"value": "SK-5", "text": "碳-5", "days": [1, 3, 5, 6]},
{"value": "PR-A-1", "text": "奶/盾芯片", "days": [1, 4, 5, 7]},
{"value": "PR-A-2", "text": "奶/盾芯片组", "days": [1, 4, 5, 7]},
{"value": "PR-B-1", "text": "术/狙芯片", "days": [1, 2, 5, 6]},
{"value": "PR-B-2", "text": "术/狙芯片组", "days": [1, 2, 5, 6]},
{"value": "PR-C-1", "text": "先/辅芯片", "days": [3, 4, 6, 7]},
{"value": "PR-C-2", "text": "先/辅芯片组", "days": [3, 4, 6, 7]},
{"value": "PR-D-1", "text": "近/特芯片", "days": [2, 3, 6, 7]},
{"value": "PR-D-2", "text": "近/特芯片组", "days": [2, 3, 6, 7]},
]
for gameid_info in gameid_list: today_gameid_dict = {"value": [], "text": []}
if day in gameid_info["days"]:
gameid_dict["value"].append(gameid_info["value"])
gameid_dict["text"].append(gameid_info["text"])
self.gameid_dict[calendar.day_name[day - 1]] = gameid_dict for gameid_info in gameid_daily_info:
if day in gameid_info["days"] or day == 0:
today_gameid_dict["value"].append(gameid_info["value"])
today_gameid_dict["text"].append(gameid_info["text"])
self.gameid_dict[calendar.day_name[day - 1] if day > 0 else "ALL"] = {
"value": today_gameid_dict["value"] + ss_gameid_dict["value"],
"text": today_gameid_dict["text"] + ss_gameid_dict["text"],
}
self.gameid_refreshed.emit() self.gameid_refreshed.emit()

View File

@@ -102,6 +102,9 @@ class MaaManager(QObject):
"Path": info["Path"], "Path": info["Path"],
"Config": info["Config"].toDict(), "Config": info["Config"].toDict(),
} }
planed_info = info["Config"].get_plan_info()
for key, value in planed_info.items():
self.data[name]["Config"]["Info"][key] = value
self.data = dict(sorted(self.data.items(), key=lambda x: int(x[0][3:]))) self.data = dict(sorted(self.data.items(), key=lambda x: int(x[0][3:])))

View File

@@ -254,7 +254,7 @@ class Notification(QWidget):
self.push_info_bar.emit( self.push_info_bar.emit(
"error", "error",
"企业微信群机器人通知推送失败", "企业微信群机器人通知推送失败",
f'使用企业微信群机器人推送通知时出错:{info["errmsg"]}', f"使用企业微信群机器人推送通知时出错:{err}",
-1, -1,
) )
return None return None
@@ -267,10 +267,10 @@ class Notification(QWidget):
self.push_info_bar.emit( self.push_info_bar.emit(
"error", "error",
"企业微信群机器人通知推送失败", "企业微信群机器人通知推送失败",
f'使用企业微信群机器人推送通知时出错:{info["errmsg"]}', f"使用企业微信群机器人推送通知时出错:{err}",
-1, -1,
) )
return f'使用企业微信群机器人推送通知时出错:{info["errmsg"]}' return f"使用企业微信群机器人推送通知时出错:{err}"
def send_test_notification(self): def send_test_notification(self):
"""发送测试通知到所有已启用的通知渠道""" """发送测试通知到所有已启用的通知渠道"""

View File

@@ -477,7 +477,7 @@ class LineEditSettingCard(SettingCard):
def __textChanged(self, content: str): def __textChanged(self, content: str):
self.configItem.valueChanged.disconnect() self.configItem.valueChanged.disconnect(self.setValue)
self.qconfig.set(self.configItem, content.strip()) self.qconfig.set(self.configItem, content.strip())
self.configItem.valueChanged.connect(self.setValue) self.configItem.valueChanged.connect(self.setValue)
@@ -485,7 +485,7 @@ class LineEditSettingCard(SettingCard):
def setValue(self, content: str): def setValue(self, content: str):
self.LineEdit.textChanged.disconnect() self.LineEdit.textChanged.disconnect(self.__textChanged)
self.LineEdit.setText(content.strip()) self.LineEdit.setText(content.strip())
self.LineEdit.textChanged.connect(self.__textChanged) self.LineEdit.textChanged.connect(self.__textChanged)
@@ -527,7 +527,7 @@ class PasswordLineEditSettingCard(SettingCard):
def __textChanged(self, content: str): def __textChanged(self, content: str):
self.configItem.valueChanged.disconnect() self.configItem.valueChanged.disconnect(self.setValue)
if self.algorithm == "DPAPI": if self.algorithm == "DPAPI":
self.qconfig.set(self.configItem, Crypto.win_encryptor(content)) self.qconfig.set(self.configItem, Crypto.win_encryptor(content))
elif self.algorithm == "AUTO": elif self.algorithm == "AUTO":
@@ -538,7 +538,7 @@ class PasswordLineEditSettingCard(SettingCard):
def setValue(self, content: str): def setValue(self, content: str):
self.LineEdit.textChanged.disconnect() self.LineEdit.textChanged.disconnect(self.__textChanged)
if self.algorithm == "DPAPI": if self.algorithm == "DPAPI":
self.LineEdit.setText(Crypto.win_decryptor(content)) self.LineEdit.setText(Crypto.win_decryptor(content))
elif self.algorithm == "AUTO": elif self.algorithm == "AUTO":
@@ -756,7 +756,7 @@ class NoOptionComboBoxSettingCard(SettingCard):
value: List[str], value: List[str],
texts: List[str], texts: List[str],
qconfig: QConfig, qconfig: QConfig,
configItem: OptionsConfigItem, configItem: ConfigItem,
parent=None, parent=None,
): ):
@@ -789,7 +789,7 @@ class NoOptionComboBoxSettingCard(SettingCard):
def reLoadOptions(self, value: List[str], texts: List[str]): def reLoadOptions(self, value: List[str], texts: List[str]):
self.comboBox.currentIndexChanged.disconnect() self.comboBox.currentIndexChanged.disconnect(self._onCurrentIndexChanged)
self.comboBox.clear() self.comboBox.clear()
self.optionToText = {o: t for o, t in zip(value, texts)} self.optionToText = {o: t for o, t in zip(value, texts)}
for text, option in zip(texts, value): for text, option in zip(texts, value):
@@ -811,7 +811,7 @@ class EditableComboBoxSettingCard(SettingCard):
value: List[str], value: List[str],
texts: List[str], texts: List[str],
qconfig: QConfig, qconfig: QConfig,
configItem: OptionsConfigItem, configItem: ConfigItem,
parent=None, parent=None,
): ):
@@ -861,7 +861,7 @@ class EditableComboBoxSettingCard(SettingCard):
def reLoadOptions(self, value: List[str], texts: List[str]): def reLoadOptions(self, value: List[str], texts: List[str]):
self.comboBox.currentIndexChanged.disconnect() self.comboBox.currentIndexChanged.disconnect(self._onCurrentIndexChanged)
self.comboBox.clear() self.comboBox.clear()
self.optionToText = {o: t for o, t in zip(value, texts)} self.optionToText = {o: t for o, t in zip(value, texts)}
for text, option in zip(texts, value): for text, option in zip(texts, value):
@@ -899,6 +899,169 @@ class EditableComboBoxSettingCard(SettingCard):
self.currentIndexChanged.emit(self.count() - 1) self.currentIndexChanged.emit(self.count() - 1)
class SpinBoxWithPlanSettingCard(SpinBoxSettingCard):
textChanged = Signal(int)
def __init__(
self,
icon: Union[str, QIcon, FluentIconBase],
title: str,
content: Union[str, None],
range: tuple[int, int],
qconfig: QConfig,
configItem: ConfigItem,
parent=None,
):
super().__init__(icon, title, content, range, qconfig, configItem, parent)
self.configItem_plan = None
self.LineEdit = LineEdit(self)
self.LineEdit.setMinimumWidth(150)
self.LineEdit.setReadOnly(True)
self.LineEdit.setVisible(False)
self.hBoxLayout.insertWidget(5, self.LineEdit, 0, Qt.AlignRight)
def setText(self, value: int) -> None:
self.LineEdit.setText(str(value))
def switch_mode(self, mode: str) -> None:
"""切换模式"""
if mode == "固定":
self.LineEdit.setVisible(False)
self.SpinBox.setVisible(True)
elif mode == "计划":
self.SpinBox.setVisible(False)
self.LineEdit.setVisible(True)
def change_plan(self, configItem_plan: ConfigItem) -> None:
"""切换计划"""
if self.configItem_plan is not None:
self.configItem_plan.valueChanged.disconnect(self.setText)
self.configItem_plan = configItem_plan
self.configItem_plan.valueChanged.connect(self.setText)
self.setText(self.qconfig.get(self.configItem_plan))
class ComboBoxWithPlanSettingCard(ComboBoxSettingCard):
def __init__(
self,
icon: Union[str, QIcon, FluentIconBase],
title: str,
content: Union[str, None],
texts: List[str],
qconfig: QConfig,
configItem: OptionsConfigItem,
parent=None,
):
super().__init__(icon, title, content, texts, qconfig, configItem, parent)
self.configItem_plan = None
self.LineEdit = LineEdit(self)
self.LineEdit.setMinimumWidth(150)
self.LineEdit.setReadOnly(True)
self.LineEdit.setVisible(False)
self.hBoxLayout.insertWidget(5, self.LineEdit, 0, Qt.AlignRight)
def setText(self, value: str) -> None:
if value not in self.optionToText:
self.optionToText[value] = value
self.LineEdit.setText(self.optionToText[value])
def switch_mode(self, mode: str) -> None:
"""切换模式"""
if mode == "固定":
self.LineEdit.setVisible(False)
self.comboBox.setVisible(True)
elif mode == "计划":
self.comboBox.setVisible(False)
self.LineEdit.setVisible(True)
def change_plan(self, configItem_plan: ConfigItem) -> None:
"""切换计划"""
if self.configItem_plan is not None:
self.configItem_plan.valueChanged.disconnect(self.setText)
self.configItem_plan = configItem_plan
self.configItem_plan.valueChanged.connect(self.setText)
self.setText(self.qconfig.get(self.configItem_plan))
class EditableComboBoxWithPlanSettingCard(EditableComboBoxSettingCard):
def __init__(
self,
icon: Union[str, QIcon, FluentIconBase],
title: str,
content: Union[str, None],
value: List[str],
texts: List[str],
qconfig: QConfig,
configItem: ConfigItem,
parent=None,
):
super().__init__(
icon, title, content, value, texts, qconfig, configItem, parent
)
self.configItem_plan = None
self.LineEdit = LineEdit(self)
self.LineEdit.setMinimumWidth(150)
self.LineEdit.setReadOnly(True)
self.LineEdit.setVisible(False)
self.hBoxLayout.insertWidget(5, self.LineEdit, 0, Qt.AlignRight)
def setText(self, value: str) -> None:
if value not in self.optionToText:
self.optionToText[value] = value
self.LineEdit.setText(self.optionToText[value])
def switch_mode(self, mode: str) -> None:
"""切换模式"""
if mode == "固定":
self.LineEdit.setVisible(False)
self.comboBox.setVisible(True)
elif mode == "计划":
self.comboBox.setVisible(False)
self.LineEdit.setVisible(True)
def change_plan(self, configItem_plan: ConfigItem) -> None:
"""切换计划"""
if self.configItem_plan is not None:
self.configItem_plan.valueChanged.disconnect(self.setText)
self.configItem_plan = configItem_plan
self.configItem_plan.valueChanged.connect(self.setText)
self.setText(self.qconfig.get(self.configItem_plan))
class TimeEditSettingCard(SettingCard): class TimeEditSettingCard(SettingCard):
enabledChanged = Signal(bool) enabledChanged = Signal(bool)
@@ -1154,7 +1317,7 @@ class NoOptionComboBoxSetting(ComboBox):
def reLoadOptions(self, value: List[str], texts: List[str]): def reLoadOptions(self, value: List[str], texts: List[str]):
self.currentIndexChanged.disconnect() self.currentIndexChanged.disconnect(self._onCurrentIndexChanged)
self.clear() self.clear()
self.optionToText = {o: t for o, t in zip(value, texts)} self.optionToText = {o: t for o, t in zip(value, texts)}
for text, option in zip(texts, value): for text, option in zip(texts, value):
@@ -1210,7 +1373,7 @@ class EditableComboBoxSetting(EditableComboBox):
def reLoadOptions(self, value: List[str], texts: List[str]): def reLoadOptions(self, value: List[str], texts: List[str]):
self.currentIndexChanged.disconnect() self.currentIndexChanged.disconnect(self._onCurrentIndexChanged)
self.clear() self.clear()
self.optionToText = {o: t for o, t in zip(value, texts)} self.optionToText = {o: t for o, t in zip(value, texts)}
for text, option in zip(texts, value): for text, option in zip(texts, value):

View File

@@ -81,8 +81,8 @@ class AUTO_MAA(MSFluentWindow):
# 创建主窗口 # 创建主窗口
self.home = Home(self) self.home = Home(self)
self.member_manager = MemberManager(self)
self.plan_manager = PlanManager(self) self.plan_manager = PlanManager(self)
self.member_manager = MemberManager(self)
self.queue_manager = QueueManager(self) self.queue_manager = QueueManager(self)
self.dispatch_center = DispatchCenter(self) self.dispatch_center = DispatchCenter(self)
self.history = History(self) self.history = History(self)
@@ -137,23 +137,7 @@ class AUTO_MAA(MSFluentWindow):
FluentIcon.SETTING, FluentIcon.SETTING,
NavigationItemPosition.BOTTOM, NavigationItemPosition.BOTTOM,
) )
self.stackedWidget.currentChanged.connect( self.stackedWidget.currentChanged.connect(self.__currentChanged)
lambda index: (
self.queue_manager.reload_member_name() if index == 2 else None
)
)
self.stackedWidget.currentChanged.connect(
lambda index: (
self.dispatch_center.pivot.setCurrentItem("主调度台")
if index == 3
else None
)
)
self.stackedWidget.currentChanged.connect(
lambda index: (
self.dispatch_center.update_top_bar() if index == 3 else None
)
)
# 创建系统托盘及其菜单 # 创建系统托盘及其菜单
self.tray = QSystemTrayIcon( self.tray = QSystemTrayIcon(
@@ -250,43 +234,6 @@ class AUTO_MAA(MSFluentWindow):
else: else:
self.setStyleSheet("background-color: #ffffff;") self.setStyleSheet("background-color: #ffffff;")
def start_up_task(self) -> None:
"""启动时任务"""
# 清理旧日志
self.clean_old_logs()
# 清理安装包
if (Config.app_path / "AUTO_MAA-Setup.exe").exists():
try:
(Config.app_path / "AUTO_MAA-Setup.exe").unlink()
except Exception:
pass
# 检查密码
self.setting.check_PASSWORD()
# 获取主题图像
if Config.get(Config.function_HomeImageMode) == "主题图像":
self.home.get_home_image()
# 直接运行主任务
if Config.get(Config.start_IfRunDirectly):
self.start_main_task()
# 获取公告
self.setting.show_notice(if_first=True)
# 检查更新
if Config.get(Config.update_IfAutoUpdate):
self.setting.check_update(if_first=True)
# 直接最小化
if Config.get(Config.start_IfMinimizeDirectly):
self.titleBar.minBtn.click()
def set_min_method(self) -> None: def set_min_method(self) -> None:
"""设置最小化方法""" """设置最小化方法"""
@@ -305,61 +252,6 @@ class AUTO_MAA(MSFluentWindow):
if reason == QSystemTrayIcon.DoubleClick: if reason == QSystemTrayIcon.DoubleClick:
self.show_ui("显示主窗口") self.show_ui("显示主窗口")
def clean_old_logs(self):
"""
删除超过用户设定天数的日志文件(基于目录日期)
"""
if Config.get(Config.function_HistoryRetentionTime) == 0:
logger.info("由于用户设置日志永久保留,跳过日志清理")
return
deleted_count = 0
for date_folder in (Config.app_path / "history").iterdir():
if not date_folder.is_dir():
continue # 只处理日期文件夹
try:
# 只检查 `YYYY-MM-DD` 格式的文件夹
folder_date = datetime.strptime(date_folder.name, "%Y-%m-%d")
if datetime.now() - folder_date > timedelta(
days=Config.get(Config.function_HistoryRetentionTime)
):
shutil.rmtree(date_folder, ignore_errors=True)
deleted_count += 1
logger.info(f"已删除超期日志目录: {date_folder}")
except ValueError:
logger.warning(f"非日期格式的目录: {date_folder}")
logger.info(f"清理完成: {deleted_count} 个日期目录")
def start_main_task(self) -> None:
"""启动主任务"""
if "调度队列_1" in Config.queue_dict:
logger.info("自动添加任务调度队列_1")
TaskManager.add_task(
"自动代理_主调度台",
"调度队列_1",
Config.queue_dict["调度队列_1"]["Config"].toDict(),
)
elif "脚本_1" in Config.member_dict:
logger.info("自动添加任务脚本_1")
TaskManager.add_task(
"自动代理_主调度台", "自定义队列", {"Queue": {"Member_1": "脚本_1"}}
)
else:
logger.warning("启动主任务失败:未找到有效的主任务配置文件")
MainInfoBar.push_info_bar(
"warning", "启动主任务失败", "“调度队列_1”与“脚本_1”均不存在", -1
)
def show_ui( def show_ui(
self, mode: str, if_quick: bool = False, if_start: bool = False self, mode: str, if_quick: bool = False, if_start: bool = False
) -> None: ) -> None:
@@ -440,6 +332,109 @@ class AUTO_MAA(MSFluentWindow):
self.window().hide() self.window().hide()
self.tray.show() self.tray.show()
def start_up_task(self) -> None:
"""启动时任务"""
# 清理旧日志
self.clean_old_logs()
# 清理安装包
if (Config.app_path / "AUTO_MAA-Setup.exe").exists():
try:
(Config.app_path / "AUTO_MAA-Setup.exe").unlink()
except Exception:
pass
# 检查密码
self.setting.check_PASSWORD()
# 获取主题图像
if Config.get(Config.function_HomeImageMode) == "主题图像":
self.home.get_home_image()
# 直接运行主任务
if Config.get(Config.start_IfRunDirectly):
self.start_main_task()
# 获取公告
self.setting.show_notice(if_first=True)
# 检查更新
if Config.get(Config.update_IfAutoUpdate):
self.setting.check_update(if_first=True)
# 直接最小化
if Config.get(Config.start_IfMinimizeDirectly):
self.titleBar.minBtn.click()
def clean_old_logs(self):
"""
删除超过用户设定天数的日志文件(基于目录日期)
"""
if Config.get(Config.function_HistoryRetentionTime) == 0:
logger.info("由于用户设置日志永久保留,跳过日志清理")
return
deleted_count = 0
for date_folder in (Config.app_path / "history").iterdir():
if not date_folder.is_dir():
continue # 只处理日期文件夹
try:
# 只检查 `YYYY-MM-DD` 格式的文件夹
folder_date = datetime.strptime(date_folder.name, "%Y-%m-%d")
if datetime.now() - folder_date > timedelta(
days=Config.get(Config.function_HistoryRetentionTime)
):
shutil.rmtree(date_folder, ignore_errors=True)
deleted_count += 1
logger.info(f"已删除超期日志目录: {date_folder}")
except ValueError:
logger.warning(f"非日期格式的目录: {date_folder}")
logger.info(f"清理完成: {deleted_count} 个日期目录")
def start_main_task(self) -> None:
"""启动主任务"""
if "调度队列_1" in Config.queue_dict:
logger.info("自动添加任务调度队列_1")
TaskManager.add_task(
"自动代理_主调度台",
"调度队列_1",
Config.queue_dict["调度队列_1"]["Config"].toDict(),
)
elif "脚本_1" in Config.member_dict:
logger.info("自动添加任务脚本_1")
TaskManager.add_task(
"自动代理_主调度台", "自定义队列", {"Queue": {"Member_1": "脚本_1"}}
)
else:
logger.warning("启动主任务失败:未找到有效的主任务配置文件")
MainInfoBar.push_info_bar(
"warning", "启动主任务失败", "“调度队列_1”与“脚本_1”均不存在", -1
)
def __currentChanged(self, index: int) -> None:
"""切换界面时任务"""
if index == 1:
self.member_manager.reload_plan_name()
elif index == 3:
self.queue_manager.reload_member_name()
elif index == 4:
self.dispatch_center.pivot.setCurrentItem("主调度台")
self.dispatch_center.update_top_bar()
def closeEvent(self, event: QCloseEvent): def closeEvent(self, event: QCloseEvent):
"""清理残余进程""" """清理残余进程"""

View File

@@ -67,7 +67,10 @@ from .Widget import (
SpinBoxSettingCard, SpinBoxSettingCard,
ComboBoxMessageBox, ComboBoxMessageBox,
SettingFlyoutView, SettingFlyoutView,
EditableComboBoxSettingCard, NoOptionComboBoxSettingCard,
ComboBoxWithPlanSettingCard,
EditableComboBoxWithPlanSettingCard,
SpinBoxWithPlanSettingCard,
PasswordLineEditSettingCard, PasswordLineEditSettingCard,
UserLableSettingCard, UserLableSettingCard,
ComboBoxSettingCard, ComboBoxSettingCard,
@@ -183,7 +186,7 @@ class MemberManager(QWidget):
name = self.member_manager.pivot.currentRouteKey() name = self.member_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("删除脚本实例时未选择脚本实例") logger.warning("删除脚本实例时未选择脚本实例")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000 "warning", "未选择脚本实例", "请选择一个脚本实例", 5000
@@ -223,7 +226,7 @@ class MemberManager(QWidget):
name = self.member_manager.pivot.currentRouteKey() name = self.member_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("向左移动脚本实例时未选择脚本实例") logger.warning("向左移动脚本实例时未选择脚本实例")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000 "warning", "未选择脚本实例", "请选择一个脚本实例", 5000
@@ -271,7 +274,7 @@ class MemberManager(QWidget):
name = self.member_manager.pivot.currentRouteKey() name = self.member_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("向右移动脚本实例时未选择脚本实例") logger.warning("向右移动脚本实例时未选择脚本实例")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择脚本实例", "请选择一个脚本实例", 5000 "warning", "未选择脚本实例", "请选择一个脚本实例", 5000
@@ -472,11 +475,57 @@ class MemberManager(QWidget):
self.key.setIcon(FluentIcon.HIDE) self.key.setIcon(FluentIcon.HIDE)
self.key.setChecked(False) self.key.setChecked(False)
def reload_plan_name(self):
"""刷新计划表名称"""
plan_list = [
["固定"] + [_ for _ in Config.plan_dict.keys()],
["固定"]
+ [
(
k
if v["Config"].get(v["Config"].Info_Name) == ""
else f"{k} - {v["Config"].get(v["Config"].Info_Name)}"
)
for k, v in Config.plan_dict.items()
],
]
for member in self.member_manager.script_list:
if isinstance(member, MemberManager.MemberSettingBox.MaaSettingBox):
for user_setting in member.user_setting.user_manager.script_list:
user_setting.card_GameIdMode.comboBox.currentIndexChanged.disconnect(
user_setting.switch_gameid_mode
)
user_setting.card_GameIdMode.reLoadOptions(
plan_list[0], plan_list[1]
)
user_setting.card_GameIdMode.comboBox.currentIndexChanged.connect(
user_setting.switch_gameid_mode
)
self.refresh_plan_info()
def refresh_dashboard(self): def refresh_dashboard(self):
"""刷新所有脚本实例的用户仪表盘""" """刷新所有脚本实例的用户仪表盘"""
for script in self.member_manager.script_list: for member in self.member_manager.script_list:
script.user_setting.user_manager.user_dashboard.load_info()
if isinstance(member, MemberManager.MemberSettingBox.MaaSettingBox):
member.user_setting.user_manager.user_dashboard.load_info()
def refresh_plan_info(self):
"""刷新所有计划信息"""
for member in self.member_manager.script_list:
if isinstance(member, MemberManager.MemberSettingBox.MaaSettingBox):
member.user_setting.user_manager.user_dashboard.load_info()
for user_setting in member.user_setting.user_manager.script_list:
user_setting.switch_gameid_mode()
class MemberSettingBox(QWidget): class MemberSettingBox(QWidget):
"""脚本管理子页面组""" """脚本管理子页面组"""
@@ -841,7 +890,7 @@ class MemberManager(QWidget):
name = self.user_manager.pivot.currentRouteKey() name = self.user_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("未选择用户") logger.warning("未选择用户")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择用户", "请先选择一个用户", 5000 "warning", "未选择用户", "请先选择一个用户", 5000
@@ -900,7 +949,7 @@ class MemberManager(QWidget):
name = self.user_manager.pivot.currentRouteKey() name = self.user_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("未选择用户") logger.warning("未选择用户")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择用户", "请先选择一个用户", 5000 "warning", "未选择用户", "请先选择一个用户", 5000
@@ -959,7 +1008,7 @@ class MemberManager(QWidget):
name = self.user_manager.pivot.currentRouteKey() name = self.user_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("未选择用户") logger.warning("未选择用户")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择用户", "请先选择一个用户", 5000 "warning", "未选择用户", "请先选择一个用户", 5000
@@ -1195,6 +1244,8 @@ class MemberManager(QWidget):
else "本周剿灭未完成" else "本周剿灭未完成"
) )
gameid_info = config.get_plan_info()
button = PrimaryToolButton( button = PrimaryToolButton(
FluentIcon.CHEVRON_RIGHT, self FluentIcon.CHEVRON_RIGHT, self
) )
@@ -1243,9 +1294,7 @@ class MemberManager(QWidget):
self.dashboard.setItem( self.dashboard.setItem(
int(name[3:]) - 1, int(name[3:]) - 1,
5, 5,
QTableWidgetItem( QTableWidgetItem(str(gameid_info["MedicineNumb"])),
str(config.get(config.Info_MedicineNumb))
),
) )
self.dashboard.setItem( self.dashboard.setItem(
int(name[3:]) - 1, int(name[3:]) - 1,
@@ -1253,12 +1302,12 @@ class MemberManager(QWidget):
QTableWidgetItem( QTableWidgetItem(
Config.gameid_dict["ALL"]["text"][ Config.gameid_dict["ALL"]["text"][
Config.gameid_dict["ALL"]["value"].index( Config.gameid_dict["ALL"]["value"].index(
config.get(config.Info_GameId) gameid_info["GameId"]
) )
] ]
if config.get(config.Info_GameId) if gameid_info["GameId"]
in Config.gameid_dict["ALL"]["value"] in Config.gameid_dict["ALL"]["value"]
else config.get(config.Info_GameId) else gameid_info["GameId"]
), ),
) )
self.dashboard.setItem( self.dashboard.setItem(
@@ -1267,12 +1316,12 @@ class MemberManager(QWidget):
QTableWidgetItem( QTableWidgetItem(
Config.gameid_dict["ALL"]["text"][ Config.gameid_dict["ALL"]["text"][
Config.gameid_dict["ALL"]["value"].index( Config.gameid_dict["ALL"]["value"].index(
config.get(config.Info_GameId_1) gameid_info["GameId_1"]
) )
] ]
if config.get(config.Info_GameId_1) if gameid_info["GameId_1"]
in Config.gameid_dict["ALL"]["value"] in Config.gameid_dict["ALL"]["value"]
else config.get(config.Info_GameId_1) else gameid_info["GameId_1"]
), ),
) )
self.dashboard.setItem( self.dashboard.setItem(
@@ -1281,12 +1330,12 @@ class MemberManager(QWidget):
QTableWidgetItem( QTableWidgetItem(
Config.gameid_dict["ALL"]["text"][ Config.gameid_dict["ALL"]["text"][
Config.gameid_dict["ALL"]["value"].index( Config.gameid_dict["ALL"]["value"].index(
config.get(config.Info_GameId_2) gameid_info["GameId_2"]
) )
] ]
if config.get(config.Info_GameId_2) if gameid_info["GameId_2"]
in Config.gameid_dict["ALL"]["value"] in Config.gameid_dict["ALL"]["value"]
else config.get(config.Info_GameId_2) else gameid_info["GameId_2"]
), ),
) )
self.dashboard.setItem( self.dashboard.setItem(
@@ -1294,22 +1343,20 @@ class MemberManager(QWidget):
9, 9,
QTableWidgetItem( QTableWidgetItem(
"不使用" "不使用"
if config.get(config.Info_GameId_Remain) == "-" if gameid_info["GameId_Remain"] == "-"
else ( else (
( (
Config.gameid_dict["ALL"]["text"][ Config.gameid_dict["ALL"]["text"][
Config.gameid_dict["ALL"][ Config.gameid_dict["ALL"][
"value" "value"
].index( ].index(
config.get( gameid_info["GameId_Remain"]
config.Info_GameId_Remain
)
) )
] ]
) )
if config.get(config.Info_GameId_Remain) if gameid_info["GameId_Remain"]
in Config.gameid_dict["ALL"]["value"] in Config.gameid_dict["ALL"]["value"]
else config.get(config.Info_GameId_Remain) else gameid_info["GameId_Remain"]
) )
), ),
) )
@@ -1333,6 +1380,19 @@ class MemberManager(QWidget):
f"用户_{uid}" f"用户_{uid}"
]["Path"] ]["Path"]
plan_list = [
["固定"] + [_ for _ in Config.plan_dict.keys()],
["固定"]
+ [
(
k
if v["Config"].get(v["Config"].Info_Name) == ""
else f"{k} - {v["Config"].get(v["Config"].Info_Name)}"
)
for k, v in Config.plan_dict.items()
],
]
self.card_Name = LineEditSettingCard( self.card_Name = LineEditSettingCard(
icon=FluentIcon.PEOPLE, icon=FluentIcon.PEOPLE,
title="用户名", title="用户名",
@@ -1360,15 +1420,17 @@ class MemberManager(QWidget):
configItem=self.config.Info_Mode, configItem=self.config.Info_Mode,
parent=self, parent=self,
) )
self.card_GameIdMode = ComboBoxSettingCard( self.card_GameIdMode = NoOptionComboBoxSettingCard(
icon=FluentIcon.DICTIONARY, icon=FluentIcon.DICTIONARY,
title="关卡配置模式", title="关卡配置模式",
content="刷理智关卡号的配置模式", content="刷理智关卡号的配置模式",
texts=["固定"], value=plan_list[0],
texts=plan_list[1],
qconfig=self.config, qconfig=self.config,
configItem=self.config.Info_GameIdMode, configItem=self.config.Info_GameIdMode,
parent=self, parent=self,
) )
self.card_GameIdMode.comboBox.setMinimumWidth(0)
self.card_Server = ComboBoxSettingCard( self.card_Server = ComboBoxSettingCard(
icon=FluentIcon.PROJECTOR, icon=FluentIcon.PROJECTOR,
title="服务器", title="服务器",
@@ -1446,7 +1508,7 @@ class MemberManager(QWidget):
configItem=self.config.Info_Notes, configItem=self.config.Info_Notes,
parent=self, parent=self,
) )
self.card_MedicineNumb = SpinBoxSettingCard( self.card_MedicineNumb = SpinBoxWithPlanSettingCard(
icon=FluentIcon.GAME, icon=FluentIcon.GAME,
title="吃理智药", title="吃理智药",
content="吃理智药次数输入0以关闭", content="吃理智药次数输入0以关闭",
@@ -1455,7 +1517,7 @@ class MemberManager(QWidget):
configItem=self.config.Info_MedicineNumb, configItem=self.config.Info_MedicineNumb,
parent=self, parent=self,
) )
self.card_SeriesNumb = ComboBoxSettingCard( self.card_SeriesNumb = ComboBoxWithPlanSettingCard(
icon=FluentIcon.GAME, icon=FluentIcon.GAME,
title="连战次数", title="连战次数",
content="连战次数较大时建议搭配剩余理智关卡使用", content="连战次数较大时建议搭配剩余理智关卡使用",
@@ -1465,7 +1527,7 @@ class MemberManager(QWidget):
parent=self, parent=self,
) )
self.card_SeriesNumb.comboBox.setMinimumWidth(150) self.card_SeriesNumb.comboBox.setMinimumWidth(150)
self.card_GameId = EditableComboBoxSettingCard( self.card_GameId = EditableComboBoxWithPlanSettingCard(
icon=FluentIcon.GAME, icon=FluentIcon.GAME,
title="关卡选择", title="关卡选择",
content="按下回车以添加自定义关卡号", content="按下回车以添加自定义关卡号",
@@ -1475,7 +1537,7 @@ class MemberManager(QWidget):
configItem=self.config.Info_GameId, configItem=self.config.Info_GameId,
parent=self, parent=self,
) )
self.card_GameId_1 = EditableComboBoxSettingCard( self.card_GameId_1 = EditableComboBoxWithPlanSettingCard(
icon=FluentIcon.GAME, icon=FluentIcon.GAME,
title="备选关卡 - 1", title="备选关卡 - 1",
content="按下回车以添加自定义关卡号", content="按下回车以添加自定义关卡号",
@@ -1485,7 +1547,7 @@ class MemberManager(QWidget):
configItem=self.config.Info_GameId_1, configItem=self.config.Info_GameId_1,
parent=self, parent=self,
) )
self.card_GameId_2 = EditableComboBoxSettingCard( self.card_GameId_2 = EditableComboBoxWithPlanSettingCard(
icon=FluentIcon.GAME, icon=FluentIcon.GAME,
title="备选关卡 - 2", title="备选关卡 - 2",
content="按下回车以添加自定义关卡号", content="按下回车以添加自定义关卡号",
@@ -1495,18 +1557,20 @@ class MemberManager(QWidget):
configItem=self.config.Info_GameId_2, configItem=self.config.Info_GameId_2,
parent=self, parent=self,
) )
self.card_GameId_Remain = EditableComboBoxSettingCard( self.card_GameId_Remain = (
icon=FluentIcon.GAME, EditableComboBoxWithPlanSettingCard(
title="剩余理智关卡", icon=FluentIcon.GAME,
content="按下回车以添加自定义关卡", title="剩余理智关卡",
value=Config.gameid_dict["ALL"]["value"], content="按下回车以添加自定义关卡号",
texts=[ value=Config.gameid_dict["ALL"]["value"],
"不使用" if _ == "当前/上次" else _ texts=[
for _ in Config.gameid_dict["ALL"]["text"] "不使用" if _ == "当前/上次" else _
], for _ in Config.gameid_dict["ALL"]["text"]
qconfig=self.config, ],
configItem=self.config.Info_GameId_Remain, qconfig=self.config,
parent=self, configItem=self.config.Info_GameId_Remain,
parent=self,
)
) )
self.card_UserLable = UserLableSettingCard( self.card_UserLable = UserLableSettingCard(
@@ -1624,10 +1688,14 @@ class MemberManager(QWidget):
self.set_infrastructure self.set_infrastructure
) )
self.card_NotifySet.clicked.connect(self.set_notify) self.card_NotifySet.clicked.connect(self.set_notify)
self.card_GameIdMode.comboBox.currentIndexChanged.connect(
self.switch_gameid_mode
)
Config.gameid_refreshed.connect(self.refresh_gameid) Config.gameid_refreshed.connect(self.refresh_gameid)
Config.PASSWORD_refreshed.connect(self.refresh_password) Config.PASSWORD_refreshed.connect(self.refresh_password)
self.switch_mode() self.switch_mode()
self.switch_gameid_mode()
self.switch_infrastructure() self.switch_infrastructure()
def switch_mode(self) -> None: def switch_mode(self) -> None:
@@ -1646,6 +1714,40 @@ class MemberManager(QWidget):
self.card_Annihilation.button.setVisible(True) self.card_Annihilation.button.setVisible(True)
self.card_Routine.setVisible(True) self.card_Routine.setVisible(True)
def switch_gameid_mode(self) -> None:
for card, name in zip(
[
self.card_MedicineNumb,
self.card_SeriesNumb,
self.card_GameId,
self.card_GameId_1,
self.card_GameId_2,
self.card_GameId_Remain,
],
[
"MedicineNumb",
"SeriesNumb",
"GameId",
"GameId_1",
"GameId_2",
"GameId_Remain",
],
):
card.switch_mode(
self.config.get(self.config.Info_GameIdMode)[:2]
)
if (
self.config.get(self.config.Info_GameIdMode)
!= "固定"
):
card.change_plan(
Config.plan_dict[
self.config.get(self.config.Info_GameIdMode)
]["Config"].get_current_info(name)
)
def switch_infrastructure(self) -> None: def switch_infrastructure(self) -> None:
if ( if (

View File

@@ -40,13 +40,14 @@ from qfluentwidgets import (
CommandBar, CommandBar,
TableWidget, TableWidget,
) )
from typing import List from typing import List, Dict, Union
import shutil import shutil
from app.core import Config, MainInfoBar, MaaPlanConfig from app.core import Config, MainInfoBar, MaaPlanConfig
from app.services import Crypto
from .Widget import ( from .Widget import (
ComboBoxMessageBox, ComboBoxMessageBox,
LineEditSettingCard,
ComboBoxSettingCard,
SpinBoxSetting, SpinBoxSetting,
EditableComboBoxSetting, EditableComboBoxSetting,
ComboBoxSetting, ComboBoxSetting,
@@ -134,7 +135,7 @@ class PlanManager(QWidget):
name = self.plan_manager.pivot.currentRouteKey() name = self.plan_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("删除计划表时未选择计划表") logger.warning("删除计划表时未选择计划表")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择计划表", "请选择一个计划表", 5000 "warning", "未选择计划表", "请选择一个计划表", 5000
@@ -172,7 +173,7 @@ class PlanManager(QWidget):
name = self.plan_manager.pivot.currentRouteKey() name = self.plan_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("向左移动计划表时未选择计划表") logger.warning("向左移动计划表时未选择计划表")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择计划表", "请选择一个计划表", 5000 "warning", "未选择计划表", "请选择一个计划表", 5000
@@ -220,7 +221,7 @@ class PlanManager(QWidget):
name = self.plan_manager.pivot.currentRouteKey() name = self.plan_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("向右移动计划表时未选择计划表") logger.warning("向右移动计划表时未选择计划表")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择计划表", "请选择一个计划表", 5000 "warning", "未选择计划表", "请选择一个计划表", 5000
@@ -321,6 +322,7 @@ class PlanManager(QWidget):
"""清空所有子界面""" """清空所有子界面"""
for sub_interface in self.script_list: for sub_interface in self.script_list:
Config.gameid_refreshed.disconnect(sub_interface.refresh_gameid)
self.stackedWidget.removeWidget(sub_interface) self.stackedWidget.removeWidget(sub_interface)
sub_interface.deleteLater() sub_interface.deleteLater()
self.script_list.clear() self.script_list.clear()
@@ -344,15 +346,35 @@ class PlanManager(QWidget):
super().__init__(parent) super().__init__(parent)
self.setObjectName(f"计划_{uid}") self.setObjectName(f"计划_{uid}")
self.setTitle("MAA计划表")
self.config = Config.plan_dict[f"计划_{uid}"]["Config"] self.config = Config.plan_dict[f"计划_{uid}"]["Config"]
self.dashboard = TableWidget(self) self.card_Name = LineEditSettingCard(
self.dashboard.setColumnCount(8) icon=FluentIcon.EDIT,
self.dashboard.setRowCount(6) title="计划表名称",
self.dashboard.setHorizontalHeaderLabels( content="用于标识计划表的名称",
text="请输入计划表名称",
qconfig=self.config,
configItem=self.config.Info_Name,
parent=self,
)
self.card_Mode = ComboBoxSettingCard(
icon=FluentIcon.DICTIONARY,
title="计划模式",
content="全局模式下计划内容固定,周计划模式下计划按周一到周日切换",
texts=["全局", "周计划"],
qconfig=self.config,
configItem=self.config.Info_Mode,
parent=self,
)
self.table = TableWidget(self)
self.table.setColumnCount(8)
self.table.setRowCount(6)
self.table.setHorizontalHeaderLabels(
["全局", "周一", "周二", "周三", "周四", "周五", "周六", "周日"] ["全局", "周一", "周二", "周三", "周四", "周五", "周六", "周日"]
) )
self.dashboard.setVerticalHeaderLabels( self.table.setVerticalHeaderLabels(
[ [
"吃理智药", "吃理智药",
"连战次数", "连战次数",
@@ -362,37 +384,60 @@ class PlanManager(QWidget):
"剩余理智", "剩余理智",
] ]
) )
self.dashboard.setEditTriggers(TableWidget.NoEditTriggers) self.table.setAlternatingRowColors(False)
self.table.setEditTriggers(TableWidget.NoEditTriggers)
for col in range(8): for col in range(8):
self.dashboard.horizontalHeader().setSectionResizeMode( self.table.horizontalHeader().setSectionResizeMode(
col, QHeaderView.ResizeMode.Stretch col, QHeaderView.ResizeMode.Stretch
) )
for row in range(6):
self.table.verticalHeader().setSectionResizeMode(
row, QHeaderView.ResizeMode.ResizeToContents
)
self.viewLayout.addWidget(self.dashboard) self.item_dict: Dict[
self.viewLayout.setContentsMargins(3, 0, 3, 3) str,
Dict[
str,
Union[SpinBoxSetting, ComboBoxSetting, EditableComboBoxSetting],
],
] = {}
for col, (group, name_dict) in enumerate( for col, (group, name_dict) in enumerate(
self.config.config_item_dict.items() self.config.config_item_dict.items()
): ):
self.item_dict[group] = {}
for row, (name, configItem) in enumerate(name_dict.items()): for row, (name, configItem) in enumerate(name_dict.items()):
if name == "MedicineNumb": if name == "MedicineNumb":
setting_item = SpinBoxSetting( self.item_dict[group][name] = SpinBoxSetting(
range=(0, 1024), range=(0, 1024),
qconfig=self.config, qconfig=self.config,
configItem=configItem, configItem=configItem,
parent=self, parent=self,
) )
elif name == "SeriesNumb": elif name == "SeriesNumb":
setting_item = ComboBoxSetting( self.item_dict[group][name] = ComboBoxSetting(
texts=["AUTO", "6", "5", "4", "3", "2", "1", "不选择"], texts=["AUTO", "6", "5", "4", "3", "2", "1", "不选择"],
qconfig=self.config, qconfig=self.config,
configItem=configItem, configItem=configItem,
parent=self, parent=self,
) )
elif name == "GameId_Remain":
self.item_dict[group][name] = EditableComboBoxSetting(
value=Config.gameid_dict[group]["value"],
texts=[
"不使用" if _ == "当前/上次" else _
for _ in Config.gameid_dict[group]["text"]
],
qconfig=self.config,
configItem=configItem,
parent=self,
)
elif "GameId" in name: elif "GameId" in name:
setting_item = EditableComboBoxSetting( self.item_dict[group][name] = EditableComboBoxSetting(
value=Config.gameid_dict[group]["value"], value=Config.gameid_dict[group]["value"],
texts=Config.gameid_dict[group]["text"], texts=Config.gameid_dict[group]["text"],
qconfig=self.config, qconfig=self.config,
@@ -400,4 +445,51 @@ class PlanManager(QWidget):
parent=self, parent=self,
) )
self.dashboard.setCellWidget(row, col, setting_item) self.table.setCellWidget(row, col, self.item_dict[group][name])
Layout = QVBoxLayout()
Layout.addWidget(self.card_Name)
Layout.addWidget(self.card_Mode)
Layout.addWidget(self.table)
self.viewLayout.addLayout(Layout)
self.viewLayout.setSpacing(3)
self.viewLayout.setContentsMargins(3, 0, 3, 3)
self.card_Mode.comboBox.currentIndexChanged.connect(self.switch_mode)
Config.gameid_refreshed.connect(self.refresh_gameid)
self.switch_mode()
def switch_mode(self) -> None:
"""切换计划模式"""
for group, name_dict in self.item_dict.items():
for name, setting_item in name_dict.items():
setting_item.setEnabled(
(group == "ALL")
== (self.config.get(self.config.Info_Mode) == "ALL")
)
def refresh_gameid(self):
for group, name_dict in self.item_dict.items():
for name, setting_item in name_dict.items():
if name == "GameId_Remain":
setting_item.reLoadOptions(
Config.gameid_dict[group]["value"],
[
"不使用" if _ == "当前/上次" else _
for _ in Config.gameid_dict[group]["text"]
],
)
elif "GameId" in name:
setting_item.reLoadOptions(
Config.gameid_dict[group]["value"],
Config.gameid_dict[group]["text"],
)

View File

@@ -122,7 +122,7 @@ class QueueManager(QWidget):
name = self.queue_manager.pivot.currentRouteKey() name = self.queue_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("未选择调度队列") logger.warning("未选择调度队列")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000 "warning", "未选择调度队列", "请先选择一个调度队列", 5000
@@ -160,7 +160,7 @@ class QueueManager(QWidget):
name = self.queue_manager.pivot.currentRouteKey() name = self.queue_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("未选择调度队列") logger.warning("未选择调度队列")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000 "warning", "未选择调度队列", "请先选择一个调度队列", 5000
@@ -205,7 +205,7 @@ class QueueManager(QWidget):
name = self.queue_manager.pivot.currentRouteKey() name = self.queue_manager.pivot.currentRouteKey()
if name == None: if name is None:
logger.warning("未选择调度队列") logger.warning("未选择调度队列")
MainInfoBar.push_info_bar( MainInfoBar.push_info_bar(
"warning", "未选择调度队列", "请先选择一个调度队列", 5000 "warning", "未选择调度队列", "请先选择一个调度队列", 5000

View File

@@ -4,7 +4,8 @@
"4.3.8.4": { "4.3.8.4": {
"新增功能": [ "新增功能": [
"支持为每一个用户执行独立通知", "支持为每一个用户执行独立通知",
"输入文本框适配文本插入操作" "输入文本框适配文本插入操作",
"计划表功能上线"
] ]
}, },
"4.3.8.3": { "4.3.8.3": {
@@ -23,7 +24,7 @@
"日志分析忽略MAA超时提示" "日志分析忽略MAA超时提示"
], ],
"程序优化": [ "程序优化": [
"配置类定义方法更新,预载入计划表相关配置" "配置类定义方法更新"
] ]
}, },
"4.3.8.1": { "4.3.8.1": {