# Hurry Curry! - a game about cooking # Copyright 2024 metamuffin # Copyright 2024 nokoe # Copyright 2024 BigBrotherNii # # 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 . # extends Menu var url_regex: RegEx = RegEx.new() @onready var server_list: VBoxContainer = $side/margin/options/second/ScrollContainerCustom/ServerList @onready var server_list_loading: Label = $side/margin/options/second/Loading @onready var connect_uri = $side/margin/options/second/connect/uri @onready var server = $side/margin/options/second/server @onready var server_control = $side/margin/options/second/server/control @onready var server_connect = $side/margin/options/second/server/connect func _ready(): url_regex.compile("^(?:(ws|wss)://)?([^:]+)(?::([0-9]+))?$") if OS.has_feature("web"): server.hide() connect_uri.text = Global.get_profile("last_server_url") Sound.play_music("MainMenu") ServerList.update_server_list.connect(update_server_list) ServerList.update_loading.connect(update_server_list_loading) update_server_list(ServerList.current_list) update_server_list_loading(ServerList.loading) ServerList.start() super() func update_server_list(lists: Array[Array]): for c in server_list.get_children(): c.queue_free() for l in lists: for i in l: var b := Button.new() b.text_overrun_behavior = TextServer.OVERRUN_TRIM_WORD_ELLIPSIS b.text = tr("c.menu.play.list_item").format([i.name, i.players_online]) # TODO: Implement fallback address correctly if i.version[0] != Multiplayer.VERSION_MAJOR or i.version[1] > Multiplayer.VERSION_MINOR: b.disabled = true b.pressed.connect(connect_to.bind(i.address[0])) server_list.add_child(b) func update_server_list_loading(status: bool): server_list_loading.visible = status func _menu_cover(state): $side.visible = not state func _on_connect_pressed(): var url = connect_uri.text var result := url_regex.search(url) if result != null: if result.get_string(1) == "": url = "ws://" + url # only set default port for non-tls websocket connections if result.get_string(3) == "" and result.get_string(1) != "wss": url = url + ":27032" connect_uri.text = url Global.set_profile("last_server_url", url) Global.save_profile() connect_to(url) func _on_quick_connect_pressed(): if OS.has_feature("web"): connect_to(JavaScriptBridge.eval(""" window.location.protocol.endsWith("s:") ? `wss://${window.location.host}/` : `ws://${window.location.hostname}:27032/` """)) else: connect_to("wss://hurrycurry.metamuffin.org/") func connect_to(url: String): print("Connecting to %s" % url) Global.server_url = url get_parent().replace_menu("res://menu/game.tscn") func _on_server_pressed(): match Server.state: Server.State.RUNNING: Server.stop() Server.State.STOPPED: Server.start() Server.State.FAILED: Server.start() func _on_server_connect_pressed(): connect_to("ws://127.0.0.1:27032/") func _process(_delta): server_control.disabled = false server_connect.visible = Server.state == Server.State.RUNNING server_control.modulate = Color.WHITE match Server.state: Server.State.RUNNING: server_control.text = tr("c.menu.play.server_stop") server_control.modulate = Color.AQUAMARINE Server.State.TESTING: server_control.text = tr("c.menu.play.server_testing") server_control.disabled = true Server.State.STARTING: server_control.text = tr("c.menu.play.server_starting") server_control.disabled = true Server.State.STOPPED: server_control.text = tr("c.menu.play.server_start") Server.State.FAILED: server_control.text = tr("c.menu.play.server_failed") server_control.modulate = Color(1, 0.4, 0.5) server_control.tooltip_text = tr("c.menu.play.server_failed_tooltip") Server.State.UNAVAILABLE: server_control.text = tr("c.menu.play.server_unavailable") server_control.disabled = true server_control.tooltip_text = tr("c.menu.play.server_binary_not_found") func _on_uri_text_changed(new_text): connect_uri.modulate = Color.WHITE if url_regex.search(new_text) else Color.RED func _on_back_pressed(): exit() func _menu_exit(): ServerList.stop() super()