use chrono::{offset::LocalResult, TimeZone, Utc}; use chrono_humanize::{Accuracy, HumanTime, Tense}; use mastodon_async::entities::status::Status; use mastodon_async::prelude::*; use serde::Serialize; use time::OffsetDateTime; use crate::Result; #[derive(Serialize)] pub struct Skweet { reblog: bool, avatar: String, username: String, url: String, time_since: String, content: String, media_attachments: Vec, } pub async fn get_recents(client: &Mastodon) -> Result> { Ok(client .statuses(&AccountId::new("cel"), Default::default()) .await? .initial_items .into_iter() .map(|status| Skweet::from(status)) .collect()) } impl From for Skweet { fn from(value: Status) -> Self { let url = value.url.unwrap_or_default(); fn time_since(time: OffsetDateTime) -> String { let time = if let LocalResult::Single(time) = Utc.timestamp_opt(time.unix_timestamp(), 0) { time } else { return "oops".to_owned(); }; let duration = Utc::now() - time; HumanTime::from(duration).to_text_en(Accuracy::Rough, Tense::Present) } match value.reblog { Some(original) => Self { reblog: true, avatar: original.account.avatar, username: original.account.acct, url, time_since: time_since(original.created_at), content: value.content, media_attachments: value.media_attachments, }, None => Self { reblog: false, avatar: value.account.avatar, username: value.account.acct, url, time_since: time_since(value.created_at), content: value.content, media_attachments: value.media_attachments, }, } } }