summaryrefslogtreecommitdiff
path: root/network/websocket_client_basic.gd
diff options
context:
space:
mode:
authorAnson Bridges <bridges.anson@gmail.com>2025-08-19 12:38:02 -0700
committerAnson Bridges <bridges.anson@gmail.com>2025-08-19 12:38:02 -0700
commit255fbf19cc9499ef384d41f68515da5e49e8a3ce (patch)
tree13c838229198383b24644f613787e34842ea7ab2 /network/websocket_client_basic.gd
parentf087c6a98b1da55525a6e3c1d7c82477f82eb5cd (diff)
added menus, reworking GC client architecture
Diffstat (limited to 'network/websocket_client_basic.gd')
-rw-r--r--network/websocket_client_basic.gd84
1 files changed, 84 insertions, 0 deletions
diff --git a/network/websocket_client_basic.gd b/network/websocket_client_basic.gd
new file mode 100644
index 0000000..353dd81
--- /dev/null
+++ b/network/websocket_client_basic.gd
@@ -0,0 +1,84 @@
+extends Node
+
+var socket_client: WebSocketClient = null
+var socket: WebSocketPeer = null
+var state: int = 0 # -1 = CONNECTION_FAILED, 0 = CONNECTION_DISCONNECTED, 1 = CONNECTION_CONNECTING, 2 = CONNECTION_CONNECTED, 3 = CONNECTION_DISCONNECTING
+
+var message_queue : Array = [] # messages to be sent upon connection
+
+func _ready():
+ socket_client = WebSocketClient.new()
+ socket_client.connect("connection_established", self, "on_connection_success")
+ socket_client.connect("connection_closed", self, "on_connection_close_success")
+ socket_client.connect("connection_error", self, "on_connection_error")
+ #socket_client.connect("data_received", self, "receive")
+
+func sock_connect_to_url(url):
+ print("Connecting to %s..." % url)
+ message_queue.clear()
+ var error = socket_client.connect_to_url(url)
+ if error != OK:
+ return error
+
+ state = 1 # CONNECTING
+ return OK
+
+func sock_close(code = 1000, reason = ""):
+ print("Closing websocket...")
+ socket_client.disconnect_from_host(code, reason)
+ state = 3 # DISCONNECTING
+
+func on_connection_success(protocol):
+ print("WebSocket connection success with protocol %s." % protocol)
+ socket = socket_client.get_peer(1)
+ socket.set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) # defaults to text mode
+ state = 2 # CONNECTED
+
+ while len(message_queue) > 0:
+ var msg = message_queue.pop_at(0)
+ send(msg)
+
+func on_connection_close_success(clean):
+ print("WebSocket closed successfully.")
+ socket = null
+ if clean:
+ state = 0 # DISCONNECTED
+ else:
+ state = -1 # DISCONNECT DIRTY
+
+func on_connection_error(): # connection failed
+ print("WebSocket connection failed!")
+ socket = null
+ state = -1 # DISCONNECT DIRTY
+
+func send(message, as_bytes=false) -> int:
+ if state != 2:
+ message_queue.push_back(message)
+ return -1
+ return socket.put_packet(message)
+
+
+func send_json(message) -> int:
+ if state != 2:
+ message_queue.push_back(JSON.print(message).to_utf8())
+ return -1
+ var message_json = JSON.print(message).to_utf8()
+ return socket.put_packet(message_json)
+
+func receive(string_to_json=false):
+ if state != 2: return null
+ if socket.get_available_packet_count() < 1: return null
+ var packet : PoolByteArray = socket.get_packet()
+ if socket.was_string_packet():
+ var message = packet.get_string_from_utf8()
+ if string_to_json:
+ var json = JSON.parse(message)
+ if json.error:
+ return null
+ message = json.result
+ return message
+ return bytes2var(packet)
+
+
+func _process(_delta):
+ socket_client.poll()