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 }