using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ReplyReceivedFriendRequestReq), typeof(ReplyReceivedFriendRequestPacketHandler), typeof(GameLoginListener))] public class ReplyReceivedFriendRequestPacketHandler : PacketRecvHandler { public override async Task onProcessPacket(ISession session, IMessage recvMessage) { var owner = session as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var recv_msg = recvMessage as ClientToGame; NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!!"); var request = recv_msg.Request.ReplyReceivedFriendRequestReq; var target_guid = request.TargetGuid; var reply_type = request.AcceptOrRefuse; var result = await replyReceivedFriendReq(owner, target_guid, reply_type); if (result.isFail()) { send_GS2C_ACK_REPLY_RECEIVED_FRIEND_REQUEST(owner, result); return result; } //로직처리 성공시 send_GS2C_ACK_REPLY_RECEIVED_FRIEND_REQUEST(owner, result, target_guid); await send_GS2CS_NTF_FRIEND_ACCEPT(owner, target_guid, reply_type); if (reply_type == (int)FriendRequestReplyType.Accept) { await QuestManager.It.QuestCheck(owner, new QuestFriend(EQuestEventTargetType.FRIEND, EQuestEventNameType.ADDED)); Thread.Sleep(1000); await owner.send_GS2CS_NTF_STATE_TO_FRIEND(target_guid); } return result; } private async Task replyReceivedFriendReq(Player owner, string targetGuid, Int32 replyType) { //replyType : Accept = 1, //수락 //replyType : Refuse = 2, //거절 IFriendInterlockAction interlock_actioin = new ReplyFriendRequestLockAction(owner, owner.getUserGuid(), targetGuid, replyType); var result = await interlock_actioin.doInterlockAction(); return result; } private static async Task send_GS2CS_NTF_FRIEND_ACCEPT(Player owner, string targetGuid, Int32 replyType) { ServerMessage acceptNoti = new ServerMessage(); acceptNoti.FriendAcceptNoti = new(); acceptNoti.FriendAcceptNoti.SenderId = owner.getAccountId(); acceptNoti.FriendAcceptNoti.SenderGuid = owner.getUserGuid(); acceptNoti.FriendAcceptNoti.SenderNickName = owner.getUserNickname(); acceptNoti.FriendAcceptNoti.AcceptOrRefuse = replyType; acceptNoti.FriendAcceptNoti.ReceiverId = ""; acceptNoti.FriendAcceptNoti.ReceiverGuid = targetGuid; var server_logic = GameServerApp.getServerLogic(); var login_cache_request = new LoginCacheOtherUserRequest(owner, server_logic.getRedisConnector(), targetGuid); var result = await login_cache_request.fetchLogin(); if (result.isSuccess()) { var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game; NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null !!!"); var login_cache = login_cache_request.getLoginCache(); NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login_cache is null !!!"); rabbit_mq.SendMessage(login_cache.CurrentServer, acceptNoti); } return true; } private static bool send_GS2C_ACK_REPLY_RECEIVED_FRIEND_REQUEST(Player owner, Result result) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) { return false; } return true; } private static bool send_GS2C_ACK_REPLY_RECEIVED_FRIEND_REQUEST(Player owner, Result result, string guid) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.ReplyReceivedFriendRequestRes = new(); ack_packet.Response.ReplyReceivedFriendRequestRes.Guid = guid; if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) { return false; } return true; } }