From 101833d0d88f1f2cfcd243449f026df550c5bfa2 Mon Sep 17 00:00:00 2001 From: Lol3rrr Date: Fri, 1 Nov 2024 21:47:25 +0100 Subject: [PATCH] Minor design improvements --- backend/src/api/demos.rs | 63 +++++++++++++++++++++++++-------- common/src/demo_analysis.rs | 9 ++++- frontend/src/demo/scoreboard.rs | 4 +-- frontend/src/homepage.rs | 24 +++++++------ frontend/src/lib.rs | 27 +++++++------- 5 files changed, 87 insertions(+), 40 deletions(-) diff --git a/backend/src/api/demos.rs b/backend/src/api/demos.rs index f08c890..9e247d7 100644 --- a/backend/src/api/demos.rs +++ b/backend/src/api/demos.rs @@ -46,7 +46,8 @@ async fn list( ) .inner_join( crate::schema::demo_players::table - .on(crate::schema::demos::dsl::demo_id.eq(crate::schema::demo_players::dsl::demo_id)) + .on(crate::schema::demos::dsl::demo_id + .eq(crate::schema::demo_players::dsl::demo_id)), ) .select(( crate::models::Demo::as_select(), @@ -54,7 +55,11 @@ async fn list( crate::models::DemoTeam::as_select(), crate::models::DemoPlayer::as_select(), )) - .filter(crate::schema::demos::dsl::steam_id.eq(steam_id.to_string()).and(crate::schema::demo_players::dsl::steam_id.eq(steam_id.to_string()))); + .filter( + crate::schema::demos::dsl::steam_id + .eq(steam_id.to_string()) + .and(crate::schema::demo_players::dsl::steam_id.eq(steam_id.to_string())), + ); let pending_query = crate::schema::demos::dsl::demos .inner_join(crate::schema::processing_status::table.on( crate::schema::demos::dsl::demo_id.eq(crate::schema::processing_status::dsl::demo_id), @@ -294,18 +299,34 @@ async fn scoreboard( ), ), ) - .filter(crate::schema::demo_players::dsl::demo_id.eq(demo_id)); + .filter(crate::schema::demo_players::dsl::demo_id.eq(demo_id.clone())); + + let team_query = crate::schema::demo_teams::dsl::demo_teams + .filter(crate::schema::demo_teams::dsl::demo_id.eq(demo_id)); let mut db_con = crate::db_connection().await; - let response: Vec<(crate::models::DemoPlayer, crate::models::DemoPlayerStats)> = - match query.load(&mut db_con).await { - Ok(d) => d, - Err(e) => { - tracing::error!("Querying DB: {:?}", e); - return Err(axum::http::StatusCode::INTERNAL_SERVER_ERROR); - } - }; + let db_result = db_con + .build_transaction() + .read_only() + .run::<_, diesel::result::Error, _>(|con| { + Box::pin(async move { + let players: Vec<(crate::models::DemoPlayer, crate::models::DemoPlayerStats)> = + query.load(con).await?; + let teams: Vec = team_query.load(con).await?; + + Ok((players, teams)) + }) + }) + .await; + + let (response, team_response) = match db_result { + Ok(d) => d, + Err(e) => { + tracing::error!("Querying DB {:?}", e); + return Err(axum::http::StatusCode::INTERNAL_SERVER_ERROR); + } + }; if response.is_empty() { tracing::error!("DB Response was empty"); @@ -314,9 +335,16 @@ async fn scoreboard( let mut teams = std::collections::BTreeMap::new(); for (player, stats) in response { - let team = teams.entry(player.team as u32).or_insert(Vec::new()); + let team = + teams + .entry(player.team as u32) + .or_insert(common::demo_analysis::ScoreBoardTeam { + number: player.team as u32, + players: Vec::new(), + score: 0, + }); - team.push(common::demo_analysis::ScoreBoardPlayer { + team.players.push(common::demo_analysis::ScoreBoardPlayer { name: player.name, kills: stats.kills as usize, deaths: stats.deaths as usize, @@ -325,8 +353,15 @@ async fn scoreboard( }); } + for team in team_response { + let number = team.team as u32; + if let Some(entry) = teams.get_mut(&number) { + entry.score = team.end_score; + } + } + Ok(axum::Json(common::demo_analysis::ScoreBoard { - teams: teams.into_iter().collect::>(), + teams: teams.into_values().collect::>(), })) } diff --git a/common/src/demo_analysis.rs b/common/src/demo_analysis.rs index 3f06b35..8906471 100644 --- a/common/src/demo_analysis.rs +++ b/common/src/demo_analysis.rs @@ -1,6 +1,13 @@ #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] pub struct ScoreBoard { - pub teams: Vec<(u32, Vec)>, + pub teams: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub struct ScoreBoardTeam { + pub number: u32, + pub score: i16, + pub players: Vec, } #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] diff --git a/frontend/src/demo/scoreboard.rs b/frontend/src/demo/scoreboard.rs index 6abffc8..48633e5 100644 --- a/frontend/src/demo/scoreboard.rs +++ b/frontend/src/demo/scoreboard.rs @@ -25,9 +25,9 @@ pub fn scoreboard() -> impl leptos::IntoView { .get() .into_iter() .flat_map(|v| v.teams.into_iter()) - .map(|(team, players)| { + .map(|team| { view! { - + } }) .collect::>() diff --git a/frontend/src/homepage.rs b/frontend/src/homepage.rs index f598c23..f4aa713 100644 --- a/frontend/src/homepage.rs +++ b/frontend/src/homepage.rs @@ -3,9 +3,7 @@ use leptos::*; #[leptos::component] pub fn homepage(get_notification: ReadSignal) -> impl leptos::IntoView { let demo_data = create_resource( - move || { - get_notification.get() - }, + move || get_notification.get(), |_| async move { let res = reqwasm::http::Request::get("/api/demos/list") .send() @@ -16,11 +14,17 @@ pub fn homepage(get_notification: ReadSignal) -> impl leptos::IntoView { }, ); - let pending_display = move || demo_data.get().map(|d| d.pending).filter(|p| p.len() > 0).map(|pending| { - view! { -

{pending.len()} demos are pending/waiting for analysis

- } - }); + let pending_display = move || { + demo_data + .get() + .map(|d| d.pending) + .filter(|p| p.len() > 0) + .map(|pending| { + view! { +

{pending.len()} demos are pending/waiting for analysis

+ } + }) + }; view! {
@@ -117,8 +121,8 @@ fn demo_list_entry(demo: common::BaseDemoInfo, idx: usize) -> impl leptos::IntoV view! { class=style, - = std::rc::Rc::new(move |resp: &leptos::web_sys::Response| { - if resp.status() != 200 { - // TODO - // Display error somehow - return; - } + let handle_resp: std::rc::Rc = + std::rc::Rc::new(move |resp: &leptos::web_sys::Response| { + if resp.status() != 200 { + // TODO + // Display error somehow + return; + } - uploading.set(false); + uploading.set(false); - // Remove the Upload popup - update_shown.set(DemoUploadStatus::Hidden); + // Remove the Upload popup + update_shown.set(DemoUploadStatus::Hidden); - // Reload the demo list - reload_demos.update(|v| { - *v = v.wrapping_add(1); + // Reload the demo list + reload_demos.update(|v| { + *v = v.wrapping_add(1); + }); }); - }); let on_submit: std::rc::Rc = std::rc::Rc::new(move |_| { uploading.set(true);