diff --git a/TODO.md b/TODO.md index a62125a..aa5219c 100644 --- a/TODO.md +++ b/TODO.md @@ -10,7 +10,6 @@ - infinite use invite codes (no multi-use support, only single-use) ## Bugs -- server-wide stats page has no PMC/Scav raid breakdown (per-user profile already tracks both) - restarting a headless client from the main headless page causes you to end up at that headless' info page - headless client start/stop/restart buttons on `/quma/headless` go past the card length - currency items (USD, EUR) displayed as roubles instead of as currency balances (Stash) diff --git a/src/db/raids.rs b/src/db/raids.rs index 9c571d1..bb67567 100644 --- a/src/db/raids.rs +++ b/src/db/raids.rs @@ -87,6 +87,10 @@ pub struct ServerRaidStats { pub total_raids: i64, pub unique_players: i64, pub overall_survival_rate: f64, + pub pmc_raids: i64, + pub scav_raids: i64, + pub pmc_survival_rate: f64, + pub scav_survival_rate: f64, pub map_counts: Vec<(String, i64)>, pub top_killers: Vec<(String, i64)>, pub recent_raids: Vec<(Raid, String)>, @@ -513,6 +517,36 @@ impl Database { 0.0 }; + // PMC stats + let (pmc_raids, pmc_survived): (i64, i64) = self.conn.query_row( + "SELECT COUNT(*), COALESCE(SUM(CASE WHEN r.exit_status = 'Survived' THEN 1 ELSE 0 END), 0) + FROM raids r JOIN users u ON r.user_id = u.id + WHERE u.is_headless = 0 AND r.player_side = 'Pmc'", + [], + |row| Ok((row.get(0)?, row.get(1)?)), + )?; + + let pmc_survival_rate = if pmc_raids > 0 { + (pmc_survived as f64 / pmc_raids as f64) * 100.0 + } else { + 0.0 + }; + + // Scav stats + let (scav_raids, scav_survived): (i64, i64) = self.conn.query_row( + "SELECT COUNT(*), COALESCE(SUM(CASE WHEN r.exit_status = 'Survived' THEN 1 ELSE 0 END), 0) + FROM raids r JOIN users u ON r.user_id = u.id + WHERE u.is_headless = 0 AND r.player_side = 'Savage'", + [], + |row| Ok((row.get(0)?, row.get(1)?)), + )?; + + let scav_survival_rate = if scav_raids > 0 { + (scav_survived as f64 / scav_raids as f64) * 100.0 + } else { + 0.0 + }; + let mut map_stmt = self.conn.prepare( "SELECT r.map, COUNT(DISTINCT COALESCE(r.server_id, 'solo_' || r.id)) as count FROM raids r JOIN users u ON r.user_id = u.id WHERE u.is_headless = 0 GROUP BY r.map ORDER BY count DESC", )?; @@ -540,6 +574,10 @@ impl Database { total_raids, unique_players, overall_survival_rate, + pmc_raids, + scav_raids, + pmc_survival_rate, + scav_survival_rate, map_counts, top_killers, recent_raids, diff --git a/templates/stats.html b/templates/stats.html index 2dd7d9d..48618a6 100644 --- a/templates/stats.html +++ b/templates/stats.html @@ -28,6 +28,35 @@

Stats

+
+
+

PMC

+
+
+
Raids
+
{{ raid_stats.pmc_raids }}
+
+
+
Survival Rate
+
{{ raid_stats.pmc_survival_rate|fmt_pct }}
+
+
+
+
+

Scav

+
+
+
Raids
+
{{ raid_stats.scav_raids }}
+
+
+
Survival Rate
+
{{ raid_stats.scav_survival_rate|fmt_pct }}
+
+
+
+
+

Active Raids