using System; using System.Collections.Generic; using System.Linq; using EnhancedUI.EnhancedScroller; using UnityEngine; using ScrollViewItemInfo = EventPartnerScrollViewItem.ScrollViewItemInfo; using EScrollViewType = EventPartnerScrollViewItem.EScrollViewType; using asap.core; using Castle.Core.Internal; using game; using GameCore; using UniRx; using UnityEngine.UI; public class EventPartnerInvitedPanel : MonoBehaviour, IEnhancedScrollerDelegate { private readonly ICustomServerMgr _customServerMgr = GContext.container.Resolve(); private readonly EventPartnerData _eventPartnerData = GContext.container.Resolve(); private readonly IUserService _userService = GContext.container.Resolve(); [SerializeField] private Button btnClose; private readonly string PlayerFullKey = "UI_ToastPanel_80", PartnerFullKey = "UI_ToastPanel_99"; private async void Start() { btnClose.onClick.AddListener(OnClickClose); await InitScrollView(); EventPartnerAct.Ctx.EventAggregator.GetEvent() .Subscribe(e => _ = OnAccept(e.Info)).AddTo(this); EventPartnerAct.Ctx.EventAggregator.GetEvent() .Subscribe(e => _ = OnIgnore(e.Info.PlayfabId)).AddTo(this); } private void HideBtn() { EventPartnerAct.Ctx.EventAggregator.Publish(new EventPartnerHideApplicationBtn()); } private void OnClickClose() { UIManager.Instance.DestroyUI(UITypes.EventPartnerInvitedPanel); } #region ScrollView [SerializeField] private EnhancedScroller scrollView; [SerializeField] private float jiandaItemHeight = 150f; [SerializeField] private EventPartnerScrollViewItem scrollViewItemPrefab; private List _itemInfos = new List(); private async System.Threading.Tasks.Task InitScrollView() { await RequestItemInfo(); var invitationList = _eventPartnerData.RequestPartners.ToList(); // foreach (Transform child in scrollView.transform) // { // Destroy(child.gameObject); // } scrollView.Delegate = this; scrollView.ReloadData(); } public int GetNumberOfCells(EnhancedScroller scroller) { return _itemInfos.Count; } public float GetCellViewSize(EnhancedScroller scroller, int dataIndex) { return jiandaItemHeight; } public EnhancedScrollerCellView GetCellView(EnhancedScroller scroller, int dataIndex, int cellIndex) { var info = _itemInfos[dataIndex]; if (scroller.GetCellView(scrollViewItemPrefab) is not EventPartnerScrollViewItem cellView) { Debug.Log("[EventPartner] Cell view is null."); return null; } cellView.Init(info); return cellView; } private async System.Threading.Tasks.Task OnAccept(ScrollViewItemInfo info) { if (_eventPartnerData.IsFullyMatched) { Debug.Log($"[EventPartner]Cannot accept. Fully matched."); ToastPanel.Show(LocalizationMgr.GetText(PlayerFullKey)); return; } var request = new EventPartnerData.EventBuildPartnerRequest { partnerId = info.PlayfabId, eventId = _eventPartnerData.EventId}; try { var response = await _customServerMgr.EventPartnerRequest(EventPartnerData.AcceptUrl, request); if (response.State != EventPartnerData.EEventBuildState.Success) { Debug.Log($"[EventPartner]{response.State}: {response.ErrorMessage}"); ToastPanel.Show(LocalizationMgr.GetText(PartnerFullKey)); } else { var idx = response.SlotId ?? throw new Exception($"Null slot id for {info.DisplayName}"); _eventPartnerData.Components[idx].SetComponent(info); _ = EventPartnerAct.Ctx.ShowMainPanel(true, info.DisplayName, info.AvatarUrl, _eventPartnerData.Components[idx].GetComponentName()); } for (int i = 0; i < _itemInfos.Count; i++) { if (_itemInfos[i].PlayfabId != info.PlayfabId) continue; _itemInfos.RemoveAt(i); break; } _eventPartnerData.Cache.ListInvitedBy = _eventPartnerData.Cache.ListInvitedBy.Where(i => i.PlayfabId != info.PlayfabId).ToList(); _eventPartnerData.RequestPartners.Remove(info.PlayfabId); _eventPartnerData.SavePlayerPreferenceData(); scrollView.ReloadData(); } catch (Exception e) { Debug.Log($"[EventPartner]{e.Message}"); } if (_itemInfos.Count <= 0 || _eventPartnerData.IsFullyMatched) { OnClickClose(); HideBtn(); } } private async System.Threading.Tasks.Task OnIgnore(string partnerId) { var request = new EventPartnerData.EventBuildPartnerRequest { partnerId = partnerId , eventId = _eventPartnerData.EventId}; try { var response = await _customServerMgr .EventPartnerRequest( EventPartnerData.IgnoreUrl, request); if (response.State != EventPartnerData.EEventBuildState.Success) Debug.Log( $"[EventPartner]{response.State}: {response.ErrorMessage}"); else { for (int i = 0; i < _itemInfos.Count; i++) { if (_itemInfos[i].PlayfabId != partnerId) continue; _itemInfos.RemoveAt(i); break; } _eventPartnerData.Cache.ListInvitedBy = _eventPartnerData.Cache.ListInvitedBy.Where(info => info.PlayfabId != partnerId).ToList(); _eventPartnerData.RequestPartners.Remove(partnerId); _eventPartnerData.SavePlayerPreferenceData(); scrollView.ReloadData(); } } catch (Exception e) { Debug.Log($"[EventPartner]{e.Message}"); } if (_itemInfos.Count <= 0) { OnClickClose(); HideBtn(); } } private async System.Threading.Tasks.Task RequestItemInfo() { var originSet = new HashSet(); foreach (var partner in _eventPartnerData.RequestPartners) { originSet.Add(partner); } // Find in cache if (_eventPartnerData.Cache?.ListInvitedBy is { Count: > 0 }) { foreach (var info in _eventPartnerData.Cache.ListInvitedBy.Where(info => originSet.Contains(info.PlayfabId))) { originSet.Remove(info.PlayfabId); _itemInfos.Add(info); } } if (originSet.IsNullOrEmpty()) return; // Find in friendList var friendDictionary = GContext.container.Resolve().FriendList .ToDictionary(f => f.playFabId); if (!friendDictionary.IsNullOrEmpty()) { var i = originSet.Intersect(friendDictionary.Keys); _itemInfos.AddRange(i.Select(s => new ScrollViewItemInfo { Type = EScrollViewType.Partner2Accept, PlayfabId = friendDictionary[s].playFabId, AvatarUrl = friendDictionary[s].avatarUrl, DisplayName = friendDictionary[s].displayName, Level = friendDictionary[s].value / LeadboardData.LV_MODELING })); originSet.RemoveWhere(friendDictionary.ContainsKey); } if (originSet.IsNullOrEmpty()) return; // Find in server cache var request = new EventPartnerData.EventBuildRecentPlayerInfoRequest(); request.playerPrefabs = originSet.ToArray(); var resp = await _customServerMgr .EventPartnerRequest( EventPartnerData.MatchRecentPlayerInfoUrl, request); if (resp.State == EventPartnerData.EEventBuildState.Success && !resp.playerInfos.IsNullOrEmpty()) { originSet = resp.leftOvers.ToHashSet(); _itemInfos.AddRange(resp.playerInfos.Select(p => new ScrollViewItemInfo { Type = EScrollViewType.Partner2Accept, PlayfabId = p.PlayFabId, AvatarUrl = p.AvatarUrl, DisplayName = p.DisplayName, Level = p.Level })); if (originSet.IsNullOrEmpty()) return; } // Find in server database. var displayInfoRequest = new EventPartnerData.EventBuildPlayerDisplayInfoRequest(); displayInfoRequest.PlayfabIds = originSet.ToArray(); var res = await _customServerMgr .EventPartnerRequest( EventPartnerData.PlayerDisplayInfoUrl, displayInfoRequest); if (res.State != EventPartnerData.EEventBuildState.Success || res.PlayerInfos.IsNullOrEmpty()) Debug.Log($"[EventPartner]Server response in invite panel info: {res.Message}"); foreach (var info in res.PlayerInfos) { originSet.Remove(info.PlayFabId); _itemInfos.Add(new ScrollViewItemInfo { Type = EScrollViewType.Partner2Accept, PlayfabId = info.PlayFabId, AvatarUrl = info.AvatarUrl, DisplayName = info.DisplayName, Level = info.Level }); } if (originSet.IsNullOrEmpty()) return; // Show default _itemInfos.AddRange(originSet.Select(p => new ScrollViewItemInfo { Type = EScrollViewType.Partner2Accept, PlayfabId = p, AvatarUrl = "", DisplayName = _userService.GetDefaultName(p), Level = 60 })); } #endregion }