using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_UGC_NPC_RANK), typeof(GetUgcNpcRankPacketHandler), typeof(GameLoginListener))] public class GetUgcNpcRankPacketHandler : PacketRecvHandler { public static bool send_GS2C_ACK_UGC_NPC_RANK(Player owner, Result result, UgcNpcRankType rankType, UgcNpcRankState rankState, List? ranking) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.AckUgcNpcRank = new(); if (result.isSuccess()) { ack_packet.Response.AckUgcNpcRank.Type = rankType; ack_packet.Response.AckUgcNpcRank.State = rankState; ranking ??= new List(); ack_packet.Response.AckUgcNpcRank.UgcNpcRank.AddRange(ranking); } if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) { return false; } return true; } public override async Task onProcessPacket(ISession entityWithSession, IMessage recvMessage) { var result = new Result(); string err_msg; var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!"); var server_logic = GameServerApp.getServerLogic(); // 1. 기본 정보 체크 var request = (recvMessage as ClientToGame)?.Request.ReqUgcNpcRank; if (null == request) { err_msg = $"Failed to get Request !!! : {nameof(ClientToGame.Request.ReqUgcNpcRank)}"; result.setFail(ServerErrorCode.InvalidArgument, err_msg); Log.getLogger().error(result.toBasicString()); send_GS2C_ACK_UGC_NPC_RANK(player,result, UgcNpcRankType.None, UgcNpcRankState.None, null); return result; } var ranking_entity = server_logic.findGlobalEntity(); if (null == ranking_entity) { err_msg = $"Failed to get Request !!! : {nameof(ClientToGame.Request.ReqUgcNpcRank)}"; result.setFail(ServerErrorCode.UgcNpcRankEntityIsNotFound, err_msg); Log.getLogger().error(result.toBasicString()); send_GS2C_ACK_UGC_NPC_RANK(player,result, request.Type, request.State, null); return result; } // 2. request validation 체크 if (false == checkRequestValidation(request)) { err_msg = $"Failed to get Request !!! : {nameof(ClientToGame.Request.ReqUgcNpcRank)}"; result.setFail(ServerErrorCode.InvalidArgument, err_msg); Log.getLogger().error(result.toBasicString()); send_GS2C_ACK_UGC_NPC_RANK(player,result, request.Type, request.State, null); return result; } // 3. ranking data 조회 (Result result, List? ranks) res_rank = new(); res_rank.result = result; switch (request.Type) { case UgcNpcRankType.Like: var like_action = ranking_entity.getEntityAction(); NullReferenceCheckHelper.throwIfNull(like_action, () => $"UgcNpcLikeRankAction is null !!! - player:{player.toBasicString()}"); res_rank = await like_action.getRanks(request.State); break; case UgcNpcRankType.Communication: var communication_action = ranking_entity.getEntityAction(); NullReferenceCheckHelper.throwIfNull(communication_action, () => $"UgcNpcCommunicationRankAction is null !!! - player:{player.toBasicString()}"); res_rank = await communication_action.getRanks(request.State); break; case UgcNpcRankType.Quest: var quest_action = ranking_entity.getEntityAction(); NullReferenceCheckHelper.throwIfNull(quest_action, () => $"UgcNpcQuestRankAction is null !!! - player:{player.toBasicString()}"); res_rank = await quest_action.getRanks(request.State); break; } send_GS2C_ACK_UGC_NPC_RANK(player, res_rank.result, request.Type, request.State, res_rank.ranks); return result; } private bool checkRequestValidation(ClientToGameReq.Types.C2GS_REQ_UGC_NPC_RANK request) { // 1. state 체크 if (request.State == UgcNpcRankState.None) return false; // 2. type 체크 if (request.Type == UgcNpcRankType.None) return false; return true; } }