feat: overhaul the nakama user management, leaderboard, prep for 2.1

This commit is contained in:
2026-04-03 04:50:18 +08:00
parent 47f88d31dc
commit e1a3ef8e85
318 changed files with 1933 additions and 1099 deletions
+27
View File
@@ -19,6 +19,7 @@ signal profile_updated
@onready var high_score_label := %HighScore as Label
@onready var account_type_label := %AccountType as Label
@onready var link_account_btn := %LinkAccountBtn as Button
@onready var admin_panel_btn := %AdminPanelBtn as Button
@onready var logout_btn := %LogoutBtn as Button
@onready var status_label := %StatusLabel as Label
@onready var avatar_popup := %AvatarSelectionPopup as PopupPanel
@@ -62,6 +63,7 @@ func _connect_signals() -> void:
change_avatar_btn.pressed.connect(_on_change_avatar_pressed)
save_name_btn.pressed.connect(_on_save_name_pressed)
link_account_btn.pressed.connect(_on_link_account_pressed)
admin_panel_btn.pressed.connect(_on_admin_panel_pressed)
logout_btn.pressed.connect(_on_logout_pressed)
char_left_btn.pressed.connect(func(): _cycle_loadout_char(-1))
char_right_btn.pressed.connect(func(): _cycle_loadout_char(1))
@@ -284,6 +286,12 @@ func _on_logout_pressed() -> void:
AuthManager.logout()
get_tree().change_scene_to_file("res://scenes/ui/login_screen.tscn")
func _on_admin_panel_pressed() -> void:
if has_node("/root/AdminManager"):
get_node("/root/AdminManager").toggle_admin_panel()
else:
AdminManager.toggle_admin_panel()
# -------------------------------------------------------------------------
# Close / Show
# -------------------------------------------------------------------------
@@ -294,8 +302,27 @@ func _on_close_pressed() -> void:
func show_panel() -> void:
_load_profile_data()
_load_loadout()
_check_admin_visibility()
show()
func _check_admin_visibility() -> void:
admin_panel_btn.hide()
if not NakamaManager.client or not NakamaManager.session:
return
# Use native Nakama account API to check user metadata for admin role
var account = await NakamaManager.client.get_account_async(NakamaManager.session)
if account.is_exception():
return
# Check account metadata for role
var metadata_str: String = account.user.metadata if account.user.metadata else "{}"
var metadata = JSON.parse_string(metadata_str)
if metadata and metadata is Dictionary:
var role = metadata.get("role", "")
if role in ["owner", "admin"]:
admin_panel_btn.show()
# -------------------------------------------------------------------------
# Signal handlers
# -------------------------------------------------------------------------