You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.9 KiB
GDScript

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()