using System; using Bansonic; using GameServer.Client; using UnityEngine; using UnityEngine.UI; public class gameSettings : MonoBehaviour { [Header("multiNotesSigns")] public Toggle multiNoteNoticeToggle; public Text multiNoteNoticeText; [Header("joinRankingList")] public Toggle user_accept_joinRankingList; public Text jrlWarningText; private const string PrefKeyEnableSyncNotePrefab = "EnableSyncNotePrefab"; private bool _isUpdatingJoinRankingToggle; private void Awake() { if (multiNoteNoticeToggle != null) { multiNoteNoticeToggle.onValueChanged.RemoveListener(HandleMultiNoteNoticeToggleChanged); multiNoteNoticeToggle.onValueChanged.AddListener(HandleMultiNoteNoticeToggleChanged); } if (user_accept_joinRankingList != null) { user_accept_joinRankingList.onValueChanged.RemoveListener(HandleJoinRankingListToggleChanged); user_accept_joinRankingList.onValueChanged.AddListener(HandleJoinRankingListToggleChanged); } } private void OnEnable() { RefreshMultiNoteNoticeState(); _ = RefreshJoinRankingStateFromServerAsync(); } private void OnDestroy() { if (multiNoteNoticeToggle != null) { multiNoteNoticeToggle.onValueChanged.RemoveListener(HandleMultiNoteNoticeToggleChanged); } if (user_accept_joinRankingList != null) { user_accept_joinRankingList.onValueChanged.RemoveListener(HandleJoinRankingListToggleChanged); } } private void RefreshMultiNoteNoticeState() { if (multiNoteNoticeToggle == null) { return; } bool isEnabled = PlayerPrefs.GetInt(PrefKeyEnableSyncNotePrefab, 1) == 1; multiNoteNoticeToggle.SetIsOnWithoutNotify(isEnabled); UpdateText(isEnabled); } private async Awaitable RefreshJoinRankingStateFromServerAsync() { if (user_accept_joinRankingList == null) { return; } try { NetworkManager nm = NetworkManager.Instance; if (nm == null) { RefreshJoinRankingListStateFromLocal(); await RefreshJoinRankingWarningTextAsync(null); return; } LeaderboardMembershipResponse resp = await nm.GetLeaderboardMembership(); bool isJoined = resp != null ? resp.is_joined : LeaderboardConsentUtility.HasLeaderboardConsent(); LeaderboardConsentUtility.SetLeaderboardConsent(isJoined); _isUpdatingJoinRankingToggle = true; user_accept_joinRankingList.SetIsOnWithoutNotify(isJoined); _isUpdatingJoinRankingToggle = false; await RefreshJoinRankingWarningTextAsync(resp); } catch (Exception ex) { Debug.LogWarning($"[gameSettings] Failed to refresh leaderboard membership state: {ex.Message}"); RefreshJoinRankingListStateFromLocal(); await RefreshJoinRankingWarningTextAsync(null); } } private void RefreshJoinRankingListStateFromLocal() { if (user_accept_joinRankingList == null) { return; } _isUpdatingJoinRankingToggle = true; user_accept_joinRankingList.SetIsOnWithoutNotify(LeaderboardConsentUtility.HasLeaderboardConsent()); _isUpdatingJoinRankingToggle = false; } private async Awaitable RefreshJoinRankingWarningTextAsync(LeaderboardMembershipResponse membership) { if (jrlWarningText == null) { return; } if (membership != null && membership.changed_today && !string.IsNullOrWhiteSpace(membership.next_change_at)) { jrlWarningText.text = BuildChangeCooldownText(membership.next_change_at); return; } jrlWarningText.text = "下次排行榜更新时间:正在获取..."; try { jrlWarningText.text = membership != null && !string.IsNullOrWhiteSpace(membership.next_settle_at) ? "下次排行榜更新时间:" + membership.next_settle_at : await LeaderboardConsentUtility.BuildNextSettleWarningTextAsync(); } catch (Exception ex) { Debug.LogWarning($"[gameSettings] Failed to refresh ranking warning text: {ex.Message}"); jrlWarningText.text = "下次排行榜更新时间:--"; } } private static string BuildChangeCooldownText(string nextChangeAt) { if (DateTime.TryParse(nextChangeAt, out DateTime parsed)) { return $"{parsed.Hour}时{parsed.Minute:D2}分后可切换"; } return "今日已切换"; } private void HandleMultiNoteNoticeToggleChanged(bool isOn) { PlayerPrefs.SetInt(PrefKeyEnableSyncNotePrefab, isOn ? 1 : 0); PlayerPrefs.Save(); UpdateText(isOn); } private async void HandleJoinRankingListToggleChanged(bool isOn) { if (_isUpdatingJoinRankingToggle) { return; } try { NetworkManager nm = NetworkManager.Instance; if (nm == null) { LeaderboardConsentUtility.SetLeaderboardConsent(isOn); await RefreshJoinRankingWarningTextAsync(null); return; } LeaderboardMembershipResponse resp = await nm.UpdateLeaderboardMembership(isOn); bool finalJoined = resp != null ? resp.is_joined : isOn; LeaderboardConsentUtility.SetLeaderboardConsent(finalJoined); _isUpdatingJoinRankingToggle = true; user_accept_joinRankingList.SetIsOnWithoutNotify(finalJoined); _isUpdatingJoinRankingToggle = false; if (resp != null && !resp.success) { if (!string.IsNullOrWhiteSpace(resp.next_change_at)) { gNotice.warning.display(BuildChangeCooldownText(resp.next_change_at)); } else if (!string.IsNullOrWhiteSpace(resp.message)) { gNotice.warning.display(resp.message); } } await RefreshJoinRankingWarningTextAsync(resp); } catch (Exception ex) { Debug.LogWarning($"[gameSettings] Failed to update leaderboard membership: {ex.Message}"); gNotice.error.display("排行榜加入状态更新失败"); RefreshJoinRankingListStateFromLocal(); await RefreshJoinRankingWarningTextAsync(null); } } private void UpdateText(bool isOn) { if (multiNoteNoticeText != null) { multiNoteNoticeText.text = isOn ? "已开启多押提示音符同步显示" : "已关闭多押提示音符同步显示"; } if (multiNoteNoticeToggle == null) { return; } Text toggleLabel = multiNoteNoticeToggle.GetComponentInChildren(); if (toggleLabel != null) { toggleLabel.text = isOn ? "已开启" : "已关闭"; } } }