extends Control @export var use_https: bool = false @export var online: bool = true @export var http_port: int = 2480 @export var multiplayer_port: int = 2481 var local_ip: String = "127.0.0.1" var global_ip: String = "0.0.0.0" var caddy_path: String = "/home/jimj316/Godot/JackIt/caddy/caddy" var caddy_file_path: String = "/home/jimj316/Godot/JackIt/Caddyfile" var caddy_pid: int = -1 var check_caddy_timer: float = 0 var upnp: UPNP = UPNP.new() func _ready() -> void: $JoinLocalBox.visible = false $JoinInternetBox.visible = false #$VBoxContainer.model = $"../Players" # get the local address for local_address in IP.get_local_addresses(): if local_address.begins_with("127") or local_address == "::1": continue else: local_ip = local_address break var global_ok: bool = setup_global_connection() get_parent().multiplayer.peer_connected.connect(on_peer_connected) get_parent().multiplayer.peer_disconnected.connect(on_peer_disconnected) start_caddy() start_multiplayer() func _process(delta: float) -> void: check_caddy_timer += delta if check_caddy_timer >= 1: check_caddy_timer = 0 if !OS.is_process_running(caddy_pid): start_caddy() func start_caddy() -> void: OS.set_environment("SITE_ADDRESS", local_ip) print("Local IP address is %s" % local_ip) #var caddy_args: PackedStringArray = ["file-server", "--root", "/home/jimj316/Godot/JackIt/build/web/", "--listen", ":%d"%port, "--domain", local_ip] caddy_pid = OS.create_process(caddy_path, ["run", "--config", caddy_file_path]) #caddy_pid = OS.create_process(caddy_path, caddy_args) print("Caddy created with PID %d" % caddy_pid) #print("Caddy args: %s" % caddy_args) var url: String = "http://%s:%d/" % [local_ip, http_port] $JoinLocalBox/QRCodeRect.data = url $JoinLocalBox/IPLabel.text = url $JoinLocalBox.visible = true func start_multiplayer() -> void: var peer: MultiplayerPeer = WebSocketMultiplayerPeer.new() var error: Error = peer.create_server(multiplayer_port) if error != OK: OS.alert("Failed to initialise server! Error: %d" % error) get_parent().multiplayer.multiplayer_peer = peer func setup_global_connection() -> bool: var status: int = upnp.discover() if status != UPNP.UPNPResult.UPNP_RESULT_SUCCESS: return false var gateway: UPNPDevice = upnp.get_gateway() if gateway == null or !gateway.is_valid_gateway(): return false status = gateway.add_port_mapping(http_port, http_port, "JackIt HTTP Port", "TCP", 0) if status != UPNP.UPNPResult.UPNP_RESULT_SUCCESS: return false #status = gateway.add_port_mapping(http_port, http_port, "JackIt HTTP Port", "UDP", 0) #if status != UPNP.UPNPResult.UPNP_RESULT_SUCCESS: return false status = gateway.add_port_mapping(multiplayer_port, multiplayer_port, "JackIt WS Port", "TCP", 0) if status != UPNP.UPNPResult.UPNP_RESULT_SUCCESS: return false #status = gateway.add_port_mapping(multiplayer_port, multiplayer_port, "JackIt WS Port", "UDP", 0) #if status != UPNP.UPNPResult.UPNP_RESULT_SUCCESS: return false global_ip = upnp.query_external_address() var url: String = "http://%s:%d/" % [global_ip, http_port] $JoinInternetBox/QRCodeRect.data = url $JoinInternetBox/IPLabel.text = url $JoinInternetBox.visible = true return true func _notification(what): if what == NOTIFICATION_WM_CLOSE_REQUEST or what == NOTIFICATION_CRASH or what == NOTIFICATION_EXIT_TREE: if caddy_pid != -1: OS.kill(caddy_pid) print("Caddy terminated with PID %d" % caddy_pid) caddy_pid = -1 func on_peer_connected(id: int) -> void: print("Peer connected with ID %d!" % id) #send_player_list(id) update_peer_list() func on_peer_disconnected(id: int) -> void: print("Peer disconnected with ID %d!" % id) update_peer_list() #func send_player_list(peer_id: int) -> void: #for player in $"../Players".get_children(): #print("Sending player %d to peer %d" % [player.session_id, peer_id]) #$"../Players".create_player_for_session_id.rpc_id(peer_id, player.session_id) func update_peer_list(): $PeerListLabel.text = "" for peer_id in multiplayer.get_peers(): $PeerListLabel.text = $PeerListLabel.text + ("Peer %d\n" % peer_id)