using System.Collections.Generic; using EventPartnerGatherRequests; using System.Linq; using asap.core; using game; using System; namespace EventPartner { /// /// Store invitation data, but not necessarrily the info shown on panel, meaning, no potential robot info. /// public class InvitationData { // List block priority: Refuse = Partners > Invite > Request > Friend > Recommend private HashSet _refusePfIdSet = new HashSet(); private HashSet _invitePfIdSet = new HashSet(); private HashSet _requestPfIdSet = new HashSet(); private HashSet _friendPfIdSet = new HashSet(); private HashSet _recommendPfIdSet = new HashSet(); // private DateTime _recommendExpiryTime = DateTime.MinValue; private IEventPartnerArchitecture _arc; public HashSet RefusePfIdSet => _refusePfIdSet; public HashSet InvitePfIdSet => _invitePfIdSet; public HashSet RequestPfIdSet => _requestPfIdSet; public HashSet FriendPfIdSet => _friendPfIdSet; public HashSet RecommendPfIdSet => _recommendPfIdSet; private int _invitationCount; private readonly cfg.Tables _tables = GContext.container.Resolve(); public int ActiveFriendCountThreshold => _tables.TbEventPartnerConfig.FriendRecommendParam1[0]; public int RecommendCount => _tables.TbEventPartnerConfig.FriendRecommendParam2[GContext.container.Resolve().FriendList.Count < ActiveFriendCountThreshold ? 0 : 1]; public int RecommendTriggerCount => _tables.TbEventPartnerConfig.RobotRecommendTriggerCount; public bool DoRecommendBot => _invitationCount >= RecommendTriggerCount; public float RobotRecommendRatio => _tables.TbEventPartnerConfig.RobotRecommendCount; public int InvitationCount => _invitationCount; // public DateTime RecommendExpiryTime => _recommendExpiryTime; public InvitationData(IEventPartnerArchitecture arc) { _arc = arc; } public void Init(HashSet refusePfIdSet, InvitationCache recommendCache) { _refusePfIdSet = refusePfIdSet; // _recommendExpiryTime = recommendCache.ExpiryTime; _recommendPfIdSet = recommendCache.RecommendPfIds.ToHashSet(); _invitationCount = recommendCache.InvitationCount; } public void FillInDetail(HashSet partners, EventPartnerGatherDetail detail) { var selfPfId = GContext.container.Resolve().UserId; _invitePfIdSet = detail.InvitePartners .Select(x => x.PlayFabId) .Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId) .ToHashSet(); _requestPfIdSet = detail.RequestPartners .Select(x => x.PlayFabId) .Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId && !_invitePfIdSet.Contains(s)) .ToHashSet(); _friendPfIdSet = GContext.container.Resolve().FriendList .Select(x => x.playFabId) .Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId && !_invitePfIdSet.Contains(s) && !_requestPfIdSet.Contains(s)) .ToHashSet(); // if (ZZTimeHelper.UtcNow() < _recommendExpiryTime) // _recommendPfIdSet = _recommendPfIdSet // .Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId // && !_invitePfIdSet.Contains(s) && !_requestPfIdSet.Contains(s) && !_friendPfIdSet.Contains(s)) // .ToHashSet(); // else // { _recommendPfIdSet = GenerateNewRecommendList(detail).ToHashSet(); // _recommendExpiryTime = ZZTimeHelper.UtcNow() + TimeSpan.FromSeconds(GContext.container.Resolve().TbEventPartnerConfig.FriendRecommendListRefreshTime); // } _arc.SavePlayerPreference(); } public void FillInFriends() { var selfPfId = GContext.container.Resolve().UserId; var partners = _arc.Model.PartnerIdSet; _friendPfIdSet = GContext.container.Resolve().FriendList .Select(x => x.playFabId) .Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId && !_invitePfIdSet.Contains(s) && !_requestPfIdSet.Contains(s)) .ToHashSet(); } public bool IsRefused(string pfId) { return _refusePfIdSet.Contains(pfId); } public void OnInvite(string pfId) { _invitePfIdSet.Add(pfId); _requestPfIdSet.Remove(pfId); _friendPfIdSet.Remove(pfId); _recommendPfIdSet.Remove(pfId); _refusePfIdSet.Remove(pfId); _invitationCount++; } public void OnAccept(string pfId) { _invitePfIdSet.Remove(pfId); _requestPfIdSet.Remove(pfId); _friendPfIdSet.Remove(pfId); _recommendPfIdSet.Remove(pfId); _refusePfIdSet.Remove(pfId); } public void OnRefuse(string pfId) { _invitePfIdSet.Remove(pfId); _requestPfIdSet.Remove(pfId); _friendPfIdSet.Remove(pfId); _recommendPfIdSet.Remove(pfId); _refusePfIdSet.Add(pfId); } public void OnRequest(string pfId) { _invitePfIdSet.Remove(pfId); _requestPfIdSet.Add(pfId); _friendPfIdSet.Remove(pfId); _recommendPfIdSet.Remove(pfId); _refusePfIdSet.Remove(pfId); } public InvitationCache ToCache() { var res = new InvitationCache(); // res.ExpiryTime = _recommendExpiryTime; res.RecommendPfIds = _recommendPfIdSet.ToList(); res.RefusePfIds = _refusePfIdSet.ToList(); res.InvitationCount = _invitationCount; return res; } public IEnumerable GenerateNewRecommendList(EventPartnerGatherDetail detail) { var count = RecommendCount; var res = new List(); if (DoRecommendBot) { var actualBotCount = (int)(count * RobotRecommendRatio); res.AddRange(detail.RecommendInfoList.Select(x => x.PlayFabId).Take(count - actualBotCount)); res.AddRange(_arc.Ctx.GetBotRecommendIdList(actualBotCount)); } else res.AddRange(detail.RecommendInfoList.Select(x => x.PlayFabId).Take(count)); var partners = detail.Partners.Select(x => x.PlayFabId).ToHashSet(); var selfPfId = GContext.container.Resolve().UserId; return res.Where(s => !_refusePfIdSet.Contains(s) && !partners.Contains(s) && s != selfPfId && !_invitePfIdSet.Contains(s) && !_requestPfIdSet.Contains(s) && !_friendPfIdSet.Contains(s)); } // #if UNITY_EDITOR // public void RefreshInvitation() // { // _recommendExpiryTime = ZZTimeHelper.UtcNow(); // } // #endif public void SetInvitationCount(int n) { _invitationCount = n; } } public class InvitationCache { public List RecommendPfIds { get; set; } = new List(); public List RefusePfIds { get; set; } = new List(); public int InvitationCount { get; set; } } }