Files
spacel/scripts/online_leaderboard.gd
T
alpacaman edc40f9008 Initial commit — Godot space roguelite source
- Touch controls: direct InputEventScreenTouch in shop_ui (bypass relay)
- ItemDB: static preload list instead of DirAccess scan (export fix)
- All 18 items with EN localisation (name_en, desc_en, category_en)
- Ship playstyles: NOVA-1 shield, INFERNO ram, AURORA agile/tank
- Quasar: SMBH visual, jet boost, merge, push, BH-eating
- Atlas & UI text updated EN+DE

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 14:38:09 +02:00

65 lines
1.7 KiB
GDScript

extends Node
# Change SERVER_URL to your server address before deploying.
# Set the same HMAC_SECRET on the server via env var SPACEL_SECRET.
const SERVER_URL := "https://lb.alpacaman.de"
const HMAC_SECRET := "63f4945d921d599f27ae4fdf5bada3f1"
signal scores_fetched(scores: Array, error: String)
signal submit_done(ok: bool)
var _http: HTTPRequest
var _mode: String = ""
func _ready() -> void:
_http = HTTPRequest.new()
add_child(_http)
_http.request_completed.connect(_on_completed)
func fetch_scores() -> void:
if _mode != "":
return
_mode = "fetch"
_http.request(SERVER_URL + "/scores")
func submit_score(player_name: String, score: int, wave: int) -> void:
if _mode != "":
return
var ts := int(Time.get_unix_time_from_system())
var raw := player_name + str(score) + str(wave) + str(ts)
var hmac := Crypto.new().hmac_digest(
HashingContext.HASH_SHA256,
HMAC_SECRET.to_utf8_buffer(),
raw.to_utf8_buffer()
).hex_encode()
var body := JSON.stringify({
"name": player_name,
"score": score,
"wave": wave,
"timestamp": ts,
"hmac": hmac
})
_mode = "submit"
_http.request(
SERVER_URL + "/scores",
PackedStringArray(["Content-Type: application/json"]),
HTTPClient.METHOD_POST,
body
)
func _on_completed(result: int, code: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
var ok := result == HTTPRequest.RESULT_SUCCESS and code == 200
if _mode == "fetch":
if ok:
var json := JSON.new()
if json.parse(body.get_string_from_utf8()) == OK:
var data = json.get_data()
if data is Array:
scores_fetched.emit(data as Array, "")
_mode = ""
return
scores_fetched.emit([], "lb_error")
elif _mode == "submit":
submit_done.emit(ok)
_mode = ""