extends Panel @onready var contents: RichTextLabel = $Scroll/Contents #更新内容 @onready var refresh_button: Button = $RefreshButton #刷新按钮 # HTTP请求节点 var http_request: HTTPRequest # API配置 const API_URL = "http://47.108.90.0:5003/api/game/mengyafarm/updates" func _ready() -> void: self.hide() # 创建HTTPRequest节点 http_request = HTTPRequest.new() add_child(http_request) # 连接HTTP请求完成信号 http_request.request_completed.connect(_on_request_completed) # 连接刷新按钮信号 refresh_button.pressed.connect(_on_refresh_button_pressed) # 初始加载更新数据 load_updates() func _on_quit_button_pressed() -> void: HidePanel() func _on_refresh_button_pressed() -> void: load_updates() func load_updates() -> void: # 禁用刷新按钮,防止重复请求 refresh_button.disabled = true refresh_button.text = "刷新中..." # 显示加载中 contents.text = "[center][color=yellow]正在加载更新信息...[/color][/center]" # 发起HTTP请求 var error = http_request.request(API_URL) if error != OK: _show_error("网络请求失败,错误代码: " + str(error)) func _on_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void: # 恢复刷新按钮 refresh_button.disabled = false refresh_button.text = "刷新" # 检查请求结果 if result != HTTPRequest.RESULT_SUCCESS: _show_error("网络连接失败") return if response_code != 200: _show_error("服务器响应错误 (HTTP " + str(response_code) + ")") return # 解析JSON数据 var json_text = body.get_string_from_utf8() if json_text.is_empty(): _show_error("服务器返回空数据") return var json = JSON.new() var parse_result = json.parse(json_text) if parse_result != OK: _show_error("数据解析失败") return var data = json.data if not data.has("updates"): _show_error("数据格式错误") return # 显示更新内容 display_updates(data.updates) func _show_error(error_message: String) -> void: refresh_button.disabled = false refresh_button.text = "刷新" contents.text = "[center][color=red]" + error_message + "\n\n请检查网络连接或稍后重试[/color][/center]" func display_updates(updates: Array) -> void: if updates.is_empty(): contents.text = "[center][color=gray]暂无更新信息[/color][/center]" return var update_text = "" for i in range(updates.size()): var update = updates[i] # 检查必要字段 if not update.has("title") or not update.has("version") or not update.has("content"): continue # 更新标题 update_text += "[color=cyan][font_size=22][b]" + str(update.title) + "[/b][/font_size][/color]\n" # 版本和时间信息 update_text += "[color=green]版本: " + str(update.version) + "[/color]" if update.has("timestamp"): var formatted_time = _format_time(str(update.timestamp)) update_text += " [color=gray]时间: " + formatted_time + "[/color]" if update.has("game_name"): update_text += " [color=gray]游戏: " + str(update.game_name) + "[/color]" update_text += "\n\n" # 更新内容 var content = str(update.content) # 处理换行符 content = content.replace("\\r\\n", "\n").replace("\\n", "\n") # 高亮特殊符号 #content = content.replace("✓", "[color=green]✓[/color]") update_text += "[color=white]" + content + "[/color]\n" # 添加分隔线(除了最后一个更新) if i < updates.size() - 1: update_text += "\n[color=gray]" + "─".repeat(60) + "[/color]\n\n" contents.text = update_text # 简单的时间格式化 func _format_time(timestamp: String) -> String: var parts = timestamp.split(" ") if parts.size() >= 2: var date_parts = parts[0].split("-") var time_parts = parts[1].split(":") if date_parts.size() >= 3 and time_parts.size() >= 2: return date_parts[1] + "月" + date_parts[2] + "日 " + time_parts[0] + ":" + time_parts[1] return timestamp # 显示面板时自动刷新 func ShowPanel() -> void: self.show() load_updates() # 隐藏面板时取消正在进行的请求 func HidePanel() -> void: self.hide() if http_request and http_request.get_http_client_status() != HTTPClient.STATUS_DISCONNECTED: http_request.cancel_request() # 恢复按钮状态 if refresh_button: refresh_button.disabled = false refresh_button.text = "刷新"