diff --git a/.gitignore b/.gitignore index 065223a..7769f79 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ /target -blogdor.db +*.db secrets .env .#* diff --git a/.sqlx/query-09ec0320ccf5156d109f328f5aee1b38376496762b910e1b0637a84550e71c25.json b/.sqlx/query-09ec0320ccf5156d109f328f5aee1b38376496762b910e1b0637a84550e71c25.json new file mode 100644 index 0000000..1859496 --- /dev/null +++ b/.sqlx/query-09ec0320ccf5156d109f328f5aee1b38376496762b910e1b0637a84550e71c25.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "insert into runs (feed, fetched, posted) values (?, ?, ?)", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "09ec0320ccf5156d109f328f5aee1b38376496762b910e1b0637a84550e71c25" +} diff --git a/.sqlx/query-0e3ab12f01a4bb5650bafe964a4578cfe3839040e801d305e990a862580d7a09.json b/.sqlx/query-0e3ab12f01a4bb5650bafe964a4578cfe3839040e801d305e990a862580d7a09.json new file mode 100644 index 0000000..20555cb --- /dev/null +++ b/.sqlx/query-0e3ab12f01a4bb5650bafe964a4578cfe3839040e801d305e990a862580d7a09.json @@ -0,0 +1,26 @@ +{ + "db_name": "SQLite", + "query": "select url, active from feeds left join (select active, feed, max(id) from status group by feed) s on s.feed = feeds.id where feeds.owner = ?", + "describe": { + "columns": [ + { + "name": "url", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "active", + "ordinal": 1, + "type_info": "Bool" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + true + ] + }, + "hash": "0e3ab12f01a4bb5650bafe964a4578cfe3839040e801d305e990a862580d7a09" +} diff --git a/.sqlx/query-2acd17df4d97ab738112dfc698fa817269a2e593afcadeb90c21b9499c4c32ce.json b/.sqlx/query-2acd17df4d97ab738112dfc698fa817269a2e593afcadeb90c21b9499c4c32ce.json new file mode 100644 index 0000000..d0e00a2 --- /dev/null +++ b/.sqlx/query-2acd17df4d97ab738112dfc698fa817269a2e593afcadeb90c21b9499c4c32ce.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "insert into status (feed, active) values (?, true)", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "2acd17df4d97ab738112dfc698fa817269a2e593afcadeb90c21b9499c4c32ce" +} diff --git a/.sqlx/query-2d37d674e60702e925683c98751be89282f5abe93080ccd2fce85f932c6cdc39.json b/.sqlx/query-2d37d674e60702e925683c98751be89282f5abe93080ccd2fce85f932c6cdc39.json new file mode 100644 index 0000000..d04afed --- /dev/null +++ b/.sqlx/query-2d37d674e60702e925683c98751be89282f5abe93080ccd2fce85f932c6cdc39.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "select id from feeds where url = ? and owner = ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false + ] + }, + "hash": "2d37d674e60702e925683c98751be89282f5abe93080ccd2fce85f932c6cdc39" +} diff --git a/.sqlx/query-5dab8e2e0eb9cff50671713adb2b596193e20d0017101603f6bb4a6731e4dc2d.json b/.sqlx/query-5dab8e2e0eb9cff50671713adb2b596193e20d0017101603f6bb4a6731e4dc2d.json new file mode 100644 index 0000000..64b2976 --- /dev/null +++ b/.sqlx/query-5dab8e2e0eb9cff50671713adb2b596193e20d0017101603f6bb4a6731e4dc2d.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "insert into feeds (url, owner) values (?, ?) returning id", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false + ] + }, + "hash": "5dab8e2e0eb9cff50671713adb2b596193e20d0017101603f6bb4a6731e4dc2d" +} diff --git a/.sqlx/query-64785d20fde925362b4eb9fcf0b8cf2436d679ed84f6b912cc563f753c19d92f.json b/.sqlx/query-64785d20fde925362b4eb9fcf0b8cf2436d679ed84f6b912cc563f753c19d92f.json new file mode 100644 index 0000000..215f4c9 --- /dev/null +++ b/.sqlx/query-64785d20fde925362b4eb9fcf0b8cf2436d679ed84f6b912cc563f753c19d92f.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "insert into status (feed, active) values (?, false)", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "64785d20fde925362b4eb9fcf0b8cf2436d679ed84f6b912cc563f753c19d92f" +} diff --git a/.sqlx/query-8ae828d3409fc5bf26d592505438d1fdb8aded5f304e203f80013c9bdae2c330.json b/.sqlx/query-8ae828d3409fc5bf26d592505438d1fdb8aded5f304e203f80013c9bdae2c330.json new file mode 100644 index 0000000..8dc2842 --- /dev/null +++ b/.sqlx/query-8ae828d3409fc5bf26d592505438d1fdb8aded5f304e203f80013c9bdae2c330.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "select id from feeds where owner = ? and url = ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false + ] + }, + "hash": "8ae828d3409fc5bf26d592505438d1fdb8aded5f304e203f80013c9bdae2c330" +} diff --git a/.sqlx/query-90c3678442a477d5315fcc66b604a0a071a99d62e33cdac4fdc9b0f65243ab33.json b/.sqlx/query-90c3678442a477d5315fcc66b604a0a071a99d62e33cdac4fdc9b0f65243ab33.json new file mode 100644 index 0000000..d8726b7 --- /dev/null +++ b/.sqlx/query-90c3678442a477d5315fcc66b604a0a071a99d62e33cdac4fdc9b0f65243ab33.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "insert into users (zulip_id) values (?)", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "90c3678442a477d5315fcc66b604a0a071a99d62e33cdac4fdc9b0f65243ab33" +} diff --git a/.sqlx/query-e717efe17105e6a2983dd360cd8f742a098913feb7c07bdd80da0d268998219d.json b/.sqlx/query-e717efe17105e6a2983dd360cd8f742a098913feb7c07bdd80da0d268998219d.json new file mode 100644 index 0000000..fe95e96 --- /dev/null +++ b/.sqlx/query-e717efe17105e6a2983dd360cd8f742a098913feb7c07bdd80da0d268998219d.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "select max(posted) posted from runs where feed = ? limit 1", + "describe": { + "columns": [ + { + "name": "posted", + "ordinal": 0, + "type_info": "Datetime" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + true + ] + }, + "hash": "e717efe17105e6a2983dd360cd8f742a098913feb7c07bdd80da0d268998219d" +} diff --git a/src/lib.rs b/src/lib.rs index ca0db75..f2f130f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,10 +79,11 @@ pub enum Action { List, } -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Default, Clone, PartialEq, Eq)] enum PostBody { Full(String), Truncated(String), + #[default] Empty, } @@ -438,13 +439,7 @@ impl BlogdorTheAggregator { for post in entries.iter() { let owner = post.owner; - let body = post.body.as_deref().unwrap_or(""); - - let tail = if body.len() <= ZULIP_MESSAGE_CUTOFF { - "" - } else { - "..." - }; + let body = &post.body; let url = post.post_url.as_str(); let title = post.title.as_str(); @@ -452,7 +447,7 @@ impl BlogdorTheAggregator { let header = format!("New post in a feed added by @**|{owner}**: {title}"); let content = format!( - "{header}\n---\n{body}{tail}\n\n---\noriginally posted to {url}, on {}", + "{header}\n```quote\n{body}\n```\n---\noriginally posted to {url}, on {}", post.published.format("%B %e, %Y"), ); @@ -593,21 +588,23 @@ async fn check_feed( for post in feed.entries.into_iter().take(5) { let body = post .content - .and_then(|c| match c.body { + .as_ref() + .map(|c| match c.body { None => PostBody::Empty, - Some(c) => { - let s = html2md::parse_html_custom(&c, &handlers) - .graphemes(false) - .take(ZULIP_MESSAGE_CUTOFF) - .collect::(); - if s.len() == c.len() { - PostBody::Full(s) + Some(ref c) => { + let full = html2md::parse_html_custom(c, &handlers); + if full.len() <= ZULIP_MESSAGE_CUTOFF { + PostBody::Full(full) } else { - PostBody::Truncated(s) + let trunc = full + .graphemes(false) + .take(ZULIP_MESSAGE_CUTOFF) + .collect::(); + PostBody::Truncated(trunc) } } }) - .unwrap_or(PostBody::Empty); + .unwrap_or_default(); if post.posted().unwrap_or(LAST_FETCHED) > last_fetched { let entry = FeedEntry {