175 lines
7.9 KiB
C#
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;
|
|
}
|
|
}
|