extends Node const PORT = 8080 var _server = WebSocketServer.new() var IDs = {} var peers = [] func _ready(): _server.connect('client_connected', self, "_connected") _server.connect('client_disconnected', self, "_disconnected") _server.connect('client_close_request', self, "_close_request") _server.connect("data_received", self, "_on_data_received") var err = _server.listen(PORT) if err != OK: print_debug("Unable to start server") set_process(false) print_debug("server started") func _connected(id, protocol): print_debug("Client %d connected with protocol: %s" % [id, protocol]) _server.get_peer(id).put_packet(JSON.print( {'type': 'test', 'message': "Server test packet"}).to_utf8() ) peers.append(id) func _close_request(id, code, reason): print_debug("Client %d disconnecting with code: %d, reason: %s" % [id, code, reason]) func _disconnected(id, was_clean = false): print_debug("Client %d disconnected, clean: %s" % [id, str(was_clean)]) var user = IDs[id] peers.erase(id) for p in peers: _server.get_peer(p).put_packet(JSON.print( {'type': "server_message", "message": user + "(#" + str(id) + ") left the chat."} ).to_utf8()) func _on_data_received(id): var original = _server.get_peer(id).get_packet().get_string_from_utf8() var json = JSON.parse(original) var packet = json.result if typeof(packet) != 18: push_error("%s is not a dictionary" % [packet]) get_tree().quit() print_debug("Got data from client %d: %s ... echoing" % [id, packet]) if packet['type'] == "user_joined": IDs[id] = packet['name'] for p in peers: _server.get_peer(p).put_packet( JSON.print( {'type': "server_message", "message": packet['name'] + "(#" + str(id) + ") joined the chat."} ).to_utf8()) elif packet['type'] == "chat_message" or packet['type'] == "server_message": for p in peers: _server.get_peer(p).put_packet(JSON.print(packet).to_utf8()) func _process(_delta): _server.poll()