diff --git a/src/game.rs b/src/game.rs index e49e327..531bea7 100644 --- a/src/game.rs +++ b/src/game.rs @@ -45,13 +45,13 @@ async fn index(State(backend): State>, cookies: CookieJar) -> Respo span.font-headline.rank.text-muted { (rank.rank)"." } - @if rank.uuid == client.uuid { (PreEscaped("")) } - (rank.name) - @if rank.uuid == client.uuid { (PreEscaped("")) } + @if rank.client == client { (PreEscaped("")) } + (rank.client.get_display_name()) + @if rank.client == client{ (PreEscaped("")) } } span.font-headline.cam { - (rank.amount)(PreEscaped(" "))"📸" - } + (rank.amount)(PreEscaped(" "))"📸" + } } } } diff --git a/src/model/client.rs b/src/model/client.rs index e434a84..f0c4ed2 100644 --- a/src/model/client.rs +++ b/src/model/client.rs @@ -9,6 +9,12 @@ pub struct Client { pub name: Option, } +impl PartialEq for Client { + fn eq(&self, other: &Self) -> bool { + self.uuid == other.uuid + } +} + impl Client { pub(crate) fn get_display_name(&self) -> String { match &self.name { diff --git a/src/model/highscore.rs b/src/model/highscore.rs index 0d595fd..a726686 100644 --- a/src/model/highscore.rs +++ b/src/model/highscore.rs @@ -1,56 +1,42 @@ -use crate::{random_names::get_name_by_uuid, Backend}; - -struct RankDb { - pub(crate) rank: i64, - pub(crate) name: Option, - pub(crate) uuid: String, - pub(crate) amount: i64, -} +use crate::{model::client::Client, Backend}; pub(crate) struct Rank { pub(crate) rank: i64, - pub(crate) name: String, - pub(crate) uuid: String, + pub(crate) client: Client, pub(crate) amount: i64, } -impl From for Rank { - fn from(value: RankDb) -> Self { - let name = match value.name { - Some(name) => name, - None => get_name_by_uuid(&value.uuid).to_string(), - }; - - Self { - rank: value.rank, - name, - uuid: value.uuid, - amount: value.amount, - } - } -} - impl Backend { pub(crate) async fn highscore(&self) -> Vec { match self { - Backend::Sqlite(db) => sqlx::query_as!( - RankDb, - "SELECT - RANK() OVER (ORDER BY COUNT(s.client_uuid) DESC) as rank, - c.name, - c.uuid, - COUNT(s.client_uuid) as amount - FROM client c - LEFT JOIN sightings s ON c.uuid = s.client_uuid - GROUP BY c.uuid, c.name - ORDER BY amount DESC" - ) - .fetch_all(db) - .await - .unwrap_or_default() - .into_iter() - .map(|r| r.into()) - .collect(), + Backend::Sqlite(db) => { + let rows = sqlx::query!( + "SELECT + RANK() OVER (ORDER BY COUNT(s.client_uuid) DESC) as rank, + c.name, + c.uuid, + COUNT(s.client_uuid) as amount + FROM client c + LEFT JOIN sightings s ON c.uuid = s.client_uuid + GROUP BY c.uuid, c.name + ORDER BY amount DESC" + ) + .fetch_all(db) + .await + .unwrap_or_default(); + + rows.into_iter() + .map(|row| Rank { + rank: row.rank, + client: Client { + uuid: row.uuid, + name: row.name, + }, + amount: row.amount, + }) + .map(|r| r.into()) + .collect() + } } } }