diff options
author | metamuffin <metamuffin@disroot.org> | 2025-09-16 22:28:24 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-09-16 22:28:24 +0200 |
commit | 3f98582f903e579d9f47aba48f3976345eabe123 (patch) | |
tree | 5124f087056171ccf0196169a4b3c4e992183fa3 /client/system/server_list.gd | |
parent | e86637eade79ed5fef5ca2e9c169f5c40a314400 (diff) | |
download | hurrycurry-3f98582f903e579d9f47aba48f3976345eabe123.tar hurrycurry-3f98582f903e579d9f47aba48f3976345eabe123.tar.bz2 hurrycurry-3f98582f903e579d9f47aba48f3976345eabe123.tar.zst |
Move some scripts to new "system" dir, add argument parser
Diffstat (limited to 'client/system/server_list.gd')
-rw-r--r-- | client/system/server_list.gd | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/client/system/server_list.gd b/client/system/server_list.gd new file mode 100644 index 00000000..77b5ee0c --- /dev/null +++ b/client/system/server_list.gd @@ -0,0 +1,113 @@ +# Hurry Curry! - a game about cooking +# Copyright (C) 2025 Hurry Curry! contributors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, version 3 of the License only. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <https://www.gnu.org/licenses/>. +# +extends Node + +signal update_loading(status: bool) +signal update_server_list(list: Array) + +enum Registry { + MDNS = 0, + GLOBAL = 1, +} + +const MDNS_URL: String = "http://127.0.0.1:27033/v1/list" +const HEADERS: Array[String] = [ + "Accept: application/json", + "User-Agent: Hurry Curry! %s" % Global.VERSION + ] + +var current_list: Array[Array] = [[], []] +var loading := false +var mdns := HTTPRequest.new() +var reg := HTTPRequest.new() + +# Fallback to http, since there seems to be a problem related to mbed tls in Godot. +# See: https://github.com/godotengine/godot/issues/96103 +var using_http_fallback := false + +var mdns_timer := Timer.new() +var reg_timer := Timer.new() +# after 30 minutes we stop fetching results to reduce server load +var timeout := Timer.new() + +func _ready() -> void: + add_child(mdns) + add_child(reg) + mdns_timer.wait_time = 5. + mdns_timer.one_shot = false + mdns_timer.timeout.connect(fetch_server_list.bind(Registry.MDNS)) + add_child(mdns_timer) + reg_timer.wait_time = 60. + reg_timer.one_shot = false + reg_timer.timeout.connect(fetch_server_list.bind(Registry.GLOBAL)) + add_child(reg_timer) + timeout.wait_time = 60. * 30. + timeout.timeout.connect(func(): + stop() + ) + add_child(timeout) + mdns.request_completed.connect(_on_request_completed.bind(Registry.MDNS)) + reg.request_completed.connect(_on_request_completed.bind(Registry.GLOBAL)) + +func fetch_server_list(registry: Registry) -> void: + match registry: + Registry.MDNS: + if Settings.read("online.use_discover"): + match Discover.state: + Service.State.STOPPED: Discover.start() + Service.State.RUNNING: mdns.request(MDNS_URL, HEADERS) + Registry.GLOBAL: + if Settings.read("online.use_registry"): + var url: String = Settings.read("online.registry_url") + url = url.replace("https:", "http:") if using_http_fallback else url + reg.request(url + "/v1/list", HEADERS) + + loading = true + update_loading.emit(true) + +func _on_request_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray, registry: Registry): + loading = false + update_loading.emit(false) + if result != 0: + push_warning("Fetching server list failed with code %d." % result) + if !using_http_fallback: + print("Retrying with http...") + using_http_fallback = true + fetch_server_list(Registry.GLOBAL) + return + var json = JSON.parse_string(body.get_string_from_utf8()) + if json == null: + push_error("Server list response invalid") + return + current_list[registry] = json + update_server_list.emit(current_list) + +func start() -> void: + timeout.stop() + timeout.start() + mdns_timer.start() + fetch_server_list(Registry.MDNS) + reg_timer.start() + fetch_server_list(Registry.GLOBAL) + +func stop() -> void: + timeout.stop() + mdns_timer.stop() + reg_timer.stop() + +func one_shot() -> void: + start() + stop() |