feat : update backend

This commit is contained in:
2026-04-08 03:12:55 +08:00
parent 7e22f48c57
commit e222cc49ee
11 changed files with 619 additions and 935 deletions
+52 -4
View File
@@ -86,6 +86,11 @@ func load_profile() -> Dictionary:
is_profile_loaded = true
emit_signal("profile_loaded", profile)
print("[UserProfileManager] Profile loaded: ", profile.display_name)
# Auto-sync existing score to native Nakama leaderboard in background
if stats.get("high_score", 0) > 0 and NakamaManager.session and not AuthManager.is_guest:
_submit_to_leaderboard.call_deferred()
return profile
func load_stats() -> Dictionary:
@@ -135,15 +140,16 @@ func update_display_name(new_name: String) -> bool:
emit_signal("profile_update_failed", "Name can only contain letters, numbers, and spaces")
return false
# Allow guest name updates locally
if not NakamaManager.session or AuthManager.is_guest:
# Offline fallback (no session)
if not NakamaManager.session:
profile["display_name"] = new_name
emit_signal("profile_updated")
return true
var formatted_username = new_name.replace(" ", "_").to_lower()
var result: NakamaAsyncResult = await NakamaManager.client.update_account_async(
NakamaManager.session,
null, # username (don't change)
formatted_username, # username (sync to display name)
new_name # display_name
)
@@ -168,10 +174,24 @@ func update_avatar(avatar_index: int) -> bool:
profile["avatar_index"] = avatar_index
profile["avatar_url"] = AVATARS[avatar_index]
# Update native avatar URL for the leaderboard
var avatar_url = AVATARS[avatar_index]
var result = await NakamaManager.client.update_account_async(
NakamaManager.session, null, null, avatar_url
)
if result.is_exception():
emit_signal("profile_update_failed", "Failed to update native avatar")
return false
var success := await _save_profile_data()
if success:
emit_signal("avatar_changed", AVATARS[avatar_index])
emit_signal("avatar_changed", avatar_url)
emit_signal("profile_updated")
# Immediately update leaderboard with new avatar
if stats.get("high_score", 0) > 0:
_submit_to_leaderboard.call_deferred()
return success
@@ -255,6 +275,34 @@ func record_game_result(won: bool, score: int) -> void:
stats["high_score"] = score
await update_stats(stats)
# Also submit to Nakama native leaderboard so global_high_score is populated
await _submit_to_leaderboard()
func _submit_to_leaderboard() -> void:
"""Submits the current high_score via server RPC (required for authoritative leaderboards)."""
if not NakamaManager.session:
return
if stats.get("high_score", 0) <= 0:
return
var payload = JSON.stringify({
"score": int(stats.get("high_score", 0)),
"games_played": int(stats.get("games_played", 0)),
"games_won": int(stats.get("games_won", 0)),
"avatar_url": profile.get("avatar_url", "")
})
var result = await NakamaManager.client.rpc_async(
NakamaManager.session,
"submit_score",
payload
)
if result.is_exception():
push_warning("[UserProfileManager] Leaderboard RPC failed: ", result.get_exception().message)
else:
print("[UserProfileManager] Leaderboard score submitted: ", stats.get("high_score", 0))
# =============================================================================
# Getters