391 lines
16 KiB
C#
391 lines
16 KiB
C#
|
|
using System.Collections.Concurrent;
|
|
|
|
|
|
using Google.Protobuf;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
|
|
|
|
using ServerCore;
|
|
using ServerBase;
|
|
using ServerCommon;
|
|
using ServerCommon.BusinessLogDomain;
|
|
using MetaAssets;
|
|
|
|
|
|
|
|
namespace GameServer;
|
|
|
|
public static class FriendNotifyHelper
|
|
{
|
|
public static void send_S2C_NTF_FRIENDS(this Player player)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.FriendListNoti = new();
|
|
|
|
var friend_agent_action = player.getEntityAction<FriendAgentAction>();
|
|
ConcurrentDictionary<string, Friend> friends = friend_agent_action.getFriends();
|
|
|
|
foreach (var saved_friend in friends.Values)
|
|
{
|
|
var saved_friend_attribute = saved_friend.getEntityAttribute<FriendAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(saved_friend_attribute, () => $"saved_friend_attribute is null");
|
|
|
|
FriendInfo info = new();
|
|
info.Guid = saved_friend_attribute.FriendGuid;
|
|
info.NickName = saved_friend_attribute.Nickname;
|
|
info.FolderName = saved_friend_attribute.FolderName;
|
|
info.IsNew = saved_friend_attribute.IsNew;
|
|
ntf_packet.Message.FriendListNoti.FriendList.Add(info);
|
|
}
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
//customUI 추가 되면 삭제 할 예정
|
|
public static void send_S2C_NTF_FRIEND_FOLDERS(this Player player)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.FriendFolderListNoti = new();
|
|
|
|
var friend_folder_attribute = player.getEntityAttribute<FriendFolderAttribute>();
|
|
NullReferenceCheckHelper.throwIfNull(friend_folder_attribute, () => $"friend_folder_attribute is null");
|
|
|
|
ntf_packet.Message.FriendFolderListNoti.FolderOrderType = friend_folder_attribute.m_folder_order_type;
|
|
|
|
foreach (var folder in friend_folder_attribute.m_folders.Values)
|
|
{
|
|
FriendFolder friend_folder = new();
|
|
friend_folder.FolderName = folder.FolderName;
|
|
friend_folder.IsHold = folder.IsHold;
|
|
friend_folder.HoldTime = Timestamp.FromDateTime(folder.HoldTime);
|
|
friend_folder.CreateTime = Timestamp.FromDateTime(folder.CreateTime);
|
|
|
|
ntf_packet.Message.FriendFolderListNoti.FriendFolderList.Add(friend_folder);
|
|
}
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
public static async Task send_S2C_NTF_SENDED_FRIEND_REQUESTS(this Player player)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.SendedFriendRequestNoti = new();
|
|
|
|
FriendReqCacheRequest cache_request = new FriendReqCacheRequest(player, player.getUserGuid(), server_logic.getRedisConnector());
|
|
List<FriendRequestCache> caches = await cache_request.getSendedFriendRequests();
|
|
|
|
var infos = await fillupFriendRequestInfos(caches);
|
|
ntf_packet.Message.SendedFriendRequestNoti.RequestList.AddRange(infos);
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
}
|
|
|
|
public static async Task send_S2C_NTF_RECEIVED_FRIEND_REQUESTS(this Player player)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var ntf_packet = new ClientToGame();
|
|
ntf_packet.Message = new();
|
|
ntf_packet.Message.ReceivedFriendRequestNoti = new();
|
|
|
|
FriendReqCacheRequest cache_request = new FriendReqCacheRequest(player, player.getUserGuid(), server_logic.getRedisConnector());
|
|
List<FriendRequestCache> caches = await cache_request.getReceivedFriendRequests();
|
|
|
|
var infos = await fillupFriendRequestInfos(caches);
|
|
ntf_packet.Message.ReceivedFriendRequestNoti.RequestList.AddRange(infos);
|
|
|
|
server_logic.onSendPacket(player, ntf_packet);
|
|
|
|
}
|
|
|
|
private static async Task<List<FriendRequestInfo>> fillupFriendRequestInfos(List<FriendRequestCache> caches)
|
|
{
|
|
List<FriendRequestInfo> infos = new();
|
|
|
|
foreach (var request_friend in caches)
|
|
{
|
|
FriendRequestInfo info = new();
|
|
info.Guid = request_friend.m_receiver_guid;
|
|
|
|
(var result, var nickname_attrib) = await NicknameDoc.findNicknameFromGuid(request_friend.m_receiver_guid);
|
|
if (result.isFail())
|
|
{
|
|
Log.getLogger().error($"{request_friend.m_receiver_guid} user not exitst Nickname");
|
|
info.NickName = string.Empty;
|
|
}
|
|
else
|
|
{
|
|
NullReferenceCheckHelper.throwIfNull(nickname_attrib, () => $"nickname_attrib is null");
|
|
|
|
info.NickName = nickname_attrib.Nickname;
|
|
}
|
|
info.IsNew = request_friend.m_is_new;
|
|
info.RequestTime = Timestamp.FromDateTime(request_friend.m_request_time);
|
|
|
|
infos.Add(info);
|
|
}
|
|
|
|
return infos;
|
|
}
|
|
|
|
public static async Task sendLoginNotiToFriend(this Player player, bool isFirstLogin)
|
|
{
|
|
if (isFirstLogin)
|
|
{
|
|
await player.send_GS2CS_NTF_LOGIN_TO_FRIENDS();
|
|
}
|
|
else
|
|
{
|
|
await player.send_GS2CS_NTF_STATE_TO_FRIENDS();
|
|
}
|
|
}
|
|
|
|
public static async Task<Result> send_GS2CS_NTF_LOGIN_TO_FRIENDS(this Player player)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var friend_action = player.getEntityAction<FriendAgentAction>();
|
|
NullReferenceCheckHelper.throwIfNull(friend_action, () => $"friend_action is null");
|
|
|
|
var friends = friend_action.getFriends();
|
|
|
|
var login_cache_request = new LoginCacheRequest(player, server_logic.getRedisConnector());
|
|
var result = await login_cache_request.fetchLogin();
|
|
if (result.isFail()) return result;
|
|
|
|
var login_cache = login_cache_request.getLoginCache();
|
|
NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login_cache is null");
|
|
|
|
var location_info = player.getUserLocationInfo();
|
|
|
|
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
|
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null");
|
|
|
|
foreach (var friend in friends)
|
|
{
|
|
var friend_guid = friend.Key;
|
|
var friend_login_cache = await getFriendCache(player, friend_guid);
|
|
if (friend_login_cache == null) continue;
|
|
var target_server = friend_login_cache.CurrentServer;
|
|
|
|
var message = new ServerMessage();
|
|
message.LoginNotiToFriend = new();
|
|
message.LoginNotiToFriend.BaseInfo = new();
|
|
message.LoginNotiToFriend.BaseInfo.SenderId = player.getUserGuid();
|
|
message.LoginNotiToFriend.BaseInfo.SenderGuid = player.getUserGuid();
|
|
message.LoginNotiToFriend.BaseInfo.SenderNickName = player.getUserNickname();
|
|
message.LoginNotiToFriend.BaseInfo.SenderState = (Int32)login_cache.State;
|
|
message.LoginNotiToFriend.BaseInfo.SenderMapId = location_info.Id;
|
|
message.LoginNotiToFriend.LocationInfo = location_info;
|
|
message.LoginNotiToFriend.BaseInfo.ReceiverId = friend_guid;
|
|
message.LoginNotiToFriend.BaseInfo.ReceiverGuid = friend_guid;
|
|
message.LoginNotiToFriend.BaseInfo.ReceiverNickName = string.Empty;
|
|
rabbit_mq.SendMessage(target_server, message);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public static async Task send_GS2CS_NTF_LOGOUT_TO_FRIENDS(this Player player)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var friend_action = player.getEntityAction<FriendAgentAction>();
|
|
NullReferenceCheckHelper.throwIfNull(friend_action, () => $"friend_action is null");
|
|
|
|
var friends = friend_action.getFriends();
|
|
|
|
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
|
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null");
|
|
|
|
foreach (var friend in friends)
|
|
{
|
|
var friend_guid = friend.Key;
|
|
var friend_login_cache = await getFriendCache(player, friend_guid);
|
|
if (friend_login_cache == null) continue;
|
|
var target_server = friend_login_cache.CurrentServer;
|
|
|
|
ServerMessage message = new ServerMessage();
|
|
message.LogoutNotiToFriend = new();
|
|
message.LogoutNotiToFriend.BaseInfo = new();
|
|
message.LogoutNotiToFriend.BaseInfo.SenderId = player.getUserGuid();
|
|
message.LogoutNotiToFriend.BaseInfo.SenderGuid = player.getUserGuid();
|
|
message.LogoutNotiToFriend.BaseInfo.SenderNickName = player.getUserNickname();
|
|
message.LogoutNotiToFriend.BaseInfo.SenderState = 0;
|
|
message.LogoutNotiToFriend.BaseInfo.SenderMapId = 0;
|
|
message.LogoutNotiToFriend.BaseInfo.ReceiverId = friend_guid;
|
|
message.LogoutNotiToFriend.BaseInfo.ReceiverGuid = friend_guid;
|
|
message.LogoutNotiToFriend.BaseInfo.ReceiverNickName = string.Empty;
|
|
rabbit_mq.SendMessage(target_server, message);
|
|
}
|
|
}
|
|
|
|
public static async Task send_GS2CS_NTF_STATE_TO_FRIENDS(this Player player)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var friend_action = player.getEntityAction<FriendAgentAction>();
|
|
NullReferenceCheckHelper.throwIfNull(friend_action, () => $"friend_action is null");
|
|
|
|
var friends = friend_action.getFriends();
|
|
|
|
var login_cache_request = new LoginCacheRequest(player, server_logic.getRedisConnector());
|
|
var result = await login_cache_request.fetchLogin();
|
|
if (result.isFail()) return;
|
|
|
|
var login_cache = login_cache_request.getLoginCache();
|
|
NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login_cache is null");
|
|
|
|
var location_info = player.getUserLocationInfo();
|
|
|
|
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
|
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null");
|
|
|
|
foreach (var friend in friends)
|
|
{
|
|
var friend_guid = friend.Key;
|
|
var friend_login_cache = await getFriendCache(player, friend_guid);
|
|
if (friend_login_cache == null) continue;
|
|
var target_server = friend_login_cache.CurrentServer;
|
|
|
|
ServerMessage stateNoti = new()
|
|
{
|
|
StateNotiToFriend = new()
|
|
};
|
|
stateNoti.StateNotiToFriend.BaseInfo = new();
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderId = player.getUserGuid();
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderGuid = player.getUserGuid();
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderNickName = player.getUserNickname();
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderState = (Int32)login_cache.State;
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderMapId = location_info.Id;
|
|
stateNoti.StateNotiToFriend.BaseInfo.ReceiverId = friend_guid;
|
|
stateNoti.StateNotiToFriend.BaseInfo.ReceiverGuid = friend_guid;
|
|
stateNoti.StateNotiToFriend.BaseInfo.ReceiverNickName = string.Empty;
|
|
stateNoti.StateNotiToFriend.LocationInfo = location_info;
|
|
|
|
rabbit_mq.SendMessage(target_server, stateNoti);
|
|
}
|
|
}
|
|
|
|
public static async Task send_GS2CS_NTF_STATE_TO_FRIEND(this Player player, string friendGuid)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var login_cache_request = new LoginCacheRequest(player, server_logic.getRedisConnector());
|
|
var result = await login_cache_request.fetchLogin();
|
|
if (result.isFail()) return;
|
|
|
|
var login_cache = login_cache_request.getLoginCache();
|
|
NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login_cache is null");
|
|
|
|
var location_info = player.getUserLocationInfo();
|
|
|
|
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
|
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null");
|
|
|
|
var friend_login_cache = await getFriendCache(player, friendGuid);
|
|
if (friend_login_cache == null) return;
|
|
var target_server = friend_login_cache.CurrentServer;
|
|
|
|
ServerMessage stateNoti = new()
|
|
{
|
|
StateNotiToFriend = new()
|
|
};
|
|
stateNoti.StateNotiToFriend.BaseInfo = new();
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderId = player.getUserGuid();
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderGuid = player.getUserGuid();
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderNickName = player.getUserNickname();
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderState = (Int32)login_cache.State;
|
|
stateNoti.StateNotiToFriend.BaseInfo.SenderMapId = location_info.Id;
|
|
stateNoti.StateNotiToFriend.BaseInfo.ReceiverId = friendGuid;
|
|
stateNoti.StateNotiToFriend.BaseInfo.ReceiverGuid = friendGuid;
|
|
stateNoti.StateNotiToFriend.BaseInfo.ReceiverNickName = string.Empty;
|
|
stateNoti.StateNotiToFriend.LocationInfo = location_info;
|
|
|
|
rabbit_mq.SendMessage(target_server, stateNoti);
|
|
}
|
|
|
|
public static async Task<LoginCache?> getFriendCache(Player player, string friend_guid)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
var friend_login_cache_request = new LoginCacheOtherUserRequest(player, server_logic.getRedisConnector(), friend_guid);
|
|
|
|
var result = await friend_login_cache_request.fetchLogin();
|
|
if (result.isFail()) return null;
|
|
|
|
var friend_login_cache = friend_login_cache_request.getLoginCache();
|
|
return friend_login_cache;
|
|
}
|
|
|
|
public static async Task send_NTF_TO_FRIEND_ABOUT_LEAVING_HOME(Player player)
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
var friend_action = player.getEntityAction<FriendAgentAction>();
|
|
NullReferenceCheckHelper.throwIfNull(friend_action, () => $"friend_action is null");
|
|
|
|
var friends = friend_action.getFriends();
|
|
|
|
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
|
NullReferenceCheckHelper.throwIfNull(rabbit_mq, () => $"rabbit_mq is null");
|
|
|
|
foreach (var friend in friends)
|
|
{
|
|
var friend_guid = friend.Key;
|
|
var friend_login_cache = await getFriendCache(player, friend_guid);
|
|
if (friend_login_cache == null) continue;
|
|
var target_server = friend_login_cache.CurrentServer;
|
|
|
|
ServerMessage notiMessage = new ServerMessage();
|
|
notiMessage.NtfFriendLeavingHome = new();
|
|
notiMessage.NtfFriendLeavingHome.Guid = player.getUserGuid();
|
|
notiMessage.NtfFriendLeavingHome.NickName = player.getUserNickname();
|
|
notiMessage.NtfFriendLeavingHome.ReceiverId = friend_guid;
|
|
|
|
rabbit_mq.SendMessage(target_server, notiMessage);
|
|
}
|
|
}
|
|
|
|
public static async Task send_GS2CS_NTF_FRIEND_LEAVE_MYHOME(this Player player)
|
|
{
|
|
var friend_action = player.getEntityAction<FriendAgentAction>();
|
|
NullReferenceCheckHelper.throwIfNull(friend_action, () => $"friend_action is null");
|
|
|
|
var friends = friend_action.getFriends();
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
var rabbitMQ4Game = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
|
NullReferenceCheckHelper.throwIfNull(rabbitMQ4Game, () => $"rabbitMQ4Game is null");
|
|
|
|
foreach (var friend in friends)
|
|
{
|
|
var friend_guid = friend.Key;
|
|
var friend_login_cache = await getFriendCache(player, friend_guid);
|
|
if (friend_login_cache == null) continue;
|
|
var target_server = friend_login_cache.CurrentServer;
|
|
|
|
ServerMessage ntf_packet = new()
|
|
{
|
|
NtfFriendLeavingHome = new()
|
|
};
|
|
ntf_packet.NtfFriendLeavingHome.Guid = player.getUserGuid();
|
|
ntf_packet.NtfFriendLeavingHome.NickName = player.getUserNickname();
|
|
ntf_packet.NtfFriendLeavingHome.ReceiverId = friend_guid;
|
|
|
|
rabbitMQ4Game.SendMessage(target_server, ntf_packet);
|
|
};
|
|
|
|
}
|
|
|
|
}
|