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 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(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(); 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(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(); 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(); 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(); 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(); 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( 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; } }