Skip to content

Commit 4e68cc1

Browse files
authored
Small overview page QoL improvements (#260)
* Pass claimed player to OverviewPage if logged in When logged in, make the player claimed by the logged in user available to the demonlist overview page. Explicitly do not require a verified claim. Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> * refactor: make demon_panel a method instead of free standing function This way it's easier to access the claimed player. Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> * ui: overhaul publisher byline on demon overview page - Stop it being italic - Add a "published by" text - make name a statsviewer link Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> * demonlist-page: add score to overview page Add the minimal possible score (for meeting list%) and total possible score to the overview page. Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> * fix: have Demon::score return 0 if progress < requirement Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> * demonlist-pages: display claimed player's progress on overview Similar to what demonlist+ is doing, display the progress of the player claimed by the logged in user on the right hand side. Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> * demonlist-pages: make beaten demons light green on overview page Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> * fix: remove some leftover css from the ad days Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> * demonlist-pages: do not display progress on overviewpage on mobile It just doesnt fit width-wise Signed-off-by: stadust <43299462+stadust@users.noreply.github.com> --------- Signed-off-by: stadust <43299462+stadust@users.noreply.github.com>
1 parent 9532bd1 commit 4e68cc1

File tree

5 files changed

+84
-45
lines changed

5 files changed

+84
-45
lines changed

pointercrate-core-pages/static/css/ui.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,10 @@ p.error {
493493
.viewer {
494494
flex-wrap: wrap;
495495
}
496+
497+
.no-mobile {
498+
display: none
499+
}
496500
}
497501

498502
.stats-container {

pointercrate-demonlist-api/src/pages.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,15 @@ use pointercrate_integrate::gd::GeometryDashConnector;
2424
use pointercrate_user::User;
2525
use rand::Rng;
2626
use rocket::{futures::StreamExt, http::CookieJar};
27+
use sqlx::PgConnection;
28+
use pointercrate_demonlist::player::claim::PlayerClaim;
29+
use pointercrate_demonlist::player::{FullPlayer, Player};
30+
use pointercrate_user::auth::{NonMutating};
31+
use pointercrate_user_api::auth::Auth;
2732

2833
#[rocket::get("/?<timemachine>&<submitter>")]
2934
pub async fn overview(
30-
pool: &State<PointercratePool>, timemachine: Option<bool>, submitter: Option<bool>, cookies: &CookieJar<'_>,
35+
pool: &State<PointercratePool>, timemachine: Option<bool>, submitter: Option<bool>, cookies: &CookieJar<'_>, auth: Option<Auth<NonMutating>>
3136
) -> Result<Page> {
3237
// A few months before pointercrate first went live - definitely the oldest data we have
3338
let beginning_of_time = NaiveDate::from_ymd_opt(2017, 1, 4).unwrap().and_hms_opt(0, 0, 0).unwrap();
@@ -77,9 +82,20 @@ pub async fn overview(
7782
demonlist,
7883
time_machine: tardis,
7984
submitter_initially_visible: submitter.unwrap_or(false),
85+
claimed_player: match auth {
86+
Some(auth) => claimed_full_player(auth.user.user(), &mut connection).await,
87+
None => None
88+
}
8089
}))
8190
}
8291

