forked from Hanabi/hanabi-league
add summary stats
This commit is contained in:
parent
4461a680fd
commit
89a14b6bc1
4 changed files with 60 additions and 21 deletions
|
@ -67,7 +67,7 @@ body {
|
||||||
}
|
}
|
||||||
.stat-description {
|
.stat-description {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 20em;
|
width: 16em;
|
||||||
}
|
}
|
||||||
.stat-list {
|
.stat-list {
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
|
|
|
@ -37,12 +37,12 @@ class Leader:
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class VariantStats:
|
class VariantStats:
|
||||||
rating: int
|
rating: int = 0
|
||||||
games_played: int
|
games_played: int = 0
|
||||||
games_won: int
|
games_won: int = 0
|
||||||
total_bdr: int
|
total_bdr: int = 0
|
||||||
total_crits_lost: int
|
total_crits_lost: int = 0
|
||||||
total_moves: int
|
total_moves: int = 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def winrate(self):
|
def winrate(self):
|
||||||
|
@ -68,6 +68,11 @@ class VariantStats:
|
||||||
return 0
|
return 0
|
||||||
return round(float(self.total_moves) / self.games_played, 3)
|
return round(float(self.total_moves) / self.games_played, 3)
|
||||||
|
|
||||||
|
def __iadd__(self, other):
|
||||||
|
for field in dataclasses.fields(self):
|
||||||
|
setattr(self, field.name, getattr(self, field.name) + getattr(other, field.name))
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class VariantRow:
|
class VariantRow:
|
||||||
|
@ -175,6 +180,15 @@ def group_games_by_var_id_and_num_players(games: List[GameRow]):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def group_games_by_var_id(games: List[GameRow]):
|
||||||
|
ret = {}
|
||||||
|
for game in games:
|
||||||
|
if game.variant_id not in ret.keys():
|
||||||
|
ret[game.variant_id] = []
|
||||||
|
ret[game.variant_id].append(dataclasses.asdict(game))
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def get_rating_lists() -> Dict[int, List[PlayerEntry]]:
|
def get_rating_lists() -> Dict[int, List[PlayerEntry]]:
|
||||||
cur = conn_manager.get_connection().cursor()
|
cur = conn_manager.get_connection().cursor()
|
||||||
rating_types = [utils.get_rating_type(x) for x in [False, True]]
|
rating_types = [utils.get_rating_type(x) for x in [False, True]]
|
||||||
|
@ -317,17 +331,21 @@ def get_num_players():
|
||||||
return num_users
|
return num_users
|
||||||
|
|
||||||
|
|
||||||
def build_variant_stats_per_variant(variant_rows: List[VariantRow]):
|
def build_variant_stats_by_variant(variant_rows: List[VariantRow]):
|
||||||
|
variant_stats_per_player = {}
|
||||||
variant_stats = {}
|
variant_stats = {}
|
||||||
variant_names = {}
|
variant_names = {}
|
||||||
for row in variant_rows:
|
for row in variant_rows:
|
||||||
|
if row.variant_id not in variant_stats_per_player.keys():
|
||||||
|
variant_stats_per_player[row.variant_id] = {}
|
||||||
if row.variant_id not in variant_stats.keys():
|
if row.variant_id not in variant_stats.keys():
|
||||||
variant_stats[row.variant_id] = {}
|
variant_stats[row.variant_id] = VariantStats()
|
||||||
if row.variant_id not in variant_names.keys():
|
if row.variant_id not in variant_names.keys():
|
||||||
variant_names[row.variant_id] = {}
|
variant_names[row.variant_id] = {}
|
||||||
variant_stats[row.variant_id][row.num_players] = row.stats
|
variant_stats_per_player[row.variant_id][row.num_players] = row.stats
|
||||||
variant_names[row.variant_id] = row.name
|
variant_names[row.variant_id] = row.name
|
||||||
return variant_stats, variant_names
|
variant_stats[row.variant_id] += row.stats
|
||||||
|
return variant_stats, variant_stats_per_player, variant_names
|
||||||
|
|
||||||
|
|
||||||
def render_leaderboard():
|
def render_leaderboard():
|
||||||
|
@ -336,7 +354,7 @@ def render_leaderboard():
|
||||||
leaders = get_leaders(rating_lists, streak_lists)
|
leaders = get_leaders(rating_lists, streak_lists)
|
||||||
|
|
||||||
variant_rows: List[VariantRow] = get_variant_rows()
|
variant_rows: List[VariantRow] = get_variant_rows()
|
||||||
variant_stats, variant_names = build_variant_stats_per_variant(variant_rows)
|
variant_stats, variant_stats_by_player, variant_names = build_variant_stats_by_variant(variant_rows)
|
||||||
|
|
||||||
leaderboards = {
|
leaderboards = {
|
||||||
'Player Rating': rating_lists,
|
'Player Rating': rating_lists,
|
||||||
|
@ -364,17 +382,20 @@ def render_leaderboard():
|
||||||
f.write(rendered_html)
|
f.write(rendered_html)
|
||||||
|
|
||||||
games = get_games()
|
games = get_games()
|
||||||
grouped_games = group_games_by_var_id_and_num_players(games)
|
grouped_games_var_players = group_games_by_var_id_and_num_players(games)
|
||||||
|
grouped_games_var = group_games_by_var_id(games)
|
||||||
|
|
||||||
variant_template = env.get_template('variant.html')
|
variant_template = env.get_template('variant.html')
|
||||||
for variant_id, stats in variant_stats.items():
|
for variant_id, by_player_stats in variant_stats_by_player.items():
|
||||||
rendered_var = variant_template.render(
|
rendered_var = variant_template.render(
|
||||||
total_games_played=get_total_games(),
|
total_games_played=get_total_games(),
|
||||||
total_players=get_num_players(),
|
total_players=get_num_players(),
|
||||||
latest_run=datetime.datetime.now().isoformat(),
|
latest_run=datetime.datetime.now().isoformat(),
|
||||||
variant_stats=stats,
|
variant_stats_by_player=by_player_stats,
|
||||||
|
variant_stats=variant_stats.get(variant_id, VariantStats),
|
||||||
variant_name=variant_names[variant_id],
|
variant_name=variant_names[variant_id],
|
||||||
variant_games=grouped_games.get(variant_id,{})
|
variant_games_by_player=grouped_games_var_players.get(variant_id, {}),
|
||||||
|
variant_games=grouped_games_var.get(variant_id, [])
|
||||||
)
|
)
|
||||||
|
|
||||||
output_file = out_dir / 'variant' / str(variant_id) / 'index.html'
|
output_file = out_dir / 'variant' / str(variant_id) / 'index.html'
|
||||||
|
|
|
@ -3,7 +3,11 @@
|
||||||
<ul class="stat-list">
|
<ul class="stat-list">
|
||||||
<li>
|
<li>
|
||||||
<span class="stat-description">Rating:</span>
|
<span class="stat-description">Rating:</span>
|
||||||
{{stats.rating}}
|
{% if show_rating %}
|
||||||
|
{{stats.rating}}
|
||||||
|
{% else %}
|
||||||
|
-
|
||||||
|
{% endif %}
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<span class="stat-description">Total Perfect Scores:</span>
|
<span class="stat-description">Total Perfect Scores:</span>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" id="overview-tab" data-toggle="tab" href="#overview">Overview</a>
|
<a class="nav-link active" id="overview-tab" data-toggle="tab" href="#overview">Overview</a>
|
||||||
</li>
|
</li>
|
||||||
{% for num_players in variant_stats.keys() %}
|
{% for num_players in variant_stats_by_player.keys() %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" id="stats-{{num_players}}p-tab" data-toggle="tab" href="#stats-{{num_players}}p">{{num_players}} Players</a>
|
<a class="nav-link" id="stats-{{num_players}}p-tab" data-toggle="tab" href="#stats-{{num_players}}p">{{num_players}} Players</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -25,13 +25,27 @@
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="tab-content" id="myTabContent">
|
<div class="tab-content" id="myTabContent">
|
||||||
{% for num_players, stats in variant_stats.items() %}
|
|
||||||
|
<div class="tab-pane fade show active" id="overview">
|
||||||
|
<div class="container my-5">
|
||||||
|
<h3>
|
||||||
|
League Statistics for {{variant_name}}
|
||||||
|
</h3>
|
||||||
|
{% with stats=variant_stats, show_rating=False %}
|
||||||
|
{% include "stats_table.html" %}
|
||||||
|
{% endwith %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% for num_players, stats in variant_stats_by_player.items() %}
|
||||||
<div class="tab-pane fade" id="stats-{{num_players}}p">
|
<div class="tab-pane fade" id="stats-{{num_players}}p">
|
||||||
<div class="container my-5">
|
<div class="container my-5">
|
||||||
<h3>
|
<h3>
|
||||||
League Statistics for {{variant_name}} - {{num_players}} Players
|
League Statistics for {{variant_name}} - {{num_players}} Players
|
||||||
</h3>
|
</h3>
|
||||||
{% include "stats_table.html" %}
|
{% with show_rating=True %}
|
||||||
|
{% include "stats_table.html" %}
|
||||||
|
{% endwith %}
|
||||||
<h4>
|
<h4>
|
||||||
List of Played Games
|
List of Played Games
|
||||||
</h4>
|
</h4>
|
||||||
|
@ -47,7 +61,7 @@
|
||||||
|
|
||||||
<!-- JavaScript part for the interactive tables -->
|
<!-- JavaScript part for the interactive tables -->
|
||||||
<script>
|
<script>
|
||||||
{% for num_players, games in variant_games.items() %}
|
{% for num_players, games in variant_games_by_player.items() %}
|
||||||
let tabledata_{{num_players}} = [
|
let tabledata_{{num_players}} = [
|
||||||
{% for game in games %}
|
{% for game in games %}
|
||||||
{{game }},
|
{{game }},
|
||||||
|
|
Loading…
Reference in a new issue