def upvote_song(room_number, url, cookie):
        user_id = SecurityUtils.get_userId(cookie)
        url = SecurityUtils.encrypt_url(url)
        pending_songs = DBUtils.get_pending_songs(room_number)

        # Check if a song is in the queue/pending songs
        if url not in pending_songs:
            return False, ErrorMsg.NO_SONG.value

        songs = DBUtils.get_votes_per_user(room_number, user_id)
        if url not in songs:
            result = DBUtils.upvote(room_number, url, user_id)
            msg = 'Something went wrong, please vote again!'
            pending_songs = DBUtils.get_pending_songs(room_number)
            sorted_queue = QueueModerator.sort_pending_songs(pending_songs)

            return (True, sorted_queue,
                    None) if result else (False, sorted_queue, msg)
        elif songs[url]:
            sorted_queue = QueueModerator.sort_pending_songs(pending_songs)
            msg = 'User has already voted for this song'
            return False, sorted_queue, msg

        sorted_queue = QueueModerator.sort_pending_songs(pending_songs)
        return False, sorted_queue, None
Example #2
0
    def join_room(room_number, nickname, ip):
        """
        Register a new user\n
        Generates users id, computes it's secret token, saves it in database\n
        :param room_number:\n
        :param nickname: \n
        :param ip: \n
        :return: json{Status, [UserCookie]}
        """

        #do not allow blocked IP users join
        blocked_members = DBUtils.get_fields(room_number, ['blocked_members'])
        if blocked_members is not None:
            blocked_members = blocked_members[0]['blocked_members']
            ips = []
            for userId in blocked_members:
                ips.append(blocked_members[userId]['IP'])

            if ip in ips:
                return Response.responseFailure(
                    "Blocked from entering this party room")

        #get unique ID
        try:
            # print("pre user ID")
            userId = DBUtils.generateUniqueId(Purpose.USER, room_number)
            # print("after UserID has been assigned")
            result = userId
        except ValueError as error:
            return Response.responseFailure("Room does not exist")
        token = SecurityUtils.generateToken()

        user = {
            userId: {
                'nickname': nickname,
                'token': token,
                'IP': ip,
                'songs': {}
            },
        }

        #save in database
        result = DBUtils.add_member(room_number, user)

        if result:
            #generate user identifiers
            cookie = SecurityUtils.generateCookie(userId, token)
            return Response.responseSuccess({
                "UserCookie":
                cookie,
                "UserId":
                userId,
                "SpotifySearchToken":
                TokenModerator.get_client_credentials_token(),
                "YoutubeSearchToken":
                config.TOKEN_KEYS['YOUTUBE_DATA_API']
            })
        else:
            return Response.responseFailure("Failed to add new party member")
Example #3
0
    def create_room():
        '''
        :return: if successful - True, room object; else - False, {}, message

        # return: response message, either success or failure which holds a room object with the following fields:
        # queue - dictionary/json object with pending songs
        # history - dictionary/json object with played songs
        # searchToken - search token (TODO)
        # accessToken - access token (TODO)
        # master - id of creator of room (TODO)
        # users - list with user ids and their votes
        # return json response with room if it's created, otherwise empty object and a failure message
        '''

        userId = DBUtils.generateUniqueId(Purpose.USER)
        token = SecurityUtils.generateToken()
        cookie = SecurityUtils.generateCookie(userId, token)
        spotify_search_token = TokenModerator.get_client_credentials_token()
        youtube_key = TokenModerator.get_youtube_search_key()

        room_obj = {
            # '_id': DBUtils.generateUniqueId(Purpose.ROOM),
            '_id': DBUtils.generateFourSymbolId(),
            'master': {userId: token},
            'SpotifySearchToken': spotify_search_token,
            'YoutubeSearchToken': youtube_key,
            'head': None,
            'queue': {},
            'history': {}, # played songs
            'users': {
                userId:{
                'nickname': 'Master',
                'token': token,
                'IP': "localhost",
                'songs': {} #master does not have 'blocked' field on purpose
                }
            },
            'blocked_members':{}
        }
        #@think is it ok to return values as head, users, master, _id as those are not needed

        result = DBUtils.create_room(room_obj)

        # cookie to identify the master
        room_obj.update({'MasterCookie': cookie})
        if result:
            return True, room_obj, None
        else:
            msg = 'Room was not created'
            return False, {}, msg
    def enqueue_song(room_number, url, name, duration, userId):
        url = SecurityUtils.encrypt_url(url)
        room = DBUtils.get_room(room_number)
        queue = room['queue']

        # Assume a song does not exist
        exists = False
        if url in queue:
            exists = True
            queue_list = QueueModerator.sort_pending_songs(queue)
            return False, queue_list

        song = {
            'name': name,
            'score': 0,  # initial score is always 0
            'duration': duration,
            'nickname': DBUtils.get_member(userId,
                                           room_number)[userId]['nickname'],
            'userId': userId
        }

        result = DBUtils.enqueue_song(room['_id'], url, song,
                                      len(queue.keys()) + 1)
        unsorted_queue = DBUtils.get_pending_songs(room_number)
        queue_list = QueueModerator.sort_pending_songs(unsorted_queue)

        return result, queue_list
    def remove_song(room_number, url):
        url = SecurityUtils.encrypt_url(url)
        is_successful, unsorted_queue = DBUtils.remove_song(room_number, url)
        sorted_queue = QueueModerator.sort_pending_songs(unsorted_queue)

        if is_successful:
            return True, sorted_queue, None
        else:
            return False, sorted_queue, ErrorMsg.NOT_REMOVED.value
