More clean up.

This commit is contained in:
Thomas Gideon 2023-07-15 21:30:14 -04:00
parent c90495a985
commit 17e99518ce
3 changed files with 31 additions and 23 deletions

View file

@ -8,7 +8,7 @@ edition = "2021"
[dependencies]
anyhow = "1.0.71"
chrono = "0.4.26"
clap = { version = "4.3.12", features = ["default", "derive"] }
clap = { version = "4.3.12", features = ["default", "derive", "env"] }
env_logger = "0.10.0"
html2md = "0.2.14"
log = "0.4.19"

View file

@ -1,7 +1,6 @@
use anyhow::Result;
use chrono::Local;
use html2md::parse_html;
use log::debug;
use megalodon::{
entities::{Account, Attachment, Status},
response::Response,
@ -46,7 +45,7 @@ pub(super) async fn format_status(
"{}{}",
ancestor,
if !thread.is_empty() {
thread
format!("\n{}", thread)
} else {
String::default()
}
@ -55,25 +54,20 @@ pub(super) async fn format_status(
fn format_attachments(depth: usize, attachments: &[Attachment]) -> String {
let prefix = vec![">"; depth].join("");
debug!("Attachments {:?}", attachments);
if attachments.is_empty() {
String::default()
} else {
let mut editor = DefaultEditor::new().unwrap();
attachments
.iter()
.map(|a| {
Url::parse(&a.url).unwrap().open();
let mut editor = DefaultEditor::new().unwrap();
let src = if let Ok(line) = editor.readline("Filename: ") {
line
} else {
a.url.clone()
};
format!(
"
{} <img src=\"{}\" />",
prefix, src
)
format!("{} <img src=\"{}\" />", prefix, src)
})
.collect::<Vec<String>>()
.join("\n")

View file

@ -9,10 +9,9 @@ use megalodon::{
response::Response,
Megalodon,
};
use tokio_stream::{iter, StreamExt};
use std::env;
use std::{env, fs::File, io::prelude::*};
use self::{
format::format_status,
@ -28,6 +27,12 @@ mod range;
#[derive(Debug, Parser)]
#[command()]
struct Config {
#[arg(short, long, env = "MASTODON_URL")]
url: String,
#[arg(short, long, env = "MASTODON_ACCESS_TOKEN")]
access_token: String,
#[arg(short, long)]
output_dir: String,
#[arg(required = true)]
date: String,
#[arg(short, long)]
@ -36,15 +41,21 @@ struct Config {
#[tokio::main]
async fn main() -> Result<()> {
let Config { date, verbose } = Config::parse();
let Config {
date,
verbose,
url,
access_token,
output_dir,
} = Config::parse();
let level = if verbose { "debug" } else { "off" };
env::set_var("RUST_LOG", format!("{}={}", module_path!(), level));
env_logger::init();
let day = try_create_range(date)?;
let day = try_create_range(date.clone())?;
let client = create_client()?;
let client = create_client(url, access_token)?;
let Response { json: account, .. } = client.verify_account_credentials().await?;
debug!("Fetching posts for date, {}.", day.end.format("%Y-%m-%d"));
@ -97,23 +108,26 @@ async fn main() -> Result<()> {
}
}
reversed.reverse();
println!("{}", reversed.join("\n\n"));
let output = format!("{}{}.md", output_dir, date);
let mut f = File::options().append(true).open(&output)?;
f.write_all(&reversed.join("\n\n").as_bytes())?;
println!("Appended matching posts to {}.", output);
Ok(())
}
// Only ones authored by the user, on the date requested, that aren't a reply to any other status
fn filter_statuses<'a>(account: &Account, day: &Range, json: &'a Vec<Status>) -> Vec<&'a Status> {
json.iter()
.filter(|json| {
json.account.id == account.id
&& day.start <= json.created_at
&& json.created_at <= day.end
.filter(|status| {
status.account.id == account.id
&& status.in_reply_to_id.is_none()
&& day.start <= status.created_at
&& status.created_at <= day.end
})
.collect::<Vec<&Status>>()
}
fn create_client() -> Result<Box<dyn Megalodon + Send + Sync>> {
let url = env::var("MASTODON_URL")?;
let token = env::var("MASTODON_ACCESS_TOKEN")?;
fn create_client(url: String, token: String) -> Result<Box<dyn Megalodon + Send + Sync>> {
Ok(generator(megalodon::SNS::Mastodon, url, Some(token), None))
}