feat: add dailylogin feature
This commit is contained in:
+117
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user