Files
caliverse_server/GameServer/Contents/Chat/Action/ChatAction.cs
2025-05-01 07:20:41 +09:00

272 lines
11 KiB
C#

using ServerCore;
using ServerBase;
using ServerCommon;
namespace GameServer;
public class ChatAction : EntityActionBase
{
public ChatAction(EntityBase owner)
: base(owner)
{
}
public override Task<Result> 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<GameZoneAction>();
ChatNotifyHelper.send_S2C_NTF_CHAT_BROADCAST(player, ChatType.Normal, player.getUserNickname(), string.Empty, PlayerStateType.None, message);
var invokers = new List<ILogInvoker>();
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<ILogInvoker>();
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<ILogInvoker>();
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<Result> 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<BlockUserAgentAction>();
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<ILogInvoker>();
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<Result> PartyChat(string message)
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var personal_party_action = player.getEntityAction<PersonalPartyAction>();
NullReferenceCheckHelper.throwIfNull(personal_party_action, () => $"personal_party_action is null !!!");
var result = await personal_party_action.sendPartyChat(message);
var invokers = new List<ILogInvoker>();
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;
}
}