using Newtonsoft.Json; using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using static ServerMessage.Types; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.InviteFriendToMyhomeReq), typeof(InviteFriendToMyhomePacketHandler), typeof(GameLoginListener))] public class InviteFriendToMyhomePacketHandler : 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; ArgumentNullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}"); var request = recv_msg.Request.InviteFriendToMyhomeReq; ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"recv_msg is null !!! - {player.toBasicString()}"); var result = new Result(); var err_msg = string.Empty; var player_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {player.toBasicString()}"); 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_INVITE_FRIEND_TO_MYHOME(player, result); return result; } var character_action = selected_character.getEntityAction(); NullReferenceCheckHelper.throwIfNull(character_action, () => $"character_action is null !!! - {selected_character.toBasicString()}"); if (character_action.isFarming()) { err_msg = $"Character is Farming !!! - {selected_character.toBasicString()}, {player.toBasicString()}"; result.setFail(ServerErrorCode.FarimgState, err_msg); Log.getLogger().error(result.toBasicString()); send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(player, result); return result; } var friend_infos = request.Infos.ToList(); var friend_myhome_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(friend_myhome_action, () => $"friend_myhome_action is null !!! - {player.toBasicString()}"); (result, var fail_infos, var noti_infos) = await friend_myhome_action.inviteFriendToMyhome(friend_infos); if (result.isFail()) { send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(player, result); return result; } send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(player, fail_infos, noti_infos); //초대 Noti 전송 await send_GS2C_NTF_RECEIVE_INVITE_MYHOME(player, noti_infos); //로그 var invokers = new List(); Dictionary invite_result = new Dictionary(); foreach (var noti in noti_infos) { invite_result.Add(noti.BaseInfo.ReceiverGuid, ServerErrorCode.Success.ToString()); } foreach (var fail_info in fail_infos) { invite_result.Add(fail_info.Guid, fail_info.ErrorCode.ToString()); } invokers.Add(new InviteFriendToMyhomeBusinessLog(player.getUserGuid(), invite_result)); var log_action = new LogActionEx(LogActionType.RefuseFriendRequest); BusinessLogger.collectLogs(log_action, player, invokers); return result; } private async Task send_GS2C_NTF_RECEIVE_INVITE_MYHOME(Player owner, List noties) { var server_logic = GameServerApp.getServerLogic(); var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game; NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit mq is null !! - player:{owner.toBasicString()}"); foreach (var noti in noties) { ServerMessage messgae = new ServerMessage(); messgae.ReceiveInviteMyHomeNoti = noti; var login_cache_request = new LoginCacheOtherUserRequest(owner, server_logic.getRedisConnector(), noti.BaseInfo.ReceiverGuid); var result = await login_cache_request.fetchLogin(); if (result.isFail()) { Log.getLogger().info($"send_GS2C_NTF_RECEIVE_INVITE_MYHOME - fetchLogin fail - {result.ErrorCode}, noti : {JsonConvert.SerializeObject(noti)}"); continue; } var login_cache = login_cache_request.getLoginCache(); NullReferenceCheckHelper.throwIfNull(login_cache, () => $"LoginCache is null !! - player:{owner.toBasicString()}"); rabbit_mq.SendMessage(login_cache.CurrentServer, messgae); } return true; } private static bool send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(Player owner, Result result) { ClientToGame ack_packet = new(); ack_packet.Response = new(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.InviteFriendToMyhomeRes = new(); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } private static bool send_GS2C_ACK_INVITE_FRIEND_TO_MYHOME(Player owner, List failInfos, List noties) { ClientToGame ack_packet = new(); ack_packet.Response = new(); ack_packet.Response.ErrorCode = ServerErrorCode.Success; ack_packet.Response.InviteFriendToMyhomeRes = new(); ack_packet.Response.InviteFriendToMyhomeRes.FailInfos.AddRange(failInfos); ack_packet.Response.InviteFriendToMyhomeRes.SuccessGuids.AddRange(noties.Select(x => x.BaseInfo.ReceiverGuid)); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } }