From c80b3556079867a4de008f10fa1dc5f9c30c3758 Mon Sep 17 00:00:00 2001 From: Ivan Dardi Date: Tue, 2 Jul 2024 22:28:47 -0300 Subject: [PATCH] feat: add automatic server icon change every 24-48h --- Cargo.lock | 82 +++++++++--------- Cargo.toml | 10 +-- ...y.png => server_icon_turtle_christmas.png} | Bin src/main.rs | 57 +++++++++++- 4 files changed, 101 insertions(+), 48 deletions(-) rename assets/server-icons/{server_icon_turtle - Copy.png => server_icon_turtle_christmas.png} (100%) diff --git a/Cargo.lock b/Cargo.lock index 2296fea..42529a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -109,7 +109,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -120,7 +120,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -516,7 +516,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -527,7 +527,7 @@ checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -617,7 +617,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -626,7 +626,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -749,7 +749,7 @@ dependencies = [ "shuttle-serenity", "shuttle-shared-db", "sqlx", - "syn 2.0.60", + "syn 2.0.68", "tokio", "tracing", ] @@ -877,7 +877,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1638,7 +1638,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1810,7 +1810,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1891,7 +1891,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1961,9 +1961,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -1988,7 +1988,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2462,7 +2462,7 @@ checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2553,21 +2553,21 @@ dependencies = [ [[package]] name = "shuttle-codegen" -version = "0.44.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a0ba1965be7df9f6eacf86ce8e7d13371972620f1b512afb16de0fb7f9842fb" +checksum = "ccc78593861ac3ed0a0efb2f59bc872c5fdf103ba4bb48a12b14a54d6ac98d20" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "shuttle-common" -version = "0.44.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4a7cbeba0ac04ff93e60e7c9cd3fb7a1a06df108b7c6c81ec4237283189f5a" +checksum = "eb1276703054c47dce9e0b5c18ed0beb7094dded4b94d9ebc5f1334ba7c21b33" dependencies = [ "anyhow", "chrono", @@ -2581,6 +2581,7 @@ dependencies = [ "serde", "serde_json", "strum 0.26.2", + "thiserror", "tower", "tracing", "tracing-opentelemetry", @@ -2592,9 +2593,9 @@ dependencies = [ [[package]] name = "shuttle-proto" -version = "0.44.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa562975ec33dfdb0535864e351f0d632af1306f877481bbc5a597bfb7b8ee2e" +checksum = "c483a607932efd362ca1421e94019cae84ff786020ce341001e44e39975d8503" dependencies = [ "futures-core", "prost", @@ -2605,9 +2606,9 @@ dependencies = [ [[package]] name = "shuttle-runtime" -version = "0.44.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9468e399b464fc49a9e2a89beeb29d5a685c3eb38cbdd4f7da28ae6db055ab86" +checksum = "6d08612be826db7a7ba7c1d1f4cb594c45c7891a68fa50c300fea88ee5b9dbe4" dependencies = [ "anyhow", "async-trait", @@ -2621,15 +2622,16 @@ dependencies = [ "strfmt", "tokio", "tokio-stream", + "tokio-util", "tonic", "tracing-subscriber", ] [[package]] name = "shuttle-serenity" -version = "0.44.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb97523f1d30635deca8739e03a312a578631251d1370a23a82439452b18587" +checksum = "c2de23e8cc7636b36452488aea2ee6f6884dde68c0e035cb37e4ee7345856300" dependencies = [ "serenity", "shuttle-runtime", @@ -2637,9 +2639,9 @@ dependencies = [ [[package]] name = "shuttle-service" -version = "0.44.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4687d5f97c43826faf9f2fa665d475696fc71857e5960c3112664480a4a6e6c" +checksum = "ca881c735af684acaab3dcaf9d6c2cc65e82636bfbe3d4afb3d666c1c3477e13" dependencies = [ "anyhow", "async-trait", @@ -2651,9 +2653,9 @@ dependencies = [ [[package]] name = "shuttle-shared-db" -version = "0.44.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79157e7cd1e86f3661f3b45c0374ad9815fd65224b9573195ff8a9e6da2ab49" +checksum = "ccd902dc026098f2af1df364610fa8591daea3d5b15673339d1decddf0a8f9a6" dependencies = [ "async-trait", "diesel-async", @@ -3060,7 +3062,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3082,9 +3084,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -3153,7 +3155,7 @@ checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3249,7 +3251,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3419,7 +3421,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3569,7 +3571,7 @@ checksum = "905e88c2a4cc27686bd57e495121d451f027e441388a67f773be729ad4be1ea8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3736,7 +3738,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -3770,7 +3772,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4056,7 +4058,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4a06942..b1bf50d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,9 +8,9 @@ license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -shuttle-runtime = "0.44.0" -shuttle-serenity = "0.44.0" -shuttle-shared-db = { version = "0.44.0", features = ["postgres"] } +shuttle-runtime = "0.46.0" +shuttle-serenity = "0.46.0" +shuttle-shared-db = { version = "0.46.0", features = ["postgres"] } poise = "0.6" anyhow = "1.0" tokio = "1.28" @@ -25,6 +25,6 @@ rusttype = { version = "0.9", default-features = false } # interact with imagepr once_cell = "1.13" humantime = "2.1.0" rand = "0.8.5" -chrono = "0.4.26" -syn = { version = "2.0.60", features = ["full"] } +chrono = "0.4.38" +syn = { version = "2.0.68", features = ["full"] } quote = "1.0.36" diff --git a/assets/server-icons/server_icon_turtle - Copy.png b/assets/server-icons/server_icon_turtle_christmas.png similarity index 100% rename from assets/server-icons/server_icon_turtle - Copy.png rename to assets/server-icons/server_icon_turtle_christmas.png diff --git a/src/main.rs b/src/main.rs index 3140b3e..2c811c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::time::Duration; use anyhow::{anyhow, Error}; use poise::serenity_prelude as serenity; +use rand::{seq::IteratorRandom, Rng}; use shuttle_runtime::SecretStore; use shuttle_serenity::ShuttleSerenity; use tracing::{debug, info, warn}; @@ -40,8 +41,6 @@ async fn serenity(#[shuttle_runtime::Secrets] secret_store: SecretStore) -> Shut load_or_create_modmail_message(ctx, &data).await?; - // let background_task_handle = tokio::spawn(async {}).await?; - info!("rustbot logged in as {}", ready.user.name); Ok(data) }) @@ -154,7 +153,7 @@ code here // This code is run after a command if it was successful (returned Ok) post_command: |ctx| { Box::pin(async move { - println!("Executed command {}!", ctx.command().qualified_name); + info!("Executed command {}!", ctx.command().qualified_name); }) }, // Every command invocation must pass this check to continue execution @@ -209,5 +208,57 @@ async fn event_handler( .await; } + if let serenity::FullEvent::Ready { .. } = event { + let http = ctx.http.clone(); + tokio::spawn(init_server_icon_changer(http, data.discord_guild_id)); + } + Ok(()) } + +async fn init_server_icon_changer(ctx: impl serenity::CacheHttp, guild_id: serenity::GuildId) { + let mut interval = tokio::time::interval(Duration::from_secs( + rand::thread_rng().gen_range((24 * 60 * 60)..(48 * 60 * 60)), + )); + + loop { + // Attempt to find all images and select one at random + let icon_path_result = std::fs::read_dir("./assets/server-icons") + .map_err(|e| anyhow!("Failed to read server-icons directory: {}", e)) + .and_then(|entries| { + entries + .filter_map(|entry| entry.ok()) + .filter_map(|entry| { + let path = entry.path(); + if path.is_file() { + Some(path) + } else { + None + } + }) + .choose(&mut rand::thread_rng()) + .ok_or_else(|| anyhow!("No server icons found")) + }); + + match icon_path_result { + Ok(icon_path) => { + info!("Changing server icon to {:?}", icon_path); + + // Attempt to change the server icon + let icon_change_result = async { + let icon = serenity::CreateAttachment::path(icon_path).await?; + let builder = serenity::EditGuild::new().icon(Some(&icon)); + guild_id.edit(&ctx, builder).await + } + .await; + + if let Err(e) = icon_change_result { + warn!("Failed to change server icon: {}", e); + } + } + Err(e) => warn!("{}", e), + } + + interval.tick().await; + } +}