Fixed stuff

Fixed tabs in both files
Fixed SammiClient to be added to the tree, so that events can process.
This commit is contained in:
Mario Steele 2025-04-30 14:56:40 -05:00
parent 759a19fcf1
commit d6e60ff204
2 changed files with 475 additions and 474 deletions

View file

@ -13,396 +13,397 @@ var last_error: String = ""
var last_error_description: String = "" var last_error_description: String = ""
func _ready() -> void: func _ready() -> void:
client = SammiClient.new() client = SammiClient.new()
client.host = host add_child(client)
client.port = port client.host = host
client.password = password client.port = port
client.request_completed.connect(_on_request_completed) client.password = password
client.request_completed.connect(_on_request_completed)
func get_variable(name: String, button_id: String = "") -> Variant: func get_variable(name: String, button_id: String = "") -> Variant:
var api_path: String = "/api?request=getVariable&name=%s" % name var api_path: String = "/api?request=getVariable&name=%s" % name
if button_id != "": if button_id != "":
api_path += "&button_id=%s" % button_id api_path += "&button_id=%s" % button_id
client.request(SammiClient.Method.GET, api_path, "") client.request(SammiClient.Method.GET, api_path, "")
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.contains("error"): if res.contains("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return res return res
else: else:
return res["data"] return res["data"]
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return null return null
func set_variable(name: String, value: Variant, button_id) -> bool: func set_variable(name: String, value: Variant, button_id) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "setVariable", "request": "setVariable",
"name": name, "name": name,
"value": value, "value": value,
"button_id": button_id "button_id": button_id
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: Invalid JSON Returned. Body: %s" % response.body) push_error("Error: Invalid JSON Returned. Body: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func delete_variable(name: String, button_id) -> bool: func delete_variable(name: String, button_id) -> bool:
var api_path: String = "/api" % name var api_path: String = "/api" % name
var req: Dictionary = { var req: Dictionary = {
"request": "deleteVariable", "request": "deleteVariable",
"name": name, "name": name,
"button_id": button_id "button_id": button_id
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func insert_array(name: String, position: int, value: Variant, button_id: String) -> bool: func insert_array(name: String, position: int, value: Variant, button_id: String) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "insertArray", "request": "insertArray",
"name": name, "name": name,
"position": position, "position": position,
"value": value, "value": value,
"button_id": button_id "button_id": button_id
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func delete_array(name: String, position: int, button_id: String) -> bool: func delete_array(name: String, position: int, button_id: String) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "deleteArray", "request": "deleteArray",
"name": name, "name": name,
"position": position, "position": position,
"button_id": button_id "button_id": button_id
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func get_deck_status(deck_id: String) -> bool: func get_deck_status(deck_id: String) -> bool:
var api_path: String = "/api?request=getDeckStatus&deck_id=%s" % deck_id var api_path: String = "/api?request=getDeckStatus&deck_id=%s" % deck_id
client.request(SammiClient.Method.GET, api_path, "") client.request(SammiClient.Method.GET, api_path, "")
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("error"): if res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
return true return true
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func change_deck_status(deck_id: String, status: int) -> bool: func change_deck_status(deck_id: String, status: int) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "changeDeckStatus", "request": "changeDeckStatus",
"deck_id": deck_id, "deck_id": deck_id,
"status": status "status": status
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func trigger_button(button_id: String) -> bool: func trigger_button(button_id: String) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "triggerButton", "request": "triggerButton",
"button_id": button_id "button_id": button_id
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func release_button(button_id: String) -> bool: func release_button(button_id: String) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "releaseButton", "request": "releaseButton",
"button_id": button_id "button_id": button_id
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func modify_button(button_id: String, text: String = "", color: int = -1, image: String = "", border: int = -1) -> bool: func modify_button(button_id: String, text: String = "", color: int = -1, image: String = "", border: int = -1) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "modifyButton", "request": "modifyButton",
"button_id": button_id, "button_id": button_id,
} }
if text != "": if text != "":
req["text"] = text req["text"] = text
if color != -1: if color != -1:
req["color"] = color req["color"] = color
if image != "": if image != "":
req["image"] = image req["image"] = image
if border != -1: if border != -1:
req["border"] = border req["border"] = border
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func popup_message(message: String) -> bool: func popup_message(message: String) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "popupMessage", "request": "popupMessage",
"message": message "message": message
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func alert_message(message: String) -> bool: func alert_message(message: String) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "alertMessage", "request": "alertMessage",
"message": message "message": message
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func notification_message(message: String, title: String) -> bool: func notification_message(message: String, title: String) -> bool:
var api_path: String = "/api" var api_path: String = "/api"
var req: Dictionary = { var req: Dictionary = {
"request": "notificationMessage", "request": "notificationMessage",
"message": message, "message": message,
"title": title "title": title
} }
client.request(SammiClient.Method.POST, api_path, JSON.stringify(req)) client.request(SammiClient.Method.POST, api_path, JSON.stringify(req))
var response: SammiClient.SammiResponse = await client.request_completed var response: SammiClient.SammiResponse = await client.request_completed
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("data") and res["data"] == "Ok.": if res.has("data") and res["data"] == "Ok.":
return true return true
elif res.has("error"): elif res.has("error"):
push_error("Error: %s: %s" % [res["Error"], res["Description"]]) push_error("Error: %s: %s" % [res["Error"], res["Description"]])
last_error = res["Error"] last_error = res["Error"]
last_error_description = res["Description"] last_error_description = res["Description"]
return false return false
else: else:
push_error("Error: %s" % response.body) push_error("Error: %s" % response.body)
last_error = "Invalid JSON Returned" last_error = "Invalid JSON Returned"
last_error_description = response.body last_error_description = response.body
return false return false
else: else:
push_error("Error: %d: %s" % [response.code, response.error_message]) push_error("Error: %d: %s" % [response.code, response.error_message])
last_error = "HTTP Error: %d" % response.code last_error = "HTTP Error: %d" % response.code
last_error_description = response.error_message last_error_description = response.error_message
return false return false
func _on_request_completed(response: SammiClient.SammiResponse) -> void: func _on_request_completed(response: SammiClient.SammiResponse) -> void:
var resp: ApiResponse = ApiResponse.new() var resp: ApiResponse = ApiResponse.new()
if response.code == 200: if response.code == 200:
var res := JSON.parse_string(response.body) var res := JSON.parse_string(response.body)
if res.has("error"): if res.has("error"):
resp.error = res["Error"] resp.error = res["Error"]
resp.error_description = res["Description"] resp.error_description = res["Description"]
else: else:
resp.data = res["data"] resp.data = res["data"]
else: else:
resp.error = "HTTP Error: %d" % response.code resp.error = "HTTP Error: %d" % response.code
resp.error_description = response.error_message resp.error_description = response.error_message
request_completed.emit(resp) request_completed.emit(resp)
class ApiResponse: class ApiResponse:
var data: Variant var data: Variant
var error: String var error: String
var error_description: String var error_description: String

View file

@ -26,137 +26,137 @@ var method: Method = Method.GET
var body: String = "" var body: String = ""
enum State { enum State {
CONNECTING, CONNECTING,
REQUESTING, REQUESTING,
RESPONSE, RESPONSE,
ERROR, ERROR,
CLOSED CLOSED
} }
enum Method { enum Method {
GET, GET,
POST, POST,
} }
func request(method: Method, api_path: String, body: String) -> void: func request(method: Method, api_path: String, body: String) -> void:
assert(state == State.CLOSED, "A request is in the process of being made.") assert(state == State.CLOSED, "A request is in the process of being made.")
self.query = api_path self.query = api_path
self.body = body self.body = body
self.client = StreamPeerTCP.new() self.client = StreamPeerTCP.new()
self.client.connect_to_host(host, port) self.client.connect_to_host(host, port)
self.state = State.CONNECTING self.state = State.CONNECTING
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
if not client: if not client:
return return
if state == State.CLOSED: if state == State.CLOSED:
client.disconnect_from_host() client.disconnect_from_host()
client = null client = null
return return
client.poll() client.poll()
if client.get_status() == StreamPeerTCP.Status.STATUS_CONNECTED and state == State.CONNECTING: if client.get_status() == StreamPeerTCP.Status.STATUS_CONNECTED and state == State.CONNECTING:
state = State.REQUESTING state = State.REQUESTING
_send_request() _send_request()
elif client.get_status() == StreamPeerTCP.Status.STATUS_CONNECTED and state == State.REQUESTING: elif client.get_status() == StreamPeerTCP.Status.STATUS_CONNECTED and state == State.REQUESTING:
state = State.RESPONSE state = State.RESPONSE
_read_response() _read_response()
elif client.get_status() == StreamPeerTCP.Status.STATUS_CONNECTED and state == State.RESPONSE: elif client.get_status() == StreamPeerTCP.Status.STATUS_CONNECTED and state == State.RESPONSE:
_read_response() _read_response()
elif client.get_status() == StreamPeerTCP.Status.STATUS_ERROR: elif client.get_status() == StreamPeerTCP.Status.STATUS_ERROR:
state = State.ERROR state = State.ERROR
print("Error: ", client.get_error()) print("Error: ", client.get_error())
client.disconnect_from_host() client.disconnect_from_host()
client = null client = null
func _send_request() -> void: func _send_request() -> void:
var request_str = "" var request_str = ""
if method == Method.GET: if method == Method.GET:
request_str = "GET %s HTTP/1.1\r\n" % query request_str = "GET %s HTTP/1.1\r\n" % query
else: else:
request_str = "POST %s HTTP/1.1\r\n" % query request_str = "POST %s HTTP/1.1\r\n" % query
request_str += "Host: %s:%d\r\n" % [host, port] request_str += "Host: %s:%d\r\n" % [host, port]
request_str += "User-Agent: %s\r\n" % user_agent request_str += "User-Agent: %s\r\n" % user_agent
request_str += "Accept: */*\r\n" request_str += "Accept: */*\r\n"
if password != "": if password != "":
request_str += "Authorization: %s\r\n" % password request_str += "Authorization: %s\r\n" % password
if method == Method.POST and body != "": if method == Method.POST and body != "":
request_str += "Content-Type: application/json\r\n" request_str += "Content-Type: application/json\r\n"
request_str += "Content-Length: %d\r\n" % body.length() request_str += "Content-Length: %d\r\n" % body.length()
request_str += "\r\n" request_str += "\r\n"
if method == Method.POST and body != "": if method == Method.POST and body != "":
request_str += body request_str += body
client.put_data(request_str.to_utf8_buffer()) client.put_data(request_str.to_utf8_buffer())
func _read_response() -> void: func _read_response() -> void:
client.poll() client.poll()
if headers.size() == 0: if headers.size() == 0:
while true: while true:
var byte := client.get_partial_data(1) var byte := client.get_partial_data(1)
if byte[0] == OK and byte[1].size() == 0: if byte[0] == OK and byte[1].size() == 0:
await get_tree().process_frame await get_tree().process_frame
client.poll() client.poll()
continue continue
elif byte[0] == OK: elif byte[0] == OK:
buffer.push_back(byte[1][0]) buffer.push_back(byte[1][0])
else: else:
state = State.ERROR state = State.ERROR
print("Error reading response headers.") print("Error reading response headers.")
return return
if buffer.size() < 4: if buffer.size() < 4:
await get_tree().process_frame await get_tree().process_frame
client.poll() client.poll()
continue continue
if (buffer[-2] == 10 and buffer[-1] == 10) or \ if (buffer[-2] == 10 and buffer[-1] == 10) or \
(buffer[-4] == 13 and buffer[-3] == 10 and buffer[-2] == 13 and buffer[-1] == 10): (buffer[-4] == 13 and buffer[-3] == 10 and buffer[-2] == 13 and buffer[-1] == 10):
var data := buffer.get_string_from_utf8() var data := buffer.get_string_from_utf8()
buffer = [] buffer = []
headers = data.replace("\r", "").rstrip("\n\n").split("\n") headers = data.replace("\r", "").rstrip("\n\n").split("\n")
break break
await get_tree().process_frame await get_tree().process_frame
client.poll() client.poll()
if headers.size() == 0: if headers.size() == 0:
return return
var chunk := client.get_partial_data(1024) var chunk := client.get_partial_data(1024)
if chunk[0] == OK and chunk[1].size() > 0: if chunk[0] == OK and chunk[1].size() > 0:
buffer.append_array(chunk[1]) buffer.append_array(chunk[1])
else: else:
response = SammiResponse.new(headers, buffer, query) response = SammiResponse.new(headers, buffer, query)
request_completed.emit(response) request_completed.emit(response)
state = State.CLOSED state = State.CLOSED
class SammiResponse: class SammiResponse:
var code: int var code: int
var headers: Dictionary var headers: Dictionary
var body: String var body: String
var query: String var query: String
var error_message: String var error_message: String
func _init(p_headers: PackedStringArray, p_buffer: PackedByteArray, p_query: String) -> void: func _init(p_headers: PackedStringArray, p_buffer: PackedByteArray, p_query: String) -> void:
body = p_buffer.get_string_from_utf8() body = p_buffer.get_string_from_utf8()
headers = {} headers = {}
for line in p_headers: for line in p_headers:
if line.contains(": "): if line.contains(": "):
var parts := line.split(": ") var parts := line.split(": ")
headers[parts[0]] = parts[1] headers[parts[0]] = parts[1]
else: else:
var parts := Array(line.split(" ")) var parts := Array(line.split(" "))
if parts.pop_front() == "HTTP/1.1": if parts.pop_front() == "HTTP/1.1":
code = int(parts.pop_front()) code = int(parts.pop_front())
error_message = " ".join(parts) error_message = " ".join(parts)
else: else:
code = 500 code = 500
error_message = "Unknown Error" error_message = "Unknown Error"
query = p_query query = p_query