Files
Sprout-Farm/SproutFarm-Frontend/GUI/CheckUpdatePanel.gd
2025-09-15 19:10:37 +08:00

178 lines
4.2 KiB
GDScript

extends Control
# 简化版更新检测器
# 适用于萌芽农场游戏
# 配置
const GAME_ID = "mengyafarm"
const SERVER_URL = "https://app.shumengya.top"
const CURRENT_VERSION = GlobalVariables.client_version
# 更新信息
var has_update = false
var latest_version = ""
func _ready():
# 初始化时隐藏面板
self.hide()
# 游戏启动时自动检查更新
call_deferred("check_for_updates")
func check_for_updates():
var http_request = HTTPRequest.new()
add_child(http_request)
# 连接请求完成信号
http_request.request_completed.connect(_on_update_check_completed)
# 发送请求
var url = SERVER_URL + "/api/simple/check-version/" + GAME_ID + "?current_version=" + CURRENT_VERSION
var error = http_request.request(url)
if error != OK:
print("网络请求失败: ", error)
func _on_update_check_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray):
if response_code != 200:
print("服务器响应错误: ", response_code)
return
# 解析JSON
var json = JSON.new()
var parse_result = json.parse(body.get_string_from_utf8())
if parse_result != OK:
print("解析响应失败")
return
var data = json.data
if "error" in data:
print("服务器错误: ", data.error)
return
# 检查是否有更新
has_update = data.get("has_update", false)
latest_version = data.get("latest_version", "")
if has_update:
print("发现新版本: ", latest_version)
show_update_panel()
else:
print("已是最新版本")
func show_update_panel():
"""显示更新面板"""
self.show() # 直接显示当前面板
func download_update():
"""下载更新"""
var platform = get_platform_name()
var download_url = SERVER_URL + "/download/" + GAME_ID + "/" + platform.to_lower()
print("下载链接: ", download_url)
# 打开下载页面
var error = OS.shell_open(download_url)
if error != OK:
# 复制到剪贴板作为备选方案
DisplayServer.clipboard_set(download_url)
show_message("无法打开浏览器,下载链接已复制到剪贴板")
func get_platform_name() -> String:
"""获取平台名称"""
var os_name = OS.get_name()
match os_name:
"Windows":
return "Windows"
"Android":
return "Android"
"macOS":
return "macOS"
"Linux":
return "Linux"
_:
return "Windows"
func show_message(text: String):
"""显示消息提示"""
var dialog = AcceptDialog.new()
add_child(dialog)
dialog.dialog_text = text
dialog.popup_centered()
# 3秒后自动关闭
await get_tree().create_timer(3.0).timeout
if is_instance_valid(dialog):
dialog.queue_free()
# 手动检查更新的公共方法
func manual_check_update():
"""手动检查更新"""
check_for_updates()
# 直接跳转到相应平台下载链接
func _on_download_button_pressed() -> void:
"""下载按钮点击事件"""
if not has_update:
show_message("当前已是最新版本")
return
var platform = get_platform_name()
var download_url = SERVER_URL + "/download/" + GAME_ID + "/" + platform.to_lower()
print("下载链接: ", download_url)
# 打开下载页面
var error = OS.shell_open(download_url)
if error != OK:
# 复制到剪贴板作为备选方案
DisplayServer.clipboard_set(download_url)
show_message("无法打开浏览器,下载链接已复制到剪贴板")
else:
show_message("正在打开下载页面...")
# 关闭更新面板
func _on_close_button_pressed() -> void:
"""关闭按钮点击事件"""
self.hide()
# 稍后提醒按钮
func _on_later_button_pressed() -> void:
"""稍后提醒按钮点击事件"""
print("用户选择稍后更新")
self.hide()
# 检查更新按钮
func _on_check_update_button_pressed() -> void:
"""检查更新按钮点击事件"""
check_for_updates()
# 获取更新信息的公共方法
func get_update_info() -> Dictionary:
"""获取更新信息"""
return {
"has_update": has_update,
"current_version": CURRENT_VERSION,
"latest_version": latest_version,
"game_id": GAME_ID
}
# 获取当前版本
func get_current_version() -> String:
"""获取当前版本"""
return CURRENT_VERSION
# 获取最新版本
func get_latest_version() -> String:
"""获取最新版本"""
return latest_version
# 是否有更新
func is_update_available() -> bool:
"""是否有更新可用"""
return has_update