slack status without the slack status.zzstoatzz.io/
quickslice
at 2cab7c64b43b99b9466ccc28df5379092eb2cdd9 54 lines 1.6 kB view raw
1use atrium_identity::did::CommonDidResolver; 2use atrium_oauth::DefaultHttpClient; 3use serde::{Deserialize, Serialize}; 4use std::sync::Arc; 5 6/// HandleResolver to make it easier to access the OAuthClient in web requests 7pub type HandleResolver = Arc<CommonDidResolver<DefaultHttpClient>>; 8 9/// Admin DID for moderation 10pub const ADMIN_DID: &str = "did:plc:xbtmt2zjwlrfegqvch7fboei"; // zzstoatzz.io 11 12/// Check if a DID is the admin 13pub fn is_admin(did: &str) -> bool { 14 did == ADMIN_DID 15} 16 17/// The post body for changing your status 18#[derive(Serialize, Deserialize, Clone)] 19pub struct StatusForm { 20 pub status: String, 21 pub text: Option<String>, 22 pub expires_in: Option<String>, // e.g., "1h", "30m", "1d", etc. 23} 24 25/// The post body for deleting a specific status 26#[derive(Serialize, Deserialize)] 27pub struct DeleteRequest { 28 pub uri: String, 29} 30 31/// Hide/unhide a status (admin only) 32#[derive(Deserialize)] 33pub struct HideStatusRequest { 34 pub uri: String, 35 pub hidden: bool, 36} 37 38/// Parse duration string like "1h", "30m", "1d" into chrono::Duration 39pub fn parse_duration(duration_str: &str) -> Option<chrono::Duration> { 40 if duration_str.is_empty() { 41 return None; 42 } 43 44 let (num_str, unit) = duration_str.split_at(duration_str.len() - 1); 45 let num: i64 = num_str.parse().ok()?; 46 47 match unit { 48 "m" => Some(chrono::Duration::minutes(num)), 49 "h" => Some(chrono::Duration::hours(num)), 50 "d" => Some(chrono::Duration::days(num)), 51 "w" => Some(chrono::Duration::weeks(num)), 52 _ => None, 53 } 54}