示例#1
0
def update_line(sid):
	# TODO: This needs code review
	# Get everyone in the line
	line = db.c.fetch_all("SELECT username, user_id, line_expiry_tune_in, line_expiry_election FROM r4_request_line JOIN phpbb_users USING (user_id) WHERE sid = %s ORDER BY line_wait_start", (sid,))
	new_line = []
	user_positions = {}
	t = time.time()
	position = 1
	# For each person
	for row in line:
		add_to_line = False
		u = User(row['user_id'])
		row['song_id'] = None
		# If their time is up, remove them and don't add them to the new line
		if row['line_expiry_tune_in'] <= t:
			u.remove_from_request_line()
		else:
			# refresh the user to get their data, using local cache only - speed things up here
			u.refresh(True)
			# If they're not tuned in and haven't been marked as expiring yet, mark them, add to line, move on
			if not u.data['radio_tuned_in'] and not u.data['radio_tuned_in']:
				row['line_expiry_tune_in'] = t + 600
				add_to_line = True
			# do nothing if they're not tuned in
			elif not u.data['radio_tuned_in']:
				pass
			else:
				# Get their top song ID
				song_id = u.get_top_request_song_id(sid)
				# If they have no song and their line expiry has arrived, boot 'em
				if not song_id and (row['line_expiry_election'] <= t):
					u.remove_from_request_line()
					# Give them a second chance if they still have requests, this is SID-indiscriminate
					# they'll get added to whatever line is their top request
					if u.has_requests():
						u.put_in_request_line(u.get_top_request_sid())
				# If they have no song, start the expiry countdown
				elif not song_id:
					row['line_expiry_election'] = t + 600
					add_to_line = True
				# Keep 'em in line
				else:
					row['song_id'] = song_id
					add_to_line = True
		if add_to_line:
			new_line.append(row)
			user_positions[u.id] = position
			position = position + 1
	
	cache.set_station(sid, "request_line", new_line)
	cache.set_station(sid, "request_user_positions", user_positions)
示例#2
0
def get_next(sid):
	# TODO: Code review
	line = cache.get_station(sid, "request_line")
	song = None
	for pos in range(0, len(line)):
		if not line['song_id']:
			pass
		else:
			entry = line.pop(pos)
			song = playlist.Song.load_from_id(entry['song_id'], sid)
			song.data['elec_request_user_id'] = entry['user_id']
			song.data['elec_request_username'] = entry['username']
			
			db.c.update("DELETE FROM r4_request_store WHERE user_id = %s AND song_id = %s", (u.id, request['song_id']))
			u = User(entry['user_id'])
			u.remove_from_request_line()
			if u.has_requests():
				u.put_in_request_line(u.get_top_request_sid())
			cache.set_station(sid, "request_line", line)
			break

	return song