mirror of
https://github.com/hyb-oyqq/FRAISEMOE-Addons-Installer-NEXT.git
synced 2025-12-18 13:00:29 +00:00
169 lines
6.1 KiB
Python
169 lines
6.1 KiB
Python
|
|
import json
|
|||
|
|
import webbrowser
|
|||
|
|
from PySide6.QtWidgets import QMessageBox
|
|||
|
|
|
|||
|
|
from utils import load_config, save_config, msgbox_frame
|
|||
|
|
|
|||
|
|
class ConfigManager:
|
|||
|
|
"""配置管理器,用于处理配置的加载、保存和获取云端配置"""
|
|||
|
|
|
|||
|
|
def __init__(self, app_name, config_url, ua, debug_manager=None):
|
|||
|
|
"""初始化配置管理器
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
app_name: 应用程序名称,用于显示消息框标题
|
|||
|
|
config_url: 云端配置URL
|
|||
|
|
ua: User-Agent字符串
|
|||
|
|
debug_manager: 调试管理器实例,用于输出调试信息
|
|||
|
|
"""
|
|||
|
|
self.app_name = app_name
|
|||
|
|
self.config_url = config_url
|
|||
|
|
self.ua = ua
|
|||
|
|
self.debug_manager = debug_manager
|
|||
|
|
self.cloud_config = None
|
|||
|
|
self.config_valid = False
|
|||
|
|
self.last_error_message = ""
|
|||
|
|
|
|||
|
|
def _is_debug_mode(self):
|
|||
|
|
"""检查是否处于调试模式
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
bool: 是否处于调试模式
|
|||
|
|
"""
|
|||
|
|
if hasattr(self.debug_manager, 'ui_manager') and hasattr(self.debug_manager.ui_manager, 'debug_action'):
|
|||
|
|
return self.debug_manager.ui_manager.debug_action.isChecked()
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def load_config(self):
|
|||
|
|
"""加载本地配置
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
dict: 加载的配置
|
|||
|
|
"""
|
|||
|
|
return load_config()
|
|||
|
|
|
|||
|
|
def save_config(self, config):
|
|||
|
|
"""保存配置
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
config: 要保存的配置
|
|||
|
|
"""
|
|||
|
|
save_config(config)
|
|||
|
|
|
|||
|
|
def fetch_cloud_config(self, config_fetch_thread_class, callback=None):
|
|||
|
|
"""获取云端配置
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
config_fetch_thread_class: 用于获取云端配置的线程类
|
|||
|
|
callback: 获取完成后的回调函数,接受两个参数(data, error_message)
|
|||
|
|
"""
|
|||
|
|
headers = {"User-Agent": self.ua}
|
|||
|
|
debug_mode = self._is_debug_mode()
|
|||
|
|
self.config_fetch_thread = config_fetch_thread_class(self.config_url, headers, debug_mode)
|
|||
|
|
|
|||
|
|
# 如果提供了回调,使用它;否则使用内部的on_config_fetched方法
|
|||
|
|
if callback:
|
|||
|
|
self.config_fetch_thread.finished.connect(callback)
|
|||
|
|
else:
|
|||
|
|
self.config_fetch_thread.finished.connect(self.on_config_fetched)
|
|||
|
|
|
|||
|
|
self.config_fetch_thread.start()
|
|||
|
|
|
|||
|
|
def on_config_fetched(self, data, error_message):
|
|||
|
|
"""云端配置获取完成的回调处理
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
data: 获取到的配置数据
|
|||
|
|
error_message: 错误信息,如果有
|
|||
|
|
"""
|
|||
|
|
debug_mode = self._is_debug_mode()
|
|||
|
|
|
|||
|
|
if error_message:
|
|||
|
|
# 标记配置无效
|
|||
|
|
self.config_valid = False
|
|||
|
|
|
|||
|
|
# 记录错误信息,用于按钮点击时显示
|
|||
|
|
if error_message == "update_required":
|
|||
|
|
self.last_error_message = "update_required"
|
|||
|
|
msg_box = msgbox_frame(
|
|||
|
|
f"更新提示 - {self.app_name}",
|
|||
|
|
"\n当前版本过低,请及时更新。\n",
|
|||
|
|
QMessageBox.StandardButton.Ok,
|
|||
|
|
)
|
|||
|
|
msg_box.exec()
|
|||
|
|
# 在浏览器中打开项目主页
|
|||
|
|
webbrowser.open("https://github.com/hyb-oyqq/FRAISEMOE-Addons-Installer-NEXT/")
|
|||
|
|
# 版本过低,应当显示"无法安装"
|
|||
|
|
return {"action": "disable_button", "then": "exit"}
|
|||
|
|
|
|||
|
|
elif "missing_keys" in error_message:
|
|||
|
|
self.last_error_message = "missing_keys"
|
|||
|
|
missing_versions = error_message.split(":")[1]
|
|||
|
|
msg_box = msgbox_frame(
|
|||
|
|
f"配置缺失 - {self.app_name}",
|
|||
|
|
f'\n云端缺失下载链接,可能云服务器正在维护,不影响其他版本下载。\n当前缺失版本:"{missing_versions}"\n',
|
|||
|
|
QMessageBox.StandardButton.Ok,
|
|||
|
|
)
|
|||
|
|
msg_box.exec()
|
|||
|
|
# 对于部分缺失,仍然允许使用,因为可能只影响部分游戏版本
|
|||
|
|
self.config_valid = True
|
|||
|
|
return {"action": "enable_button"}
|
|||
|
|
else:
|
|||
|
|
# 设置网络错误标记
|
|||
|
|
self.last_error_message = "network_error"
|
|||
|
|
|
|||
|
|
# 显示通用错误消息,只在debug模式下显示详细错误
|
|||
|
|
error_msg = "访问云端配置失败,请检查网络状况或稍后再试。"
|
|||
|
|
if debug_mode and "详细错误:" in error_message:
|
|||
|
|
msg_box = msgbox_frame(
|
|||
|
|
f"错误 - {self.app_name}",
|
|||
|
|
f"\n{error_message}\n",
|
|||
|
|
QMessageBox.StandardButton.Ok,
|
|||
|
|
)
|
|||
|
|
else:
|
|||
|
|
msg_box = msgbox_frame(
|
|||
|
|
f"错误 - {self.app_name}",
|
|||
|
|
f"\n{error_msg}\n",
|
|||
|
|
QMessageBox.StandardButton.Ok,
|
|||
|
|
)
|
|||
|
|
msg_box.exec()
|
|||
|
|
|
|||
|
|
# 网络错误时应当显示"无法安装"
|
|||
|
|
return {"action": "disable_button"}
|
|||
|
|
else:
|
|||
|
|
self.cloud_config = data
|
|||
|
|
# 标记配置有效
|
|||
|
|
self.config_valid = True
|
|||
|
|
# 清除错误信息
|
|||
|
|
self.last_error_message = ""
|
|||
|
|
|
|||
|
|
if debug_mode:
|
|||
|
|
print("--- Cloud config fetched successfully ---")
|
|||
|
|
print(json.dumps(data, indent=2))
|
|||
|
|
|
|||
|
|
# 获取配置成功,允许安装
|
|||
|
|
return {"action": "enable_button"}
|
|||
|
|
|
|||
|
|
def is_config_valid(self):
|
|||
|
|
"""检查配置是否有效
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
bool: 配置是否有效
|
|||
|
|
"""
|
|||
|
|
return self.config_valid
|
|||
|
|
|
|||
|
|
def get_cloud_config(self):
|
|||
|
|
"""获取云端配置
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
dict: 云端配置
|
|||
|
|
"""
|
|||
|
|
return self.cloud_config
|
|||
|
|
|
|||
|
|
def get_last_error(self):
|
|||
|
|
"""获取最后一次错误信息
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
str: 错误信息
|
|||
|
|
"""
|
|||
|
|
return self.last_error_message
|