diff --git a/client/project.godot b/client/project.godot index ddf9bf6..e34c831 100644 --- a/client/project.godot +++ b/client/project.godot @@ -18,6 +18,7 @@ config/icon="res://icon.svg" [autoload] Multi="*res://scenes/multi.gd" +Stream="*res://xmpp/stream.gd" [input] diff --git a/client/scenes/main.gd b/client/scenes/main.gd index 18058e9..6317471 100644 --- a/client/scenes/main.gd +++ b/client/scenes/main.gd @@ -22,6 +22,9 @@ func _ready(): Multi.update_my_position.connect(_on_update_me) Multi.update_player_position.connect(_on_update_player) Multi.remove_player.connect(_on_remove_player) + Stream.set_server_ip("127.0.0.1") + Stream.server_ip = "127.0.0.1" + print(Stream.get_server_ip()) func _on_connexion_updated(new_state): diff --git a/client/xmpp/stream.gd b/client/xmpp/stream.gd new file mode 100644 index 0000000..ebfd22f --- /dev/null +++ b/client/xmpp/stream.gd @@ -0,0 +1,117 @@ +extends Node + +# Stream XMPP +# Author : AleaJactaEst +# +# Based on https://invent.kde.org/woltherav/godot-xmpp-client.git + +signal debug(message) +signal error(message) +signal new_stanza(stanza) + +enum StreamState { + END, # Stream is over. Starting with this. + START, # Stream hass started. + TLS, # Connection has been made and the first header is send. Let's get ssl! + AUTHENTICATE, # We have negotiated whether to use TLS, let's authenticate. + STANZA # We have authenticated, account is now allowed to send stanzas +} +var stream_status = StreamState.END + +@export var server_ip:String = "127.0.0.1": + set = set_server_ip, get = get_server_ip + +func set_server_ip(value:String): + server_ip = value + +func get_server_ip() -> String: + return server_ip + +@export var port_number:int = 5222: + set = set_port_number, get = get_port_number + +func set_port_number(value:int): + port_number = value + +func get_port_number() -> int: + return port_number + +@export var account_name:String = "undefined@localhost": + set = set_account_name, get = get_account_name + +func set_account_name(value:String): + account_name = value + +func get_account_name() -> String: + return account_name + +@export var password:String = "undefined": + set = set_password, get = get_password + +func set_password(value:String): + password = value + +func get_password() -> String: + return password + +@export var locale:String = "en": + set = set_locale, get = get_locale + +func set_locale(value:String): + locale = value + +func get_locale() -> String: + return locale + +var count_connecting_time = 0 +var partial_stanza:String = "" +var tcp_peer = StreamPeerTCP.new() +var status:StreamState = StreamState.END + +func _init(): + var language = OS.get_locale() + set_locale(language) + +func _process(delta): + if (tcp_peer.get_status() == StreamPeerTCP.STATUS_CONNECTED) : + if (tcp_peer.has_method("poll")): + tcp_peer.poll() + if tcp_peer.get_available_bytes()>0: + var response = tcp_peer.get_string(tcp_peer.get_available_bytes()) + debug.emit("Stream: response \n[color=red]"+response+"[/color]") + if stream_status == self.StreamState.STANZA: + collect_stanza(remove_stream_header(response)) + else: + stream_process(remove_stream_header(response)) + if tcp_peer.get_status() == StreamPeerTCP.STATUS_CONNECTING: + count_connecting_time += delta + if count_connecting_time > 1: # if it took more than 1s to connect, error + print("*** Stream: Stuck connecting, will now disconnect") + debug.emit("Stream: Stuck connecting, will now disconnect") + tcp_peer.disconnect_from_host() #interrupts connection to nothing + set_process(false) # stop listening for packets + + +func remove_stream_header(text :String) -> String: + var index = 0 + if text.begins_with("") + text = text.substr(index+2).strip_edges() + # strip stream header + var rg = RegEx.new() + rg.compile("<\\s?(stream|stream:stream)\\s") + var result = rg.search(text) + if result: + debug.emit("Stream: Response header received") + index = text.find(">", result.get_end()) + text = text.substr(index+1) + return text + + +func collect_stanza(text : String): + pass + + +func stream_process(response :String = ""): + pass