use anyhow::{format_err, Result}; use chrono::{DateTime, Local, NaiveDate, TimeZone, Utc}; use html2md::parse_html; use megalodon::{generator, megalodon::GetLocalTimelineInputOptions, response::Response}; use std::env; #[derive(Debug)] struct Post { content: String, created_at: DateTime, } #[tokio::main] async fn main() -> Result<()> { env_logger::init(); let start = Local .from_local_datetime( &NaiveDate::from_ymd_opt(2023, 7, 1) .ok_or_else(|| format_err!("Invallid date!"))? .and_hms_opt(0, 0, 0) .expect("Failed to construct time!"), ) .unwrap(); let end = Local .from_local_datetime( &NaiveDate::from_ymd_opt(2023, 7, 1) .ok_or_else(|| format_err!("Invallid date!"))? .and_hms_opt(23, 59, 59) .expect("Failed to construct time!"), ) .unwrap(); println!("Date {:#?}", start); let url = env::var("MASTODON_URL")?; let token = env::var("MASTODON_ACCESS_TOKEN")?; let client = generator(megalodon::SNS::Mastodon, url, Some(token), None); let mut max_id: Option = None; loop { let Response { json, .. } = if let Some(max_id) = max_id.as_ref() { client .get_local_timeline(Some(&GetLocalTimelineInputOptions { max_id: Some(max_id.clone()), ..GetLocalTimelineInputOptions::default() })) .await? } else { client.get_local_timeline(None).await? }; if let Some(last) = json.last() { println!( "Checking {:?} against {:?}: {}", last.created_at, start, last.created_at > start ); if last.created_at > start { max_id.replace(last.id.clone()); continue; } } println!( "{:#?}", json.iter() .filter(|json| start <= json.created_at && json.created_at <= end) .map(|json| Post { content: parse_html(&json.content), created_at: json.created_at }) .collect::>() ); break; } Ok(()) }