add more stats to webpage

This commit is contained in:
Maximilian Keßler 2023-12-04 15:04:37 +01:00
parent d272c4f549
commit 230d96ae1b
Signed by: max
GPG Key ID: BCC5A619923C0BA5

View File

@ -85,7 +85,7 @@ def get_leaders(rating_lists: Dict, streak_lists: Dict) -> Dict[int, Dict[str, L
return leaders return leaders
def get_streak_lists(): def get_stat_lists(stat_type: str, order_type: str = 'DESC', precision: int = 0, default: float | int = 0, percents: bool = False):
cur = conn_manager.get_connection().cursor(cursor_factory=psycopg2.extras.DictCursor) cur = conn_manager.get_connection().cursor(cursor_factory=psycopg2.extras.DictCursor)
rating_types = [utils.get_rating_type(x) for x in [False, True]] rating_types = [utils.get_rating_type(x) for x in [False, True]]
leaderboard = { leaderboard = {
@ -98,19 +98,24 @@ def get_streak_lists():
" SELECT " " SELECT "
" player_name," " player_name,"
" string_agg(user_accounts.username, %s ORDER BY user_accounts.username) AS user_accounts," " string_agg(user_accounts.username, %s ORDER BY user_accounts.username) AS user_accounts,"
" COALESCE(maximum_streak, %s) AS maximum_streak" f" COALESCE({stat_type}, %s) AS value"
" FROM users " " FROM users "
" LEFT OUTER JOIN user_statistics" " LEFT OUTER JOIN user_statistics"
" ON users.id = user_statistics.user_id AND variant_type = %s" " ON users.id = user_statistics.user_id AND variant_type = %s"
" LEFT OUTER JOIN user_accounts " " LEFT OUTER JOIN user_accounts "
" ON users.id = user_accounts.user_id " " ON users.id = user_accounts.user_id "
" GROUP BY (user_accounts.user_id, player_name, maximum_streak) " f" GROUP BY (user_accounts.user_id, player_name, {stat_type}) "
" ) AS streaks " " ) AS streaks "
"ORDER BY maximum_streak DESC", f"ORDER BY value {order_type}",
(", ", 0, rating_type) (", ", default, rating_type)
) )
for (player_name, user_accounts, maximum_streak) in cur.fetchall(): for (player_name, user_accounts, value) in cur.fetchall():
leaderboard[rating_type].append(PlayerEntry(player_name, user_accounts, maximum_streak)) if percents:
value = round(100 * value, precision)
value = str(value) + ' %'
else:
value = round(value, precision)
leaderboard[rating_type].append(PlayerEntry(player_name, user_accounts, value))
return leaderboard return leaderboard
@ -167,12 +172,15 @@ def get_num_players():
def render_leaderboard(): def render_leaderboard():
rating_lists = get_rating_lists() rating_lists = get_rating_lists()
streak_lists = get_streak_lists() streak_lists = get_stat_lists("maximum_streak")
leaders = get_leaders(rating_lists, streak_lists) leaders = get_leaders(rating_lists, streak_lists)
leaderboards = { leaderboards = {
'Player Rating': rating_lists, 'Player Rating': rating_lists,
'Maximum Streak': streak_lists 'Maximum Streak': streak_lists,
'Current Streak': get_stat_lists("current_streak", order_type="DESC"),
'Average Bottom Deck Risk': get_stat_lists("average_bdr", 'ASC', precision=2, default=float("inf")),
'Winrate': get_stat_lists('winrate', order_type='DESC', precision=1, percents=True)
} }
env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates')) env = jinja2.Environment(loader=jinja2.FileSystemLoader('templates'))