using ServerCore; using ServerBase; using ServerCommon; namespace GameServer; public class ChatAction : EntityActionBase { public ChatAction(EntityBase owner) : base(owner) { } public override Task onInit() { var result = new Result(); return Task.FromResult(result); } public override void onClear() { return; } // 일반 주변 채팅 public Result NormalChat(string message) { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var game_zone_action = player.getEntityAction(); ChatNotifyHelper.send_S2C_NTF_CHAT_BROADCAST(player, ChatType.Normal, player.getUserNickname(), string.Empty, PlayerStateType.None, message); var invokers = new List(); var log_action = new LogActionEx(LogActionType.ChatNormal); var cellPos = game_zone_action.GetPlayerCellPos(player); var task_log_data = ChatBusinessLogHelper.toLogInfo(message, cellPos); invokers.Add(new ChatBusinessLog(task_log_data)); BusinessLogger.collectLogs(log_action, player, invokers); return result; } // 채널 서버 내 채팅 public Result ChannelChat(string message) { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"server_logic is null !!!"); var server_logic = GameServerApp.getServerLogic(); var receivers = server_logic.getPlayerManager().getUsers(); foreach(var receiver in receivers) { ChatNotifyHelper.send_S2C_NTF_CHAT(receiver.Value, ChatType.Channel, player.getUserNickname(), string.Empty, PlayerStateType.None, message); } var invokers = new List(); var log_action = new LogActionEx(LogActionType.ChatChannel); var task_log_data = ChatBusinessLogHelper.toLogInfo(message, string.Empty); invokers.Add(new ChatBusinessLog(task_log_data)); BusinessLogger.collectLogs(log_action, player, invokers); return result; } // 전서버 채팅 public Result NoticeChat(string message) { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"server_logic is null !!!"); var server_logic = GameServerApp.getServerLogic(); // GM인지 확인 //if (AccountAuthorityManager.Instance.IsWhiteListUser(player.getAccountId()) == false) //{ // err_msg = $"Not Enough Authority to NoticeChat : player - {player.toBasicString()}"; // result.setFail(ServerErrorCode.NotEnoughAuthority, err_msg); // Log.getLogger().error(err_msg); // ChatPacketHandler.send_S2C_ACK_CHAT(player, result, ChatType.Notice, player.getUserNickname(), string.Empty, string.Empty, PlayerStateType.None, message); // return result; //} var rabbitMQ4Game = server_logic.getRabbitMqConnector() as RabbitMQ4Game; NullReferenceCheckHelper.throwIfNull(rabbitMQ4Game, () => $"rabbitMQ4Game is null !!!"); rabbitMQ4Game.sendChat(message, player.getUserNickname(), ChatType.Notice); var invokers = new List(); var log_action = new LogActionEx(LogActionType.ChatNotice); var task_log_data = ChatBusinessLogHelper.toLogInfo(message, string.Empty); invokers.Add(new ChatBusinessLog(task_log_data)); BusinessLogger.collectLogs(log_action, player, invokers); return result; } // 귓속말 채팅 public async Task WhisperChat(string receiver_nickname, string message) { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var server_logic = GameServerApp.getServerLogic(); var rabbitMQ4Game = server_logic.getRabbitMqConnector() as RabbitMQ4Game; NullReferenceCheckHelper.throwIfNull(rabbitMQ4Game, () => $"rabbitMQ4Game is null !!!"); var dynamo_db_client = server_logic.getDynamoDbClient(); if (receiver_nickname == player.getUserNickname()) { err_msg = $"Can't Send Chat to Self. nickname : {receiver_nickname}"; result.setFail(ServerErrorCode.ChatSendSelfFailed, err_msg); Log.getLogger().error(err_msg); PacketHandler.ChatPacketHandler.send_S2C_ACK_CHAT(player, result, receiver_nickname, ChatType.Whisper, player.getUserNickname(), string.Empty, (int)PlayerStateType.None, message); return result; } (result, var nickname_attrib) = await NicknameHelper.findNickname(receiver_nickname); if (result.isFail()) { err_msg = $"Not Found Target. nickname : {receiver_nickname}"; result.setFail(ServerErrorCode.TargetUserNotFound, err_msg); Log.getLogger().error(err_msg); PacketHandler.ChatPacketHandler.send_S2C_ACK_CHAT(player, result, receiver_nickname, ChatType.Whisper, player.getUserNickname(), string.Empty, (int)PlayerStateType.None, message); return result; } NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null !!!"); var receiver_user_guid = nickname_attrib.UserGuid; var login_cache_request = new LoginCacheOtherUserRequest(player, server_logic.getRedisConnector(), nickname_attrib.UserGuid); result = await login_cache_request.fetchLogin(); var login_cache = login_cache_request.getLoginCache(); if (result.isFail() || login_cache == null) { err_msg = $"Logoff user : target_usenicknamer - {receiver_nickname}"; result.setFail(ServerErrorCode.TargetUserNotLogIn, err_msg); Log.getLogger().error(err_msg); PacketHandler.ChatPacketHandler.send_S2C_ACK_CHAT(player, result, receiver_nickname, ChatType.Whisper, player.getUserNickname(), string.Empty, (int)PlayerStateType.None, message); return result; } var user_block_action = 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); PacketHandler.ChatPacketHandler.send_S2C_ACK_CHAT(player, result, receiver_nickname, ChatType.Whisper, player.getUserNickname(), string.Empty, (int)PlayerStateType.None, message); return result; } //내가 차단한경우 if (user_block_action.isBlockUser(receiver_user_guid)) { err_msg = $"Failed chat with blocked user."; result.setFail(ServerErrorCode.ChatBlockUserCannotWhisper, err_msg); PacketHandler.ChatPacketHandler.send_S2C_ACK_CHAT(player, result, receiver_nickname, ChatType.Whisper, player.getUserNickname(), string.Empty, (int)PlayerStateType.None, message); return result; } //상대방이 차단한경우 상대방에겐 보내지 않고 정상 처리 되도록 (result, bool isblocked) = await user_block_action.amIBockedFromOthers(receiver_user_guid); if (result.isFail()) { return result; } if (isblocked == true) { PacketHandler.ChatPacketHandler.send_S2C_ACK_CHAT(player, result, receiver_nickname, ChatType.Whisper, player.getUserNickname(), receiver_user_guid, login_cache.State, message); return result; } if (login_cache.CurrentServer != server_logic.getServerName()) { ServerMessage chatMessage = new(); chatMessage.Chat = new(); chatMessage.Chat.Type = ChatType.Whisper; chatMessage.Chat.SenderNickName = player.getUserNickname(); chatMessage.Chat.ReceiverGuid = receiver_user_guid; chatMessage.Chat.Receiverstate = login_cache.State; chatMessage.Chat.Message = message; rabbitMQ4Game.SendMessage(login_cache.CurrentServer, chatMessage); } else { if(server_logic.getPlayerManager().tryGetUserByPrimaryKey(receiver_user_guid, out var receiver) == false) { err_msg = $"Failed to get player from player manager : receiver_user_guid - {receiver_user_guid}"; result.setFail(ServerErrorCode.TargetUserNotLogIn, err_msg); Log.getLogger().error(err_msg); PacketHandler.ChatPacketHandler.send_S2C_ACK_CHAT(player, result, receiver_nickname, ChatType.Whisper, player.getUserNickname(), string.Empty, (int)PlayerStateType.None, message); return result; } if(receiver == null) { err_msg = $"Failed to get player from player manager : receiver_user_guid - {receiver_user_guid}"; result.setFail(ServerErrorCode.TargetUserNotLogIn, err_msg); Log.getLogger().error(err_msg); PacketHandler.ChatPacketHandler.send_S2C_ACK_CHAT(player, result, receiver_nickname, ChatType.Whisper, player.getUserNickname(), string.Empty, (int)PlayerStateType.None, message); return result; } ChatNotifyHelper.send_S2C_NTF_CHAT(receiver, ChatType.Whisper, player.getUserNickname(), receiver_nickname, login_cache.State, message); } ChatNotifyHelper.send_S2C_NTF_CHAT(player, ChatType.Whisper, player.getUserNickname(), receiver_nickname, login_cache.State, message); var invokers = new List(); var log_action = new LogActionEx(LogActionType.ChatWhisper); var task_log_data = ChatBusinessLogHelper.toLogInfo(message, receiver_nickname); invokers.Add(new ChatBusinessLog(task_log_data)); BusinessLogger.collectLogs(log_action, player, invokers); return result; } // 파티 채팅 public async Task PartyChat(string message) { var player = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var personal_party_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(personal_party_action, () => $"personal_party_action is null !!!"); var result = await personal_party_action.sendPartyChat(message); var invokers = new List(); var log_action = new LogActionEx(LogActionType.ChatParty); //personal_party_action.getPersonalParty(). var task_log_data = ChatBusinessLogHelper.toLogInfo(message, string.Empty); invokers.Add(new ChatBusinessLog(task_log_data)); BusinessLogger.collectLogs(log_action, player, invokers); return result; } }