using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer; public class UgcNpcLikeRankAction : EntityActionBase { private readonly Dictionary> m_ranks; public UgcNpcLikeRankAction(UgcNpcRankEntity owner) : base(owner) { m_ranks = new(); } public override async Task onInit() => await Task.FromResult(new Result()); public override void onClear() { } public async Task<(Result result, List? list)> getRanks(UgcNpcRankState state) { if (!m_ranks.TryGetValue(state, out var ranks)) { ranks = await loadRank(state); } return (new Result(), ranks); } public async Task?> loadRank(UgcNpcRankState state) { Result result; List? list; var server_logic = GameServerApp.getServerLogic(); var redis_client = server_logic.getRedisConnector(); var rank_date = UgcNpcRankHelper.getCurrentRankDate(); // 누적 랭킹 조회 if (state == UgcNpcRankState.Total) { var total_cache_request = new UgcNpcTotalRankCacheRequest(UgcNpcRankType.Like, rank_date, redis_client); result = await total_cache_request.getRanks(UgcNpcRankEntity.DefaultPageNum, UgcNpcRankEntity.DefaultPageSize); if (result.isFail()) return null; var total_cache = total_cache_request.getTotalCache(); NullReferenceCheckHelper.throwIfNull(total_cache, () => $"total_cache is null !!!"); list = await UgcNpcRankHelper.getUgcNpcSummaryFromMetaGuid(total_cache.Ranks); } // 트랜드 랭킹 조회 else { var trend_cache_request = new UgcNpcTrendRankCacheRequest(UgcNpcRankType.Like, rank_date, redis_client); result = await trend_cache_request.getRanks(UgcNpcRankEntity.DefaultPageNum, UgcNpcRankEntity.DefaultPageSize); if (result.isFail()) return null; var trend_rank_cache = trend_cache_request.getTrendRankCache(); NullReferenceCheckHelper.throwIfNull(trend_rank_cache, () => $"trend_rank_cache is null !!!"); list = await UgcNpcRankHelper.getUgcNpcSummaryFromMetaGuid(trend_rank_cache.Ranks); } Log.getLogger().info($"update ugc npc like rank data : rank state[{state}] / rank count[{list.Count}]"); m_ranks[state] = list; return list; } public async Task setRankScore(string ownerGuid, string targetUserGuid, string ugcNpcMetaGuid, bool isAdd) { var key = UgcNpcRankHelper.makeRankKey(targetUserGuid, ugcNpcMetaGuid); var delta = isAdd ? 1 : -1; var result = await UgcNpcRankHelper.updateUgcNpcRank(UgcNpcRankState.Total, UgcNpcRankType.Like, key, delta, null); if (result.isFail()) return result; result = await UgcNpcRankHelper.updateUgcNpcRank(UgcNpcRankState.Trend, UgcNpcRankType.Like, key, delta, UgcNpcRankHelper.makeCurrentOrganizationDate()); return result; } }