Exemplo n.º 1
0
        public static bool IsUserOnChatRoomConnectionPool(Guid userId, ChatRoomConnectionPool chatRoomConnection)
        {
            foreach (var server in chatRoomConnection.ServerInstances)
            {
                var connectedUser = server.ConnectedUsers.Where(conn => conn.UserId == userId).FirstOrDefault();

                if (connectedUser != null)
                {
                    return(true);
                }
            }

            return(false);
        }
Exemplo n.º 2
0
        public static string GetConnectionIdFromChatRoomConnectionPool(Guid userId, ChatRoomConnectionPool chatRoomConnection)
        {
            foreach (var server in chatRoomConnection.ServerInstances)
            {
                var connectedUser = server.ConnectedUsers.Where(conn => conn.UserId == userId).FirstOrDefault();

                if (connectedUser != null)
                {
                    return(connectedUser.ConnectionId);
                }
            }

            // given user id was not found!
            throw new ObjectDoesNotExistException("User was not found in the room!");
        }
Exemplo n.º 3
0
        //
        //  Summary:
        //    Increments a chat room's connection pool on Redis.
        //
        //  Exceptions
        //    ChatRoomIsFullException - raised when the chat room is full
        //    UserIsAlreadyConnectedException - raised if the user is already connected to the room
        public static ChatRoomConnectionPool IncrementChatRoomConnectionPool(Guid userId,
                                                                             Guid serverInstanceId, string connectionId, ChatRoomConnectionPool chatRoomConnectionPool)
        {
            if (chatRoomConnectionPool.ActiveConnectionsLimit == chatRoomConnectionPool.TotalActiveConnections)
            {
                throw new ChatRoomIsFullException("The chat room is already full!");
            }

            var serverInstance = chatRoomConnectionPool.ServerInstances
                                 .Where(server => server.ServerInstanceId == serverInstanceId)
                                 .FirstOrDefault();

            // server instance hosting this chat room is new
            if (serverInstance == null)
            {
                chatRoomConnectionPool.ServerInstances         = CreateFirstServerInstance(userId, serverInstanceId, connectionId);
                chatRoomConnectionPool.TotalActiveConnections += 1;

                return(chatRoomConnectionPool);
            }

            // server instance is already hosting users for this room
            if (IsUserAlreadyInTheRoom(userId, serverInstance.ConnectedUsers))
            {
                throw new UserIsAlreadyConnectedException("User is already in the room!");
            }

            serverInstance.ConnectedUsers = serverInstance.ConnectedUsers
                                            .AsQueryable().Append(new ConnectedUser {
                UserId = userId, ConnectionId = connectionId
            });

            chatRoomConnectionPool.TotalActiveConnections += 1;
            return(chatRoomConnectionPool);
        }
Exemplo n.º 4
0
        //
        //  Summary:
        //    Decrements a chat room's connection pool on Redis based on a connection id.
        //
        //  Exceptions
        //    UserIsNotConnectedException - raised if the user connection was not found.
        public static ChatRoomConnectionPool DecrementChatRoomConnectionPool(Guid serverInstanceId,
                                                                             string connectionId, ChatRoomConnectionPool chatRoomConnectionPool)
        {
            var serverInstance = chatRoomConnectionPool.ServerInstances
                                 .Where(server => server.ServerInstanceId == serverInstanceId)
                                 .FirstOrDefault();
            var connectedUser = serverInstance?.ConnectedUsers.Where(conn => conn.ConnectionId == connectionId);

            // makes sure a server instance exists and that the connectionId exists
            if (serverInstance == null || connectedUser.Count() == 0)
            {
                throw new ObjectDoesNotExistException("User was not found in the room! Maybe he has left already?");
            }

            // updated list with the removed connection
            var updatedConnections = serverInstance.ConnectedUsers.ToList();

            updatedConnections.RemoveAll(conn => conn.ConnectionId == connectionId);

            serverInstance.ConnectedUsers = updatedConnections;
            chatRoomConnectionPool.TotalActiveConnections -= 1;

            return(chatRoomConnectionPool);
        }