Files
back_cantanBuilding/Assets/Scripts/UI/PartnerFishBowl/EventPartnerEntryButton.cs
2026-05-26 16:15:54 +08:00

175 lines
7.3 KiB
C#

using asap.core;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UniRx;
using GameCore;
using game;
using static EventPartnerData;
using System.Collections.Generic;
public class EventPartnerEntryButton : EventButtonResource
{
[SerializeField] private TMP_Text _textTimer;
[SerializeField] private Button _btn;
[SerializeField] CanvasGroup _homeCanvasGroup;
[SerializeField] private Image icon;
private readonly IUserService _userService = GContext.container.Resolve<IUserService>();
private void Awake()
{
// Debug.Log($"<color=#e23f31>[EventPartner] Icon Awake</color>");
GContext.OnEvent<EventPartnerDataLoaded>().Subscribe(_ => OnDataLoaded()).AddTo(this);
}
private void OnEnable()
{
var _data = GContext.container.Resolve<EventPartnerData>();
// _data.LogActivation();
//var manager = GContext.container.Resolve(Partainer)?
if (!_data.IsEventActivated)
{
gameObject.SetActive(false);
return;
}
_textTimer.text = ConvertTools.ConvertTime2(_data.RemainingTime);
RedPointManager.Instance.SetRedPointState("Home.Fishbowl", _data.DoNeedRedPoint);
Observable.Interval(System.TimeSpan.FromSeconds(1.0f)).Subscribe(_ =>
{
_textTimer.text = ConvertTools.ConvertTime2(_data.RemainingTime);
RedPointManager.Instance.SetRedPointState("Home.Fishbowl", _data.DoNeedRedPoint);
if (_data.RemainingTime.TotalSeconds <= 0) gameObject.SetActive(false);
}).AddTo(this);
// Debug.Log($"<color=#e23f31>icon: {_data.Icon}</color>");
CheckResource(new List<string>() { "EventPartnerCommonPrefabs", _data.AddressableLabel, _data.Icon });
}
private void Start()
{
_btn.onClick.AddListener(() => EnterEventPartnerAct());
}
private async void EnterEventPartnerAct()
{
try
{
var _data = GContext.container.Resolve<EventPartnerData>();
_homeCanvasGroup.blocksRaycasts = false;
var isWithinCoolDown = _data.LastDetailRequestFromEntranceButton != null
&& ZZTimeHelper.UtcNow() - _data.LastDetailRequestFromEntranceButton <= System.TimeSpan.FromSeconds(15);
if (!_data.IsWhole || !isWithinCoolDown)
{
_data.LastDetailRequestFromEntranceButton = ZZTimeHelper.UtcNow();
var dataRes = await LoadData();
if (!dataRes)
{
Debug.Log($"<color=red>[EventPartner] LoadData Failed.</color>");
ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_107"));
_homeCanvasGroup.blocksRaycasts = true;
_data.IsLastTimeDetailRequestFromEntranceButtonValid = false;
return;
}
_data.IsLastTimeDetailRequestFromEntranceButtonValid = true;
// else open panel.
}
else if (!_data.IsLastTimeDetailRequestFromEntranceButtonValid)
{
Debug.Log($"<color=red>[EventPartner] Too frequent.</color>");
ToastPanel.Show(LocalizationMgr.GetText("UI_ToastPanel_107"));
_homeCanvasGroup.blocksRaycasts = true;
return;
}
// Load resource and enter event act
_data.SubscribeEvent();
if (await LoadAssetBundle())
GContext.Publish(new UnloadActToNextAct("EventPartnerAct"));
else
{
var panel = await UIManager.Instance.ShowUI(UITypes.CloudTransitionPanel);
panel.GetComponent<CloudTransitionPanel>().SetBtn(true, () => GContext.Publish(new UnloadActToNextAct("EventPartnerAct")));
}
_homeCanvasGroup.blocksRaycasts = true;
}
catch (System.Exception e)
{
Debug.Log($"<color=#22a6f2>[EventPartner] EnterActError: {e.Message}\n{e.StackTrace}</color>");
throw;
}
}
private async System.Threading.Tasks.Task<bool> LoadData()
{
var _data = GContext.container.Resolve<EventPartnerData>();
var _playerPreferenceKey = "EventPartnerRecommendCache" + _userService.UserId;
//Load Player Preferences
var pfString = PlayFabMgr.Instance.GetLocalData(EventPartnerPlayfabData.Key);
EventPartnerPlayfabData pfData = EventPartnerPlayfabData.FromString(pfString);
Debug.Log($"<color=#2d7cee>[EventPartner] Try get response in load data from entrance:</color>");
var detailRequest = new EventBuildDetailRequest() { eventId = _data.EventId };
var response = await GContext.container.Resolve<ICustomServerMgr>()
.EventPartnerRequest<EventBuildDetailResp>(DetailUrl, detailRequest);
if (response == null)
{
Debug.Log($"<color=red>[EventPartner] No response. </color>");
return false;
}
Debug.Log($"<color=#2d7cee>[EventPartner] Response: {response}</color>");
Debug.Log($"<color=#2d7cee>[EventPartner] ResponseState: {response.State}</color>");
Debug.Log($"<color=#2d7cee>[EventPartner] ResponseMessage: {response.Message}</color>");
switch (response.State)
{
case EEventBuildState.Failed:
Debug.Log($"<color=red>[EventPartner] Load data error from server: {response.Message} </color>");
return false;
case EEventBuildState.NoActiveEvent:
Debug.Log($"<color=red>[EventPartner] Event partner not active in server: {response.Message}, but this is not supposed to happen any more.</color>");
return false;
case EEventBuildState.Success:
_data.ResolveAllDataButEvent(response, _data.Cache, pfData);
return true;
default:
Debug.Log($"<color=red>[EventPartner] Unexpected status: {response.State}./nMessage: {response.Message} </color>");
return false;
}
}
private async System.Threading.Tasks.Task<bool> LoadAssetBundle()
{
var _data = GContext.container.Resolve<EventPartnerData>();
var loadResourceService = GContext.container.Resolve<ILoadResourceService>();
var isCommentAssetLoaded = await loadResourceService.Load("EventPartnerCommonPrefabs");
var isCurrentAssetLoaded = await loadResourceService.Load(_data.AddressableLabel);
return isCommentAssetLoaded && isCurrentAssetLoaded;
}
private async void OnDataLoaded()
{
Debug.Log($"<color=#2d7cee>[EventPartner]On Loaded.</color>");
await Awaiters.NextFrame;
//gameObject.SetActive(true);
var _data = GContext.container.Resolve<EventPartnerData>();
CheckResource(new List<string>() { "EventPartnerCommonPrefabs", _data.AddressableLabel, _data.Icon });
}
protected override void OnLoadEventResource()
{
var _data = GContext.container.Resolve<EventPartnerData>();
if (_data == null)
{
Debug.LogError("EventPartnerEntryButton EventPartnerData 为空");
return;
}
// _data.LogActivation();
if (_data.IsEventActivated)
{
GContext.container.Resolve<IUIService>().SetImageSprite(icon, _data.Icon);
gameObject.SetActive(true);
}
}
}
public class EventPartnerDataLoaded { }