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(); ConcurrentDictionary friends = friend_agent_action.getFriends(); foreach (var saved_friend in friends.Values) { var saved_friend_attribute = saved_friend.getEntityAttribute(); 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(); 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 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 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> fillupFriendRequestInfos(List caches) { List 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 send_GS2CS_NTF_LOGIN_TO_FRIENDS(this Player player) { var server_logic = GameServerApp.getServerLogic(); var friend_action = player.getEntityAction(); 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(); 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(); 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 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(); 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(); 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); }; } }