Files
caliverse_server/GameServer/Contents/UgcNpc/PacketHandler/UgcNpcLikePacketHandler.cs
2025-05-01 07:20:41 +09:00

175 lines
7.9 KiB
C#

using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using static ClientToGameRes.Types;
using UGCNPC_GUID = System.String;
using USER_GUID = System.String;
namespace GameServer.PacketHandler;
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_UGC_NPC_LIKE), typeof(UgcNpcLikePacketHandler), typeof(GameLoginListener))]
public class UgcNpcLikePacketHandler : PacketRecvHandler
{
public static bool send_S2C_ACK_UGC_NPC_LIKE(Player player, Result result, UGCNPC_GUID npc_guid = "", USER_GUID owner_guid = "", bool isLike = false)
{
var ack_packet = new ClientToGame();
ack_packet.Response = new ClientToGameRes();
ack_packet.Response.ErrorCode = result.ErrorCode;
ack_packet.Response.AckUgcNpcLike = new GS2C_ACK_UGC_NPC_LIKE();
if (result.isSuccess())
{
ack_packet.Response.AckUgcNpcLike.NpcGuid = npc_guid;
ack_packet.Response.AckUgcNpcLike.OwnerGuid = owner_guid;
ack_packet.Response.AckUgcNpcLike.IsLike = isLike == true ? BoolType.True : BoolType.False;
}
if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet))
{
return false;
}
return true;
}
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var player = entityWithSession as Player;
ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var game_msg = recvMessage as ClientToGame;
ArgumentNullReferenceCheckHelper.throwIfNull(game_msg, () => $"game_msg is null !!! - {player.toBasicString()}");
var request = game_msg.Request.ReqUgcNpcLike;
ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
var dynamo_db_client = server_logic.getDynamoDbClient();
var selectee_count_doc = new UgcNpcLikeSelecteeCountDoc(OwnerEntityType.UgcNpc, request.NpcGuid);
var selectee_count_query_config = dynamo_db_client.makeQueryConfigForReadByPKSK(selectee_count_doc.getPK(), selectee_count_doc.getSK());
(result, var npc_like_selectee_count_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<UgcNpcLikeSelecteeCountDoc>(selectee_count_query_config);
if(npc_like_selectee_count_docs.Count == 0)
{
err_msg = $"QueryCount 0 is simpleQueryDocTypesWithQueryOperationConfig() !!!, Not found UgcNpcLikeSelecteeCountDoc : {selectee_count_doc.toBasicString()} - {player.toBasicString()}";
result.setFail(ServerErrorCode.UgcNpcLikeSelecteeCountNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
send_S2C_ACK_UGC_NPC_LIKE(player, result);
return result;
}
var game_zone_action = player.getEntityAction<GameZoneAction>();
NullReferenceCheckHelper.throwIfNull(game_zone_action, () => $"GameZoneAction is null !!! - {player.toBasicString()}");
var map = game_zone_action.getLinkedToMap();
if(map == null)
{
err_msg = $"Map is null !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.MapIsNull, err_msg);
Log.getLogger().error(result.toBasicString());
send_S2C_ACK_UGC_NPC_LIKE(player, result);
return result;
}
var npc = map.findUgcNpc(request.NpcGuid);
if (npc == null)
{
err_msg = $"Failed to findUgcNpc() !!!, Not registered UgcNpc in GameZone !!! : {player.toBasicString()}";
result.setFail(ServerErrorCode.UgcNpcNotRegisteredInGameZone, err_msg);
Log.getLogger().error(result.toBasicString());
send_S2C_ACK_UGC_NPC_LIKE(player, result);
return result;
}
bool is_update_like = true;
var selected_flag_doc = new UgcNpcLikeSelectedFlagDoc(OwnerEntityType.User, player.getUserGuid(), request.NpcGuid);
var selected_flag_query_config = dynamo_db_client.makeQueryConfigForReadByPKSK(selected_flag_doc.getPK(), selected_flag_doc.getSK());
(result, var npc_like_selected_flag_docs) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<UgcNpcLikeSelectedFlagDoc>(selected_flag_query_config);
if (0 < npc_like_selected_flag_docs.Count)
{
var npc_like_selected_flag_attrib = npc_like_selected_flag_docs[0].getAttrib<UgcNpcLikeSelectedFlagAttrib>();
NullReferenceCheckHelper.throwIfNull(npc_like_selected_flag_attrib, () => $"npc_like_selected_flag_attrib is null !!! - {player.toBasicString()}");
is_update_like = npc_like_selected_flag_attrib.IsSelectedFlag == true ? false : true;
}
var fn_ugc_npc_like = async delegate ()
{
var result = new Result();
var delta_count = is_update_like ? 1 : -1;
var rank_entity = server_logic.findGlobalEntity<UgcNpcRankEntity>();
NullReferenceCheckHelper.throwIfNull(rank_entity, () => $"rank_entity is null !!! - {player.toBasicString()}");
var organize_last_date = UgcNpcRankHelper.makeCurrentOrganizationDate();
var flag_last_date = DateTimeHelper.MinTime;
if (0 < npc_like_selected_flag_docs.Count)
{
var ugc_npc_like_selected_flag_attrib = npc_like_selected_flag_docs[0].getAttrib<UgcNpcLikeSelectedFlagAttrib>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_like_selected_flag_attrib, () => $"ugc_npc_like_selected_flag_attrib is null !!! - {player.toBasicString()}");
flag_last_date = ugc_npc_like_selected_flag_attrib.LastCheckDate;
}
var is_update_last_date = flag_last_date == DateTimeHelper.MinTime || organize_last_date < flag_last_date;
// rank score 설정
var like_rank_action = rank_entity.getEntityAction<UgcNpcLikeRankAction>();
NullReferenceCheckHelper.throwIfNull(like_rank_action, () => $"like_rank_action is null !!! - {player.toBasicString()}");
await like_rank_action.setRankScore(player.getUserGuid(), request.OwnerGuid, request.NpcGuid, is_update_like);
var batch = new QueryBatchEx<QueryRunnerWithItemRequest>( player, LogActionType.UpdateUgcNpcLike
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQUgcNpcLikeSelectedFlagUpdate(player.getUserGuid(), request.NpcGuid, is_update_last_date));
batch.addQuery(new DBQUgcNpcLikeSelecteeCountUpdate(request.NpcGuid, delta_count));
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
send_S2C_ACK_UGC_NPC_LIKE(player, result, request.NpcGuid, request.OwnerGuid, is_update_like);
return result;
};
var transaction_name = "UgcNpcLike";
result = await player.runTransactionRunnerSafelyWithTransGuid( player.getUserGuid()
, TransactionIdType.PrivateContents, transaction_name
, fn_ugc_npc_like);
if (result.isFail())
{
err_msg = $"Failed to runTransactionRunnerSafelyWithTransGuid() !!! : {result.toBasicString()} - transactionName:{transaction_name}, {player.toBasicString()}";
Log.getLogger().error(err_msg);
}
return result;
}
}