/// <summary> /// Add user to list of online users and start to listen to him. /// </summary> /// <param name="user">user.</param> public void AddUser(OnlineUser user) { if (user != null) { onlineUsers.Add(user); // online notification to friends string[] allFriends = DBoperations.GetFriends(user.Id); string[] online_users = onlineUsers.Select(x => x.Login).ToArray(); string[] onlineFriends = allFriends.Where(x => online_users.Contains(x)).ToArray(); foreach (var login in onlineFriends) { OnlineUser friend = GetOnlineUser(login); friend?.Client.SendMessage(new UserActionMessage { UserLogin = user.Login, Action = UserActions.GoOnline }); } } // listen this user Task.Run(() => UserListener(user)); }
/// <summary> /// Send array of friends to user. /// </summary> /// <param name="user">user.</param> /// <exception cref="ConnectionInterruptedException"></exception> private void SendFriends(OnlineUser user) { string[] allFriends = DBoperations.GetFriends(user.Id); string[] online_users = onlineUsers.Select(x => x.Login).ToArray(); user.Client.SendMessage(new FriendsMessage { OnlineFriends = allFriends.Where(x => online_users.Contains(x)).ToArray(), OfflineFriends = allFriends.Where(x => !online_users.Contains(x)).ToArray() }); }
/// <summary> /// Send array of all users to user. /// </summary> /// <param name="user">user.</param> /// <exception cref="ConnectionInterruptedException"></exception> private void SendAllUsers(OnlineUser user) { string[] allUsers = DBoperations.GetAllUsers(); string[] incomeRequests = DBoperations.GetIncomeFriendshipRequests(user.Id); string[] outcomeRequests = DBoperations.GetOutcomeFriendshipRequests(user.Id); string[] friends = DBoperations.GetFriends(user.Id); string[] users = allUsers.Where(x => !incomeRequests.Contains(x) & !outcomeRequests.Contains(x) & !friends.Contains(x) & x != user.Login).ToArray(); string[] online_users = onlineUsers.Select(x => x.Login).ToArray(); user.Client.SendMessage(new AllUsersMessage { OnlineUsers = users.Where(x => online_users.Contains(x)).ToArray(), OfflineUsers = users.Where(x => !online_users.Contains(x)).ToArray() }); }
/// <summary> /// Log out user. /// </summary> /// <param name="user">user.</param> private void Logout(OnlineUser user) { log.Info($"Client disconnected. ip {((IPEndPoint)user.Client.tcpClient.Client.RemoteEndPoint).Address.ToString()}"); string[] allFriends = DBoperations.GetFriends(user.Id); string[] online_users = onlineUsers.Select(x => x.Login).ToArray(); string[] onlineFriends = allFriends.Where(x => online_users.Contains(x)).ToArray(); foreach (var login in onlineFriends) { OnlineUser friend = GetOnlineUser(login); friend?.Client.SendMessage(new UserActionMessage { UserLogin = user.Login, Action = UserActions.GoOffline }); } onlineUsers.Remove(user); user.Dispose(); }