From 2ff7a2c7a9f5786911a5ddb5faae8760cd4868fc Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Wed, 6 Aug 2025 09:03:50 +0200 Subject: [PATCH] show ranking for each camera on sighting --- locales/de.yml | 2 +- locales/en.yml | 2 +- src/game.rs | 4 ++-- src/model/sighting.rs | 32 +++++++++++++++++++++++--------- src/page.rs | 19 +++++++++++-------- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/locales/de.yml b/locales/de.yml index 14e9ef0..f23df98 100644 --- a/locales/de.yml +++ b/locales/de.yml @@ -3,6 +3,6 @@ digital_shadows: "Digitaler Schatten" icon_home: "🏠" icon_camera: "📸" found_camera_title: "Kamera '%{name}' gefunden" -found_camera_body: "✨ You are a star ✨ Star dust sprinkle, sprinkle." +found_camera_body: "✨ Du bist #%{amount} der/die diese Kamera gefunden hat ✨" ask_to_change_name: "%{name}, do you want to be named something different? No worries, change here 👇" funny_name_change_placeholder: "✨ Your new name starts here ✨" diff --git a/locales/en.yml b/locales/en.yml index 09fa542..6ed9db3 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -3,6 +3,6 @@ digital_shadows: "Digital Shadows" icon_home: "🏠" icon_camera: "📸" found_camera_title: "Camera '%{name}' found" -found_camera_body: "✨ You are a star ✨ Star dust sprinkle, sprinkle." +found_camera_body: "✨ You are #%{amount} who has found this camera ✨" ask_to_change_name: "%{name}, do you want to be named something different? No worries, change here 👇" funny_name_change_placeholder: "✨ Your new name starts here ✨" diff --git a/src/game.rs b/src/game.rs index fdb7b6f..9baa9fa 100644 --- a/src/game.rs +++ b/src/game.rs @@ -102,8 +102,8 @@ async fn game( return Err(not_found(cookies, headers).await.into_response()); }; - if backend.client_found_camera(&client, &camera).await { - messages.info(format!("found-cam|{}", camera.name)); + if let Ok(number) = backend.client_found_camera(&client, &camera).await { + messages.info(format!("found-cam|{}|{number}", camera.name)); } else { messages.info("err|Try to find a new camera!|You have already collected this camera.|"); } diff --git a/src/model/sighting.rs b/src/model/sighting.rs index 0901a86..8fc9a59 100644 --- a/src/model/sighting.rs +++ b/src/model/sighting.rs @@ -58,19 +58,33 @@ impl Backend { } } - pub(crate) async fn client_found_camera(&self, client: &Client, camera: &Camera) -> bool { + pub(crate) async fn client_found_camera( + &self, + client: &Client, + camera: &Camera, + ) -> Result { let client_uuid = client.uuid.to_string(); let camera_uuid = camera.uuid.to_string(); match self { - Backend::Sqlite(db) => sqlx::query!( - "INSERT INTO sightings(client_uuid, camera_id) VALUES (?, ?) RETURNING client_uuid", - client_uuid, - camera_uuid - ) - .fetch_one(db) - .await - .is_ok(), + Backend::Sqlite(db) => { + sqlx::query!( + "INSERT INTO sightings(client_uuid, camera_id) VALUES (?, ?)", + client_uuid, + camera_uuid + ) + .execute(db) + .await + .map_err(|_| ())?; + + Ok(sqlx::query_scalar!( + "SELECT COUNT(client_uuid) FROM sightings WHERE camera_id = ?", + camera_uuid + ) + .fetch_one(db) + .await + .map_err(|_| ())?) + } } } } diff --git a/src/page.rs b/src/page.rs index 6423262..172e7d8 100644 --- a/src/page.rs +++ b/src/page.rs @@ -6,7 +6,7 @@ use maud::{html, Markup, DOCTYPE}; pub(crate) struct Page { lang: Language, - found_camera: Option, + found_camera: Option<(String, i64)>, new_name: bool, err: Option<(String, String, String)>, } @@ -29,8 +29,13 @@ impl Page { self.new_name = true; } (_, msg) if msg.starts_with("found-cam|") => { - let (_, name) = msg.split_once('|').expect("we just checked |"); - self.found_camera = Some(name.into()); + let mut parts = msg.splitn(3, '|'); + let _ = parts.next().expect("just checked |"); + if let (Some(name), Some(amount)) = (parts.next(), parts.next()) { + if let Ok(amount) = amount.parse::() { + self.found_camera = Some((name.into(), amount)); + } + } } (_, msg) if msg.starts_with("err|") => { let mut parts = msg.splitn(4, '|'); @@ -96,11 +101,9 @@ impl Page { main.container { @if let Some(found_camera) = &self.found_camera { article class="succ w-full" { - header { (t!("found_camera_title", name = found_camera)) } - (t!("found_camera_body")) - " " - a href="#ranking" { "See your ranking" } - footer { (found_camera) } + header { (t!("found_camera_title", name = found_camera.0)) } + (t!("found_camera_body", amount = found_camera.1)) + footer { a href="#ranking" { "See your ranking" } } } } @if self.new_name {