From 735a000acdd0398eeac93bb3423d8782c821a652 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Mon, 18 Mar 2024 16:16:30 +0100 Subject: [PATCH 01/10] Start upgrade --- Cargo.lock | 204 ++++++++++++++++++++++++++++++++++++++++++--- sphene/Cargo.toml | 2 +- sphene/src/main.rs | 115 +++++++++++++------------ 3 files changed, 257 insertions(+), 64 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e8fd2cd..1212262 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -66,6 +66,15 @@ version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b3d0060af21e8d11a926981cc00c6c1541aa91dd64b9f881985c3da1094425f" +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +dependencies = [ + "serde", +] + [[package]] name = "async-trait" version = "0.1.77" @@ -89,7 +98,7 @@ dependencies = [ "pin-project-lite", "tokio", "tokio-rustls 0.23.4", - "tungstenite", + "tungstenite 0.17.3", "webpki-roots 0.22.6", ] @@ -344,6 +353,12 @@ dependencies = [ "serde", ] +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + [[package]] name = "deranged" version = "0.3.11" @@ -669,7 +684,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.11", "indexmap 2.1.0", "slab", "tokio", @@ -733,6 +748,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -740,7 +766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.11", "pin-project-lite", ] @@ -767,7 +793,7 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", + "http 0.2.11", "http-body", "httparse", "httpdate", @@ -787,7 +813,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", + "http 0.2.11", "hyper", "rustls 0.21.10", "tokio", @@ -1278,7 +1304,7 @@ dependencies = [ "parking_lot", "poise_macros", "regex", - "serenity", + "serenity 0.11.7", "tokio", ] @@ -1410,7 +1436,7 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", + "http 0.2.11", "http-body", "hyper", "hyper-rustls", @@ -1577,10 +1603,24 @@ checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring 0.17.7", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring 0.17.7", + "rustls-pki-types", + "rustls-webpki 0.102.2", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -1590,6 +1630,12 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pki-types" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -1600,6 +1646,17 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustls-webpki" +version = "0.102.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring 0.17.7", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -1663,6 +1720,16 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "serde", + "zeroize", +] + [[package]] name = "security-framework" version = "2.9.2" @@ -1807,7 +1874,34 @@ dependencies = [ "time", "tokio", "tracing", - "typemap_rev", + "typemap_rev 0.1.5", + "url", +] + +[[package]] +name = "serenity" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64da29158bb55d70677cacd4f4f8eab1acef005fb830d9c3bea411b090e96a9" +dependencies = [ + "arrayvec", + "async-trait", + "base64 0.21.7", + "bitflags 2.4.2", + "bytes", + "flate2", + "futures", + "mime_guess", + "percent-encoding", + "reqwest", + "secrecy", + "serde", + "serde_json", + "time", + "tokio", + "tokio-tungstenite", + "tracing", + "typemap_rev 0.3.0", "url", ] @@ -1831,6 +1925,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -1869,7 +1974,7 @@ dependencies = [ "dotenv", "regex", "rust-i18n", - "serenity", + "serenity 0.12.1", "thorium", "tokio", ] @@ -1935,6 +2040,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "1.0.109" @@ -2084,7 +2195,7 @@ dependencies = [ "dotenv", "reqwest", "scraper", - "serenity", + "serenity 0.11.7", "thorium", "tokio", ] @@ -2148,6 +2259,33 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.2", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83b561d025642014097b66e6c1bb422783339e0909e4429cde4749d1990bc38" +dependencies = [ + "futures-util", + "log", + "rustls 0.22.2", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.25.0", + "tungstenite 0.21.0", + "webpki-roots 0.26.1", +] + [[package]] name = "tokio-util" version = "0.7.10" @@ -2260,7 +2398,7 @@ dependencies = [ "base64 0.13.1", "byteorder", "bytes", - "http", + "http 0.2.11", "httparse", "log", "rand", @@ -2272,12 +2410,39 @@ dependencies = [ "webpki", ] +[[package]] +name = "tungstenite" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http 1.1.0", + "httparse", + "log", + "rand", + "rustls 0.22.2", + "rustls-pki-types", + "sha1", + "thiserror", + "url", + "utf-8", +] + [[package]] name = "typemap_rev" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5b74f0a24b5454580a79abb6994393b09adf0ab8070f15827cb666255de155" +[[package]] +name = "typemap_rev" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74b08b0c1257381af16a5c3605254d529d3e7e109f3c62befc5d168968192998" + [[package]] name = "typenum" version = "1.17.0" @@ -2501,6 +2666,15 @@ version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +[[package]] +name = "webpki-roots" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2720,3 +2894,9 @@ dependencies = [ "quote", "syn 2.0.48", ] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/sphene/Cargo.toml b/sphene/Cargo.toml index c583aaf..eb3e165 100644 --- a/sphene/Cargo.toml +++ b/sphene/Cargo.toml @@ -8,7 +8,7 @@ authors.workspace = true [dependencies] dotenv = "0.15.0" -serenity = { version = "0.11.6", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } +serenity = { version = "0.12.0", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } thorium = { path = "../thorium" } regex = "1.9.3" diff --git a/sphene/src/main.rs b/sphene/src/main.rs index 1a43e7f..7e99f97 100644 --- a/sphene/src/main.rs +++ b/sphene/src/main.rs @@ -10,12 +10,13 @@ use options::get_tik_tok_options; use options::get_twitter_options; use regex::Regex; use rust_i18n::available_locales; +use serenity::all::CreateActionRow; +use serenity::all::CreateAllowedMentions; +use serenity::all::CreateMessage; +use serenity::all::UserId; use serenity::async_trait; use serenity::builder::CreateSelectMenuOption; -use serenity::model::application::interaction::Interaction; -use serenity::model::application::interaction::InteractionResponseType; -use serenity::model::application::interaction::InteractionType; use serenity::model::channel::Message; use serenity::model::gateway::Ready; use serenity::model::prelude::Activity; @@ -47,9 +48,9 @@ impl EventHandler for Handler { let options: Vec; let id = if msg.guild_id.is_some() { - msg.guild_id.unwrap().0 + msg.guild_id.unwrap().get() } else { - msg.author.id.0 + msg.author.id.get() }; let get_lang = match self.dbconn.lock().await.get_server(id, false).language { @@ -99,11 +100,9 @@ impl EventHandler for Handler { .to_string(); ref_author.pop(); - let author = &context - .http - .get_user(ref_author.parse::().unwrap()) - .await - .unwrap(); + let user_id = UserId::new(ref_author.parse::().unwrap()); + + let author = &context.http.get_user(user_id).await.unwrap(); // Ignore people that reply to their own messages if author.id == msg.author.id { @@ -116,17 +115,16 @@ impl EventHandler for Handler { .nick_in(&context.http, &msg.guild_id.unwrap()) .await .unwrap_or(msg.author.name.clone()); - author - .dm(&context.http, |m| { - m.content(t!( - "referenced", locale=lang, - USER_ID = &msg.author.id, - AUTHOR_NICKNAME = &author_nickname, - MESSAGE_URL = &msg_url - )) - }) - .await - .unwrap(); + + let message = CreateMessage::new().content(t!( + "referenced", + locale = lang, + USER_ID = &msg.author.id, + AUTHOR_NICKNAME = &author_nickname, + MESSAGE_URL = &msg_url + )); + + author.dm(&context.http, message).await.unwrap(); return; } else { @@ -139,34 +137,40 @@ impl EventHandler for Handler { .push(url) .build(); - if let Err(why) = msg - .channel_id - .send_message(&context.http, |m| { - m.allowed_mentions(|am| am.empty_parse()).content(response); - if msg.referenced_message.is_some() { - m.reference_message(msg.message_reference.clone().unwrap()); - } - m.components(|f| { - f.create_action_row(|f| { - f.create_select_menu(|s| { - s.custom_id("select") - .placeholder(t!("nothing_selected", locale=lang)) - .min_values(1) - .max_values(1) - .options(|o| o.set_options(options)) - }) - }) + let allowedMentions = CreateAllowedMentions::new().empty_users().empty_roles(); + + let mut message = CreateMessage::new() + .allowed_mentions(allowedMentions) + .content(response); + + if msg.referenced_message.is_some() { + message.reference_message(msg.message_reference.clone().unwrap()); + }; + + let selectMenu = CreateSelectMenuOption::new(). + + let actionRow = CreateActionRow::SelectMenu(()) + + message.components(|f| { + f.create_action_row(|f| { + f.create_select_menu(|s| { + s.custom_id("select") + .placeholder(t!("nothing_selected", locale = lang)) + .min_values(1) + .max_values(1) + .options(|o| o.set_options(options)) }) }) - .await - { - println!("{}", t!("error_sending_message", locale=lang, WHY = why)); + }); + + if let Err(why) = msg.channel_id.send_message(&context.http, message).await { + println!("{}", t!("error_sending_message", locale = lang, WHY = why)); }; if !msg.is_private() { // Delete message if let Err(why) = msg.delete(&context.http).await { - println!("{}", t!("error_delete_message", locale=lang, WHY = why)); + println!("{}", t!("error_delete_message", locale = lang, WHY = why)); } } } @@ -186,14 +190,13 @@ impl EventHandler for Handler { } // Get guild ID - let id = msg.author.id.0; + let id = msg.author.id.0; let get_lang = match self.dbconn.lock().await.get_server(id, false).language { Some(lang) => lang, None => "en".to_string(), }; let lang = get_lang.as_str(); - let user = &component.user.id.to_string(); // Check whether user is correct if !msg.content.contains(user) @@ -205,13 +208,23 @@ impl EventHandler for Handler { || command == "contribute_language" { let content = if command == "version" { - t!("source_code", locale=lang, URL = "https://github.com/AnnsAnns/sphene").to_string() + t!( + "source_code", + locale = lang, + URL = "https://github.com/AnnsAnns/sphene" + ) + .to_string() } else if command == "menu" { t!("menu_meme").to_string() } else if command == "disable" { t!("disable").to_string() - } else if command == "set_language" || command == "contribute_language"{ - t!("contribute_language", locale=lang, URL="https://github.com/AnnsAnns/sphene/locales").to_string() + } else if command == "set_language" || command == "contribute_language" { + t!( + "contribute_language", + locale = lang, + URL = "https://github.com/AnnsAnns/sphene/locales" + ) + .to_string() } else if command == "download" { let extracted_url = self .regex_pattern @@ -242,12 +255,12 @@ impl EventHandler for Handler { }; if url != "0" { - t!("download_url", locale=lang, URL = url).to_string() + t!("download_url", locale = lang, URL = url).to_string() } else { - t!("no_download", locale=lang).to_string() + t!("no_download", locale = lang).to_string() } } else { - t!("not_author", locale=lang).to_string() + t!("not_author", locale = lang).to_string() }; component @@ -272,7 +285,7 @@ impl EventHandler for Handler { if command == "remove" { if let Err(why) = component .edit_original_interaction_response(&ctx.http, |m| { - m.content(t!("deleted_message", locale=lang)) + m.content(t!("deleted_message", locale = lang)) .allowed_mentions(|am| am.empty_parse()); m.components(|c| c) }) From e7bf95dac3048cbdc9087fb6d4a97f0d3b8d1a72 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Mon, 18 Mar 2024 17:40:58 +0100 Subject: [PATCH 02/10] Continue --- sphene/src/main.rs | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/sphene/src/main.rs b/sphene/src/main.rs index 7e99f97..9dfde27 100644 --- a/sphene/src/main.rs +++ b/sphene/src/main.rs @@ -13,6 +13,10 @@ use rust_i18n::available_locales; use serenity::all::CreateActionRow; use serenity::all::CreateAllowedMentions; use serenity::all::CreateMessage; +use serenity::all::CreateSelectMenu; +use serenity::all::CreateSelectMenuKind; +use serenity::all::Interaction; +use serenity::all::InteractionType; use serenity::all::UserId; use serenity::async_trait; use serenity::builder::CreateSelectMenuOption; @@ -147,21 +151,15 @@ impl EventHandler for Handler { message.reference_message(msg.message_reference.clone().unwrap()); }; - let selectMenu = CreateSelectMenuOption::new(). + let selectMenu = + CreateSelectMenu::new("select", CreateSelectMenuKind::String { options: options }) + .max_values(1) + .min_values(1) + .placeholder(t!("nothing_selected", locale = lang)); - let actionRow = CreateActionRow::SelectMenu(()) + let actionRow = CreateActionRow::SelectMenu(selectMenu); - message.components(|f| { - f.create_action_row(|f| { - f.create_select_menu(|s| { - s.custom_id("select") - .placeholder(t!("nothing_selected", locale = lang)) - .min_values(1) - .max_values(1) - .options(|o| o.set_options(options)) - }) - }) - }); + message.components(vec![actionRow]); if let Err(why) = msg.channel_id.send_message(&context.http, message).await { println!("{}", t!("error_sending_message", locale = lang, WHY = why)); @@ -177,7 +175,7 @@ impl EventHandler for Handler { async fn interaction_create(&self, ctx: Context, interaction: Interaction) { // Check whether button has been pressed - if interaction.kind() != InteractionType::MessageComponent { + if interaction.kind() != InteractionType::Component { return; } From 4e66761ca7c14adbe5fb3d8d777e14336a13cbb7 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Mon, 18 Mar 2024 21:53:43 +0100 Subject: [PATCH 03/10] Update sphene_config, start merging both into poise framework --- .vscode/settings.json | 3 +- Cargo.lock | 187 ++++++- sphene/.env.TEMPLATE | 1 - sphene/Cargo.toml | 5 +- sphene/README.md | 8 +- sphene/src/main.rs | 511 +++++------------- sphene_config/src/main.rs | 139 ----- {sphene => sphene_old}/.github/screenshot.png | Bin .../.github/workflows/rust.yml | 0 {sphene => sphene_old}/.gitignore | 0 {sphene_config => sphene_old}/Cargo.toml | 7 +- {sphene => sphene_old}/LICENSE | 0 {sphene_config => sphene_old}/README.md | 8 +- sphene_old/src/main.rs | 413 ++++++++++++++ {sphene => sphene_old}/src/options.rs | 0 15 files changed, 714 insertions(+), 568 deletions(-) delete mode 100644 sphene/.env.TEMPLATE delete mode 100644 sphene_config/src/main.rs rename {sphene => sphene_old}/.github/screenshot.png (100%) rename {sphene => sphene_old}/.github/workflows/rust.yml (100%) rename {sphene => sphene_old}/.gitignore (100%) rename {sphene_config => sphene_old}/Cargo.toml (63%) rename {sphene => sphene_old}/LICENSE (100%) rename {sphene_config => sphene_old}/README.md (65%) create mode 100644 sphene_old/src/main.rs rename {sphene => sphene_old}/src/options.rs (100%) diff --git a/.vscode/settings.json b/.vscode/settings.json index 3c35d6f..2d09116 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "i18n-ally.localesPaths": [ "locales" - ] + ], + "i18n-ally.keystyle": "nested" } \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 1212262..ef82905 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -172,6 +172,12 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +[[package]] +name = "bytecount" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" + [[package]] name = "byteorder" version = "1.5.0" @@ -184,6 +190,37 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + [[package]] name = "cc" version = "1.0.83" @@ -246,6 +283,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.5" @@ -306,9 +352,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.14.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ "darling_core", "darling_macro", @@ -316,27 +362,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.14.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] name = "darling_macro" -version = "0.14.4" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -453,6 +499,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -1022,6 +1077,21 @@ dependencies = [ "unicase", ] +[[package]] +name = "mini-moka" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803" +dependencies = [ + "crossbeam-channel", + "crossbeam-utils", + "dashmap", + "skeptic", + "smallvec", + "tagptr", + "triomphe", +] + [[package]] name = "miniz_oxide" version = "0.7.1" @@ -1291,33 +1361,31 @@ checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "poise" -version = "0.5.7" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d104e4b5847283b2fbd6a7ec19fb6a8af328e2145623d056b66d750a30073fdf" +checksum = "1819d5a45e3590ef33754abce46432570c54a120798bdbf893112b4211fa09a6" dependencies = [ "async-trait", "derivative", - "futures-core", "futures-util", - "log", - "once_cell", "parking_lot", "poise_macros", "regex", - "serenity 0.11.7", + "serenity 0.12.1", "tokio", + "tracing", ] [[package]] name = "poise_macros" -version = "0.5.7" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb516a8cf4e4ae4bd7ef5819d08c6ca408976461a9bea3ee3eec5138ac070c1" +checksum = "8fa2c123c961e78315cd3deac7663177f12be4460f5440dbf62a7ed37b1effea" dependencies = [ "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -1347,6 +1415,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "pulldown-cmark" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +dependencies = [ + "bitflags 2.4.2", + "memchr", + "unicase", +] + [[package]] name = "quote" version = "1.0.35" @@ -1657,12 +1736,6 @@ dependencies = [ "untrusted 0.9.0", ] -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - [[package]] name = "ryu" version = "1.0.16" @@ -1772,6 +1845,15 @@ dependencies = [ "smallvec", ] +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +dependencies = [ + "serde", +] + [[package]] name = "serde" version = "1.0.195" @@ -1858,16 +1940,12 @@ dependencies = [ "bitflags 1.3.2", "bytes", "cfg-if", - "chrono", - "dashmap", "flate2", "futures", "mime", "mime_guess", - "parking_lot", "percent-encoding", "reqwest", - "rustversion", "serde", "serde-value", "serde_json", @@ -1889,9 +1967,13 @@ dependencies = [ "base64 0.21.7", "bitflags 2.4.2", "bytes", + "chrono", + "dashmap", "flate2", "futures", + "fxhash", "mime_guess", + "parking_lot", "percent-encoding", "reqwest", "secrecy", @@ -1902,6 +1984,7 @@ dependencies = [ "tokio-tungstenite", "tracing", "typemap_rev 0.3.0", + "typesize", "url", ] @@ -1942,6 +2025,21 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +dependencies = [ + "bytecount", + "cargo_metadata", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", +] + [[package]] name = "slab" version = "0.4.9" @@ -2089,6 +2187,12 @@ dependencies = [ "libc", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tempfile" version = "3.9.0" @@ -2449,6 +2553,35 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "typesize" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac862de7176a9c24a9c6b8840cb7092ae0ab7ff52cb2f9c71f27efacc7ecaf54" +dependencies = [ + "chrono", + "dashmap", + "hashbrown 0.14.3", + "mini-moka", + "parking_lot", + "secrecy", + "serde_json", + "time", + "typesize-derive", + "url", +] + +[[package]] +name = "typesize-derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b122284365ba8497be951b9a21491f70c9688eb6fddc582931a0703f6a00ece" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "unicase" version = "2.7.0" diff --git a/sphene/.env.TEMPLATE b/sphene/.env.TEMPLATE deleted file mode 100644 index 6a56620..0000000 --- a/sphene/.env.TEMPLATE +++ /dev/null @@ -1 +0,0 @@ -DISCORD_TOKEN=TOKEN_HERE \ No newline at end of file diff --git a/sphene/Cargo.toml b/sphene/Cargo.toml index eb3e165..2583fa8 100644 --- a/sphene/Cargo.toml +++ b/sphene/Cargo.toml @@ -8,8 +8,7 @@ authors.workspace = true [dependencies] dotenv = "0.15.0" -serenity = { version = "0.12.0", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } +poise = "0.6.1" thorium = { path = "../thorium" } -regex = "1.9.3" -rust-i18n = "3.0.1" +rust-i18n = "3.0.1" \ No newline at end of file diff --git a/sphene/README.md b/sphene/README.md index 7e75220..d048d85 100644 --- a/sphene/README.md +++ b/sphene/README.md @@ -1,10 +1,6 @@ -## Sphene +## Sphene Config -Sphene is a discord bot that replaces twitter, bluesky, instagram and tiktok links with various other sources that aim to fix the bug/broken embeds these sites have. - -### Example - -![](./.github/screenshot.png) +Sphene Config is a shard of the Sphene discord bot that allows you to configure the bot via slash commands. ### Invite diff --git a/sphene/src/main.rs b/sphene/src/main.rs index 9dfde27..7c913b6 100644 --- a/sphene/src/main.rs +++ b/sphene/src/main.rs @@ -1,413 +1,152 @@ -use std::env; - -extern crate dotenv; - -use dotenv::dotenv; - -use options::get_blueksy_options; -use options::get_instagram_options; -use options::get_tik_tok_options; -use options::get_twitter_options; -use regex::Regex; -use rust_i18n::available_locales; -use serenity::all::CreateActionRow; -use serenity::all::CreateAllowedMentions; -use serenity::all::CreateMessage; -use serenity::all::CreateSelectMenu; -use serenity::all::CreateSelectMenuKind; -use serenity::all::Interaction; -use serenity::all::InteractionType; -use serenity::all::UserId; -use serenity::async_trait; -use serenity::builder::CreateSelectMenuOption; - -use serenity::model::channel::Message; -use serenity::model::gateway::Ready; -use serenity::model::prelude::Activity; -use serenity::prelude::*; -use serenity::utils::MessageBuilder; -use thorium::db::DBConn; -use thorium::*; - -use rust_i18n::t; - -rust_i18n::i18n!("../locales", fallback = "en"); - -mod options; - -const VERSION: &str = env!("CARGO_PKG_VERSION"); - -struct Handler { - regex_pattern: Regex, - dbconn: Mutex, +use poise::serenity_prelude as serenity; +use thorium::db::{DBConn, Server}; +use tokio::sync::Mutex; + +struct Data { + db: Mutex, +} // User data, which is stored and accessible in all command invocations +type Error = Box; +type Context<'a> = poise::Context<'a, Data, Error>; + +#[derive(Debug, poise::ChoiceParameter)] +pub enum Choices { + Twitter, + Bluesky, + Instagram, + Tiktok, } -const REGEX_URL_EXTRACTOR: &str = r"\b(?:https?:\/\/|<)[^\s>]+(?:>|)\b"; - -#[async_trait] -impl EventHandler for Handler { - async fn message(&self, context: Context, msg: Message) { - let url: String; - let content = msg.content.clone(); - let options: Vec; - - let id = if msg.guild_id.is_some() { - msg.guild_id.unwrap().get() - } else { - msg.author.id.get() - }; - - let get_lang = match self.dbconn.lock().await.get_server(id, false).language { - Some(lang) => lang, - None => "en".to_string(), - }; - let lang = get_lang.as_str(); - - if twitter::is_twitter_url(content.as_str()) - && self.dbconn.lock().await.get_server(id, false).twitter - { - url = twitter::remove_tracking( - twitter::convert_url_lazy(content, twitter::UrlType::Vxtwitter).await, - ); - - options = get_twitter_options(lang); - } else if bluesky::is_bluesky_url(content.as_str()) - && self.dbconn.lock().await.get_server(id, false).bluesky - { - url = bluesky::convert_url_lazy(content, bluesky::UrlType::FixBluesky).await; - options = get_blueksy_options(lang); - } else if tiktok::is_tiktok_url(content.as_str()) - && self.dbconn.lock().await.get_server(id, false).tiktok - { - url = - tiktok::convert_url_lazy(tiktok::clear_url(content).await, tiktok::UrlType::TIKTXK) - .await; - options = get_tik_tok_options(lang); - } else if instagram::is_instagram_url(content.as_str()) - && self.dbconn.lock().await.get_server(id, false).instagram - { - url = instagram::convert_url_lazy(content, instagram::UrlType::DDInstagram).await; - options = get_instagram_options(lang); - } else if msg.referenced_message.is_some() { - let ref_message = &msg.referenced_message.clone().unwrap(); - if ref_message.author.id != context.http.get_current_user().await.unwrap().id { - return; - }; - - let mut ref_author = ref_message - .content - .split_once(':') - .unwrap() - .0 - .split_at(2) - .1 - .to_string(); - ref_author.pop(); - - let user_id = UserId::new(ref_author.parse::().unwrap()); - - let author = &context.http.get_user(user_id).await.unwrap(); - - // Ignore people that reply to their own messages - if author.id == msg.author.id { - return; - } - - let msg_url = &msg.link_ensured(&context.http).await; - let author_nickname = &msg - .author - .nick_in(&context.http, &msg.guild_id.unwrap()) - .await - .unwrap_or(msg.author.name.clone()); - - let message = CreateMessage::new().content(t!( - "referenced", - locale = lang, - USER_ID = &msg.author.id, - AUTHOR_NICKNAME = &author_nickname, - MESSAGE_URL = &msg_url - )); - - author.dm(&context.http, message).await.unwrap(); - - return; - } else { - return; - } - - let response = MessageBuilder::new() - .mention(&msg.author) - .push(": ") - .push(url) - .build(); - - let allowedMentions = CreateAllowedMentions::new().empty_users().empty_roles(); - - let mut message = CreateMessage::new() - .allowed_mentions(allowedMentions) - .content(response); - - if msg.referenced_message.is_some() { - message.reference_message(msg.message_reference.clone().unwrap()); - }; - - let selectMenu = - CreateSelectMenu::new("select", CreateSelectMenuKind::String { options: options }) - .max_values(1) - .min_values(1) - .placeholder(t!("nothing_selected", locale = lang)); - - let actionRow = CreateActionRow::SelectMenu(selectMenu); +#[derive(Debug, Clone, poise::ChoiceParameter)] +pub enum EnableOrDisable { + Enable = 1, + Disable = 0, +} - message.components(vec![actionRow]); +#[derive(Debug, Clone, poise::ChoiceParameter)] +pub enum Languages { + English, + German, + Dutch, +} - if let Err(why) = msg.channel_id.send_message(&context.http, message).await { - println!("{}", t!("error_sending_message", locale = lang, WHY = why)); - }; +// Allow enum to string conversion for Languages +trait ToLanguageString { + fn to_language_string(&self) -> String; +} - if !msg.is_private() { - // Delete message - if let Err(why) = msg.delete(&context.http).await { - println!("{}", t!("error_delete_message", locale = lang, WHY = why)); - } +impl ToLanguageString for Languages { + fn to_language_string(&self) -> String { + match self { + Languages::English => "en".to_string(), + Languages::German => "de-DE".to_string(), + Languages::Dutch => "nl-NL".to_string(), } } +} - async fn interaction_create(&self, ctx: Context, interaction: Interaction) { - // Check whether button has been pressed - if interaction.kind() != InteractionType::Component { - return; +fn parse_choice(choice: &Choices, mut server: Server, change_to: bool) -> Server { + match choice { + Choices::Twitter => { + server.twitter = change_to; } - - let component = interaction.as_message_component().unwrap().clone(); - let command = component.data.values.first().unwrap(); - let msg = &component.message; - - if !msg.author.bot { - return; + Choices::Bluesky => { + server.bluesky = change_to; } - - // Get guild ID - let id = msg.author.id.0; - let get_lang = match self.dbconn.lock().await.get_server(id, false).language { - Some(lang) => lang, - None => "en".to_string(), - }; - let lang = get_lang.as_str(); - - let user = &component.user.id.to_string(); - // Check whether user is correct - if !msg.content.contains(user) - || command == "version" - || command == "download" - || command == "menu" - || command == "disable" - || command == "set_language" - || command == "contribute_language" - { - let content = if command == "version" { - t!( - "source_code", - locale = lang, - URL = "https://github.com/AnnsAnns/sphene" - ) - .to_string() - } else if command == "menu" { - t!("menu_meme").to_string() - } else if command == "disable" { - t!("disable").to_string() - } else if command == "set_language" || command == "contribute_language" { - t!( - "contribute_language", - locale = lang, - URL = "https://github.com/AnnsAnns/sphene/locales" - ) - .to_string() - } else if command == "download" { - let extracted_url = self - .regex_pattern - .find_iter(&msg.content) - .next() - .unwrap() - .as_str() - .to_string(); - - let url = if twitter::UrlType::from_string(&extracted_url) - != twitter::UrlType::Unknown - { - twitter::get_media_from_url( - twitter::convert_url_lazy(extracted_url, twitter::UrlType::Vxtwitter).await, - ) - .await - } else if tiktok::UrlType::from_string(&extracted_url) != tiktok::UrlType::Unknown { - tiktok::get_media_from_url( - tiktok::convert_url_lazy(extracted_url, tiktok::UrlType::TIKTXK).await, - ) - .await - } else { - bluesky::get_media_from_url( - bluesky::convert_url_lazy(extracted_url, bluesky::UrlType::FixBluesky) - .await, - ) - .await - }; - - if url != "0" { - t!("download_url", locale = lang, URL = url).to_string() - } else { - t!("no_download", locale = lang).to_string() - } - } else { - t!("not_author", locale = lang).to_string() - }; - - component - .create_interaction_response(&ctx.http, |r| { - r.kind(InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|m| m.content(content).ephemeral(true)) - }) - .await - .unwrap(); - - return; - } else { - // Make the Discord API happy :) - component - .create_interaction_response(&ctx.http, |r| { - r.kind(InteractionResponseType::DeferredUpdateMessage) - }) - .await - .unwrap(); + Choices::Instagram => { + server.instagram = change_to; } - - if command == "remove" { - if let Err(why) = component - .edit_original_interaction_response(&ctx.http, |m| { - m.content(t!("deleted_message", locale = lang)) - .allowed_mentions(|am| am.empty_parse()); - m.components(|c| c) - }) - .await - { - println!("Error editing message: {:?}", why); - } - - // Sleep for 5 seconds - tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; - - // Delete the response message - if let Err(why) = component - .delete_original_interaction_response(&ctx.http) - .await - { - println!("Error deleting message: {:?}", why); - } - } else { - let extracted_url = self - .regex_pattern - .find_iter(&msg.content) - .next() - .unwrap() - .as_str() - .to_string(); - let mut new_msg: String = String::new(); - - let mut twitter_urltype = twitter::UrlType::from_string(command); - let bluesky_urltype = bluesky::UrlType::from_string(command); - let instagram_urltype = instagram::UrlType::from_string(command); - let tiktok_urltype = tiktok::UrlType::from_string(command); - - if twitter_urltype != twitter::UrlType::Unknown { - new_msg = twitter::convert_url_lazy(extracted_url, twitter_urltype).await; - } else if bluesky_urltype != bluesky::UrlType::Unknown { - new_msg = bluesky::convert_url_lazy(extracted_url, bluesky_urltype).await; - } else if instagram_urltype != instagram::UrlType::Unknown { - new_msg = instagram::convert_url_lazy(extracted_url, instagram_urltype).await; - } else if tiktok_urltype != tiktok::UrlType::Unknown { - new_msg = tiktok::convert_url_lazy(extracted_url, tiktok_urltype).await; - } else if command == "direct_vx" || command == "direct_fx" { - twitter_urltype = match command.as_str() { - "direct_vx" => twitter::UrlType::Vxtwitter, - "direct_fx" => twitter::UrlType::Fxtwitter, - _ => twitter::UrlType::Unknown, - }; - - new_msg = - twitter::convert_url_lazy(extracted_url.to_string(), twitter_urltype).await; - new_msg = format!( - "<{}> ({})", - new_msg, - twitter::get_media_from_url(new_msg.clone()).await - ); - } else if command == "direct_fxbsky" { - new_msg = bluesky::convert_url_lazy( - extracted_url.to_string(), - bluesky::UrlType::FixBluesky, - ) - .await; - new_msg = format!( - "<{}> ({})", - new_msg, - bluesky::get_media_from_url(new_msg.clone()).await - ); - } else if command == "direct_tiktxk" { - new_msg = - tiktok::convert_url_lazy(extracted_url.to_string(), tiktok::UrlType::TIKTXK) - .await; - new_msg = format!( - "<{}> ({})", - new_msg, - tiktok::get_media_from_url(new_msg.clone()).await - ); - } - - new_msg = format!("<@{}>: {}", user, new_msg); - - if let Err(why) = component - .edit_original_interaction_response(&ctx.http, |m| { - m.content(new_msg).allowed_mentions(|am| am.empty_parse()) - }) - .await - { - println!("Error editing message: {:?}", why); - } + Choices::Tiktok => { + server.tiktok = change_to; } } + server +} - async fn ready(&self, ctx: Context, ready: Ready) { - ctx.set_activity(Activity::watching("out for embeds 🕵️")) - .await; +#[poise::command(slash_command, prefix_command)] +async fn set_own_language( + ctx: Context<'_>, + #[description = "Which language should the bot use for you personally?"] language: Languages, +) -> Result<(), Error> { + let db = ctx.data().db.lock().await; + let id = ctx.author().id.get(); + let mut server = db.get_server(id, true); + server.language = Some(language.to_language_string()); + db.update_server(server); + ctx.say(format!("Changed language to {:#?} 👍", language)) + .await?; + Ok(()) +} - println!("{} is connected!", ready.user.name); +// Gets relevent id, if guild id is present, it returns the guild id, else it returns the author id +async fn get_relevant_id(ctx: Context<'_>) -> u64 { + if ctx.guild_id().is_some() { + ctx.guild_id().unwrap().get() + } else { + ctx.author().id.get() } } +#[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] +async fn set_guild_language( + ctx: Context<'_>, + #[description = "Which language should the bot use for this Guild?"] language: Languages, +) -> Result<(), Error> { + let db = ctx.data().db.lock().await; + let id = get_relevant_id(ctx).await; + let mut server = db.get_server(id, true); + server.language = Some(language.to_language_string()); + db.update_server(server); + ctx.say(format!("Changed language to {:#?} 👍", language)) + .await?; + Ok(()) +} + +/// Displays your or another user's account creation date +#[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] +async fn change( + ctx: Context<'_>, + #[description = "What do you want to change?"] choice: Choices, + #[description = "Should it be enabled or disabled?"] enable_or_disable: EnableOrDisable, +) -> Result<(), Error> { + let db = ctx.data().db.lock().await; + let id = get_relevant_id(ctx).await; + let mut server = db.get_server(id, true); + server = parse_choice(&choice, server, enable_or_disable.clone() as u8 == 1); + db.update_server(server); + ctx.say(format!( + "Changed {:#?} to {:#?}d 👍", + choice, enable_or_disable + )) + .await?; + Ok(()) +} + #[tokio::main] async fn main() { - // Load the environment variables from the .env file. - dotenv().ok(); + dotenv::dotenv().unwrap(); - // Configure the client with your Discord bot token in the environment. - let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment"); - let intents = GatewayIntents::GUILD_MESSAGES - | GatewayIntents::DIRECT_MESSAGES - | GatewayIntents::MESSAGE_CONTENT; - - let regex_pattern = Regex::new(REGEX_URL_EXTRACTOR).unwrap(); + let token = std::env::var("DISCORD_TOKEN").expect("missing DISCORD_TOKEN"); + let intents = serenity::GatewayIntents::non_privileged(); let dbconn = Mutex::new(DBConn::new().unwrap()); + dbconn.lock().await.create_new(); - println!("Available Languages: {:?}", available_locales!()); - - let mut client = Client::builder(&token, intents) - .event_handler(Handler { - regex_pattern, - dbconn, + let framework = poise::Framework::builder() + .options(poise::FrameworkOptions { + commands: vec![change, set_own_language, set_guild_language], + ..Default::default() }) - .await - .expect("Err creating client"); + .setup(|ctx, _ready, framework| { + Box::pin(async move { + poise::builtins::register_globally(ctx, &framework.options().commands).await?; + Ok(Data { db: dbconn }) + }) + }) + .build(); - if let Err(why) = client.start().await { - println!("Client error: {:?}", why); - } + let client = serenity::ClientBuilder::new(token, intents) + .framework(framework) + .await; + + client.unwrap().start().await.unwrap(); } diff --git a/sphene_config/src/main.rs b/sphene_config/src/main.rs deleted file mode 100644 index 653f647..0000000 --- a/sphene_config/src/main.rs +++ /dev/null @@ -1,139 +0,0 @@ -use poise::serenity_prelude as serenity; -use thorium::db::{DBConn, Server}; -use tokio::sync::Mutex; - -struct Data { - db: Mutex, -} // User data, which is stored and accessible in all command invocations -type Error = Box; -type Context<'a> = poise::Context<'a, Data, Error>; - -#[derive(Debug, poise::ChoiceParameter)] -pub enum Choices { - Twitter, - Bluesky, - Instagram, - Tiktok, -} - -#[derive(Debug, Clone, poise::ChoiceParameter)] -pub enum EnableOrDisable { - Enable = 1, - Disable = 0, -} - -#[derive(Debug, Clone, poise::ChoiceParameter)] -pub enum Languages { - English, - German, - Dutch, -} - -// Allow enum to string conversion for Languages -trait ToLanguageString { - fn to_language_string(&self) -> String; -} - -impl ToLanguageString for Languages { - fn to_language_string(&self) -> String { - match self { - Languages::English => "en".to_string(), - Languages::German => "de-DE".to_string(), - Languages::Dutch => "nl-NL".to_string(), - } - } -} - -fn parse_choice(choice: &Choices, mut server: Server, change_to: bool) -> Server { - match choice { - Choices::Twitter => { - server.twitter = change_to; - } - Choices::Bluesky => { - server.bluesky = change_to; - } - Choices::Instagram => { - server.instagram = change_to; - } - Choices::Tiktok => { - server.tiktok = change_to; - } - } - server -} - -#[poise::command(slash_command, prefix_command)] -async fn set_own_language( - ctx: Context<'_>, - #[description = "Which language should the bot use for you personally?"] language: Languages, -) -> Result<(), Error> { - let db = ctx.data().db.lock().await; - let id = ctx.author().id.0; - let mut server = db.get_server(id, true); - server.language = Some(language.to_language_string()); - db.update_server(server); - ctx.say(format!("Changed language to {:#?} 👍", language)).await?; - Ok(()) -} - -#[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] -async fn set_guild_language( - ctx: Context<'_>, - #[description = "Which language should the bot use for this Guild?"] language: Languages, -) -> Result<(), Error> { - let db = ctx.data().db.lock().await; - let id = if ctx.guild_id().is_some() { - ctx.guild_id().unwrap().0 - } else { - ctx.author().id.0 - }; - let mut server = db.get_server(id, true); - server.language = Some(language.to_language_string()); - db.update_server(server); - ctx.say(format!("Changed language to {:#?} 👍", language)).await?; - Ok(()) -} - -/// Displays your or another user's account creation date -#[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] -async fn change( - ctx: Context<'_>, - #[description = "What do you want to change?"] choice: Choices, - #[description = "Should it be enabled or disabled?"] enable_or_disable: EnableOrDisable, -) -> Result<(), Error> { - let db = ctx.data().db.lock().await; - let id = if ctx.guild_id().is_some() { - ctx.guild_id().unwrap().0 - } else { - ctx.author().id.0 - }; - let mut server = db.get_server(id, true); - server = parse_choice(&choice, server, enable_or_disable.clone() as u8 == 1); - db.update_server(server); - ctx.say(format!("Changed {:#?} to {:#?}d 👍", choice, enable_or_disable)).await?; - Ok(()) -} - -#[tokio::main] -async fn main() { - dotenv::dotenv().unwrap(); - - let dbconn = Mutex::new(DBConn::new().unwrap()); - dbconn.lock().await.create_new(); - - let framework = poise::Framework::builder() - .options(poise::FrameworkOptions { - commands: vec![change(), set_own_language(), set_guild_language()], - ..Default::default() - }) - .token(std::env::var("DISCORD_TOKEN").expect("missing DISCORD_TOKEN")) - .intents(serenity::GatewayIntents::non_privileged()) - .setup(|ctx, _ready, framework| { - Box::pin(async move { - poise::builtins::register_globally(ctx, &framework.options().commands).await?; - Ok(Data { db: dbconn }) - }) - }); - - framework.run().await.unwrap(); -} diff --git a/sphene/.github/screenshot.png b/sphene_old/.github/screenshot.png similarity index 100% rename from sphene/.github/screenshot.png rename to sphene_old/.github/screenshot.png diff --git a/sphene/.github/workflows/rust.yml b/sphene_old/.github/workflows/rust.yml similarity index 100% rename from sphene/.github/workflows/rust.yml rename to sphene_old/.github/workflows/rust.yml diff --git a/sphene/.gitignore b/sphene_old/.gitignore similarity index 100% rename from sphene/.gitignore rename to sphene_old/.gitignore diff --git a/sphene_config/Cargo.toml b/sphene_old/Cargo.toml similarity index 63% rename from sphene_config/Cargo.toml rename to sphene_old/Cargo.toml index 9b4054a..1743e48 100644 --- a/sphene_config/Cargo.toml +++ b/sphene_old/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "sphene_config" +name = "sphene_old" edition = "2021" version.workspace = true authors.workspace = true @@ -8,7 +8,8 @@ authors.workspace = true [dependencies] dotenv = "0.15.0" +serenity = { version = "0.12.0", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -poise = "0.5.6" thorium = { path = "../thorium" } -rust-i18n = "3.0.1" \ No newline at end of file +regex = "1.9.3" +rust-i18n = "3.0.1" diff --git a/sphene/LICENSE b/sphene_old/LICENSE similarity index 100% rename from sphene/LICENSE rename to sphene_old/LICENSE diff --git a/sphene_config/README.md b/sphene_old/README.md similarity index 65% rename from sphene_config/README.md rename to sphene_old/README.md index d048d85..7e75220 100644 --- a/sphene_config/README.md +++ b/sphene_old/README.md @@ -1,6 +1,10 @@ -## Sphene Config +## Sphene -Sphene Config is a shard of the Sphene discord bot that allows you to configure the bot via slash commands. +Sphene is a discord bot that replaces twitter, bluesky, instagram and tiktok links with various other sources that aim to fix the bug/broken embeds these sites have. + +### Example + +![](./.github/screenshot.png) ### Invite diff --git a/sphene_old/src/main.rs b/sphene_old/src/main.rs new file mode 100644 index 0000000..9dfde27 --- /dev/null +++ b/sphene_old/src/main.rs @@ -0,0 +1,413 @@ +use std::env; + +extern crate dotenv; + +use dotenv::dotenv; + +use options::get_blueksy_options; +use options::get_instagram_options; +use options::get_tik_tok_options; +use options::get_twitter_options; +use regex::Regex; +use rust_i18n::available_locales; +use serenity::all::CreateActionRow; +use serenity::all::CreateAllowedMentions; +use serenity::all::CreateMessage; +use serenity::all::CreateSelectMenu; +use serenity::all::CreateSelectMenuKind; +use serenity::all::Interaction; +use serenity::all::InteractionType; +use serenity::all::UserId; +use serenity::async_trait; +use serenity::builder::CreateSelectMenuOption; + +use serenity::model::channel::Message; +use serenity::model::gateway::Ready; +use serenity::model::prelude::Activity; +use serenity::prelude::*; +use serenity::utils::MessageBuilder; +use thorium::db::DBConn; +use thorium::*; + +use rust_i18n::t; + +rust_i18n::i18n!("../locales", fallback = "en"); + +mod options; + +const VERSION: &str = env!("CARGO_PKG_VERSION"); + +struct Handler { + regex_pattern: Regex, + dbconn: Mutex, +} + +const REGEX_URL_EXTRACTOR: &str = r"\b(?:https?:\/\/|<)[^\s>]+(?:>|)\b"; + +#[async_trait] +impl EventHandler for Handler { + async fn message(&self, context: Context, msg: Message) { + let url: String; + let content = msg.content.clone(); + let options: Vec; + + let id = if msg.guild_id.is_some() { + msg.guild_id.unwrap().get() + } else { + msg.author.id.get() + }; + + let get_lang = match self.dbconn.lock().await.get_server(id, false).language { + Some(lang) => lang, + None => "en".to_string(), + }; + let lang = get_lang.as_str(); + + if twitter::is_twitter_url(content.as_str()) + && self.dbconn.lock().await.get_server(id, false).twitter + { + url = twitter::remove_tracking( + twitter::convert_url_lazy(content, twitter::UrlType::Vxtwitter).await, + ); + + options = get_twitter_options(lang); + } else if bluesky::is_bluesky_url(content.as_str()) + && self.dbconn.lock().await.get_server(id, false).bluesky + { + url = bluesky::convert_url_lazy(content, bluesky::UrlType::FixBluesky).await; + options = get_blueksy_options(lang); + } else if tiktok::is_tiktok_url(content.as_str()) + && self.dbconn.lock().await.get_server(id, false).tiktok + { + url = + tiktok::convert_url_lazy(tiktok::clear_url(content).await, tiktok::UrlType::TIKTXK) + .await; + options = get_tik_tok_options(lang); + } else if instagram::is_instagram_url(content.as_str()) + && self.dbconn.lock().await.get_server(id, false).instagram + { + url = instagram::convert_url_lazy(content, instagram::UrlType::DDInstagram).await; + options = get_instagram_options(lang); + } else if msg.referenced_message.is_some() { + let ref_message = &msg.referenced_message.clone().unwrap(); + if ref_message.author.id != context.http.get_current_user().await.unwrap().id { + return; + }; + + let mut ref_author = ref_message + .content + .split_once(':') + .unwrap() + .0 + .split_at(2) + .1 + .to_string(); + ref_author.pop(); + + let user_id = UserId::new(ref_author.parse::().unwrap()); + + let author = &context.http.get_user(user_id).await.unwrap(); + + // Ignore people that reply to their own messages + if author.id == msg.author.id { + return; + } + + let msg_url = &msg.link_ensured(&context.http).await; + let author_nickname = &msg + .author + .nick_in(&context.http, &msg.guild_id.unwrap()) + .await + .unwrap_or(msg.author.name.clone()); + + let message = CreateMessage::new().content(t!( + "referenced", + locale = lang, + USER_ID = &msg.author.id, + AUTHOR_NICKNAME = &author_nickname, + MESSAGE_URL = &msg_url + )); + + author.dm(&context.http, message).await.unwrap(); + + return; + } else { + return; + } + + let response = MessageBuilder::new() + .mention(&msg.author) + .push(": ") + .push(url) + .build(); + + let allowedMentions = CreateAllowedMentions::new().empty_users().empty_roles(); + + let mut message = CreateMessage::new() + .allowed_mentions(allowedMentions) + .content(response); + + if msg.referenced_message.is_some() { + message.reference_message(msg.message_reference.clone().unwrap()); + }; + + let selectMenu = + CreateSelectMenu::new("select", CreateSelectMenuKind::String { options: options }) + .max_values(1) + .min_values(1) + .placeholder(t!("nothing_selected", locale = lang)); + + let actionRow = CreateActionRow::SelectMenu(selectMenu); + + message.components(vec![actionRow]); + + if let Err(why) = msg.channel_id.send_message(&context.http, message).await { + println!("{}", t!("error_sending_message", locale = lang, WHY = why)); + }; + + if !msg.is_private() { + // Delete message + if let Err(why) = msg.delete(&context.http).await { + println!("{}", t!("error_delete_message", locale = lang, WHY = why)); + } + } + } + + async fn interaction_create(&self, ctx: Context, interaction: Interaction) { + // Check whether button has been pressed + if interaction.kind() != InteractionType::Component { + return; + } + + let component = interaction.as_message_component().unwrap().clone(); + let command = component.data.values.first().unwrap(); + let msg = &component.message; + + if !msg.author.bot { + return; + } + + // Get guild ID + let id = msg.author.id.0; + let get_lang = match self.dbconn.lock().await.get_server(id, false).language { + Some(lang) => lang, + None => "en".to_string(), + }; + let lang = get_lang.as_str(); + + let user = &component.user.id.to_string(); + // Check whether user is correct + if !msg.content.contains(user) + || command == "version" + || command == "download" + || command == "menu" + || command == "disable" + || command == "set_language" + || command == "contribute_language" + { + let content = if command == "version" { + t!( + "source_code", + locale = lang, + URL = "https://github.com/AnnsAnns/sphene" + ) + .to_string() + } else if command == "menu" { + t!("menu_meme").to_string() + } else if command == "disable" { + t!("disable").to_string() + } else if command == "set_language" || command == "contribute_language" { + t!( + "contribute_language", + locale = lang, + URL = "https://github.com/AnnsAnns/sphene/locales" + ) + .to_string() + } else if command == "download" { + let extracted_url = self + .regex_pattern + .find_iter(&msg.content) + .next() + .unwrap() + .as_str() + .to_string(); + + let url = if twitter::UrlType::from_string(&extracted_url) + != twitter::UrlType::Unknown + { + twitter::get_media_from_url( + twitter::convert_url_lazy(extracted_url, twitter::UrlType::Vxtwitter).await, + ) + .await + } else if tiktok::UrlType::from_string(&extracted_url) != tiktok::UrlType::Unknown { + tiktok::get_media_from_url( + tiktok::convert_url_lazy(extracted_url, tiktok::UrlType::TIKTXK).await, + ) + .await + } else { + bluesky::get_media_from_url( + bluesky::convert_url_lazy(extracted_url, bluesky::UrlType::FixBluesky) + .await, + ) + .await + }; + + if url != "0" { + t!("download_url", locale = lang, URL = url).to_string() + } else { + t!("no_download", locale = lang).to_string() + } + } else { + t!("not_author", locale = lang).to_string() + }; + + component + .create_interaction_response(&ctx.http, |r| { + r.kind(InteractionResponseType::ChannelMessageWithSource) + .interaction_response_data(|m| m.content(content).ephemeral(true)) + }) + .await + .unwrap(); + + return; + } else { + // Make the Discord API happy :) + component + .create_interaction_response(&ctx.http, |r| { + r.kind(InteractionResponseType::DeferredUpdateMessage) + }) + .await + .unwrap(); + } + + if command == "remove" { + if let Err(why) = component + .edit_original_interaction_response(&ctx.http, |m| { + m.content(t!("deleted_message", locale = lang)) + .allowed_mentions(|am| am.empty_parse()); + m.components(|c| c) + }) + .await + { + println!("Error editing message: {:?}", why); + } + + // Sleep for 5 seconds + tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; + + // Delete the response message + if let Err(why) = component + .delete_original_interaction_response(&ctx.http) + .await + { + println!("Error deleting message: {:?}", why); + } + } else { + let extracted_url = self + .regex_pattern + .find_iter(&msg.content) + .next() + .unwrap() + .as_str() + .to_string(); + let mut new_msg: String = String::new(); + + let mut twitter_urltype = twitter::UrlType::from_string(command); + let bluesky_urltype = bluesky::UrlType::from_string(command); + let instagram_urltype = instagram::UrlType::from_string(command); + let tiktok_urltype = tiktok::UrlType::from_string(command); + + if twitter_urltype != twitter::UrlType::Unknown { + new_msg = twitter::convert_url_lazy(extracted_url, twitter_urltype).await; + } else if bluesky_urltype != bluesky::UrlType::Unknown { + new_msg = bluesky::convert_url_lazy(extracted_url, bluesky_urltype).await; + } else if instagram_urltype != instagram::UrlType::Unknown { + new_msg = instagram::convert_url_lazy(extracted_url, instagram_urltype).await; + } else if tiktok_urltype != tiktok::UrlType::Unknown { + new_msg = tiktok::convert_url_lazy(extracted_url, tiktok_urltype).await; + } else if command == "direct_vx" || command == "direct_fx" { + twitter_urltype = match command.as_str() { + "direct_vx" => twitter::UrlType::Vxtwitter, + "direct_fx" => twitter::UrlType::Fxtwitter, + _ => twitter::UrlType::Unknown, + }; + + new_msg = + twitter::convert_url_lazy(extracted_url.to_string(), twitter_urltype).await; + new_msg = format!( + "<{}> ({})", + new_msg, + twitter::get_media_from_url(new_msg.clone()).await + ); + } else if command == "direct_fxbsky" { + new_msg = bluesky::convert_url_lazy( + extracted_url.to_string(), + bluesky::UrlType::FixBluesky, + ) + .await; + new_msg = format!( + "<{}> ({})", + new_msg, + bluesky::get_media_from_url(new_msg.clone()).await + ); + } else if command == "direct_tiktxk" { + new_msg = + tiktok::convert_url_lazy(extracted_url.to_string(), tiktok::UrlType::TIKTXK) + .await; + new_msg = format!( + "<{}> ({})", + new_msg, + tiktok::get_media_from_url(new_msg.clone()).await + ); + } + + new_msg = format!("<@{}>: {}", user, new_msg); + + if let Err(why) = component + .edit_original_interaction_response(&ctx.http, |m| { + m.content(new_msg).allowed_mentions(|am| am.empty_parse()) + }) + .await + { + println!("Error editing message: {:?}", why); + } + } + } + + async fn ready(&self, ctx: Context, ready: Ready) { + ctx.set_activity(Activity::watching("out for embeds 🕵️")) + .await; + + println!("{} is connected!", ready.user.name); + } +} + +#[tokio::main] +async fn main() { + // Load the environment variables from the .env file. + dotenv().ok(); + + // Configure the client with your Discord bot token in the environment. + let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment"); + let intents = GatewayIntents::GUILD_MESSAGES + | GatewayIntents::DIRECT_MESSAGES + | GatewayIntents::MESSAGE_CONTENT; + + let regex_pattern = Regex::new(REGEX_URL_EXTRACTOR).unwrap(); + + let dbconn = Mutex::new(DBConn::new().unwrap()); + + println!("Available Languages: {:?}", available_locales!()); + + let mut client = Client::builder(&token, intents) + .event_handler(Handler { + regex_pattern, + dbconn, + }) + .await + .expect("Err creating client"); + + if let Err(why) = client.start().await { + println!("Client error: {:?}", why); + } +} diff --git a/sphene/src/options.rs b/sphene_old/src/options.rs similarity index 100% rename from sphene/src/options.rs rename to sphene_old/src/options.rs From 61ebd1d3df100677693e2516dfe145e7a3386811 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Mon, 18 Mar 2024 23:11:49 +0100 Subject: [PATCH 04/10] Fully merge both bots into v2 + Poise --- Cargo.lock | 14 +- Cargo.toml | 1 - sphene/Cargo.toml | 4 +- sphene/src/commands/change.rs | 20 + sphene/src/commands/mod.rs | 2 + sphene/src/commands/set_lang.rs | 31 ++ sphene/src/main.rs | 131 +----- sphene/src/message_handler.rs | 27 ++ .../src/message_handler/interaction_event.rs | 207 +++++++++ sphene/src/message_handler/message_event.rs | 141 ++++++ {sphene_old => sphene}/src/options.rs | 4 +- sphene/src/utils.rs | 74 ++++ sphene_old/.github/screenshot.png | Bin 313161 -> 0 bytes sphene_old/.github/workflows/rust.yml | 22 - sphene_old/.gitignore | 2 - sphene_old/Cargo.toml | 15 - sphene_old/LICENSE | 274 ------------ sphene_old/README.md | 19 - sphene_old/src/main.rs | 413 ------------------ 19 files changed, 525 insertions(+), 876 deletions(-) create mode 100644 sphene/src/commands/change.rs create mode 100644 sphene/src/commands/mod.rs create mode 100644 sphene/src/commands/set_lang.rs create mode 100644 sphene/src/message_handler.rs create mode 100644 sphene/src/message_handler/interaction_event.rs create mode 100644 sphene/src/message_handler/message_event.rs rename {sphene_old => sphene}/src/options.rs (97%) create mode 100644 sphene/src/utils.rs delete mode 100644 sphene_old/.github/screenshot.png delete mode 100644 sphene_old/.github/workflows/rust.yml delete mode 100644 sphene_old/.gitignore delete mode 100644 sphene_old/Cargo.toml delete mode 100644 sphene_old/LICENSE delete mode 100644 sphene_old/README.md delete mode 100644 sphene_old/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index ef82905..1a78535 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2070,19 +2070,9 @@ name = "sphene" version = "9.0.0" dependencies = [ "dotenv", - "regex", - "rust-i18n", - "serenity 0.12.1", - "thorium", - "tokio", -] - -[[package]] -name = "sphene_config" -version = "9.0.0" -dependencies = [ - "dotenv", + "lazy_static", "poise", + "regex", "rust-i18n", "thorium", "tokio", diff --git a/Cargo.toml b/Cargo.toml index f9f69c7..7ad8857 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,6 @@ members = [ "sphene", "thorium", "titanite", - "sphene_config" ] resolver = "2" diff --git a/sphene/Cargo.toml b/sphene/Cargo.toml index 2583fa8..28ddc77 100644 --- a/sphene/Cargo.toml +++ b/sphene/Cargo.toml @@ -11,4 +11,6 @@ dotenv = "0.15.0" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } poise = "0.6.1" thorium = { path = "../thorium" } -rust-i18n = "3.0.1" \ No newline at end of file +rust-i18n = "3.0.1" +regex = "1.9.3" +lazy_static = "1.4.0" \ No newline at end of file diff --git a/sphene/src/commands/change.rs b/sphene/src/commands/change.rs new file mode 100644 index 0000000..8494462 --- /dev/null +++ b/sphene/src/commands/change.rs @@ -0,0 +1,20 @@ +use crate::{utils::{get_relevant_id, parse_choice, Choices, EnableOrDisable, Languages, ToLanguageString}, Context, Error}; + +#[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] +pub async fn change( + ctx: Context<'_>, + #[description = "What do you want to change?"] choice: Choices, + #[description = "Should it be enabled or disabled?"] enable_or_disable: EnableOrDisable, +) -> Result<(), Error> { + let db = ctx.data().db.lock().await; + let id = get_relevant_id(ctx); + let mut server = db.get_server(id, true); + server = parse_choice(&choice, server, enable_or_disable.clone() as u8 == 1); + db.update_server(server); + ctx.say(format!( + "Changed {:#?} to {:#?}d 👍", + choice, enable_or_disable + )) + .await?; + Ok(()) +} diff --git a/sphene/src/commands/mod.rs b/sphene/src/commands/mod.rs new file mode 100644 index 0000000..0c76165 --- /dev/null +++ b/sphene/src/commands/mod.rs @@ -0,0 +1,2 @@ +pub mod set_lang; +pub mod change; \ No newline at end of file diff --git a/sphene/src/commands/set_lang.rs b/sphene/src/commands/set_lang.rs new file mode 100644 index 0000000..a2b2438 --- /dev/null +++ b/sphene/src/commands/set_lang.rs @@ -0,0 +1,31 @@ +use crate::{utils::{get_relevant_id, Languages, ToLanguageString}, Context, Error}; + +#[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] +pub async fn set_guild_language( + ctx: Context<'_>, + #[description = "Which language should the bot use for this Guild?"] language: Languages, +) -> Result<(), Error> { + let db = ctx.data().db.lock().await; + let id = get_relevant_id(ctx); + let mut server = db.get_server(id, true); + server.language = Some(language.to_language_string()); + db.update_server(server); + ctx.say(format!("Changed language to {:#?} 👍", language)) + .await?; + Ok(()) +} + +#[poise::command(slash_command, prefix_command)] +pub async fn set_own_language( + ctx: Context<'_>, + #[description = "Which language should the bot use for you personally?"] language: Languages, +) -> Result<(), Error> { + let db = ctx.data().db.lock().await; + let id = ctx.author().id.get(); + let mut server = db.get_server(id, true); + server.language = Some(language.to_language_string()); + db.update_server(server); + ctx.say(format!("Changed language to {:#?} 👍", language)) + .await?; + Ok(()) +} \ No newline at end of file diff --git a/sphene/src/main.rs b/sphene/src/main.rs index 7c913b6..c3b8eb1 100644 --- a/sphene/src/main.rs +++ b/sphene/src/main.rs @@ -1,139 +1,40 @@ use poise::serenity_prelude as serenity; use thorium::db::{DBConn, Server}; use tokio::sync::Mutex; +use commands::set_lang::{set_guild_language, set_own_language}; +use commands::change::change; + +use rust_i18n::t; + +rust_i18n::i18n!("../locales", fallback = "en"); struct Data { db: Mutex, } // User data, which is stored and accessible in all command invocations type Error = Box; -type Context<'a> = poise::Context<'a, Data, Error>; - -#[derive(Debug, poise::ChoiceParameter)] -pub enum Choices { - Twitter, - Bluesky, - Instagram, - Tiktok, -} - -#[derive(Debug, Clone, poise::ChoiceParameter)] -pub enum EnableOrDisable { - Enable = 1, - Disable = 0, -} +pub(crate) type Context<'a> = poise::Context<'a, Data, Error>; -#[derive(Debug, Clone, poise::ChoiceParameter)] -pub enum Languages { - English, - German, - Dutch, -} - -// Allow enum to string conversion for Languages -trait ToLanguageString { - fn to_language_string(&self) -> String; -} - -impl ToLanguageString for Languages { - fn to_language_string(&self) -> String { - match self { - Languages::English => "en".to_string(), - Languages::German => "de-DE".to_string(), - Languages::Dutch => "nl-NL".to_string(), - } - } -} - -fn parse_choice(choice: &Choices, mut server: Server, change_to: bool) -> Server { - match choice { - Choices::Twitter => { - server.twitter = change_to; - } - Choices::Bluesky => { - server.bluesky = change_to; - } - Choices::Instagram => { - server.instagram = change_to; - } - Choices::Tiktok => { - server.tiktok = change_to; - } - } - server -} - -#[poise::command(slash_command, prefix_command)] -async fn set_own_language( - ctx: Context<'_>, - #[description = "Which language should the bot use for you personally?"] language: Languages, -) -> Result<(), Error> { - let db = ctx.data().db.lock().await; - let id = ctx.author().id.get(); - let mut server = db.get_server(id, true); - server.language = Some(language.to_language_string()); - db.update_server(server); - ctx.say(format!("Changed language to {:#?} 👍", language)) - .await?; - Ok(()) -} - -// Gets relevent id, if guild id is present, it returns the guild id, else it returns the author id -async fn get_relevant_id(ctx: Context<'_>) -> u64 { - if ctx.guild_id().is_some() { - ctx.guild_id().unwrap().get() - } else { - ctx.author().id.get() - } -} - -#[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] -async fn set_guild_language( - ctx: Context<'_>, - #[description = "Which language should the bot use for this Guild?"] language: Languages, -) -> Result<(), Error> { - let db = ctx.data().db.lock().await; - let id = get_relevant_id(ctx).await; - let mut server = db.get_server(id, true); - server.language = Some(language.to_language_string()); - db.update_server(server); - ctx.say(format!("Changed language to {:#?} 👍", language)) - .await?; - Ok(()) -} - -/// Displays your or another user's account creation date -#[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] -async fn change( - ctx: Context<'_>, - #[description = "What do you want to change?"] choice: Choices, - #[description = "Should it be enabled or disabled?"] enable_or_disable: EnableOrDisable, -) -> Result<(), Error> { - let db = ctx.data().db.lock().await; - let id = get_relevant_id(ctx).await; - let mut server = db.get_server(id, true); - server = parse_choice(&choice, server, enable_or_disable.clone() as u8 == 1); - db.update_server(server); - ctx.say(format!( - "Changed {:#?} to {:#?}d 👍", - choice, enable_or_disable - )) - .await?; - Ok(()) -} +mod commands; +mod utils; +mod message_handler; +mod options; #[tokio::main] async fn main() { dotenv::dotenv().unwrap(); let token = std::env::var("DISCORD_TOKEN").expect("missing DISCORD_TOKEN"); - let intents = serenity::GatewayIntents::non_privileged(); + let intents = serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT; let dbconn = Mutex::new(DBConn::new().unwrap()); dbconn.lock().await.create_new(); let framework = poise::Framework::builder() .options(poise::FrameworkOptions { - commands: vec![change, set_own_language, set_guild_language], + commands: vec![change(), set_own_language(), set_guild_language()], + event_handler: |ctx, event, framework, data| { + Box::pin(message_handler::event_handler(ctx, event, framework, data)) + }, ..Default::default() }) .setup(|ctx, _ready, framework| { diff --git a/sphene/src/message_handler.rs b/sphene/src/message_handler.rs new file mode 100644 index 0000000..619080d --- /dev/null +++ b/sphene/src/message_handler.rs @@ -0,0 +1,27 @@ +use poise::serenity_prelude::{Context, FullEvent}; + +use crate::{Data, Error}; + +mod message_event; +mod interaction_event; + +pub async fn event_handler( + ctx: &Context, + event: &FullEvent, + _framework: poise::FrameworkContext<'_, Data, Error>, + data: &Data, +) -> Result<(), Error> { + match event { + FullEvent::Ready { data_about_bot, .. } => { + println!("Logged in as {}", data_about_bot.user.name); + } + FullEvent::Message { new_message } => { + message_event::message(ctx, new_message.clone(), &data.db).await; + } + FullEvent::InteractionCreate { interaction } => { + interaction_event::interaction_create(ctx, interaction.clone(), &data.db).await; + } + _ => {} + } + Ok(()) +} \ No newline at end of file diff --git a/sphene/src/message_handler/interaction_event.rs b/sphene/src/message_handler/interaction_event.rs new file mode 100644 index 0000000..db1973b --- /dev/null +++ b/sphene/src/message_handler/interaction_event.rs @@ -0,0 +1,207 @@ +use poise::serenity_prelude::{ + Context, CreateActionRow, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseMessage, CreateMessage, CreateSelectMenu, CreateSelectMenuKind, CreateSelectMenuOption, EditInteractionResponse, FullEvent, Interaction, InteractionType, Message, MessageBuilder, UserId +}; +use rust_i18n::t; +use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; +use tokio::sync::Mutex; + +use crate::utils::REGEX_URL; + +pub async fn interaction_create(ctx: &Context, interaction: Interaction, dbconn: &Mutex) { + // Check whether button has been pressed + if interaction.kind() != InteractionType::Component { + return; + } + + let component = interaction.as_message_component().unwrap().clone(); + let command = &component.data.custom_id; + let msg = &component.message; + + if !msg.author.bot { + return; + } + + // Get guild ID + let id = msg.author.id.get(); + let get_lang = match dbconn.lock().await.get_server(id, false).language { + Some(lang) => lang, + None => "en".to_string(), + }; + let lang = get_lang.as_str(); + + let user = &component.user.id.to_string(); + // Check whether user is correct + if !msg.content.contains(user) + || command == "version" + || command == "download" + || command == "menu" + || command == "disable" + || command == "set_language" + || command == "contribute_language" + { + let content = if command == "version" { + t!( + "source_code", + locale = lang, + URL = "https://github.com/AnnsAnns/sphene" + ) + .to_string() + } else if command == "menu" { + t!("menu_meme").to_string() + } else if command == "disable" { + t!("disable").to_string() + } else if command == "set_language" || command == "contribute_language" { + t!( + "contribute_language", + locale = lang, + URL = "https://github.com/AnnsAnns/sphene/locales" + ) + .to_string() + } else if command == "download" { + let extracted_url = REGEX_URL + .find_iter(&msg.content) + .next() + .unwrap() + .as_str() + .to_string(); + + let url = if twitter::UrlType::from_string(&extracted_url) + != twitter::UrlType::Unknown + { + twitter::get_media_from_url( + twitter::convert_url_lazy(extracted_url, twitter::UrlType::Vxtwitter).await, + ) + .await + } else if tiktok::UrlType::from_string(&extracted_url) != tiktok::UrlType::Unknown { + tiktok::get_media_from_url( + tiktok::convert_url_lazy(extracted_url, tiktok::UrlType::TIKTXK).await, + ) + .await + } else { + bluesky::get_media_from_url( + bluesky::convert_url_lazy(extracted_url, bluesky::UrlType::FixBluesky) + .await, + ) + .await + }; + + if url != "0" { + t!("download_url", locale = lang, URL = url).to_string() + } else { + t!("no_download", locale = lang).to_string() + } + } else { + t!("not_author", locale = lang).to_string() + }; + + let response_msg = CreateInteractionResponseMessage::new().content(content).ephemeral(true); + let response = CreateInteractionResponse::Defer(response_msg); + + component + .create_response(&ctx.http, response) + .await + .unwrap(); + + return; + } else { + // Make the Discord API happy :) + component + .create_response(&ctx.http, CreateInteractionResponse::Defer(CreateInteractionResponseMessage::new())) + .await + .unwrap(); + } + + if command == "remove" { + let interaction_response = EditInteractionResponse::new() + .content(t!("deleted_message", locale = lang)) + .allowed_mentions(CreateAllowedMentions::new().empty_roles().empty_users()); + + if let Err(why) = component + .edit_response(&ctx.http, interaction_response) + .await + { + println!("Error editing message: {:?}", why); + } + + // Sleep for 5 seconds + tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; + + // Delete the response message + if let Err(why) = component + .delete_response(&ctx.http) + .await + { + println!("Error deleting message: {:?}", why); + } + } else { + let extracted_url = REGEX_URL + .find_iter(&msg.content) + .next() + .unwrap() + .as_str() + .to_string(); + let mut new_msg: String = String::new(); + + let mut twitter_urltype = twitter::UrlType::from_string(&command); + let bluesky_urltype = bluesky::UrlType::from_string(&command); + let instagram_urltype = instagram::UrlType::from_string(&command); + let tiktok_urltype = tiktok::UrlType::from_string(&command); + + if twitter_urltype != twitter::UrlType::Unknown { + new_msg = twitter::convert_url_lazy(extracted_url, twitter_urltype).await; + } else if bluesky_urltype != bluesky::UrlType::Unknown { + new_msg = bluesky::convert_url_lazy(extracted_url, bluesky_urltype).await; + } else if instagram_urltype != instagram::UrlType::Unknown { + new_msg = instagram::convert_url_lazy(extracted_url, instagram_urltype).await; + } else if tiktok_urltype != tiktok::UrlType::Unknown { + new_msg = tiktok::convert_url_lazy(extracted_url, tiktok_urltype).await; + } else if command == "direct_vx" || command == "direct_fx" { + twitter_urltype = match command.as_str() { + "direct_vx" => twitter::UrlType::Vxtwitter, + "direct_fx" => twitter::UrlType::Fxtwitter, + _ => twitter::UrlType::Unknown, + }; + + new_msg = + twitter::convert_url_lazy(extracted_url.to_string(), twitter_urltype).await; + new_msg = format!( + "<{}> ({})", + new_msg, + twitter::get_media_from_url(new_msg.clone()).await + ); + } else if command == "direct_fxbsky" { + new_msg = bluesky::convert_url_lazy( + extracted_url.to_string(), + bluesky::UrlType::FixBluesky, + ) + .await; + new_msg = format!( + "<{}> ({})", + new_msg, + bluesky::get_media_from_url(new_msg.clone()).await + ); + } else if command == "direct_tiktxk" { + new_msg = + tiktok::convert_url_lazy(extracted_url.to_string(), tiktok::UrlType::TIKTXK) + .await; + new_msg = format!( + "<{}> ({})", + new_msg, + tiktok::get_media_from_url(new_msg.clone()).await + ); + } + + new_msg = format!("<@{}>: {}", user, new_msg); + + let new_response = EditInteractionResponse::new() + .content(new_msg) + .allowed_mentions(CreateAllowedMentions::new().empty_roles().empty_users()); + + if let Err(why) = component + .edit_response(&ctx.http, new_response) + .await + { + println!("Error editing message: {:?}", why); + } + } +} \ No newline at end of file diff --git a/sphene/src/message_handler/message_event.rs b/sphene/src/message_handler/message_event.rs new file mode 100644 index 0000000..6f91948 --- /dev/null +++ b/sphene/src/message_handler/message_event.rs @@ -0,0 +1,141 @@ +use poise::serenity_prelude::{ + Context, CreateActionRow, CreateAllowedMentions, CreateMessage, + CreateSelectMenu, CreateSelectMenuKind, CreateSelectMenuOption, FullEvent, Message, + MessageBuilder, UserId, +}; +use rust_i18n::t; +use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; +use tokio::sync::Mutex; + +use crate::{ + options::{ + get_blueksy_options, get_instagram_options, get_tik_tok_options, get_twitter_options, + }, + Data, +}; + +pub async fn message(context: &Context, msg: Message, dbconn: &Mutex) { + let url: String; + let content = msg.content.clone(); + let options: Vec; + + let id = if msg.guild_id.is_some() { + msg.guild_id.unwrap().get() + } else { + msg.author.id.get() + }; + + let get_lang = match dbconn.lock().await.get_server(id, false).language { + Some(lang) => lang, + None => "en".to_string(), + }; + let lang = get_lang.as_str(); + + if twitter::is_twitter_url(content.as_str()) + && dbconn.lock().await.get_server(id, false).twitter + { + url = twitter::remove_tracking( + twitter::convert_url_lazy(content, twitter::UrlType::Vxtwitter).await, + ); + + options = get_twitter_options(lang); + } else if bluesky::is_bluesky_url(content.as_str()) + && dbconn.lock().await.get_server(id, false).bluesky + { + url = bluesky::convert_url_lazy(content, bluesky::UrlType::FixBluesky).await; + options = get_blueksy_options(lang); + } else if tiktok::is_tiktok_url(content.as_str()) + && dbconn.lock().await.get_server(id, false).tiktok + { + url = tiktok::convert_url_lazy(tiktok::clear_url(content).await, tiktok::UrlType::TIKTXK) + .await; + options = get_tik_tok_options(lang); + } else if instagram::is_instagram_url(content.as_str()) + && dbconn.lock().await.get_server(id, false).instagram + { + url = instagram::convert_url_lazy(content, instagram::UrlType::DDInstagram).await; + options = get_instagram_options(lang); + } else if msg.referenced_message.is_some() { + let ref_message = &msg.referenced_message.clone().unwrap(); + if ref_message.author.id != context.http.get_current_user().await.unwrap().id { + return; + }; + + let mut ref_author = ref_message + .content + .split_once(':') + .unwrap() + .0 + .split_at(2) + .1 + .to_string(); + ref_author.pop(); + + let user_id = UserId::new(ref_author.parse::().unwrap()); + + let author = &context.http.get_user(user_id).await.unwrap(); + + // Ignore people that reply to their own messages + if author.id == msg.author.id { + return; + } + + let msg_url = &msg.link_ensured(&context.http).await; + let author_nickname = &msg + .author + .nick_in(&context.http, &msg.guild_id.unwrap()) + .await + .unwrap_or(msg.author.name.clone()); + + let message = CreateMessage::new().content(t!( + "referenced", + locale = lang, + USER_ID = &msg.author.id, + AUTHOR_NICKNAME = &author_nickname, + MESSAGE_URL = &msg_url + )); + + author.dm(&context.http, message).await.unwrap(); + + return; + } else { + return; + } + + let response = MessageBuilder::new() + .mention(&msg.author) + .push(": ") + .push(url) + .build(); + + let allowedMentions = CreateAllowedMentions::new().empty_users().empty_roles(); + + let mut message = CreateMessage::new() + .allowed_mentions(allowedMentions) + .content(response); + + if msg.referenced_message.is_some() { + message = message.reference_message(msg.message_reference.clone().unwrap()); + }; + + let selectMenu = + CreateSelectMenu::new("select", CreateSelectMenuKind::String { options: options }) + .max_values(1) + .min_values(1) + .placeholder(t!("nothing_selected", locale = lang)); + + let actionRow = CreateActionRow::SelectMenu(selectMenu); + + message = message.components(vec![actionRow]); + + if let Err(why) = msg.channel_id.send_message(&context.http, message).await { + println!("{}", t!("error_sending_message", locale = lang, WHY = why)); + }; + + if !msg.is_private() { + // Delete message + if let Err(why) = msg.delete(&context.http).await { + println!("{}", t!("error_delete_message", locale = lang, WHY = why)); + } + } +} diff --git a/sphene_old/src/options.rs b/sphene/src/options.rs similarity index 97% rename from sphene_old/src/options.rs rename to sphene/src/options.rs index a95c5ef..5f54864 100644 --- a/sphene_old/src/options.rs +++ b/sphene/src/options.rs @@ -1,9 +1,9 @@ -use serenity::builder::CreateSelectMenuOption; +use poise::serenity_prelude::CreateSelectMenuOption; use rust_i18n::t; use thorium::{bluesky, instagram, tiktok, twitter}; -use crate::VERSION; +const VERSION: &str = env!("CARGO_PKG_VERSION"); rust_i18n::i18n!("locales", fallback = "en"); diff --git a/sphene/src/utils.rs b/sphene/src/utils.rs new file mode 100644 index 0000000..5be46ed --- /dev/null +++ b/sphene/src/utils.rs @@ -0,0 +1,74 @@ +use regex::Regex; +use thorium::db::Server; +use lazy_static::lazy_static; + +use crate::Context; + +#[derive(Debug, poise::ChoiceParameter)] +pub enum Choices { + Twitter, + Bluesky, + Instagram, + Tiktok, +} + +const REGEX_URL_EXTRACTOR: &str = r"\b(?:https?:\/\/|<)[^\s>]+(?:>|)\b"; + +lazy_static! { + pub static ref REGEX_URL: Regex = Regex::new(REGEX_URL_EXTRACTOR).unwrap(); +} + +#[derive(Debug, Clone, poise::ChoiceParameter)] +pub enum EnableOrDisable { + Enable = 1, + Disable = 0, +} + +#[derive(Debug, Clone, poise::ChoiceParameter)] +pub enum Languages { + English, + German, + Dutch, +} + +// Allow enum to string conversion for Languages +pub trait ToLanguageString { + fn to_language_string(&self) -> String; +} + +impl ToLanguageString for Languages { + fn to_language_string(&self) -> String { + match self { + Languages::English => "en".to_string(), + Languages::German => "de-DE".to_string(), + Languages::Dutch => "nl-NL".to_string(), + } + } +} + +pub fn parse_choice(choice: &Choices, mut server: Server, change_to: bool) -> Server { + match choice { + Choices::Twitter => { + server.twitter = change_to; + } + Choices::Bluesky => { + server.bluesky = change_to; + } + Choices::Instagram => { + server.instagram = change_to; + } + Choices::Tiktok => { + server.tiktok = change_to; + } + } + server +} + +// Gets relevent id, if guild id is present, it returns the guild id, else it returns the author id +pub fn get_relevant_id(ctx: Context<'_>) -> u64 { + if ctx.guild_id().is_some() { + ctx.guild_id().unwrap().get() + } else { + ctx.author().id.get() + } +} diff --git a/sphene_old/.github/screenshot.png b/sphene_old/.github/screenshot.png deleted file mode 100644 index def2ba2d190b37dbc3702d2e289112b67698903a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313161 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 zð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 diff --git a/sphene_old/.github/workflows/rust.yml b/sphene_old/.github/workflows/rust.yml deleted file mode 100644 index 7d8a76d..0000000 --- a/sphene_old/.github/workflows/rust.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Rust - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -env: - CARGO_TERM_COLOR: always - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - uses: dtolnay/rust-toolchain@stable - with: - components: clippy - - run: cargo clippy --all-targets --all-features -- -D warnings diff --git a/sphene_old/.gitignore b/sphene_old/.gitignore deleted file mode 100644 index 0b745e2..0000000 --- a/sphene_old/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -.env \ No newline at end of file diff --git a/sphene_old/Cargo.toml b/sphene_old/Cargo.toml deleted file mode 100644 index 1743e48..0000000 --- a/sphene_old/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "sphene_old" -edition = "2021" -version.workspace = true -authors.workspace = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -dotenv = "0.15.0" -serenity = { version = "0.12.0", default-features = false, features = ["client", "gateway", "rustls_backend", "model"] } -tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -thorium = { path = "../thorium" } -regex = "1.9.3" -rust-i18n = "3.0.1" diff --git a/sphene_old/LICENSE b/sphene_old/LICENSE deleted file mode 100644 index a74f044..0000000 --- a/sphene_old/LICENSE +++ /dev/null @@ -1,274 +0,0 @@ -European Union Public Licence -V. 1.2 - -EUPL © the European Union 2007, 2016 - -This European Union Public Licence (the ‘EUPL’) applies to the Work (as -defined below) which is provided under the terms of this Licence. Any use of -the Work, other than as authorised under this Licence is prohibited (to the -extent such use is covered by a right of the copyright holder of the Work). - -The Work is provided under the terms of this Licence when the Licensor (as -defined below) has placed the following notice immediately following the -copyright notice for the Work: “Licensed under the EUPL”, or has expressed by -any other means his willingness to license under the EUPL. - -1. Definitions - -In this Licence, the following terms have the following meaning: -— ‘The Licence’: this Licence. -— ‘The Original Work’: the work or software distributed or communicated by the - ‘Licensor under this Licence, available as Source Code and also as - ‘Executable Code as the case may be. -— ‘Derivative Works’: the works or software that could be created by the - ‘Licensee, based upon the Original Work or modifications thereof. This - ‘Licence does not define the extent of modification or dependence on the - ‘Original Work required in order to classify a work as a Derivative Work; - ‘this extent is determined by copyright law applicable in the country - ‘mentioned in Article 15. -— ‘The Work’: the Original Work or its Derivative Works. -— ‘The Source Code’: the human-readable form of the Work which is the most - convenient for people to study and modify. - -— ‘The Executable Code’: any code which has generally been compiled and which - is meant to be interpreted by a computer as a program. -— ‘The Licensor’: the natural or legal person that distributes or communicates - the Work under the Licence. -— ‘Contributor(s)’: any natural or legal person who modifies the Work under - the Licence, or otherwise contributes to the creation of a Derivative Work. -— ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of - the Work under the terms of the Licence. -— ‘Distribution’ or ‘Communication’: any act of selling, giving, lending, - renting, distributing, communicating, transmitting, or otherwise making - available, online or offline, copies of the Work or providing access to its - essential functionalities at the disposal of any other natural or legal - person. - -2. Scope of the rights granted by the Licence - -The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, -sublicensable licence to do the following, for the duration of copyright -vested in the Original Work: - -— use the Work in any circumstance and for all usage, -— reproduce the Work, -— modify the Work, and make Derivative Works based upon the Work, -— communicate to the public, including the right to make available or display - the Work or copies thereof to the public and perform publicly, as the case - may be, the Work, -— distribute the Work or copies thereof, -— lend and rent the Work or copies thereof, -— sublicense rights in the Work or copies thereof. - -Those rights can be exercised on any media, supports and formats, whether now -known or later invented, as far as the applicable law permits so. - -In the countries where moral rights apply, the Licensor waives his right to -exercise his moral right to the extent allowed by law in order to make -effective the licence of the economic rights here above listed. - -The Licensor grants to the Licensee royalty-free, non-exclusive usage rights -to any patents held by the Licensor, to the extent necessary to make use of -the rights granted on the Work under this Licence. - -3. Communication of the Source Code - -The Licensor may provide the Work either in its Source Code form, or as -Executable Code. If the Work is provided as Executable Code, the Licensor -provides in addition a machine-readable copy of the Source Code of the Work -along with each copy of the Work that the Licensor distributes or indicates, -in a notice following the copyright notice attached to the Work, a repository -where the Source Code is easily and freely accessible for as long as the -Licensor continues to distribute or communicate the Work. - -4. Limitations on copyright - -Nothing in this Licence is intended to deprive the Licensee of the benefits -from any exception or limitation to the exclusive rights of the rights owners -in the Work, of the exhaustion of those rights or of other applicable -limitations thereto. - -5. Obligations of the Licensee - -The grant of the rights mentioned above is subject to some restrictions and -obligations imposed on the Licensee. Those obligations are the following: - -Attribution right: The Licensee shall keep intact all copyright, patent or -trademarks notices and all notices that refer to the Licence and to the -disclaimer of warranties. The Licensee must include a copy of such notices and -a copy of the Licence with every copy of the Work he/she distributes or -communicates. The Licensee must cause any Derivative Work to carry prominent -notices stating that the Work has been modified and the date of modification. - -Copyleft clause: If the Licensee distributes or communicates copies of the -Original Works or Derivative Works, this Distribution or Communication will be -done under the terms of this Licence or of a later version of this Licence -unless the Original Work is expressly distributed only under this version of -the Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee -(becoming Licensor) cannot offer or impose any additional terms or conditions -on the Work or Derivative Work that alter or restrict the terms of the -Licence. - -Compatibility clause: If the Licensee Distributes or Communicates Derivative -Works or copies thereof based upon both the Work and another work licensed -under a Compatible Licence, this Distribution or Communication can be done -under the terms of this Compatible Licence. For the sake of this clause, -‘Compatible Licence’ refers to the licences listed in the appendix attached to -this Licence. Should the Licensee's obligations under the Compatible Licence -conflict with his/her obligations under this Licence, the obligations of the -Compatible Licence shall prevail. - -Provision of Source Code: When distributing or communicating copies of the -Work, the Licensee will provide a machine-readable copy of the Source Code or -indicate a repository where this Source will be easily and freely available -for as long as the Licensee continues to distribute or communicate the Work. - -Legal Protection: This Licence does not grant permission to use the trade -names, trademarks, service marks, or names of the Licensor, except as required -for reasonable and customary use in describing the origin of the Work and -reproducing the content of the copyright notice. - -6. Chain of Authorship - -The original Licensor warrants that the copyright in the Original Work granted -hereunder is owned by him/her or licensed to him/her and that he/she has the -power and authority to grant the Licence. - -Each Contributor warrants that the copyright in the modifications he/she -brings to the Work are owned by him/her or licensed to him/her and that he/she -has the power and authority to grant the Licence. - -Each time You accept the Licence, the original Licensor and subsequent -Contributors grant You a licence to their contributions to the Work, under the -terms of this Licence. - -7. Disclaimer of Warranty - -The Work is a work in progress, which is continuously improved by numerous -Contributors. It is not a finished work and may therefore contain defects or -‘bugs’ inherent to this type of development. - -For the above reason, the Work is provided under the Licence on an ‘as is’ -basis and without warranties of any kind concerning the Work, including -without limitation merchantability, fitness for a particular purpose, absence -of defects or errors, accuracy, non-infringement of intellectual property -rights other than copyright as stated in Article 6 of this Licence. - -This disclaimer of warranty is an essential part of the Licence and a -condition for the grant of any rights to the Work. - -8. Disclaimer of Liability - -Except in the cases of wilful misconduct or damages directly caused to natural -persons, the Licensor will in no event be liable for any direct or indirect, -material or moral, damages of any kind, arising out of the Licence or of the -use of the Work, including without limitation, damages for loss of goodwill, -work stoppage, computer failure or malfunction, loss of data or any commercial -damage, even if the Licensor has been advised of the possibility of such -damage. However, the Licensor will be liable under statutory product liability -laws as far such laws apply to the Work. - -9. Additional agreements - -While distributing the Work, You may choose to conclude an additional -agreement, defining obligations or services consistent with this Licence. -However, if accepting obligations, You may act only on your own behalf and on -your sole responsibility, not on behalf of the original Licensor or any other -Contributor, and only if You agree to indemnify, defend, and hold each -Contributor harmless for any liability incurred by, or claims asserted against -such Contributor by the fact You have accepted any warranty or additional -liability. - -10. Acceptance of the Licence - -The provisions of this Licence can be accepted by clicking on an icon ‘I -agree’ placed under the bottom of a window displaying the text of this Licence -or by affirming consent in any other similar way, in accordance with the rules -of applicable law. Clicking on that icon indicates your clear and irrevocable -acceptance of this Licence and all of its terms and conditions. - -Similarly, you irrevocably accept this Licence and all of its terms and -conditions by exercising any rights granted to You by Article 2 of this -Licence, such as the use of the Work, the creation by You of a Derivative Work -or the Distribution or Communication by You of the Work or copies thereof. - -11. Information to the public - -In case of any Distribution or Communication of the Work by means of -electronic communication by You (for example, by offering to download the Work -from a remote location) the distribution channel or media (for example, a -website) must at least provide to the public the information requested by the -applicable law regarding the Licensor, the Licence and the way it may be -accessible, concluded, stored and reproduced by the Licensee. - -12. Termination of the Licence - -The Licence and the rights granted hereunder will terminate automatically upon -any breach by the Licensee of the terms of the Licence. Such a termination -will not terminate the licences of any person who has received the Work from -the Licensee under the Licence, provided such persons remain in full -compliance with the Licence. - -13. Miscellaneous - -Without prejudice of Article 9 above, the Licence represents the complete -agreement between the Parties as to the Work. - -If any provision of the Licence is invalid or unenforceable under applicable -law, this will not affect the validity or enforceability of the Licence as a -whole. Such provision will be construed or reformed so as necessary to make it -valid and enforceable. - -The European Commission may publish other linguistic versions or new versions -of this Licence or updated versions of the Appendix, so far this is required -and reasonable, without reducing the scope of the rights granted by the -Licence. New versions of the Licence will be published with a unique version -number. - -All linguistic versions of this Licence, approved by the European Commission, -have identical value. Parties can take advantage of the linguistic version of -their choice. - -14. Jurisdiction - -Without prejudice to specific agreement between parties, -— any litigation resulting from the interpretation of this License, arising - between the European Union institutions, bodies, offices or agencies, as a - Licensor, and any Licensee, will be subject to the jurisdiction of the Court - of Justice of the European Union, as laid down in article 272 of the Treaty - on the Functioning of the European Union, -— any litigation arising between other parties and resulting from the - interpretation of this License, will be subject to the exclusive - jurisdiction of the competent court where the Licensor resides or conducts - its primary business. - -15. Applicable Law - -Without prejudice to specific agreement between parties, -— this Licence shall be governed by the law of the European Union Member State - where the Licensor has his seat, resides or has his registered office, -— this licence shall be governed by Belgian law if the Licensor has no seat, - residence or registered office inside a European Union Member State. - -Appendix - -‘Compatible Licences’ according to Article 5 EUPL are: -— GNU General Public License (GPL) v. 2, v. 3 -— GNU Affero General Public License (AGPL) v. 3 -— Open Software License (OSL) v. 2.1, v. 3.0 -— Eclipse Public License (EPL) v. 1.0 -— CeCILL v. 2.0, v. 2.1 -— Mozilla Public Licence (MPL) v. 2 -— GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 -— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for - works other than software -— European Union Public Licence (EUPL) v. 1.1, v. 1.2 -— Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or - Strong Reciprocity (LiLiQ-R+) - -— The European Commission may update this Appendix to later versions of the - above licences without producing a new version of the EUPL, as long as they - provide the rights granted in Article 2 of this Licence and protect the - covered Source Code from exclusive appropriation. -— All other changes or additions to this Appendix require the production of a - new EUPL version. diff --git a/sphene_old/README.md b/sphene_old/README.md deleted file mode 100644 index 7e75220..0000000 --- a/sphene_old/README.md +++ /dev/null @@ -1,19 +0,0 @@ -## Sphene - -Sphene is a discord bot that replaces twitter, bluesky, instagram and tiktok links with various other sources that aim to fix the bug/broken embeds these sites have. - -### Example - -![](./.github/screenshot.png) - -### Invite - -https://discord.com/api/oauth2/authorize?client_id=1134171949338214491&permissions=292057802816&scope=bot - -### Run Yourself - -To run it yourself either compile the code via `cargo build --release` or just use the [public bot](https://discord.com/api/oauth2/authorize?client_id=1134171949338214491&permissions=292057802816&scope=bot). - -### License - -This project is licensed under EUPLv1.2 see [HERE](./LICENSE). diff --git a/sphene_old/src/main.rs b/sphene_old/src/main.rs deleted file mode 100644 index 9dfde27..0000000 --- a/sphene_old/src/main.rs +++ /dev/null @@ -1,413 +0,0 @@ -use std::env; - -extern crate dotenv; - -use dotenv::dotenv; - -use options::get_blueksy_options; -use options::get_instagram_options; -use options::get_tik_tok_options; -use options::get_twitter_options; -use regex::Regex; -use rust_i18n::available_locales; -use serenity::all::CreateActionRow; -use serenity::all::CreateAllowedMentions; -use serenity::all::CreateMessage; -use serenity::all::CreateSelectMenu; -use serenity::all::CreateSelectMenuKind; -use serenity::all::Interaction; -use serenity::all::InteractionType; -use serenity::all::UserId; -use serenity::async_trait; -use serenity::builder::CreateSelectMenuOption; - -use serenity::model::channel::Message; -use serenity::model::gateway::Ready; -use serenity::model::prelude::Activity; -use serenity::prelude::*; -use serenity::utils::MessageBuilder; -use thorium::db::DBConn; -use thorium::*; - -use rust_i18n::t; - -rust_i18n::i18n!("../locales", fallback = "en"); - -mod options; - -const VERSION: &str = env!("CARGO_PKG_VERSION"); - -struct Handler { - regex_pattern: Regex, - dbconn: Mutex, -} - -const REGEX_URL_EXTRACTOR: &str = r"\b(?:https?:\/\/|<)[^\s>]+(?:>|)\b"; - -#[async_trait] -impl EventHandler for Handler { - async fn message(&self, context: Context, msg: Message) { - let url: String; - let content = msg.content.clone(); - let options: Vec; - - let id = if msg.guild_id.is_some() { - msg.guild_id.unwrap().get() - } else { - msg.author.id.get() - }; - - let get_lang = match self.dbconn.lock().await.get_server(id, false).language { - Some(lang) => lang, - None => "en".to_string(), - }; - let lang = get_lang.as_str(); - - if twitter::is_twitter_url(content.as_str()) - && self.dbconn.lock().await.get_server(id, false).twitter - { - url = twitter::remove_tracking( - twitter::convert_url_lazy(content, twitter::UrlType::Vxtwitter).await, - ); - - options = get_twitter_options(lang); - } else if bluesky::is_bluesky_url(content.as_str()) - && self.dbconn.lock().await.get_server(id, false).bluesky - { - url = bluesky::convert_url_lazy(content, bluesky::UrlType::FixBluesky).await; - options = get_blueksy_options(lang); - } else if tiktok::is_tiktok_url(content.as_str()) - && self.dbconn.lock().await.get_server(id, false).tiktok - { - url = - tiktok::convert_url_lazy(tiktok::clear_url(content).await, tiktok::UrlType::TIKTXK) - .await; - options = get_tik_tok_options(lang); - } else if instagram::is_instagram_url(content.as_str()) - && self.dbconn.lock().await.get_server(id, false).instagram - { - url = instagram::convert_url_lazy(content, instagram::UrlType::DDInstagram).await; - options = get_instagram_options(lang); - } else if msg.referenced_message.is_some() { - let ref_message = &msg.referenced_message.clone().unwrap(); - if ref_message.author.id != context.http.get_current_user().await.unwrap().id { - return; - }; - - let mut ref_author = ref_message - .content - .split_once(':') - .unwrap() - .0 - .split_at(2) - .1 - .to_string(); - ref_author.pop(); - - let user_id = UserId::new(ref_author.parse::().unwrap()); - - let author = &context.http.get_user(user_id).await.unwrap(); - - // Ignore people that reply to their own messages - if author.id == msg.author.id { - return; - } - - let msg_url = &msg.link_ensured(&context.http).await; - let author_nickname = &msg - .author - .nick_in(&context.http, &msg.guild_id.unwrap()) - .await - .unwrap_or(msg.author.name.clone()); - - let message = CreateMessage::new().content(t!( - "referenced", - locale = lang, - USER_ID = &msg.author.id, - AUTHOR_NICKNAME = &author_nickname, - MESSAGE_URL = &msg_url - )); - - author.dm(&context.http, message).await.unwrap(); - - return; - } else { - return; - } - - let response = MessageBuilder::new() - .mention(&msg.author) - .push(": ") - .push(url) - .build(); - - let allowedMentions = CreateAllowedMentions::new().empty_users().empty_roles(); - - let mut message = CreateMessage::new() - .allowed_mentions(allowedMentions) - .content(response); - - if msg.referenced_message.is_some() { - message.reference_message(msg.message_reference.clone().unwrap()); - }; - - let selectMenu = - CreateSelectMenu::new("select", CreateSelectMenuKind::String { options: options }) - .max_values(1) - .min_values(1) - .placeholder(t!("nothing_selected", locale = lang)); - - let actionRow = CreateActionRow::SelectMenu(selectMenu); - - message.components(vec![actionRow]); - - if let Err(why) = msg.channel_id.send_message(&context.http, message).await { - println!("{}", t!("error_sending_message", locale = lang, WHY = why)); - }; - - if !msg.is_private() { - // Delete message - if let Err(why) = msg.delete(&context.http).await { - println!("{}", t!("error_delete_message", locale = lang, WHY = why)); - } - } - } - - async fn interaction_create(&self, ctx: Context, interaction: Interaction) { - // Check whether button has been pressed - if interaction.kind() != InteractionType::Component { - return; - } - - let component = interaction.as_message_component().unwrap().clone(); - let command = component.data.values.first().unwrap(); - let msg = &component.message; - - if !msg.author.bot { - return; - } - - // Get guild ID - let id = msg.author.id.0; - let get_lang = match self.dbconn.lock().await.get_server(id, false).language { - Some(lang) => lang, - None => "en".to_string(), - }; - let lang = get_lang.as_str(); - - let user = &component.user.id.to_string(); - // Check whether user is correct - if !msg.content.contains(user) - || command == "version" - || command == "download" - || command == "menu" - || command == "disable" - || command == "set_language" - || command == "contribute_language" - { - let content = if command == "version" { - t!( - "source_code", - locale = lang, - URL = "https://github.com/AnnsAnns/sphene" - ) - .to_string() - } else if command == "menu" { - t!("menu_meme").to_string() - } else if command == "disable" { - t!("disable").to_string() - } else if command == "set_language" || command == "contribute_language" { - t!( - "contribute_language", - locale = lang, - URL = "https://github.com/AnnsAnns/sphene/locales" - ) - .to_string() - } else if command == "download" { - let extracted_url = self - .regex_pattern - .find_iter(&msg.content) - .next() - .unwrap() - .as_str() - .to_string(); - - let url = if twitter::UrlType::from_string(&extracted_url) - != twitter::UrlType::Unknown - { - twitter::get_media_from_url( - twitter::convert_url_lazy(extracted_url, twitter::UrlType::Vxtwitter).await, - ) - .await - } else if tiktok::UrlType::from_string(&extracted_url) != tiktok::UrlType::Unknown { - tiktok::get_media_from_url( - tiktok::convert_url_lazy(extracted_url, tiktok::UrlType::TIKTXK).await, - ) - .await - } else { - bluesky::get_media_from_url( - bluesky::convert_url_lazy(extracted_url, bluesky::UrlType::FixBluesky) - .await, - ) - .await - }; - - if url != "0" { - t!("download_url", locale = lang, URL = url).to_string() - } else { - t!("no_download", locale = lang).to_string() - } - } else { - t!("not_author", locale = lang).to_string() - }; - - component - .create_interaction_response(&ctx.http, |r| { - r.kind(InteractionResponseType::ChannelMessageWithSource) - .interaction_response_data(|m| m.content(content).ephemeral(true)) - }) - .await - .unwrap(); - - return; - } else { - // Make the Discord API happy :) - component - .create_interaction_response(&ctx.http, |r| { - r.kind(InteractionResponseType::DeferredUpdateMessage) - }) - .await - .unwrap(); - } - - if command == "remove" { - if let Err(why) = component - .edit_original_interaction_response(&ctx.http, |m| { - m.content(t!("deleted_message", locale = lang)) - .allowed_mentions(|am| am.empty_parse()); - m.components(|c| c) - }) - .await - { - println!("Error editing message: {:?}", why); - } - - // Sleep for 5 seconds - tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; - - // Delete the response message - if let Err(why) = component - .delete_original_interaction_response(&ctx.http) - .await - { - println!("Error deleting message: {:?}", why); - } - } else { - let extracted_url = self - .regex_pattern - .find_iter(&msg.content) - .next() - .unwrap() - .as_str() - .to_string(); - let mut new_msg: String = String::new(); - - let mut twitter_urltype = twitter::UrlType::from_string(command); - let bluesky_urltype = bluesky::UrlType::from_string(command); - let instagram_urltype = instagram::UrlType::from_string(command); - let tiktok_urltype = tiktok::UrlType::from_string(command); - - if twitter_urltype != twitter::UrlType::Unknown { - new_msg = twitter::convert_url_lazy(extracted_url, twitter_urltype).await; - } else if bluesky_urltype != bluesky::UrlType::Unknown { - new_msg = bluesky::convert_url_lazy(extracted_url, bluesky_urltype).await; - } else if instagram_urltype != instagram::UrlType::Unknown { - new_msg = instagram::convert_url_lazy(extracted_url, instagram_urltype).await; - } else if tiktok_urltype != tiktok::UrlType::Unknown { - new_msg = tiktok::convert_url_lazy(extracted_url, tiktok_urltype).await; - } else if command == "direct_vx" || command == "direct_fx" { - twitter_urltype = match command.as_str() { - "direct_vx" => twitter::UrlType::Vxtwitter, - "direct_fx" => twitter::UrlType::Fxtwitter, - _ => twitter::UrlType::Unknown, - }; - - new_msg = - twitter::convert_url_lazy(extracted_url.to_string(), twitter_urltype).await; - new_msg = format!( - "<{}> ({})", - new_msg, - twitter::get_media_from_url(new_msg.clone()).await - ); - } else if command == "direct_fxbsky" { - new_msg = bluesky::convert_url_lazy( - extracted_url.to_string(), - bluesky::UrlType::FixBluesky, - ) - .await; - new_msg = format!( - "<{}> ({})", - new_msg, - bluesky::get_media_from_url(new_msg.clone()).await - ); - } else if command == "direct_tiktxk" { - new_msg = - tiktok::convert_url_lazy(extracted_url.to_string(), tiktok::UrlType::TIKTXK) - .await; - new_msg = format!( - "<{}> ({})", - new_msg, - tiktok::get_media_from_url(new_msg.clone()).await - ); - } - - new_msg = format!("<@{}>: {}", user, new_msg); - - if let Err(why) = component - .edit_original_interaction_response(&ctx.http, |m| { - m.content(new_msg).allowed_mentions(|am| am.empty_parse()) - }) - .await - { - println!("Error editing message: {:?}", why); - } - } - } - - async fn ready(&self, ctx: Context, ready: Ready) { - ctx.set_activity(Activity::watching("out for embeds 🕵️")) - .await; - - println!("{} is connected!", ready.user.name); - } -} - -#[tokio::main] -async fn main() { - // Load the environment variables from the .env file. - dotenv().ok(); - - // Configure the client with your Discord bot token in the environment. - let token = env::var("DISCORD_TOKEN").expect("Expected a token in the environment"); - let intents = GatewayIntents::GUILD_MESSAGES - | GatewayIntents::DIRECT_MESSAGES - | GatewayIntents::MESSAGE_CONTENT; - - let regex_pattern = Regex::new(REGEX_URL_EXTRACTOR).unwrap(); - - let dbconn = Mutex::new(DBConn::new().unwrap()); - - println!("Available Languages: {:?}", available_locales!()); - - let mut client = Client::builder(&token, intents) - .event_handler(Handler { - regex_pattern, - dbconn, - }) - .await - .expect("Err creating client"); - - if let Err(why) = client.start().await { - println!("Client error: {:?}", why); - } -} From 3dc2703af505bdeb1788dabd30cf114572f00451 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Mon, 18 Mar 2024 23:37:32 +0100 Subject: [PATCH 05/10] Bot works ~80% on Poise --- sphene/src/commands/change.rs | 2 +- sphene/src/main.rs | 4 +- sphene/src/message_handler.rs | 9 ++++- .../src/message_handler/interaction_event.rs | 38 +++++++++++-------- sphene/src/message_handler/message_event.rs | 5 +-- sphene/src/utils.rs | 9 +---- 6 files changed, 36 insertions(+), 31 deletions(-) diff --git a/sphene/src/commands/change.rs b/sphene/src/commands/change.rs index 8494462..fb8a288 100644 --- a/sphene/src/commands/change.rs +++ b/sphene/src/commands/change.rs @@ -1,4 +1,4 @@ -use crate::{utils::{get_relevant_id, parse_choice, Choices, EnableOrDisable, Languages, ToLanguageString}, Context, Error}; +use crate::{utils::{get_relevant_id, parse_choice, Choices, EnableOrDisable}, Context, Error}; #[poise::command(slash_command, prefix_command, required_permissions = "ADMINISTRATOR")] pub async fn change( diff --git a/sphene/src/main.rs b/sphene/src/main.rs index c3b8eb1..f323d83 100644 --- a/sphene/src/main.rs +++ b/sphene/src/main.rs @@ -1,10 +1,10 @@ use poise::serenity_prelude as serenity; -use thorium::db::{DBConn, Server}; +use thorium::db::{DBConn}; use tokio::sync::Mutex; use commands::set_lang::{set_guild_language, set_own_language}; use commands::change::change; -use rust_i18n::t; + rust_i18n::i18n!("../locales", fallback = "en"); diff --git a/sphene/src/message_handler.rs b/sphene/src/message_handler.rs index 619080d..7bed9c5 100644 --- a/sphene/src/message_handler.rs +++ b/sphene/src/message_handler.rs @@ -1,4 +1,4 @@ -use poise::serenity_prelude::{Context, FullEvent}; +use poise::serenity_prelude::{Context, FullEvent, Interaction}; use crate::{Data, Error}; @@ -19,7 +19,12 @@ pub async fn event_handler( message_event::message(ctx, new_message.clone(), &data.db).await; } FullEvent::InteractionCreate { interaction } => { - interaction_event::interaction_create(ctx, interaction.clone(), &data.db).await; + match interaction { + Interaction::Component(component) => { + interaction_event::interaction_create(ctx, component.clone(), &data.db).await; + } + _ => {} + } } _ => {} } diff --git a/sphene/src/message_handler/interaction_event.rs b/sphene/src/message_handler/interaction_event.rs index db1973b..9fbc538 100644 --- a/sphene/src/message_handler/interaction_event.rs +++ b/sphene/src/message_handler/interaction_event.rs @@ -1,26 +1,27 @@ +use std::any::Any; + use poise::serenity_prelude::{ - Context, CreateActionRow, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseMessage, CreateMessage, CreateSelectMenu, CreateSelectMenuKind, CreateSelectMenuOption, EditInteractionResponse, FullEvent, Interaction, InteractionType, Message, MessageBuilder, UserId + ComponentInteraction, Context, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseMessage, EditInteractionResponse, Interaction, InteractionType }; use rust_i18n::t; use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; use tokio::sync::Mutex; -use crate::utils::REGEX_URL; - -pub async fn interaction_create(ctx: &Context, interaction: Interaction, dbconn: &Mutex) { - // Check whether button has been pressed - if interaction.kind() != InteractionType::Component { - return; - } +use crate::utils::{REGEX_URL_EXTRACTOR}; - let component = interaction.as_message_component().unwrap().clone(); - let command = &component.data.custom_id; +pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, dbconn: &Mutex) { + let command = &component.data.custom_id; // Appears to be incorrect let msg = &component.message; if !msg.author.bot { return; } + println!("Command: {}", command); + println!("Message: {:?}", msg.content); + + let regex = regex::Regex::new(REGEX_URL_EXTRACTOR).unwrap(); + // Get guild ID let id = msg.author.id.get(); let get_lang = match dbconn.lock().await.get_server(id, false).language { @@ -58,7 +59,7 @@ pub async fn interaction_create(ctx: &Context, interaction: Interaction, dbconn: ) .to_string() } else if command == "download" { - let extracted_url = REGEX_URL + let extracted_url = regex .find_iter(&msg.content) .next() .unwrap() @@ -134,7 +135,7 @@ pub async fn interaction_create(ctx: &Context, interaction: Interaction, dbconn: println!("Error deleting message: {:?}", why); } } else { - let extracted_url = REGEX_URL + let extracted_url = regex .find_iter(&msg.content) .next() .unwrap() @@ -142,10 +143,13 @@ pub async fn interaction_create(ctx: &Context, interaction: Interaction, dbconn: .to_string(); let mut new_msg: String = String::new(); - let mut twitter_urltype = twitter::UrlType::from_string(&command); - let bluesky_urltype = bluesky::UrlType::from_string(&command); - let instagram_urltype = instagram::UrlType::from_string(&command); - let tiktok_urltype = tiktok::UrlType::from_string(&command); + let mut twitter_urltype = twitter::UrlType::from_string(command); + let bluesky_urltype = bluesky::UrlType::from_string(command); + let instagram_urltype = instagram::UrlType::from_string(command); + let tiktok_urltype = tiktok::UrlType::from_string(command); + + println!("Extracted URL: {}", extracted_url); + println!("Twitter URL type: {:?}", twitter_urltype); if twitter_urltype != twitter::UrlType::Unknown { new_msg = twitter::convert_url_lazy(extracted_url, twitter_urltype).await; @@ -193,6 +197,8 @@ pub async fn interaction_create(ctx: &Context, interaction: Interaction, dbconn: new_msg = format!("<@{}>: {}", user, new_msg); + println!("New message: {}", new_msg); + let new_response = EditInteractionResponse::new() .content(new_msg) .allowed_mentions(CreateAllowedMentions::new().empty_roles().empty_users()); diff --git a/sphene/src/message_handler/message_event.rs b/sphene/src/message_handler/message_event.rs index 6f91948..2419e14 100644 --- a/sphene/src/message_handler/message_event.rs +++ b/sphene/src/message_handler/message_event.rs @@ -1,6 +1,6 @@ use poise::serenity_prelude::{ Context, CreateActionRow, CreateAllowedMentions, CreateMessage, - CreateSelectMenu, CreateSelectMenuKind, CreateSelectMenuOption, FullEvent, Message, + CreateSelectMenu, CreateSelectMenuKind, CreateSelectMenuOption, Message, MessageBuilder, UserId, }; use rust_i18n::t; @@ -11,7 +11,6 @@ use crate::{ options::{ get_blueksy_options, get_instagram_options, get_tik_tok_options, get_twitter_options, }, - Data, }; pub async fn message(context: &Context, msg: Message, dbconn: &Mutex) { @@ -119,7 +118,7 @@ pub async fn message(context: &Context, msg: Message, dbconn: &Mutex) { }; let selectMenu = - CreateSelectMenu::new("select", CreateSelectMenuKind::String { options: options }) + CreateSelectMenu::new("select", CreateSelectMenuKind::String { options }) .max_values(1) .min_values(1) .placeholder(t!("nothing_selected", locale = lang)); diff --git a/sphene/src/utils.rs b/sphene/src/utils.rs index 5be46ed..252945a 100644 --- a/sphene/src/utils.rs +++ b/sphene/src/utils.rs @@ -1,6 +1,5 @@ -use regex::Regex; + use thorium::db::Server; -use lazy_static::lazy_static; use crate::Context; @@ -12,11 +11,7 @@ pub enum Choices { Tiktok, } -const REGEX_URL_EXTRACTOR: &str = r"\b(?:https?:\/\/|<)[^\s>]+(?:>|)\b"; - -lazy_static! { - pub static ref REGEX_URL: Regex = Regex::new(REGEX_URL_EXTRACTOR).unwrap(); -} +pub const REGEX_URL_EXTRACTOR: &str = r"\b(?:https?:\/\/|<)[^\s>]+(?:>|)\b"; #[derive(Debug, Clone, poise::ChoiceParameter)] pub enum EnableOrDisable { From 631b94ebcaa7ac775509eec3714047b84d7ebf96 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Mon, 18 Mar 2024 23:46:57 +0100 Subject: [PATCH 06/10] Fix clippy issues --- sphene/src/message_handler.rs | 9 ++------- sphene/src/message_handler/interaction_event.rs | 4 ++-- sphene/src/message_handler/message_event.rs | 10 +++++----- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/sphene/src/message_handler.rs b/sphene/src/message_handler.rs index 7bed9c5..c922afd 100644 --- a/sphene/src/message_handler.rs +++ b/sphene/src/message_handler.rs @@ -18,13 +18,8 @@ pub async fn event_handler( FullEvent::Message { new_message } => { message_event::message(ctx, new_message.clone(), &data.db).await; } - FullEvent::InteractionCreate { interaction } => { - match interaction { - Interaction::Component(component) => { - interaction_event::interaction_create(ctx, component.clone(), &data.db).await; - } - _ => {} - } + FullEvent::InteractionCreate { interaction: Interaction::Component(component) } => { + interaction_event::interaction_create(ctx, component.clone(), &data.db).await; } _ => {} } diff --git a/sphene/src/message_handler/interaction_event.rs b/sphene/src/message_handler/interaction_event.rs index 9fbc538..0d5c801 100644 --- a/sphene/src/message_handler/interaction_event.rs +++ b/sphene/src/message_handler/interaction_event.rs @@ -1,7 +1,7 @@ -use std::any::Any; + use poise::serenity_prelude::{ - ComponentInteraction, Context, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseMessage, EditInteractionResponse, Interaction, InteractionType + ComponentInteraction, Context, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseMessage, EditInteractionResponse }; use rust_i18n::t; use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; diff --git a/sphene/src/message_handler/message_event.rs b/sphene/src/message_handler/message_event.rs index 2419e14..3e8032b 100644 --- a/sphene/src/message_handler/message_event.rs +++ b/sphene/src/message_handler/message_event.rs @@ -107,25 +107,25 @@ pub async fn message(context: &Context, msg: Message, dbconn: &Mutex) { .push(url) .build(); - let allowedMentions = CreateAllowedMentions::new().empty_users().empty_roles(); + let allowed_mentions = CreateAllowedMentions::new().empty_users().empty_roles(); let mut message = CreateMessage::new() - .allowed_mentions(allowedMentions) + .allowed_mentions(allowed_mentions) .content(response); if msg.referenced_message.is_some() { message = message.reference_message(msg.message_reference.clone().unwrap()); }; - let selectMenu = + let select_menu = CreateSelectMenu::new("select", CreateSelectMenuKind::String { options }) .max_values(1) .min_values(1) .placeholder(t!("nothing_selected", locale = lang)); - let actionRow = CreateActionRow::SelectMenu(selectMenu); + let action_row = CreateActionRow::SelectMenu(select_menu); - message = message.components(vec![actionRow]); + message = message.components(vec![action_row]); if let Err(why) = msg.channel_id.send_message(&context.http, message).await { println!("{}", t!("error_sending_message", locale = lang, WHY = why)); From 234eaaed5cf5678bddfedd46e80be41db66fd9a5 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Tue, 19 Mar 2024 09:32:55 +0100 Subject: [PATCH 07/10] Command Extraction works properly again --- sphene/src/message_handler.rs | 10 ++++++++-- sphene/src/message_handler/interaction_event.rs | 14 ++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/sphene/src/message_handler.rs b/sphene/src/message_handler.rs index c922afd..81fa3be 100644 --- a/sphene/src/message_handler.rs +++ b/sphene/src/message_handler.rs @@ -18,8 +18,14 @@ pub async fn event_handler( FullEvent::Message { new_message } => { message_event::message(ctx, new_message.clone(), &data.db).await; } - FullEvent::InteractionCreate { interaction: Interaction::Component(component) } => { - interaction_event::interaction_create(ctx, component.clone(), &data.db).await; + FullEvent::InteractionCreate { interaction } => { + match interaction { + Interaction::Component(component) => { + let id = &component.data.custom_id; + interaction_event::interaction_create(ctx, component.clone(), id, &data.db).await; + } + _ => {} + } } _ => {} } diff --git a/sphene/src/message_handler/interaction_event.rs b/sphene/src/message_handler/interaction_event.rs index 0d5c801..23213be 100644 --- a/sphene/src/message_handler/interaction_event.rs +++ b/sphene/src/message_handler/interaction_event.rs @@ -1,7 +1,7 @@ use poise::serenity_prelude::{ - ComponentInteraction, Context, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseMessage, EditInteractionResponse + ComponentInteraction, ComponentInteractionDataKind, Context, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseMessage, EditInteractionResponse }; use rust_i18n::t; use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; @@ -9,8 +9,12 @@ use tokio::sync::Mutex; use crate::utils::{REGEX_URL_EXTRACTOR}; -pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, dbconn: &Mutex) { - let command = &component.data.custom_id; // Appears to be incorrect +pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, id: &String, dbconn: &Mutex) { + let command = match &component.data.kind { + ComponentInteractionDataKind::StringSelect { values, .. } => values[0].as_str(), + _ => return (), + }; + let msg = &component.message; if !msg.author.bot { @@ -66,6 +70,8 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, .as_str() .to_string(); + println!("Extracted URL: Download {}", extracted_url); + let url = if twitter::UrlType::from_string(&extracted_url) != twitter::UrlType::Unknown { @@ -160,7 +166,7 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, } else if tiktok_urltype != tiktok::UrlType::Unknown { new_msg = tiktok::convert_url_lazy(extracted_url, tiktok_urltype).await; } else if command == "direct_vx" || command == "direct_fx" { - twitter_urltype = match command.as_str() { + twitter_urltype = match command { "direct_vx" => twitter::UrlType::Vxtwitter, "direct_fx" => twitter::UrlType::Fxtwitter, _ => twitter::UrlType::Unknown, From c0312ba1e95b6438d08ad5c14c3be33e1943550a Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Tue, 19 Mar 2024 10:24:34 +0100 Subject: [PATCH 08/10] Sphene v9 works fully --- sphene/src/commands/convert_url.rs | 75 +++++++++++++++++++ sphene/src/commands/mod.rs | 3 +- sphene/src/message_handler.rs | 3 +- .../src/message_handler/interaction_event.rs | 37 ++++----- sphene/src/message_handler/message_event.rs | 46 ++++-------- 5 files changed, 111 insertions(+), 53 deletions(-) create mode 100644 sphene/src/commands/convert_url.rs diff --git a/sphene/src/commands/convert_url.rs b/sphene/src/commands/convert_url.rs new file mode 100644 index 0000000..614b087 --- /dev/null +++ b/sphene/src/commands/convert_url.rs @@ -0,0 +1,75 @@ +use poise::serenity_prelude::{CreateSelectMenuOption, Message}; +use thorium::db::DBConn; +use tokio::sync::Mutex; + +use poise::serenity_prelude::{ + Context, CreateActionRow, CreateAllowedMentions, CreateMessage, + CreateSelectMenu, CreateSelectMenuKind, + MessageBuilder, UserId, +}; +use rust_i18n::t; +use thorium::{bluesky, instagram, tiktok, twitter}; + +use crate::{ + options::{ + get_blueksy_options, get_instagram_options, get_tik_tok_options, get_twitter_options, + }, +}; + +pub struct ConvertedUrl { + pub url: String, + pub options: Vec, +} + +pub async fn convert_url(msg: Message, dbconn: &Mutex, id: u64, lang: &str) -> Option { + let url: String; + let content = msg.content.clone(); + let options: Vec; + + if twitter::is_twitter_url(content.as_str()) + && dbconn.lock().await.get_server(id, false).twitter + { + url = twitter::remove_tracking( + twitter::convert_url_lazy(content, twitter::UrlType::Vxtwitter).await, + ); + + options = get_twitter_options(lang); + } else if bluesky::is_bluesky_url(content.as_str()) + && dbconn.lock().await.get_server(id, false).bluesky + { + url = bluesky::convert_url_lazy(content, bluesky::UrlType::FixBluesky).await; + options = get_blueksy_options(lang); + } else if tiktok::is_tiktok_url(content.as_str()) + && dbconn.lock().await.get_server(id, false).tiktok + { + url = tiktok::convert_url_lazy(tiktok::clear_url(content).await, tiktok::UrlType::TIKTXK) + .await; + options = get_tik_tok_options(lang); + } else if instagram::is_instagram_url(content.as_str()) + && dbconn.lock().await.get_server(id, false).instagram + { + url = instagram::convert_url_lazy(content, instagram::UrlType::DDInstagram).await; + options = get_instagram_options(lang); + } else { + return None; + } + + Some(ConvertedUrl { url, options }) +} + +pub async fn convert_twitter_to(url: String, kind: &str) -> String { + let twitter_urltype = match kind { + "direct_vx" => twitter::UrlType::Vxtwitter, + "direct_fx" => twitter::UrlType::Fxtwitter, + _ => twitter::UrlType::Unknown, + }; + + let mut new_msg = + twitter::convert_url_lazy(url.to_string(), twitter_urltype).await; + + format!( + "<{}> ({})", + new_msg, + twitter::get_media_from_url(new_msg.clone()).await + ) +} \ No newline at end of file diff --git a/sphene/src/commands/mod.rs b/sphene/src/commands/mod.rs index 0c76165..97285d5 100644 --- a/sphene/src/commands/mod.rs +++ b/sphene/src/commands/mod.rs @@ -1,2 +1,3 @@ pub mod set_lang; -pub mod change; \ No newline at end of file +pub mod change; +pub mod convert_url; \ No newline at end of file diff --git a/sphene/src/message_handler.rs b/sphene/src/message_handler.rs index 81fa3be..38d71d8 100644 --- a/sphene/src/message_handler.rs +++ b/sphene/src/message_handler.rs @@ -21,8 +21,7 @@ pub async fn event_handler( FullEvent::InteractionCreate { interaction } => { match interaction { Interaction::Component(component) => { - let id = &component.data.custom_id; - interaction_event::interaction_create(ctx, component.clone(), id, &data.db).await; + interaction_event::interaction_create(ctx, component.clone(), &data.db).await; } _ => {} } diff --git a/sphene/src/message_handler/interaction_event.rs b/sphene/src/message_handler/interaction_event.rs index 23213be..fae330a 100644 --- a/sphene/src/message_handler/interaction_event.rs +++ b/sphene/src/message_handler/interaction_event.rs @@ -1,7 +1,7 @@ use poise::serenity_prelude::{ - ComponentInteraction, ComponentInteractionDataKind, Context, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseMessage, EditInteractionResponse + ComponentInteraction, ComponentInteractionDataKind, Context, CreateActionRow, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseFollowup, CreateInteractionResponseMessage, EditInteractionResponse, EditMessage }; use rust_i18n::t; use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; @@ -9,13 +9,13 @@ use tokio::sync::Mutex; use crate::utils::{REGEX_URL_EXTRACTOR}; -pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, id: &String, dbconn: &Mutex) { +pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, dbconn: &Mutex) { let command = match &component.data.kind { ComponentInteractionDataKind::StringSelect { values, .. } => values[0].as_str(), _ => return (), }; - let msg = &component.message; + let mut msg = &component.message; if !msg.author.bot { return; @@ -26,7 +26,7 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, let regex = regex::Regex::new(REGEX_URL_EXTRACTOR).unwrap(); - // Get guild ID + // Get user id let id = msg.author.id.get(); let get_lang = match dbconn.lock().await.get_server(id, false).language { Some(lang) => lang, @@ -34,6 +34,12 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, }; let lang = get_lang.as_str(); + // Make the Discord API happy :) + component + .create_response(&ctx.http, CreateInteractionResponse::Defer(CreateInteractionResponseMessage::new())) + .await + .unwrap(); + let user = &component.user.id.to_string(); // Check whether user is correct if !msg.content.contains(user) @@ -101,22 +107,15 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, t!("not_author", locale = lang).to_string() }; - let response_msg = CreateInteractionResponseMessage::new().content(content).ephemeral(true); - let response = CreateInteractionResponse::Defer(response_msg); + let response = CreateInteractionResponseFollowup::new().content(content).ephemeral(true); component - .create_response(&ctx.http, response) + .create_followup(&ctx.http, response) .await .unwrap(); return; - } else { - // Make the Discord API happy :) - component - .create_response(&ctx.http, CreateInteractionResponse::Defer(CreateInteractionResponseMessage::new())) - .await - .unwrap(); - } + } if command == "remove" { let interaction_response = EditInteractionResponse::new() @@ -130,6 +129,8 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, println!("Error editing message: {:?}", why); } + msg.delete(&ctx.http).await.unwrap(); + // Sleep for 5 seconds tokio::time::sleep(tokio::time::Duration::from_secs(5)).await; @@ -205,15 +206,17 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, println!("New message: {}", new_msg); - let new_response = EditInteractionResponse::new() + let edit_message = EditMessage::new() .content(new_msg) .allowed_mentions(CreateAllowedMentions::new().empty_roles().empty_users()); - if let Err(why) = component - .edit_response(&ctx.http, new_response) + if let Err(why) = msg.to_owned() + .edit(&ctx.http, edit_message) .await { println!("Error editing message: {:?}", why); } + + component.delete_response(&ctx.http).await.unwrap(); } } \ No newline at end of file diff --git a/sphene/src/message_handler/message_event.rs b/sphene/src/message_handler/message_event.rs index 3e8032b..75ab00c 100644 --- a/sphene/src/message_handler/message_event.rs +++ b/sphene/src/message_handler/message_event.rs @@ -1,3 +1,5 @@ +use std::convert; + use poise::serenity_prelude::{ Context, CreateActionRow, CreateAllowedMentions, CreateMessage, CreateSelectMenu, CreateSelectMenuKind, CreateSelectMenuOption, Message, @@ -8,16 +10,12 @@ use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; use tokio::sync::Mutex; use crate::{ - options::{ + commands::convert_url::convert_url, options::{ get_blueksy_options, get_instagram_options, get_tik_tok_options, get_twitter_options, - }, + } }; pub async fn message(context: &Context, msg: Message, dbconn: &Mutex) { - let url: String; - let content = msg.content.clone(); - let options: Vec; - let id = if msg.guild_id.is_some() { msg.guild_id.unwrap().get() } else { @@ -30,31 +28,11 @@ pub async fn message(context: &Context, msg: Message, dbconn: &Mutex) { }; let lang = get_lang.as_str(); - if twitter::is_twitter_url(content.as_str()) - && dbconn.lock().await.get_server(id, false).twitter - { - url = twitter::remove_tracking( - twitter::convert_url_lazy(content, twitter::UrlType::Vxtwitter).await, - ); - - options = get_twitter_options(lang); - } else if bluesky::is_bluesky_url(content.as_str()) - && dbconn.lock().await.get_server(id, false).bluesky - { - url = bluesky::convert_url_lazy(content, bluesky::UrlType::FixBluesky).await; - options = get_blueksy_options(lang); - } else if tiktok::is_tiktok_url(content.as_str()) - && dbconn.lock().await.get_server(id, false).tiktok - { - url = tiktok::convert_url_lazy(tiktok::clear_url(content).await, tiktok::UrlType::TIKTXK) - .await; - options = get_tik_tok_options(lang); - } else if instagram::is_instagram_url(content.as_str()) - && dbconn.lock().await.get_server(id, false).instagram - { - url = instagram::convert_url_lazy(content, instagram::UrlType::DDInstagram).await; - options = get_instagram_options(lang); - } else if msg.referenced_message.is_some() { + let converted_url = convert_url(msg.clone(), dbconn, id, lang).await; + + if converted_url.is_none() && msg.referenced_message.is_none() { + return; + } else if converted_url.is_none() && msg.referenced_message.is_some() { let ref_message = &msg.referenced_message.clone().unwrap(); if ref_message.author.id != context.http.get_current_user().await.unwrap().id { return; @@ -96,11 +74,13 @@ pub async fn message(context: &Context, msg: Message, dbconn: &Mutex) { author.dm(&context.http, message).await.unwrap(); - return; - } else { return; } + let converted_url = converted_url.unwrap(); + let url = converted_url.url; + let options = converted_url.options; + let response = MessageBuilder::new() .mention(&msg.author) .push(": ") From 9edc68a24b946ba303e73e0f48a6f04eedbfbf07 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Tue, 19 Mar 2024 10:26:21 +0100 Subject: [PATCH 09/10] Remove debug prints --- sphene/src/message_handler/interaction_event.rs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/sphene/src/message_handler/interaction_event.rs b/sphene/src/message_handler/interaction_event.rs index fae330a..c6fabd4 100644 --- a/sphene/src/message_handler/interaction_event.rs +++ b/sphene/src/message_handler/interaction_event.rs @@ -21,9 +21,6 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, return; } - println!("Command: {}", command); - println!("Message: {:?}", msg.content); - let regex = regex::Regex::new(REGEX_URL_EXTRACTOR).unwrap(); // Get user id @@ -76,8 +73,6 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, .as_str() .to_string(); - println!("Extracted URL: Download {}", extracted_url); - let url = if twitter::UrlType::from_string(&extracted_url) != twitter::UrlType::Unknown { @@ -155,9 +150,6 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, let instagram_urltype = instagram::UrlType::from_string(command); let tiktok_urltype = tiktok::UrlType::from_string(command); - println!("Extracted URL: {}", extracted_url); - println!("Twitter URL type: {:?}", twitter_urltype); - if twitter_urltype != twitter::UrlType::Unknown { new_msg = twitter::convert_url_lazy(extracted_url, twitter_urltype).await; } else if bluesky_urltype != bluesky::UrlType::Unknown { @@ -204,8 +196,6 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, new_msg = format!("<@{}>: {}", user, new_msg); - println!("New message: {}", new_msg); - let edit_message = EditMessage::new() .content(new_msg) .allowed_mentions(CreateAllowedMentions::new().empty_roles().empty_users()); From a30e9915910ad69692752a8b926bdc7e521e0ec1 Mon Sep 17 00:00:00 2001 From: AnnsAnn Date: Tue, 19 Mar 2024 10:29:20 +0100 Subject: [PATCH 10/10] Make clippy happy --- sphene/src/commands/convert_url.rs | 10 +++---- sphene/src/message_handler.rs | 9 ++----- .../src/message_handler/interaction_event.rs | 27 +++++++------------ sphene/src/message_handler/message_event.rs | 10 +++---- 4 files changed, 18 insertions(+), 38 deletions(-) diff --git a/sphene/src/commands/convert_url.rs b/sphene/src/commands/convert_url.rs index 614b087..a4c216b 100644 --- a/sphene/src/commands/convert_url.rs +++ b/sphene/src/commands/convert_url.rs @@ -2,12 +2,8 @@ use poise::serenity_prelude::{CreateSelectMenuOption, Message}; use thorium::db::DBConn; use tokio::sync::Mutex; -use poise::serenity_prelude::{ - Context, CreateActionRow, CreateAllowedMentions, CreateMessage, - CreateSelectMenu, CreateSelectMenuKind, - MessageBuilder, UserId, -}; -use rust_i18n::t; + + use thorium::{bluesky, instagram, tiktok, twitter}; use crate::{ @@ -64,7 +60,7 @@ pub async fn convert_twitter_to(url: String, kind: &str) -> String { _ => twitter::UrlType::Unknown, }; - let mut new_msg = + let new_msg = twitter::convert_url_lazy(url.to_string(), twitter_urltype).await; format!( diff --git a/sphene/src/message_handler.rs b/sphene/src/message_handler.rs index 38d71d8..c922afd 100644 --- a/sphene/src/message_handler.rs +++ b/sphene/src/message_handler.rs @@ -18,13 +18,8 @@ pub async fn event_handler( FullEvent::Message { new_message } => { message_event::message(ctx, new_message.clone(), &data.db).await; } - FullEvent::InteractionCreate { interaction } => { - match interaction { - Interaction::Component(component) => { - interaction_event::interaction_create(ctx, component.clone(), &data.db).await; - } - _ => {} - } + FullEvent::InteractionCreate { interaction: Interaction::Component(component) } => { + interaction_event::interaction_create(ctx, component.clone(), &data.db).await; } _ => {} } diff --git a/sphene/src/message_handler/interaction_event.rs b/sphene/src/message_handler/interaction_event.rs index c6fabd4..ba5532f 100644 --- a/sphene/src/message_handler/interaction_event.rs +++ b/sphene/src/message_handler/interaction_event.rs @@ -1,21 +1,21 @@ use poise::serenity_prelude::{ - ComponentInteraction, ComponentInteractionDataKind, Context, CreateActionRow, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseFollowup, CreateInteractionResponseMessage, EditInteractionResponse, EditMessage + ComponentInteraction, ComponentInteractionDataKind, Context, CreateAllowedMentions, CreateInteractionResponse, CreateInteractionResponseFollowup, CreateInteractionResponseMessage, EditInteractionResponse, EditMessage }; use rust_i18n::t; use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; use tokio::sync::Mutex; -use crate::utils::{REGEX_URL_EXTRACTOR}; +use crate::{commands::convert_url::convert_twitter_to, utils::REGEX_URL_EXTRACTOR}; pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, dbconn: &Mutex) { let command = match &component.data.kind { ComponentInteractionDataKind::StringSelect { values, .. } => values[0].as_str(), - _ => return (), + _ => return , }; - let mut msg = &component.message; + let msg = &component.message; if !msg.author.bot { return; @@ -145,7 +145,7 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, .to_string(); let mut new_msg: String = String::new(); - let mut twitter_urltype = twitter::UrlType::from_string(command); + let twitter_urltype = twitter::UrlType::from_string(command); let bluesky_urltype = bluesky::UrlType::from_string(command); let instagram_urltype = instagram::UrlType::from_string(command); let tiktok_urltype = tiktok::UrlType::from_string(command); @@ -159,19 +159,10 @@ pub async fn interaction_create(ctx: &Context, component: ComponentInteraction, } else if tiktok_urltype != tiktok::UrlType::Unknown { new_msg = tiktok::convert_url_lazy(extracted_url, tiktok_urltype).await; } else if command == "direct_vx" || command == "direct_fx" { - twitter_urltype = match command { - "direct_vx" => twitter::UrlType::Vxtwitter, - "direct_fx" => twitter::UrlType::Fxtwitter, - _ => twitter::UrlType::Unknown, - }; - - new_msg = - twitter::convert_url_lazy(extracted_url.to_string(), twitter_urltype).await; - new_msg = format!( - "<{}> ({})", - new_msg, - twitter::get_media_from_url(new_msg.clone()).await - ); + new_msg = convert_twitter_to( + extracted_url.to_string(), + command, + ).await } else if command == "direct_fxbsky" { new_msg = bluesky::convert_url_lazy( extracted_url.to_string(), diff --git a/sphene/src/message_handler/message_event.rs b/sphene/src/message_handler/message_event.rs index 75ab00c..2949bbd 100644 --- a/sphene/src/message_handler/message_event.rs +++ b/sphene/src/message_handler/message_event.rs @@ -1,18 +1,16 @@ -use std::convert; + use poise::serenity_prelude::{ Context, CreateActionRow, CreateAllowedMentions, CreateMessage, - CreateSelectMenu, CreateSelectMenuKind, CreateSelectMenuOption, Message, + CreateSelectMenu, CreateSelectMenuKind, Message, MessageBuilder, UserId, }; use rust_i18n::t; -use thorium::{bluesky, db::DBConn, instagram, tiktok, twitter}; +use thorium::{db::DBConn}; use tokio::sync::Mutex; use crate::{ - commands::convert_url::convert_url, options::{ - get_blueksy_options, get_instagram_options, get_tik_tok_options, get_twitter_options, - } + commands::convert_url::convert_url }; pub async fn message(context: &Context, msg: Message, dbconn: &Mutex) {