61 lines
1.9 KiB
GDScript
61 lines
1.9 KiB
GDScript
extends Node
|
|
|
|
signal dashboard_changed
|
|
signal dashboard_failed(message: String)
|
|
|
|
const EndpointConfig := preload("res://scripts/autoload/api_endpoint_config.gd")
|
|
const DEFAULT_URL := "https://us3q.ranaze.com/api/dashboard"
|
|
|
|
var data: Dictionary = {}
|
|
var loading := false
|
|
var request: HTTPRequest
|
|
var request_token := ""
|
|
var api_url := DEFAULT_URL
|
|
|
|
|
|
func _ready() -> void:
|
|
api_url = EndpointConfig.resolve(
|
|
str(ProjectSettings.get_setting("step3/dashboard_api_url", DEFAULT_URL)),
|
|
"/api/dashboard")
|
|
request = HTTPRequest.new()
|
|
request.timeout = 20.0
|
|
request.request_completed.connect(_on_completed)
|
|
add_child(request)
|
|
AuthState.auth_changed.connect(_on_auth_changed)
|
|
|
|
|
|
func refresh() -> void:
|
|
if loading or not AuthState.can_send_authenticated_request():
|
|
return
|
|
loading = true
|
|
request_token = AuthState.access_token
|
|
var headers := PackedStringArray(["Authorization: Bearer %s" % request_token])
|
|
var error := request.request(api_url, headers, HTTPClient.METHOD_GET)
|
|
if error != OK:
|
|
loading = false
|
|
dashboard_failed.emit("Dashboard data could not be loaded. Check your connection and try again.")
|
|
|
|
|
|
func _on_completed(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
|
|
loading = false
|
|
if response_code == 401:
|
|
AuthState.handle_unauthorized(request_token)
|
|
return
|
|
if result != HTTPRequest.RESULT_SUCCESS or response_code < 200 or response_code >= 300:
|
|
dashboard_failed.emit("Dashboard data could not be loaded. Check your connection and try again.")
|
|
return
|
|
var parsed: Variant = JSON.parse_string(body.get_string_from_utf8())
|
|
if typeof(parsed) != TYPE_DICTIONARY:
|
|
dashboard_failed.emit("The dashboard service returned an invalid response.")
|
|
return
|
|
data = parsed
|
|
dashboard_changed.emit()
|
|
|
|
|
|
func _on_auth_changed() -> void:
|
|
if not AuthState.is_logged_in:
|
|
data = {}
|
|
loading = false
|
|
if request.get_http_client_status() != HTTPClient.STATUS_DISCONNECTED:
|
|
request.cancel_request()
|