92+
async fn claimed_full_player(user: &User, connection: &mut PgConnection) -> Option<FullPlayer> {
93+
let claim = PlayerClaim::by_user(user.id, connection).await.ok().flatten()?;
94+
let player = Player::by_id(claim.player.id, connection).await.ok()?;
95+
96+
player.upgrade(connection).await.ok()
97+
}
98+
8399
#[rocket::get("/permalink/<demon_id>")]
84100
pub async fn demon_permalink(demon_id: i32, pool: &State<PointercratePool>) -> Result<Redirect> {
85101
let mut connection = pool.connection().await?;

pointercrate-demonlist-pages/src/overview.rs

Lines changed: 59 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -12,44 +12,14 @@ use pointercrate_demonlist::{
1212
config as list_config,
1313
demon::{Demon, TimeShiftedDemon},
1414
};
15+
use pointercrate_demonlist::player::FullPlayer;
1516

1617
pub struct OverviewPage {
1718
pub team: Team,
1819
pub demonlist: Vec<Demon>,
1920
pub time_machine: Tardis,
2021
pub submitter_initially_visible: bool,
21-
}
22-
23-
fn demon_panel(demon: &Demon, current_position: Option<i16>) -> Markup {
24-
let video_link = demon.video.as_deref().unwrap_or("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
25-
html! {
26-
section.panel.fade style="overflow:hidden" {
27-
div.flex style = "align-items: center" {
28-
a.thumb."ratio-16-9"."js-delay-css" href = (video_link) style = "position: relative" data-property = "background-image" data-property-value = {"url('" (demon.thumbnail) "')"} {}
29-
div style = "padding-left: 15px" {
30-
h2 style = "text-align: left; margin-bottom: 0px" {
31-
a href = {"/demonlist/permalink/" (demon.base.id) "/"} {
32-
"#" (demon.base.position) (PreEscaped(" &#8211; ")) (demon.base.name)
33-
}
34-
}
35-
h3 style = "text-align: left" {
36-
i {
37-
(demon.publisher.name)
38-
}
39-
@if let Some(current_position) = current_position {
40-
br;
41-
@if current_position > list_config::extended_list_size() {
42-
"Currently Legacy"
43-
}
44-
@else {
45-
"Currently #"(current_position)
46-
}
47-
}
48-
}
49-
}
50-
}
51-
}
52-
}
22+
pub claimed_player: Option<FullPlayer>
5323
}
5424

5525
impl From<OverviewPage> for PageFragment {
@@ -131,14 +101,14 @@ impl OverviewPage {
131101
Tardis::Activated { demons, ..} => {
132102
@for TimeShiftedDemon {current_demon, position_now} in demons {
133103
@if current_demon.base.position <= list_config::extended_list_size() {
134-
(demon_panel(current_demon, Some(*position_now)))
104+
(self.demon_panel(current_demon, Some(*position_now)))
135105
}
136106
}
137107
},
138108
_ => {
139109
@for demon in &self.demonlist {
140110
@if demon.base.position <= list_config::extended_list_size() {
141-
(demon_panel(demon, None))
111+
(self.demon_panel(demon, None))
142112
}
143113
}
144114
}
@@ -155,4 +125,59 @@ impl OverviewPage {
155125
}
156126
}
157127
}
128+
129+
fn demon_panel(&self, demon: &Demon, current_position: Option<i16>) -> Markup {
130+
let video_link = demon.video.as_deref().unwrap_or("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
131+
132+
let progress = self.claimed_player.as_ref().and_then(|player| {
133+
if player.verified.iter().any(|d| d.id == demon.base.id) {
134+
Some(100)
135+
} else {
136+
player.records.iter().find(|r| r.demon.id == demon.base.id).map(|r| r.progress)
137+
}
138+
}).unwrap_or_default();
139+
140+
let total_score = format!("{:.2}", demon.score(100));
141+
let progress_score = format!("{:.2}", demon.score(progress));
142+
let minimal_score = format!("{:.2}", demon.score(demon.requirement));
143+
144+
let bg_color = if progress == 100 { "#ddffdd;"} else {"white"};
145+
146+
html! {
147+
section.panel.fade style={"overflow:hidden; background:"(bg_color)} {
148+
div.flex style = "align-items: center" {
149+
a.thumb."ratio-16-9"."js-delay-css" href = (video_link) style = "position: relative" data-property = "background-image" data-property-value = {"url('" (demon.thumbnail) "')"} {}
150+
div style = "padding-left: 15px" {
151+
h2 style = "text-align: left; margin-bottom: 0px" {
152+
a href = {"/demonlist/permalink/" (demon.base.id) "/"} {
153+
"#" (demon.base.position) (PreEscaped(" &#8211; ")) (demon.base.name)
154+
}
155+
}
156+
h3 style = "text-align: left" {
157+
"published by " a.underdotted href = {"/demonlist/statsviewer?player="(demon.publisher.id)} {(demon.publisher.name)}
158+
}
159+
div style="text-align: left; font-size: 0.8em" {
160+
@if let Some(current_position) = current_position {
161+
@if current_position > list_config::extended_list_size() {
162+
"Currently Legacy"
163+
}
164+
@else {
165+
"Currently #"(current_position)
166+
}
167+
}
168+
@else {
169+
(minimal_score) " (" (demon.requirement) "%) — " (total_score) " (100%) points"
170+
}
171+
}
172+
}
173+
@if self.claimed_player.is_some() {
174+
div.flex.col.no-mobile style = "font-weight: bold; text-align: right" {
175+
span style = "font-size: 300%" { (progress) "%" }
176+
span style = "font-size: 0.8em"{ (progress_score) " points"}
177+
}
178+
}
179+
}
180+
}
181+
}
182+
}
158183
}

pointercrate-demonlist-pages/static/css/demonlist.css

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,6 @@ tr:nth-child(even) {
6767
font-weight: normal;
6868
}
6969

70-
#outofboundsad {
71-
width: 200px;
72-
}
73-
74-
@media (max-width: 1359px) {
75-
#outofboundsad {
76-
display: none;
77-
}
78-
}
79-
8070
@media (max-width: 1071px) {
8171
#rules,
8272
#discord {

pointercrate-demonlist/src/demon/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ impl Demon {
218218
}
219219

220220
pub fn score(&self, progress: i16) -> f64 {
221+
if progress < self.requirement {
222+
return 0.0
223+
}
224+
221225
let position = self.base.position;
222226

223227
let beaten_score = match position {

0 commit comments

Comments
 (0)