Files
ft/Client/Assets/Scripts/UI/PartnerStatue/EventPartnerInvitationData.cs
2026-06-29 21:18:33 +08:00

183 lines
7.8 KiB
C#

using System.Collections.Generic;
using EventPartnerGatherRequests;
using System.Linq;
using asap.core;
using game;
using System;
namespace EventPartner
{
/// <summary>
/// Store invitation data, but not necessarrily the info shown on panel, meaning, no potential robot info.
/// </summary>
public class InvitationData
{
// List block priority: Refuse = Partners > Invite > Request > Friend > Recommend
private HashSet<string> _refusePfIdSet = new HashSet<string>();
private HashSet<string> _invitePfIdSet = new HashSet<string>();
private HashSet<string> _requestPfIdSet = new HashSet<string>();
private HashSet<string> _friendPfIdSet = new HashSet<string>();
private HashSet<string> _recommendPfIdSet = new HashSet<string>();
// private DateTime _recommendExpiryTime = DateTime.MinValue;
private IEventPartnerArchitecture _arc;
public HashSet<string> RefusePfIdSet => _refusePfIdSet;
public HashSet<string> InvitePfIdSet => _invitePfIdSet;
public HashSet<string> RequestPfIdSet => _requestPfIdSet;
public HashSet<string> FriendPfIdSet => _friendPfIdSet;
public HashSet<string> RecommendPfIdSet => _recommendPfIdSet;
private int _invitationCount;
private readonly cfg.Tables _tables = GContext.container.Resolve<cfg.Tables>();
public int ActiveFriendCountThreshold => _tables.TbEventPartnerConfig.FriendRecommendParam1[0];
public int RecommendCount => _tables.TbEventPartnerConfig.FriendRecommendParam2[GContext.container.Resolve<FriendService>().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<string> refusePfIdSet, InvitationCache recommendCache)
{
_refusePfIdSet = refusePfIdSet;
// _recommendExpiryTime = recommendCache.ExpiryTime;
_recommendPfIdSet = recommendCache.RecommendPfIds.ToHashSet();
_invitationCount = recommendCache.InvitationCount;
}
public void FillInDetail(HashSet<string> partners, EventPartnerGatherDetail detail)
{
var selfPfId = GContext.container.Resolve<IUserService>().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<FriendService>().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<cfg.Tables>().TbEventPartnerConfig.FriendRecommendListRefreshTime);
// }
_arc.SavePlayerPreference();
}
public void FillInFriends()
{
var selfPfId = GContext.container.Resolve<IUserService>().UserId;
var partners = _arc.Model.PartnerIdSet;
_friendPfIdSet = GContext.container.Resolve<FriendService>().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<string> GenerateNewRecommendList(EventPartnerGatherDetail detail)
{
var count = RecommendCount;
var res = new List<string>();
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<IUserService>().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<string> RecommendPfIds { get; set; } = new List<string>();
public List<string> RefusePfIds { get; set; } = new List<string>();
public int InvitationCount { get; set; }
}
}