106 lines
3.1 KiB
GDScript
106 lines
3.1 KiB
GDScript
extends Control
|
|
|
|
@onready var token_input = $VBoxContainer/HBoxContainer/TokenInput
|
|
@onready var status_label = $VBoxContainer/ConnectionStatusLabel
|
|
@onready var location_name_label = $VBoxContainer/LocationNameLabel
|
|
@onready var location_image = $VBoxContainer/LocationImage
|
|
@onready var location_desc_label = $VBoxContainer/LocationDescriptionLabel
|
|
@onready var log_label = $VBoxContainer/LogLabel
|
|
|
|
var socket = WebSocketPeer.new()
|
|
var http_request : HTTPRequest
|
|
var is_connected_to_host = false
|
|
|
|
func _ready():
|
|
log_message("Godot PoC Started")
|
|
http_request = HTTPRequest.new()
|
|
add_child(http_request)
|
|
http_request.request_completed.connect(_on_image_request_completed)
|
|
|
|
func _process(delta):
|
|
socket.poll()
|
|
var state = socket.get_ready_state()
|
|
|
|
if state == WebSocketPeer.STATE_OPEN:
|
|
if not is_connected_to_host:
|
|
is_connected_to_host = true
|
|
status_label.text = "Status: Connected"
|
|
log_message("WebSocket Connected!")
|
|
|
|
while socket.get_available_packet_count():
|
|
var packet = socket.get_packet()
|
|
var data = packet.get_string_from_utf8()
|
|
var json = JSON.new()
|
|
var error = json.parse(data)
|
|
if error == OK:
|
|
handle_message(json.get_data())
|
|
else:
|
|
log_message("Error parsing JSON: " + data)
|
|
|
|
elif state == WebSocketPeer.STATE_CLOSED:
|
|
if is_connected_to_host:
|
|
is_connected_to_host = false
|
|
status_label.text = "Status: Disconnected"
|
|
log_message("WebSocket Disconnected")
|
|
|
|
func _on_connect_button_pressed():
|
|
var token = token_input.text.strip_edges()
|
|
if token == "":
|
|
log_message("Please enter a token.")
|
|
return
|
|
|
|
var url = "wss://api-staging.echoesoftheash.com/ws/game/" + token
|
|
log_message("Connecting to: " + url)
|
|
var err = socket.connect_to_url(url)
|
|
if err != OK:
|
|
log_message("Error connecting to URL: " + str(err))
|
|
else:
|
|
status_label.text = "Status: Connecting..."
|
|
|
|
func handle_message(msg):
|
|
# log_message("Received: " + str(msg.get("type")))
|
|
|
|
if msg.get("type") == "location_update":
|
|
var data = msg.get("data", {})
|
|
var location = data.get("location", {})
|
|
|
|
if location:
|
|
update_location_ui(location)
|
|
|
|
func update_location_ui(location):
|
|
location_name_label.text = location.get("name", "Unknown Location")
|
|
location_desc_label.text = location.get("description", "")
|
|
|
|
var image_url = location.get("image_url", "")
|
|
if image_url != "":
|
|
fetch_image(image_url)
|
|
|
|
func fetch_image(url):
|
|
if url.begins_with("/"):
|
|
url = "https://api-staging.echoesoftheash.com" + url
|
|
|
|
log_message("Fetching image: " + url)
|
|
http_request.cancel_request()
|
|
http_request.request(url)
|
|
|
|
func _on_image_request_completed(result, response_code, headers, body):
|
|
if result == HTTPRequest.RESULT_SUCCESS:
|
|
var image = Image.new()
|
|
var error = image.load_png_from_buffer(body)
|
|
if error != OK:
|
|
error = image.load_jpg_from_buffer(body)
|
|
if error != OK:
|
|
error = image.load_webp_from_buffer(body)
|
|
|
|
if error == OK:
|
|
var texture = ImageTexture.create_from_image(image)
|
|
location_image.texture = texture
|
|
else:
|
|
log_message("Failed to load image texture")
|
|
else:
|
|
log_message("Failed to fetch image. Code: " + str(response_code))
|
|
|
|
func log_message(text):
|
|
print(text)
|
|
log_label.text += text + "\n"
|