slack status without the slack
status.zzstoatzz.io/
quickslice
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}