summaryrefslogtreecommitdiff
path: root/network/websocket_client_basic.gd
blob: 353dd811cb41625da70145addc52f6beb36d752a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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()