Example #6
0
        def master_in_route(*args, **kwargs):
            cookie = request.headers.get('Authorization')
            if cookie is None:
                return Response.responseFailure(ErrorMsg.NO_AUTH.value)

            room_number = kwargs['room_number']
            is_allowed = SecurityUtils.checkUser(room_number, cookie, True)
            if is_allowed:
                return f(*args, **kwargs)
            else:
                return Response.responseFailure(ErrorMsg.NO_MASTER.value)
    def sort_pending_songs(songs):
        priority_queue = DuplicatePriorityQueue()
        queue_list = []
        if type(songs) is dict:
            for x in songs.keys():
                song = songs[x]
                song['url'] = SecurityUtils.decrypt_url(x)
                priority_queue.enqueue(songs[x], songs[x]['score'])

            while len(priority_queue) > 0:
                queue_list.append(priority_queue.dequeue())

        return queue_list
    def unvote_song(room_number, url, cookie):
        user_id = SecurityUtils.get_userId(cookie)
        url = SecurityUtils.encrypt_url(url)
        pending_songs = DBUtils.get_pending_songs(room_number)

        # Check if a song is in the queue/pending songs
        if url not in pending_songs:
            sorted_queue = QueueModerator.sort_pending_songs(pending_songs)
            return False, sorted_queue, ErrorMsg.NO_SONG.value

        songs = DBUtils.get_votes_per_user(room_number, user_id)

        if url not in songs or songs[url] == 0:
            sorted_queue = QueueModerator.sort_pending_songs(pending_songs)
            return False, sorted_queue, ErrorMsg.NO_VOTE.value

        result, err = DBUtils.unvote(room_number, url, user_id)
        pending_songs = DBUtils.get_pending_songs(room_number)
        sorted_queue = QueueModerator.sort_pending_songs(pending_songs)

        if result:
            return True, sorted_queue, None
        else:
            return False, sorted_queue, err.value
    def dequeue_song(room_number):
        is_successful, dequeued_song, msg = DBUtils.dequeue_song(room_number)
        history, unsorted_queue = DBUtils.get_all_songs(room_number)
        queue = QueueModerator.sort_pending_songs(unsorted_queue)
        history = QueueModerator.decrypt_urls(history)
        decrypted_song = None

        if dequeued_song is not None:
            for x in dequeued_song.keys():
                decrypted_song = dequeued_song[x]
                decrypted_song['url'] = SecurityUtils.decrypt_url(x)

                break

        if is_successful:
            return True, history, queue, decrypted_song, None
        else:
            return False, history, queue, decrypted_song, msg.value
Example #10
0
 def decrypt_urls(songs_object):
     decrypted_url_songs = {}
     for x in songs_object.keys():
         decoded_url = SecurityUtils.decrypt_url(x)
         decrypted_url_songs[decoded_url] = songs_object[x]
     return decrypted_url_songs