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
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")
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
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
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