소스 검색

Change update checker version source

kobewi 1 년 전
부모
커밋
6e9dc0ee27
2개의 변경된 파일29개의 추가작업 그리고 25개의 파일을 삭제
  1. 1 1
      doc/classes/EditorSettings.xml
  2. 28 24
      editor/engine_update_label.cpp

+ 1 - 1
doc/classes/EditorSettings.xml

@@ -881,7 +881,7 @@
 			All update modes will ignore builds with different major versions (e.g. Godot 4 -> Godot 5).
 		</member>
 		<member name="network/connection/network_mode" type="int" setter="" getter="">
-			Determines whether online features are enabled in the editor, such as the Asset Library or update checks. Disabling these online features helps alleviate privacy concerns by preventing the editor from making HTTP requests to the Godot website, GitHub, or third-party platforms hosting assets from the Asset Library.
+			Determines whether online features are enabled in the editor, such as the Asset Library or update checks. Disabling these online features helps alleviate privacy concerns by preventing the editor from making HTTP requests to the Godot website or third-party platforms hosting assets from the Asset Library.
 		</member>
 		<member name="network/debug/remote_host" type="String" setter="" getter="">
 			The address to listen to when starting the remote debugger. This can be set to [code]0.0.0.0[/code] to allow external clients to connect to the remote debugger (instead of restricting the remote debugger to connections from [code]localhost[/code]).

+ 28 - 24
editor/engine_update_label.cpp

@@ -30,6 +30,7 @@
 
 #include "engine_update_label.h"
 
+#include "core/io/json.h"
 #include "core/os/time.h"
 #include "editor/editor_settings.h"
 #include "editor/editor_string_names.h"
@@ -46,7 +47,7 @@ bool EngineUpdateLabel::_can_check_updates() const {
 void EngineUpdateLabel::_check_update() {
 	checked_update = true;
 	_set_status(UpdateStatus::BUSY);
-	http->request("https://raw.githubusercontent.com/godotengine/godot-website/master/_data/versions.yml");
+	http->request("https://godotengine.org/versions.json");
 }
 
 void EngineUpdateLabel::_http_request_completed(int p_result, int p_response_code, const PackedStringArray &p_headers, const PackedByteArray &p_body) {
@@ -62,12 +63,24 @@ void EngineUpdateLabel::_http_request_completed(int p_result, int p_response_cod
 		return;
 	}
 
-	PackedStringArray lines;
+	Array version_data;
 	{
 		String s;
 		const uint8_t *r = p_body.ptr();
 		s.parse_utf8((const char *)r, p_body.size());
-		lines = s.split("\n");
+
+		Variant result = JSON::parse_string(s);
+		if (result == Variant()) {
+			_set_status(UpdateStatus::ERROR);
+			_set_message(TTR("Failed to parse version JSON."), theme_cache.error_color);
+			return;
+		}
+		if (result.get_type() != Variant::ARRAY) {
+			_set_status(UpdateStatus::ERROR);
+			_set_message(TTR("Received JSON data is not a valid version array."), theme_cache.error_color);
+			return;
+		}
+		version_data = result;
 	}
 
 	UpdateMode update_mode = UpdateMode(int(EDITOR_GET("network/connection/engine_version_update_mode")));
@@ -78,14 +91,11 @@ void EngineUpdateLabel::_http_request_completed(int p_result, int p_response_cod
 	int current_minor = version_info["minor"];
 	int current_patch = version_info["patch"];
 
-	int current_version_line = -1;
-	for (int i = 0; i < lines.size(); i++) {
-		const String &line = lines[i];
-		if (!line.begins_with("- name")) {
-			continue;
-		}
+	Dictionary found_version_info;
+	for (const Variant &data_bit : version_data) {
+		const Dictionary info = data_bit;
 
-		const String version_string = _extract_sub_string(line);
+		const String version_string = info["name"];
 		const PackedStringArray version_bits = version_string.split(".");
 
 		if (version_bits.size() < 2) {
@@ -111,7 +121,7 @@ void EngineUpdateLabel::_http_request_completed(int p_result, int p_response_cod
 		}
 
 		if (minor > current_minor || patch > current_patch) {
-			String version_type = _extract_sub_string(lines[i + 1]);
+			String version_type = info["flavor"];
 			if (stable_only && _get_version_type(version_type, nullptr) != VersionType::STABLE) {
 				continue;
 			}
@@ -120,17 +130,17 @@ void EngineUpdateLabel::_http_request_completed(int p_result, int p_response_cod
 			found_version += "-" + version_type;
 			break;
 		} else if (minor == current_minor && patch == current_patch) {
-			current_version_line = i;
+			found_version_info = info;
 			found_version = version_string;
 			break;
 		}
 	}
 
-	if (current_version_line == -1 && !found_version.is_empty()) {
+	if (found_version_info.is_empty() && !found_version.is_empty()) {
 		_set_status(UpdateStatus::UPDATE_AVAILABLE);
 		_set_message(vformat(TTR("Update available: %s."), found_version), theme_cache.update_color);
 		return;
-	} else if (current_version_line == -1 || stable_only) {
+	} else if (found_version_info.is_empty() || stable_only) {
 		_set_status(UpdateStatus::UP_TO_DATE);
 		return;
 	}
@@ -138,17 +148,11 @@ void EngineUpdateLabel::_http_request_completed(int p_result, int p_response_cod
 	int current_version_index;
 	VersionType current_version_type = _get_version_type(version_info["status"], &current_version_index);
 
-	for (int i = current_version_line + 1; i < lines.size(); i++) {
-		const String &line = lines[i];
-		if (line.begins_with("- name")) {
-			break;
-		}
-
-		if (!line.begins_with("    - name") && !line.begins_with("  flavor")) {
-			continue;
-		}
+	const Array releases = found_version_info["releases"];
+	for (const Variant &data_bit : version_data) {
+		const Dictionary info = data_bit;
 
-		const String version_string = _extract_sub_string(line);
+		const String version_string = info["name"];
 		int version_index;
 		VersionType version_type = _get_version_type(version_string, &version_index);