using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using static ClientToGameReq.Types; using static ClientToGameRes.Types; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ReplyInviteMyhomeReq), typeof(ReplyInviteMyhomePacketHandler), typeof(GameLoginListener))] public class ReplyInviteMyhomePacketHandler : PacketRecvHandler { public override async Task onProcessPacket(ISession entityWithSession, IMessage recvMessage) { var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var recv_msg = recvMessage as ClientToGame; NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}"); var request = recv_msg.Request.ReplyInviteMyhomeReq; NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; var player_action = player.getEntityAction(); var selected_character = player_action.getSelectedCharacter(); if (null == selected_character) { err_msg = $"Not selected Character !!! - {player.toBasicString()}"; result.setFail(ServerErrorCode.CharacterNotSelected, err_msg); Log.getLogger().error(result.toBasicString()); send_GS2C_ACK_REPLY_INVITE_MYHOME(player, result); return result; } var character_action = selected_character.getEntityAction(); NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {selected_character.toBasicString()}"); var my_guid = player.getUserGuid(); var reply_value = request.AcceptOrRefuse; var reply_ref = new FriendReplyInviteMyhomeRefference(reply_value); var invitor_id = request.SenderId; var room_id = request.InstanceRoomId; var friend_myhome_action = player.getEntityAction(); result = await friend_myhome_action.checkReplyableAboutInvite(room_id, invitor_id, reply_ref); if (result.isFail()) { send_GS2C_ACK_REPLY_INVITE_MYHOME(player, result); return result; } NullReferenceCheckHelper.throwIfNull(reply_ref.m_invitor_login_cache_nullable, () => $"reply_ref.m_invitor_login_cache_nullable is null !!!"); var invitor_login_cache = reply_ref.m_invitor_login_cache_nullable.getLoginCache(); NullReferenceCheckHelper.throwIfNull(invitor_login_cache, () => $"invitor_login_cache is null !!!"); if (character_action.isFarming()) { //파밍중이면 클라에서 요청을 받았을때 알아서 reply 4로 보내주기때문에 여기서 리턴 처리만 정상처리로 보낸다. //err_msg = $"Character is Farming !!! - {selected_character.toBasicString()}, {player.toBasicString()}"; //result.setFail(ServerErrorCode.FarimgState, err_msg); //Log.getLogger().error(result.toBasicString()); send_GS2C_ACK_REPLY_INVITE_MYHOME(player, result); //초대한 유저에게 에게 거절한 내용 전달 send_GS2C_NTF_REPLY_INVITE_MYHOME(my_guid, reply_value, invitor_login_cache); return result; } if (reply_value == (int)InviteFriendReplyType.Accept) { result = friend_myhome_action.acceptReply(reply_ref); //에러든 아니든 여기서 리턴 send_GS2C_ACK_REPLY_INVITE_MYHOME(player, result); if (result.isFail()) return result; //초대한 유저에게 에게 수락한 내용 전달 send_GS2C_NTF_REPLY_INVITE_MYHOME(my_guid, reply_value, invitor_login_cache); //친구 마이홈으로 이동하기 위한 처리 result = await friend_myhome_action.joinFriendMyhomeFromInvite(room_id, reply_ref); if (result.isFail()) return result; result = MyhomeHelper.getMyhomeOwnerUserGuidAndMyhomeGuidFromRoomId(room_id, out var myhome_owner_user_guid, out _); if (result.isFail()) return result; (result, var myhome_attrib) = await MyhomeHelper.getEnterMyhomeAttribFromDynamoDb(myhome_owner_user_guid); if (result.isFail()) return result; var server_connect_info = reply_ref.m_server_connect_info_nullable; NullReferenceCheckHelper.throwIfNull(server_connect_info, () => $"server_connect_info is null !!!"); send_GS2C_NTF_FRIEND_MYHOME_INFO_NOTI(player, server_connect_info); await QuestManager.It.QuestCheck(player, new QuestMyHome(EQuestEventTargetType.MYHOME, EQuestEventNameType.ENTERED, "OTHERS")); } else { //초대한 유저에게 에게 거절한 내용 전달 send_GS2C_NTF_REPLY_INVITE_MYHOME(my_guid, reply_value, invitor_login_cache); } List invokers = new List(); invokers.Add(new ReplyInviteMyhomeBuisinessLog(my_guid, invitor_login_cache.UserGuid, reply_value)); var log_action = new LogActionEx(LogActionType.RefuseFriendRequest); BusinessLogger.collectLogs(log_action, player, invokers); return result; } private static bool send_GS2C_NTF_FRIEND_MYHOME_INFO_NOTI(Player owner, ServerConnectInfo serverConnectInfo) { ClientToGame ntf_packet = new ClientToGame(); ntf_packet.Message = new ClientToGameMessage(); ntf_packet.Message.FriendMyhomeInfoNoti = new(); ntf_packet.Message.FriendMyhomeInfoNoti.InstanceServerConnectInfo = serverConnectInfo; if (false == GameServerApp.getServerLogic().onSendPacket(owner, ntf_packet)) return false; return true; } private static bool send_GS2C_ACK_REPLY_INVITE_MYHOME(Player owner, Result result) { ClientToGame ack_packet = new(); ack_packet.Response = new(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.ReplyInviteMyhomeRes = new(); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } private static bool send_GS2C_NTF_REPLY_INVITE_MYHOME(string myGuid, Int32 replyValue, LoginCache invitor_cache) { ServerMessage message = new ServerMessage(); message.ReplyInviteMyhomeNoti = new(); message.ReplyInviteMyhomeNoti.AcceptOrRefuse = replyValue; message.ReplyInviteMyhomeNoti.ReceiverId = invitor_cache.UserGuid; message.ReplyInviteMyhomeNoti.ReplyUserGuid = myGuid; var server_logic = GameServerApp.getServerLogic(); var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMqConnector; NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null !!!"); rabbit_mq.SendMessage(invitor_cache.CurrentServer, message); return true; } }