feat: 2.3.1

This commit is contained in:
2026-05-11 17:24:47 +08:00
parent 57e56412e0
commit 13f3c3d591
733 changed files with 17957 additions and 798 deletions
+79
View File
@@ -36,6 +36,17 @@ signal closed
var _daily_reward_config_data: Dictionary = {}
var _current_dr_month: String = ""
# Tab: Announcements
@onready var target_user_edit := %TargetUserEdit as LineEdit
@onready var title_edit := %TitleEdit as LineEdit
@onready var content_edit := %ContentEdit as TextEdit
@onready var start_date_edit := %StartDatePicker as Button
@onready var end_date_edit := %EndDatePicker as Button
@onready var add_reward_btn := %AddRewardBtn as Button
@onready var rewards_list := %RewardsList as VBoxContainer
@onready var reward_row_template := %RewardRowTemplate as HBoxContainer
@onready var send_mail_btn := %SendMailBtn as Button
const MONTH_NAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
# -- Data --
@@ -151,6 +162,10 @@ func _connect_signals() -> void:
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)
# Announcement actions
send_mail_btn.pressed.connect(_on_send_mail)
add_reward_btn.pressed.connect(_on_add_reward_pressed)
# =============================================================================
# Core Panel Logic
@@ -623,3 +638,67 @@ func _save_daily_rewards_config() -> void:
_set_status("Save failed: " + res.get("error"), CLR_STATUS_ERR)
else:
_set_status("Config saved successfully!", CLR_STATUS_OK)
# =============================================================================
# TAB 4: ANNOUNCEMENTS
# =============================================================================
func _on_add_reward_pressed() -> void:
var row = reward_row_template.duplicate()
row.visible = true
rewards_list.add_child(row)
var remove_btn = row.get_node("RemoveBtn") as Button
remove_btn.pressed.connect(func(): row.queue_free())
func _on_send_mail() -> void:
var target = target_user_edit.text.strip_edges()
var title = title_edit.text.strip_edges()
var content = content_edit.text.strip_edges()
var start_date = start_date_edit.get_date_iso()
var end_date = end_date_edit.get_date_iso()
if title.is_empty() or content.is_empty():
_set_status("Title and content cannot be empty", CLR_STATUS_ERR)
return
var rewards_arr = []
for child in rewards_list.get_children():
if not child.visible: continue # skip template
var type_opt = child.get_node("TypeOption") as OptionButton
var id_edit = child.get_node("IdEdit") as LineEdit
var amount_spin = child.get_node("AmountSpin") as SpinBox
var type_str = type_opt.get_item_text(type_opt.selected)
var r_id = id_edit.text.strip_edges()
rewards_arr.append({
"type": type_str,
"id": r_id,
"amount": int(amount_spin.value)
})
send_mail_btn.disabled = true
_set_status("Sending mail...")
var payload = {
"target_user_id": target,
"title": title,
"content": content,
"start_date": start_date,
"end_date": end_date,
"rewards": rewards_arr
}
var res = await _rpc("admin_send_mail", payload)
send_mail_btn.disabled = false
if res.has("error"):
_set_status("Failed to send mail: " + res.get("error", "Unknown"), CLR_STATUS_ERR)
else:
_set_status("Mail sent successfully!", CLR_STATUS_OK)
title_edit.text = ""
content_edit.text = ""
if start_date_edit.has_method("clear_date"):
start_date_edit.clear_date()
if end_date_edit.has_method("clear_date"):
end_date_edit.clear_date()
for child in rewards_list.get_children():
if child.visible: child.queue_free()