using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using static ClientToGameReq.Types; using static ClientToGameRes.Types; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.SendMailReq), typeof(SendMailPacketHandler), typeof(GameLoginListener))] public class SendMailPacketHandler : PacketRecvHandler { public static bool send_S2C_ACK_SEND_MAIL(Player player, Result result, Mail? sent_mail = null) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.SendMailRes = new SendMailRes(); if(sent_mail != null) { ack_packet.Response.SendMailRes.MailInfo = new(); ack_packet.Response.SendMailRes.MailInfo = sent_mail.toMailData4Client(MailType.SentMail); } 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 entity_player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!"); var mail_action = entity_player.getEntityAction(); if (mail_action == null) { err_msg = $"Failed to get mail action : {nameof(MailAction)}"; result.setFail(ServerErrorCode.EntityActionNotFound, err_msg); Log.getLogger().error(err_msg); send_S2C_ACK_SEND_MAIL(entity_player, result); return result; } var game_msg = recvMessage as ClientToGame; if (game_msg == null) { err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.SendMailReq)}"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); send_S2C_ACK_SEND_MAIL(entity_player, result); return result; } var request = game_msg.Request.SendMailReq; string to_user_guid = request.ToGuid; if(to_user_guid == string.Empty) { var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); (result, var nickname_attrib) = await NicknameHelper.findNickname(request.ToNickName); if (result.isFail()) { send_S2C_ACK_SEND_MAIL(entity_player, result); return result; } NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null !!!"); to_user_guid = nickname_attrib.UserGuid; } var user_block_action = entity_player.getEntityAction(); if (user_block_action == null) { err_msg = $"Failed to get user block action : {nameof(BlockUserAgentAction)}"; result.setFail(ServerErrorCode.EntityActionNotFound, err_msg); Log.getLogger().error(err_msg); send_S2C_ACK_SEND_MAIL(entity_player, result); return result; } //내가 차단한 유저면 보내지 않는다. if (user_block_action.isBlockUser(to_user_guid)) { err_msg = $"Failed send mail with blocked user."; result.setFail(ServerErrorCode.MailBlockUserCannotSend, err_msg); send_S2C_ACK_SEND_MAIL(entity_player, result); } //상대방이 차단한경우 상대방에겐 보내지 않고 정상 처리 되도록 (result, bool isblocked) = await user_block_action.amIBockedFromOthers(to_user_guid); if (result.isFail()) { send_S2C_ACK_SEND_MAIL(entity_player, result); return result; } if (isblocked == true) { send_S2C_ACK_SEND_MAIL(entity_player, result); return result; } result = await mail_action.trySendMail(request.ToNickName, to_user_guid, request.Title, request.MailText); if (result.isFail()) { err_msg = $"Failed to trySendMail() !!! : {result.toBasicString()} - {entity_player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_SEND_MAIL(entity_player, result); return result; } await QuestManager.It.QuestCheck(entity_player, new QuestMail(EQuestEventTargetType.MAIL, EQuestEventNameType.SENDED, request.MailText)); return result; } public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage , Result errorResult) { await Task.CompletedTask; var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}"); send_S2C_ACK_SEND_MAIL(player, errorResult); } }