From 87b0567b5982791bea07af94a08a6dbdbb26a747 Mon Sep 17 00:00:00 2001 From: VC Date: Mon, 20 Nov 2023 12:03:54 +0100 Subject: [PATCH 1/3] feat: split toot into 2 tweets when necessary --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/lib.rs | 32 ++++++++++++------- src/utils.rs | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 26e45ee..4eff00a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -988,7 +988,7 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "oolatoocs" -version = "1.2.0" +version = "1.3.0" dependencies = [ "clap", "env_logger", diff --git a/Cargo.toml b/Cargo.toml index 9e11d6c..671ca4f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "oolatoocs" -version = "1.2.0" +version = "1.3.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/src/lib.rs b/src/lib.rs index 735f776..bf0a28d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,7 +14,7 @@ use mastodon::get_mastodon_timeline_since; pub use mastodon::register; mod utils; -use utils::strip_everything; +use utils::{generate_multi_tweets, strip_everything}; mod twitter; #[allow(unused_imports)] @@ -40,13 +40,29 @@ pub async fn run(config: &Config) { .unwrap_or_else(|e| panic!("Cannot get instance: {}", e)); for toot in timeline { - let Ok(tweet_content) = strip_everything(&toot.content, &toot.tags) else { + let Ok(mut tweet_content) = strip_everything(&toot.content, &toot.tags) else { continue; // skip in case we can’t strip something }; - let mut medias: Vec = vec![]; + // threads if necessary + let mut reply_to = toot.in_reply_to_id.and_then(|t| { + read_state(&conn, Some(t.parse::().unwrap())) + .ok() + .flatten() + .map(|s| s.tweet_id) + }); - // if we wanted to cut toot in half, now would be the right time to do so + // if the toot is too long, we cut it in half here + if let Some((first_half, second_half)) = generate_multi_tweets(&tweet_content) { + tweet_content = second_half; + let reply_id = post_tweet(&config.twitter, &first_half, &[], &reply_to) + .await + .unwrap_or_else(|e| panic!("Cannot post the first half of {}: {}", &toot.id, e)); + reply_to = Some(reply_id); + }; + + // treats medias + let mut medias: Vec = vec![]; let media_attachments = toot.media_attachments.clone(); let mut stream = stream::iter(media_attachments) @@ -84,14 +100,6 @@ pub async fn run(config: &Config) { } } - // threads if necessary - let reply_to = toot.in_reply_to_id.and_then(|t| { - read_state(&conn, Some(t.parse::().unwrap())) - .ok() - .flatten() - .map(|s| s.tweet_id) - }); - // posts corresponding tweet let tweet_id = post_tweet(&config.twitter, &tweet_content, &medias, &reply_to) .await diff --git a/src/utils.rs b/src/utils.rs index 1a8ca0d..a91cc38 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -3,6 +3,50 @@ use megalodon::entities::status::Tag; use regex::Regex; use std::error::Error; +/// Generate 2 contents out of 1 if that content is > 280 chars, None else +pub fn generate_multi_tweets(content: &str) -> Option<(String, String)> { + // Twitter webforms are utf-8 encoded, so we cannot count on len(), we don’t need + // encode_utf16().count() + if twitter_count(content) <= 280 { + return None; + } + + let split_content = content.split(' '); + + let split_count = split_content.clone().count(); + + let first_half: String = split_content + .clone() + .take(split_count / 2) + .collect::>() + .join(" "); + let second_half: String = split_content + .clone() + .skip(split_count / 2) + .collect::>() + .join(" "); + + Some((first_half, second_half)) +} + +/// Twitter doesn’t count words the same we do, so you’ll have to improvise +fn twitter_count(content: &str) -> usize { + let mut count = 0; + + let split_content = content.split(' '); + count += split_content.clone().count() - 1; // count the spaces + + for word in split_content { + if word.starts_with("http://") || word.starts_with("https://") { + count += 23; + } else { + count += word.chars().count(); + } + } + + count +} + pub fn strip_everything(content: &str, tags: &Vec) -> Result> { let mut res = strip_html_tags(&content.replace("

", "\n\n").replace("
", "\n")); @@ -48,6 +92,51 @@ fn strip_html_tags(input: &str) -> String { mod tests { use super::*; + #[test] + fn test_twitter_count() { + let content = "tamerelol?! 🐡"; + + assert_eq!(twitter_count(content), content.chars().count()); + + let content = "Shoot out to https://y.ml/ !"; + + assert_eq!(twitter_count(content), 38); + + let content = "this is the link https://www.google.com/tamerelol/youpi/tonperemdr/tarace.html if you like! What if I shit a final"; + + assert_eq!(twitter_count(content), 76); + } + + #[test] + fn test_generate_multi_tweets_to_none() { + // test Β«β€―standardβ€―Β» text + let tweet_content = + "LOLOLOL, je suis bien trop petit pour Γͺtre coupΓ© en deux voyons :troll:".to_string(); + + let youpi = generate_multi_tweets(&tweet_content); + + assert_eq!(None, youpi); + + // test with Β«β€―complexβ€―Β» emoji (2 utf-8 chars) + let tweet_content = "πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·πŸ‡«πŸ‡·".to_string(); + + let youpi = generate_multi_tweets(&tweet_content); + + assert_eq!(None, youpi); + } + + #[test] + fn test_generate_multi_tweets_to_some() { + let tweet_content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit dolor. Mauris nunc congue nisi vitae. Scelerisque varius morbi enim nunc faucibus a pellentesque sit amet. Morbi leo urna molestie at elementum. Tristique et egestas quis ipsum suspendisse ultrices gravida dictum fusce. Amet porttitor eget dolor morbi.".to_string(); + + let youpi = generate_multi_tweets(&tweet_content); + + let first_half = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ipsum dolor sit amet consectetur adipiscing elit pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit dolor.".to_string(); + let second_half = "Mauris nunc congue nisi vitae. Scelerisque varius morbi enim nunc faucibus a pellentesque sit amet. Morbi leo urna molestie at elementum. Tristique et egestas quis ipsum suspendisse ultrices gravida dictum fusce. Amet porttitor eget dolor morbi.".to_string(); + + assert_eq!(youpi, Some((first_half, second_half))); + } + #[test] fn test_strip_mastodon_tags() { let tags = vec![ From 80946ac131bf268d76ce80032639f7241d0cb787 Mon Sep 17 00:00:00 2001 From: VC Date: Mon, 20 Nov 2023 12:24:58 +0100 Subject: [PATCH 2/3] chore: cargo update --- Cargo.lock | 213 +++++++++++++++++++++++------------------------------ 1 file changed, 94 insertions(+), 119 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4eff00a..f2e0afa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -108,7 +108,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -140,9 +140,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "bitflags" @@ -215,18 +215,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.6" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" +checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.4.6" +version = "4.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" +checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" dependencies = [ "anstream", "anstyle", @@ -236,9 +236,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "colorchoice" @@ -309,9 +309,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" dependencies = [ "humantime", "is-terminal", @@ -328,9 +328,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" dependencies = [ "libc", "windows-sys", @@ -446,7 +446,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -491,9 +491,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "js-sys", @@ -510,9 +510,9 @@ checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -520,7 +520,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap", "slab", "tokio", "tokio-util", @@ -536,12 +536,6 @@ dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashbrown" version = "0.14.2" @@ -589,9 +583,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -713,19 +707,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.3" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", "hashbrown 0.14.2", @@ -756,9 +740,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" dependencies = [ "wasm-bindgen", ] @@ -771,9 +755,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libsqlite3-sys" @@ -787,9 +771,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" [[package]] name = "lock_api" @@ -868,9 +852,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", @@ -1007,9 +991,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -1028,7 +1012,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1039,9 +1023,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" dependencies = [ "cc", "libc", @@ -1067,7 +1051,7 @@ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall", "smallvec", "windows-targets", ] @@ -1184,15 +1168,6 @@ dependencies = [ "getrandom", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -1237,7 +1212,7 @@ version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -1314,9 +1289,9 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.38.20" +version = "0.38.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" +checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" dependencies = [ "bitflags 2.4.1", "errno", @@ -1327,9 +1302,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.8" +version = "0.21.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" +checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" dependencies = [ "log", "ring", @@ -1351,11 +1326,11 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", ] [[package]] @@ -1439,7 +1414,7 @@ checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1465,9 +1440,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] @@ -1537,9 +1512,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "socket2" @@ -1575,9 +1550,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" @@ -1592,9 +1567,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -1624,22 +1599,22 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.3.5", + "redox_syscall", "rustix", "windows-sys", ] [[package]] name = "termcolor" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" dependencies = [ "winapi-util", ] @@ -1661,7 +1636,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1681,9 +1656,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", @@ -1700,13 +1675,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1760,21 +1735,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.21.0", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] @@ -1785,18 +1760,18 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.2", + "indexmap", "toml_datetime", "winnow", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.0.2", + "indexmap", "serde", "serde_spanned", "toml_datetime", @@ -1934,9 +1909,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.5.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ "getrandom", ] @@ -1970,9 +1945,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1980,24 +1955,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.37" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" dependencies = [ "cfg-if", "js-sys", @@ -2007,9 +1982,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2017,22 +1992,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wasm-streams" @@ -2049,9 +2024,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" dependencies = [ "js-sys", "wasm-bindgen", @@ -2171,9 +2146,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.17" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" dependencies = [ "memchr", ] From e8bde4c779d36a9fb7083e06d67e2dcb97a4e5e1 Mon Sep 17 00:00:00 2001 From: VC Date: Mon, 20 Nov 2023 15:27:09 +0100 Subject: [PATCH 3/3] feat: move media generation list to twitter.rs to avoid clutter --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/lib.rs | 44 ++------------------------------------------ src/twitter.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 50 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f2e0afa..a7b5dce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -972,7 +972,7 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "oolatoocs" -version = "1.3.0" +version = "1.3.1" dependencies = [ "clap", "env_logger", diff --git a/Cargo.toml b/Cargo.toml index 671ca4f..0fa65d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "oolatoocs" -version = "1.3.0" +version = "1.3.1" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/src/lib.rs b/src/lib.rs index bf0a28d..6e6069e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,13 +18,9 @@ use utils::{generate_multi_tweets, strip_everything}; mod twitter; #[allow(unused_imports)] -use twitter::{post_tweet, upload_chunk_media, upload_simple_media}; +use twitter::{generate_media_ids, post_tweet}; -use futures::{stream, StreamExt}; -use log::{error, warn}; -use megalodon::entities::attachment::AttachmentType; use rusqlite::Connection; -use std::error::Error; #[tokio::main] pub async fn run(config: &Config) { @@ -62,43 +58,7 @@ pub async fn run(config: &Config) { }; // treats medias - let mut medias: Vec = vec![]; - - let media_attachments = toot.media_attachments.clone(); - let mut stream = stream::iter(media_attachments) - .map(|media| { - let twitter_config = config.twitter.clone(); - tokio::task::spawn(async move { - match media.r#type { - AttachmentType::Image => { - upload_simple_media(&twitter_config, &media.url, &media.description) - .await - } - AttachmentType::Gifv => { - upload_chunk_media(&twitter_config, &media.url, "tweet_gif").await - } - AttachmentType::Video => { - upload_chunk_media(&twitter_config, &media.url, "tweet_video").await - } - _ => Err::>( - OolatoocsError::new(&format!( - "Cannot treat this type of media: {}", - &media.url - )) - .into(), - ), - } - }) - }) - .buffered(4); - - while let Some(result) = stream.next().await { - match result { - Ok(Ok(v)) => medias.push(v), - Ok(Err(e)) => warn!("Cannot treat media: {}", e), - Err(e) => error!("Something went wrong when joining the main thread: {}", e), - } - } + let medias = generate_media_ids(&config.twitter, &toot.media_attachments).await; // posts corresponding tweet let tweet_id = post_tweet(&config.twitter, &tweet_content, &medias, &reply_to) diff --git a/src/twitter.rs b/src/twitter.rs index aeb6de5..264d51b 100644 --- a/src/twitter.rs +++ b/src/twitter.rs @@ -1,6 +1,8 @@ use crate::config::TwitterConfig; use crate::error::OolatoocsError; -use log::debug; +use futures::{stream, StreamExt}; +use log::{debug, error, warn}; +use megalodon::entities::attachment::{Attachment, AttachmentType}; use oauth1_request::Token; use reqwest::{ multipart::{Form, Part}, @@ -99,8 +101,49 @@ fn get_token(config: &TwitterConfig) -> Token { ) } +pub async fn generate_media_ids(config: &TwitterConfig, media_attach: &[Attachment]) -> Vec { + let mut medias: Vec = vec![]; + + let media_attachments = media_attach.to_owned(); + let mut stream = stream::iter(media_attachments) + .map(|media| { + let twitter_config = config.clone(); + tokio::task::spawn(async move { + match media.r#type { + AttachmentType::Image => { + upload_simple_media(&twitter_config, &media.url, &media.description).await + } + AttachmentType::Gifv => { + upload_chunk_media(&twitter_config, &media.url, "tweet_gif").await + } + AttachmentType::Video => { + upload_chunk_media(&twitter_config, &media.url, "tweet_video").await + } + _ => Err::>( + OolatoocsError::new(&format!( + "Cannot treat this type of media: {}", + &media.url + )) + .into(), + ), + } + }) + }) + .buffered(4); + + while let Some(result) = stream.next().await { + match result { + Ok(Ok(v)) => medias.push(v), + Ok(Err(e)) => warn!("Cannot treat media: {}", e), + Err(e) => error!("Something went wrong when joining the main thread: {}", e), + } + } + + medias +} + /// This function uploads simple images from Mastodon to Twitter and returns the media id from Twitter -pub async fn upload_simple_media( +async fn upload_simple_media( config: &TwitterConfig, u: &str, d: &Option, @@ -191,7 +234,7 @@ async fn metadata_create( } /// This posts video/gif to Twitter and returns the media id from Twitter -pub async fn upload_chunk_media( +async fn upload_chunk_media( config: &TwitterConfig, u: &str, t: &str,