player pages: add rating, fix bug on rating type

This commit is contained in:
Maximilian Keßler 2023-12-11 00:16:52 +01:00
parent 271430e901
commit dd13cd4ae9
Signed by: max
GPG Key ID: BCC5A619923C0BA5

View File

@ -12,7 +12,6 @@ import stats
import constants import constants
import config import config
import utils import utils
import ratings
from dataclasses import dataclass from dataclasses import dataclass
from database import conn_manager from database import conn_manager
@ -122,6 +121,7 @@ class Player:
class PlayerStats(GeneralStats): class PlayerStats(GeneralStats):
current_streak: int = 0 current_streak: int = 0
max_streak: int = 0 max_streak: int = 0
rating: int = 0
@dataclass @dataclass
@ -353,31 +353,51 @@ def get_variant_rows() -> List[VariantRow]:
] ]
def get_player_stats() -> Dict[int, Dict[int, PlayerStats]]: def get_player_stats() -> Dict[str, Dict[int, PlayerStats]]:
cur = conn_manager.get_new_cursor() cur = conn_manager.get_new_cursor()
ret = {}
rating_types = [utils.get_rating_type(x) for x in [False, True]]
for rating_type in rating_types:
cur.execute( cur.execute(
"SELECT " "SELECT "
" user_id," " users.id,"
" player_name," " player_name,"
" variant_type,"
" games_played," " games_played,"
" games_won," " games_won,"
" total_bdr," " total_bdr,"
" total_crits_lots," " total_crits_lots,"
" total_game_moves," " total_game_moves,"
" current_streak," " current_streak,"
" maximum_streak " " maximum_streak,"
" user_accounts,"
" current_rating "
"FROM user_statistics " "FROM user_statistics "
"INNER JOIN users " "INNER JOIN users "
" ON user_statistics.user_id = users.id " " ON user_statistics.user_id = users.id AND user_statistics.variant_type = %s "
"ORDER BY user_id, variant_type" "INNER JOIN ("
" SELECT DISTINCT ON (user_accounts.user_id)"
" user_accounts.user_id,"
" array_agg(user_accounts.username ORDER BY user_accounts.username) AS user_accounts,"
" COALESCE(value_after, rating) AS current_rating"
" FROM users "
" LEFT OUTER JOIN user_ratings "
" ON user_ratings.user_id = users.id AND user_ratings.type = %s "
" LEFT OUTER JOIN user_accounts "
" ON users.id = user_accounts.user_id "
" INNER JOIN user_base_ratings "
" ON users.id = user_base_ratings.user_id AND user_base_ratings.type = %s"
" GROUP BY (user_accounts.user_id, player_name, value_after, league_id, rating) "
" ORDER BY user_accounts.user_id, league_id DESC"
" ) AS ratings "
" ON ratings.user_id = users.id "
"ORDER BY users.id, variant_type",
(rating_type, rating_type, rating_type)
) )
ret = {} for (user_id, player_name, games_played, games_won, total_bdr, total_crits_lost, total_game_moves, current_streak, maximum_streak, user_accounts, current_rating) in cur.fetchall():
for (user_id, player_name, variant_type, games_played, games_won, total_bdr, total_crits_lost, total_game_moves, current_streak, maximum_streak) in cur.fetchall():
if player_name not in ret.keys(): if player_name not in ret.keys():
ret[player_name] = {} ret[player_name] = {}
ret[player_name][variant_type] = PlayerStats(games_played, games_won, total_bdr, total_crits_lost, total_game_moves, current_streak, maximum_streak) row = PlayerRow(user_id, player_name, user_accounts, PlayerStats(games_played, games_won, total_bdr, total_crits_lost, total_game_moves, current_streak, maximum_streak, round(current_rating, 1)))
ret[player_name][rating_type] = row
return ret return ret
@ -483,7 +503,7 @@ def render_leaderboard():
player_stat=player_stat player_stat=player_stat
) )
output_file = out_dir / 'player' / str(player_name) / 'index.html' output_file = out_dir / 'player' / urllib.parse.quote_plus(player_name) / 'index.html'
output_file.parent.mkdir(exist_ok=True, parents=True) output_file.parent.mkdir(exist_ok=True, parents=True)
with open(output_file, 'w') as f: with open(output_file, 'w') as f: