272 lines
11 KiB
C#
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;
|
|
}
|
|
}
|