feat: add dailylogin feature

This commit is contained in:
2026-05-01 05:07:54 +08:00
parent 54be7bbb25
commit 21875cdf8a
17 changed files with 1262 additions and 34 deletions
+117 -2
View File
@@ -26,6 +26,18 @@ signal closed
@onready var sync_lb_btn := %SyncLeaderboardBtn as Button
@onready var reset_lb_btn := %ResetLBBtn as Button
# Tab: Daily Rewards
@onready var month_option_btn := %MonthOptionBtn as OptionButton
@onready var days_grid := %DaysGrid as GridContainer
@onready var day_config_template := %DayConfigTemplate as VBoxContainer
@onready var load_dr_btn := %LoadDRConfigBtn as Button
@onready var save_dr_btn := %SaveDRConfigBtn as Button
var _daily_reward_config_data: Dictionary = {}
var _current_dr_month: String = ""
const MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
# -- Data --
var all_users: Array = []
var lb_data: Array = []
@@ -62,7 +74,7 @@ func _apply_plain_style() -> void:
count_label.add_theme_color_override("font_color", CLR_HEADER)
status_label.add_theme_color_override("font_color", CLR_DIM)
for btn: Button in [refresh_btn, close_btn, select_all_btn, deselect_btn]:
for btn: Button in [refresh_btn, close_btn, select_all_btn, deselect_btn, load_dr_btn, save_dr_btn]:
_style_button(btn, Color(0.2, 0.2, 0.24), CLR_TEXT)
_style_button(ban_btn, Color(0.3, 0.2, 0.1), CLR_BTN_BAN)
_style_button(unban_btn, Color(0.1, 0.22, 0.1), CLR_BTN_UNBAN)
@@ -134,6 +146,11 @@ func _connect_signals() -> void:
# LB actions
lb_tree.button_clicked.connect(_on_lb_tree_button_clicked)
sync_lb_btn.pressed.connect(_on_sync_leaderboard)
# DR actions
load_dr_btn.pressed.connect(_load_daily_rewards_config)
save_dr_btn.pressed.connect(_save_daily_rewards_config)
month_option_btn.item_selected.connect(_on_dr_month_selected)
# =============================================================================
# Core Panel Logic
@@ -153,8 +170,10 @@ func _on_tab_changed(tab_index: int) -> void:
_set_status("")
if tab_index == 0:
await _load_users()
else:
elif tab_index == 1:
await _load_leaderboard()
elif tab_index == 2:
await _load_daily_rewards_config()
# =============================================================================
# RPC Helper
@@ -508,3 +527,99 @@ func _get_edit_icon() -> Texture2D:
img.set_pixel(i, 11 - i + 4, CLR_TEXT)
img.set_pixel(i, 12 - i + 4, CLR_TEXT)
return ImageTexture.create_from_image(img)
# =============================================================================
# TAB 3: DAILY REWARDS
# =============================================================================
func _load_daily_rewards_config() -> void:
_set_status("Loading Daily Rewards Config...")
var res := await _rpc("get_daily_reward_config_admin", {})
if res.has("error"):
_set_status("Failed to load DR config", CLR_STATUS_ERR)
return
var config = res.get("config", {})
if config.is_empty():
for m in range(1, 13):
var m_str = "%02d" % m
var arr = []
for d in range(30):
arr.append({"type": "star", "amount": min(10 + d*5, 100)})
config[m_str] = arr
_daily_reward_config_data = config
month_option_btn.clear()
for i in range(1, 13):
month_option_btn.add_item(MONTH_NAMES[i - 1])
month_option_btn.set_item_metadata(i - 1, "%02d" % i)
if not _daily_reward_config_data.is_empty():
_current_dr_month = "01"
month_option_btn.select(0)
_build_dr_grid()
_set_status("Config Loaded", CLR_STATUS_OK)
func _on_dr_month_selected(index: int) -> void:
# Save current grid values into the dictionary before switching
_save_current_grid_to_dict()
_current_dr_month = month_option_btn.get_item_metadata(index)
_build_dr_grid()
func _save_current_grid_to_dict() -> void:
if _current_dr_month.is_empty(): return
var arr = []
for child in days_grid.get_children():
if child != day_config_template:
var opt = child.get_node("Margin/VBox/TypeOptionBtn") as OptionButton
var spin = child.get_node("Margin/VBox/AmountSpinBox") as SpinBox
var item_type = opt.get_item_text(opt.selected) if opt.selected >= 0 else "star"
arr.append({"type": item_type, "amount": int(spin.value)})
if not arr.is_empty():
_daily_reward_config_data[_current_dr_month] = arr
func _build_dr_grid() -> void:
for child in days_grid.get_children():
if child != day_config_template:
child.queue_free()
var arr = _daily_reward_config_data.get(_current_dr_month, [])
for i in range(arr.size()):
var slot = day_config_template.duplicate()
slot.visible = true
days_grid.add_child(slot)
var lbl = slot.get_node("Margin/VBox/DayLabel") as Label
var opt = slot.get_node("Margin/VBox/TypeOptionBtn") as OptionButton
var spin = slot.get_node("Margin/VBox/AmountSpinBox") as SpinBox
lbl.text = "Day " + str(i + 1)
var rdata = arr[i]
if typeof(rdata) == TYPE_DICTIONARY:
spin.value = rdata.get("amount", 0)
var type_str = rdata.get("type", "star")
var found = false
for j in range(opt.item_count):
if opt.get_item_text(j) == type_str:
opt.select(j)
found = true
break
if not found:
opt.add_item(type_str)
opt.select(opt.item_count - 1)
else:
# Fallback for old int format
spin.value = int(rdata)
opt.select(0)
func _save_daily_rewards_config() -> void:
_save_current_grid_to_dict()
_set_status("Saving config...")
var req = { "config": _daily_reward_config_data }
var res = await _rpc("set_daily_reward_config", req)
if res.has("error"):
_set_status("Save failed: " + res.get("error"), CLR_STATUS_ERR)
else:
_set_status("Config saved successfully!", CLR_STATUS_OK)