225 lines
7.1 KiB
C#
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 ? "已开启" : "已关闭";
|
|
}
|
|
}
|
|
}
|