From 3c874d02186a1727e4597987c51fe5df5bf9c419 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Wed, 7 May 2025 20:14:44 -0500 Subject: [PATCH] Updated SammiClient Updated API per suggestion of ImamuraCross on SAMMI Community discord. Added Timeout check when attempting to connect. Added Queue for requests when a request is in the process of running. --- addons/sammi/lib/sammi_client.gd | 53 ++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/addons/sammi/lib/sammi_client.gd b/addons/sammi/lib/sammi_client.gd index fcdbac2..e56408a 100644 --- a/addons/sammi/lib/sammi_client.gd +++ b/addons/sammi/lib/sammi_client.gd @@ -7,15 +7,19 @@ class_name SammiClient ## not set the Content-Length header for response headers to the API. Hence it will fail with a ## normal Godot HTTPClient. + signal request_completed(response: SammiResponse) + @export_category("SAMMI Connection Information") @export var host: String = "127.0.0.1" @export var port: int = 9450 @export var user_agent: String = "GodotSammi/0.1 (%s)" % OS.get_name() +@export var timeout_limit: int = 200 @export_category("Authentication") @export_custom(PROPERTY_HINT_PASSWORD, "") var password: String = "" + var client: StreamPeerTCP var state: State = State.CLOSED var buffer: PackedByteArray @@ -24,6 +28,9 @@ var response: SammiResponse var query: String = "" var method: Method = Method.GET var body: String = "" +var queue: Array[QueueRequest] = [] +var timeout: int = 0 + enum State { CONNECTING, @@ -33,13 +40,18 @@ enum State { CLOSED } + enum Method { GET, POST, } + func request(method: Method, api_path: String, body: String) -> void: - assert(state == State.CLOSED, "A request is in the process of being made.") + if state != State.CLOSED: + var req = QueueRequest.new(method, api_path, body) + queue.append(req) + return self.query = api_path self.body = body @@ -48,6 +60,7 @@ func request(method: Method, api_path: String, body: String) -> void: self.client.connect_to_host(host, port) self.state = State.CONNECTING + func _process(_delta: float) -> void: if not client: return @@ -63,9 +76,22 @@ func _process(_delta: float) -> void: _read_response() elif client.get_status() == StreamPeerTCP.Status.STATUS_ERROR: state = State.ERROR - print("Error: ", client.get_error()) client.disconnect_from_host() client = null + _check_queue() + elif client.get_status() != StreamPeerTCP.Status.STATUS_CONNECTING: + print("AGAIN") + if timeout == 0: + timeout = Time.get_ticks_msec() + elif Time.get_ticks_msec() - timeout >= timeout_limit: + state = State.CLOSED + print("Timeout") + timeout = 0 + client.disconnect_from_host() + client = null + _check_queue() + return + func _send_request() -> void: var request_str = "" @@ -90,6 +116,7 @@ func _send_request() -> void: request_str += body client.put_data(request_str.to_utf8_buffer()) + func _read_response() -> void: client.poll() @@ -129,9 +156,19 @@ func _read_response() -> void: state = State.CLOSED headers = [] buffer = [] + timeout = 0 client.disconnect_from_host() client = null request_completed.emit(response) + _check_queue() + + +func _check_queue() -> void: + if queue.is_empty(): + return + + var req: QueueRequest = queue.pop_front() + request(req.method, req.path, req.body) class SammiResponse: @@ -157,3 +194,15 @@ class SammiResponse: code = 500 error_message = "Unknown Error" query = p_query + +class QueueRequest: + extends RefCounted + + var method: Method + var path: String + var body: String + + func _init(p_method: Method, p_path: String, p_body: String) -> void: + method = p_method + path = p_path + body = p_body