Files

225 lines
7.1 KiB
C#

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<Text>();
if (toggleLabel != null)
{
toggleLabel.text = isOn ? "已开启" : "已关闭";
}
}
}