/ src / aoc / models.rs
models.rs
 1  use std::{cmp::Reverse, collections::HashMap};
 2  
 3  use chrono::{DateTime, Utc};
 4  use matrix_sdk::ruma::UserId;
 5  use serde::{Deserialize, Serialize};
 6  
 7  use crate::utils::{self, serde::via_string::ViaString};
 8  
 9  #[derive(Debug, Clone, PartialEq, Eq)]
10  pub struct AocWhoami {
11      pub user_id: u64,
12      pub invite_code: String,
13  }
14  
15  pub type PrivateLeaderboardMembers = HashMap<ViaString<AocId>, PrivateLeaderboardMember>;
16  pub type AocId = u64;
17  
18  #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
19  pub struct PrivateLeaderboard {
20      pub event: String,
21      pub owner_id: AocId,
22      pub members: PrivateLeaderboardMembers,
23  }
24  
25  #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
26  pub struct PrivateLeaderboardMember {
27      pub id: AocId,
28      pub name: Option<String>,
29      pub global_score: Option<u32>,
30      pub local_score: u32,
31      pub stars: u32,
32      #[serde(with = "utils::serde::timestamp")]
33      pub last_star_ts: DateTime<Utc>,
34      pub completion_day_level: HashMap<u32, PrivateLeaderboardMemberCompletionDay>,
35  }
36  
37  impl PrivateLeaderboardMember {
38      pub fn display_name(&self) -> String {
39          match self.name.clone() {
40              Some(name) => name,
41              None => format!("[anonymous user #{}]", self.id),
42          }
43      }
44  
45      pub fn matrix_mention_or_display_name(&self, matrix: Option<&UserId>) -> String {
46          match matrix {
47              Some(matrix) => format!("{} ({})", matrix.matrix_to_uri(), self.display_name()),
48              None => format!("**{}**", self.display_name()),
49          }
50      }
51  
52      pub fn matrix_mention_or_display_name_html(&self, matrix: Option<&UserId>) -> String {
53          match matrix {
54              Some(matrix) => format!("{} ({})", matrix.matrix_to_uri(), self.display_name()),
55              None => format!("<b>{}</b>", self.display_name()),
56          }
57      }
58  }
59  
60  #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
61  pub struct PrivateLeaderboardMemberCompletionDay {
62      #[serde(rename = "1")]
63      pub fst: PrivateLeaderboardMemberCompletionDayPart,
64      #[serde(rename = "2")]
65      pub snd: Option<PrivateLeaderboardMemberCompletionDayPart>,
66  }
67  
68  #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
69  pub struct PrivateLeaderboardMemberCompletionDayPart {
70      #[serde(with = "utils::serde::timestamp")]
71      pub get_star_ts: DateTime<Utc>,
72  }
73  
74  impl PartialOrd for PrivateLeaderboardMember {
75      fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
76          Some(self.cmp(other))
77      }
78  }
79  
80  impl Ord for PrivateLeaderboardMember {
81      fn cmp(&self, other: &Self) -> std::cmp::Ordering {
82          let key = |m: &Self| {
83              (
84                  Reverse(m.local_score),
85                  Reverse(m.stars),
86                  m.last_star_ts,
87                  m.id,
88              )
89          };
90          key(self).cmp(&key(other))
91      }
92  }