Files
caliverse_server/GameServer/Entity/Ranking/PacketHandler/GetUgcNpcRankPacketHandler.cs
2025-05-01 07:20:41 +09:00

128 lines
4.9 KiB
C#

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<UgcNpcRank>? 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<UgcNpcRank>();
ack_packet.Response.AckUgcNpcRank.UgcNpcRank.AddRange(ranking);
}
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
{
return false;
}
return true;
}
public override async Task<Result> 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<UgcNpcRankEntity>();
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<UgcNpcRank>? ranks) res_rank = new();
res_rank.result = result;
switch (request.Type)
{
case UgcNpcRankType.Like:
var like_action = ranking_entity.getEntityAction<UgcNpcLikeRankAction>();
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<UgcNpcCommunicationRankAction>();
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<UgcNpcQuestRankAction>();
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;
}
}