extends Mod_Base 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: # Process only one message, then disconnect. peer.close() var split := message.split(" ", false, 1) var command := split[0] var rest := split[1] match command: "camera": if not rest.is_valid_int(): print_log("expected integer, got '%s'" % rest); return var index := int(rest) if not (index >= 1 and index <= 9): print_log("invalid camera '%s'" % rest); return var camera_mod := get_node("../CameraPositions") if not camera_mod: print_log("mod 'CameraPositions' not found"); return camera_mod._load_camera_position("Camera %d" % index) "vibrate": if not rest.is_valid_float(): print_log("expected float, got '%s'" % rest); return var amount := float(rest) var copy_thrower_mod := get_node("../copyThrower") if not copy_thrower_mod: print_log("mod 'copyThrower' not found"); return copy_thrower_mod.vibrate(get_skeleton(), amount) _: print_log("unknown command: '%s'" % command)