adding 1 step xmpp

This commit is contained in:
AleaJactaEst 2023-10-27 16:49:55 +02:00
parent 93fc0f44b2
commit d0508567f4
3 changed files with 121 additions and 0 deletions

View file

@ -18,6 +18,7 @@ config/icon="res://icon.svg"
[autoload]
Multi="*res://scenes/multi.gd"
Stream="*res://xmpp/stream.gd"
[input]

View file

@ -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):

117
client/xmpp/stream.gd Normal file
View file

@ -0,0 +1,117 @@
extends Node
# Stream XMPP
# Author : AleaJactaEst
#
# Based on https://invent.kde.org/woltherav/godot-xmpp-client.git <Wolthera van Hövell>
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("<?") :
# Strip xml header
index = text.find("?>")
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