Update the game from inside it (#13)
"Version X is available" in the top bar is now a button that opens an Update popup: - Update and restart gets the download link from the server (the redirect is not followed, as the Gitea link needs no token), downloads the new game next to the running one with a progress bar, checks it (complete, and an MZ or ELF file), swaps it in and restarts. The quiz is saved first and continues. On Windows the running .exe is renamed to .old, put back if the swap fails, and deleted at the next start. - Download in browser opens the .exe, the Linux package, or the release page on other platforms. - From the editor, an unwritable folder or another platform, only the browser download is offered, with the reason. The message now fits between the tabs and the buttons in every theme; in Nord and Christmas it ran into Sync. The macOS export preset is removed, and the unused download_client_* functions are replaced by fetch_client_download_url. Closes #13 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c03c0e4efe
commit
f39865fffc
30 files changed
+2363
-354
No files matched your search
@@ -31,6 +31,9 @@ var requested_bodies: Array[String] = []
|
||||
## The body of each request as bytes, e.g. an uploaded picture, in the same order as
|
||||
## [member requested_paths].
|
||||
var requested_raw_bodies: Array[PackedByteArray] = []
|
||||
## Whether each request followed redirects, in the same order as
|
||||
## [member requested_paths].
|
||||
var requested_follow_redirects: Array[bool] = []
|
||||
## How many tokens have been asked for.
|
||||
var token_requests: int = 0
|
||||
## The JSON body of the last token request.
|
||||
@@ -67,6 +70,14 @@ func uninstall() -> void:
|
||||
Settings.queue_ids = _previous_queue_ids
|
||||
|
||||
|
||||
## Answers requests to [param path] with a redirect to [param location], like the
|
||||
## server's download routes. Requests that follow redirects get an empty 200 instead, as
|
||||
## if they had followed it.
|
||||
func respond_redirect(path: String, location: String) -> void:
|
||||
_responses[path] = {"code": 302, "body": PackedByteArray(), "location": location}
|
||||
_successes_left.erase(path)
|
||||
|
||||
|
||||
## Answers requests to [param path] with [param data] encoded as JSON.
|
||||
func respond_json(path: String, data: Variant, response_code: int = 200) -> void:
|
||||
respond_bytes(path, JSON.stringify(data).to_utf8_buffer(), response_code)
|
||||
@@ -114,6 +125,7 @@ func request(
|
||||
on_complete: Callable,
|
||||
headers: PackedStringArray = PackedStringArray(),
|
||||
body: PackedByteArray = PackedByteArray(),
|
||||
follow_redirects: bool = true,
|
||||
) -> void:
|
||||
var path: String = url.trim_prefix(Settings.default_path + MusicServerClient.API_PATH)
|
||||
if path == "/token" && method == HTTPClient.METHOD_POST:
|
||||
@@ -129,17 +141,18 @@ func request(
|
||||
requested_headers.append(headers)
|
||||
requested_bodies.append(body.get_string_from_utf8())
|
||||
requested_raw_bodies.append(body)
|
||||
requested_follow_redirects.append(follow_redirects)
|
||||
if !OPEN_PATHS.has(path.get_slice("?", 0)) && !_has_valid_token(headers):
|
||||
on_complete.call(401, JSON.stringify({"error": "Unauthorized"}).to_utf8_buffer(),
|
||||
PackedStringArray())
|
||||
return
|
||||
if _held_paths.has(path):
|
||||
_held_paths[path].append(_answer.bind(path, on_complete))
|
||||
_held_paths[path].append(_answer.bind(path, on_complete, follow_redirects))
|
||||
return
|
||||
_answer(path, on_complete)
|
||||
_answer(path, on_complete, follow_redirects)
|
||||
|
||||
|
||||
func _answer(path: String, on_complete: Callable) -> void:
|
||||
func _answer(path: String, on_complete: Callable, follow_redirects: bool = true) -> void:
|
||||
var headers: PackedStringArray = []
|
||||
if !queue_id.is_empty() && path != "/token":
|
||||
headers.append("X-Queue-Id: " + queue_id)
|
||||
@@ -148,7 +161,13 @@ func _answer(path: String, on_complete: Callable) -> void:
|
||||
on_complete.call(503, PackedByteArray(), headers)
|
||||
return
|
||||
_successes_left[path] -= 1
|
||||
if _responses.has(path):
|
||||
if _responses.has(path) && _responses[path].has("location"):
|
||||
if follow_redirects:
|
||||
on_complete.call(200, PackedByteArray(), headers)
|
||||
else:
|
||||
headers.append("Location: " + _responses[path].location)
|
||||
on_complete.call(302, PackedByteArray(), headers)
|
||||
elif _responses.has(path):
|
||||
on_complete.call(_responses[path].code, _responses[path].body, headers)
|
||||
else:
|
||||
on_complete.call(404, PackedByteArray(), headers)
|
||||
|
||||
Reference in new issue
Block a user