extends Mod_Base static var NUMBER_REGEX := RegEx.create_from_string("^\\d+$") var server: TCPServer var peers: Dictionary[WebSocketPeer, int] func _ready() -> void: server = TCPServer.new() server.listen(13981, "127.0.0.1") func _exit_tree() -> void: server.stop() for peer in peers: peer.close() server = null peers.clear() func _process(_delta: float) -> void: # Accept new connections. while server.is_connection_available(): var conn := server.take_connection() if not conn: break var socket := WebSocketPeer.new() # socket.supported_protocols = [] socket.accept_stream(conn) socket.set_no_delay(true) peers.set(socket, Time.get_ticks_msec()) var to_remove: Array[WebSocketPeer] for peer in peers: peer.poll() # Receive messages. while peer.get_available_packet_count(): var packet := peer.get_packet() if not peer.was_string_packet(): continue # ignore binary packets var message := packet.get_string_from_utf8() _on_websocket_message(peer, message) # Remove the peer if it's disconnected. if peer.get_ready_state() != WebSocketPeer.STATE_OPEN: to_remove.append(peer) # Remove the peer if it's been around for over 0.5 seconds. if Time.get_ticks_msec() - peers[peer] > 500: to_remove.append(peer) # Clear out disconnected peers. for peer in to_remove: peers.erase(peer) func _on_websocket_message(peer: WebSocketPeer, message: String) -> void: if message.begins_with("camera "): var index := message.substr("camera ".length()) if NUMBER_REGEX.search(index) and int(index): var camera_mod := get_node("../CameraPositions") if camera_mod: camera_mod._load_camera_position("Camera " + index); else: print_log("mod with index 'CameraPositions' not found") else: print_log("invalid camera index: " + index) else: print_log("unknown command: " + message) # Process only one message, then disconnect. peer.close()