From f9776218e0b5a66947a2800d396c67c19830beb7 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Thu, 19 Jan 2023 20:19:58 -0700 Subject: [PATCH] Moved insults and compliments into the db + Fmt --- Cargo.lock | 52 ++++++++++++++--------- src/config.rs | 5 --- src/discord/joke.rs | 26 ++++++------ src/insult_compliment.rs | 25 ----------- src/main.rs | 1 - src/models/insult_compliment.rs | 75 +++++++++++++++++++++++++++++++++ src/models/mod.rs | 1 + 7 files changed, 122 insertions(+), 63 deletions(-) delete mode 100644 src/insult_compliment.rs create mode 100644 src/models/insult_compliment.rs diff --git a/Cargo.lock b/Cargo.lock index 4033edc..61e3c26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -417,9 +417,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d1075c37807dcf850c379432f0df05ba52cc30f279c5cfc43cc221ce7f8579" +checksum = "b61a7545f753a88bcbe0a70de1fcc0221e10bfc752f576754fa91e663db1622e" dependencies = [ "cc", "cxxbridge-flags", @@ -429,9 +429,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5044281f61b27bc598f2f6647d480aed48d2bf52d6eb0b627d84c0361b17aa70" +checksum = "f464457d494b5ed6905c63b0c4704842aba319084a0a3561cdc1359536b53200" dependencies = [ "cc", "codespan-reporting", @@ -444,15 +444,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b50bc93ba22c27b0d31128d2d130a0a6b3d267ae27ef7e4fae2167dfe8781c" +checksum = "43c7119ce3a3701ed81aca8410b9acf6fc399d2629d057b87e2efa4e63a3aaea" [[package]] name = "cxxbridge-macro" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e61fda7e62115119469c7b3591fd913ecca96fb766cfd3f2e2502ab7bc87a5" +checksum = "65e07508b90551e610910fa648a1878991d367064997a596135b86df30daf07e" dependencies = [ "proc-macro2", "quote", @@ -1763,11 +1763,11 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" +checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" dependencies = [ - "base64 0.13.1", + "base64 0.21.0", "bytes", "encoding_rs", "futures-core", @@ -1800,6 +1800,7 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", "webpki-roots", "winreg", @@ -1938,9 +1939,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "645926f31b250a2dca3c232496c2d898d91036e45ca0e97e0e2390c54e11be36" dependencies = [ "bitflags", "core-foundation", @@ -1951,9 +1952,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" dependencies = [ "core-foundation-sys", "libc", @@ -2276,9 +2277,9 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "symphonia-core" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199a6417cd4115bac79289b64b859358ea050b7add0ceb364dc991f628c5b347" +checksum = "6b9567e2d8a5f866b2f94f5d366d811e0c6826babcff6d37de9e1a6690d38869" dependencies = [ "arrayvec", "bitflags", @@ -2691,9 +2692,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "0046be40136ef78dc325e0edefccf84ccddacd0afcc1ca54103fa3c61bbdab1d" [[package]] name = "unicode-ident" @@ -2888,6 +2889,19 @@ version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +[[package]] +name = "wasm-streams" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bbae3363c08332cadccd13b67db371814cd214c2524020932f0804b8cf7c078" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.60" diff --git a/src/config.rs b/src/config.rs index 7bd5f88..5c2e3ed 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,7 +1,6 @@ use crate::error::Error; use crate::imgur; use crate::imgur::Image; -use crate::insult_compliment::InsultComplimentTemplate; use crate::inventory::InventoryManager; use config::{Config, File}; use j_db::database::Database; @@ -51,10 +50,6 @@ pub struct BotConfig { pub albums: Vec, pub motivation: MotivationConfig, - - pub insults: Vec, - - pub compliments: Vec, } impl BotConfig { diff --git a/src/discord/joke.rs b/src/discord/joke.rs index 17b8581..49dfb07 100644 --- a/src/discord/joke.rs +++ b/src/discord/joke.rs @@ -1,8 +1,7 @@ use crate::error::Error; +use crate::models::insult_compliment::{RandomResponseTemplate, ResponseType}; use crate::models::random::RandomConfig; use crate::{command, group, GlobalData, BAD_APPLE}; -use rand::prelude::IteratorRandom; -use rand::thread_rng; use reqwest::Client; use serde::{Deserialize, Serialize}; use serenity::client::Context; @@ -170,7 +169,7 @@ pub async fn list_random(ctx: &Context, msg: &Message, args: Args) -> CommandRes let random = RandomConfig::get_random(&global_data.db, &random_name)?; - let dm_channel = msg.author.id.create_dm_channel(&ctx.http).await?; + let dm_channel = msg.author.id.create_dm_channel(&ctx.http).await?; if let Some(random) = random { let mut msg_builder = MessageBuilder::new(); msg_builder.push_line(format!("All possible responses for {}:", random_name)); @@ -187,7 +186,7 @@ pub async fn list_random(ctx: &Context, msg: &Message, args: Args) -> CommandRes } if !msg_builder.0.is_empty() { - dm_channel.say(&ctx.http, msg_builder.build()).await?; + dm_channel.say(&ctx.http, msg_builder.build()).await?; } } else { msg.reply( @@ -264,10 +263,10 @@ async fn insult(ctx: &Context, msg: &Message, args: Args) -> CommandResult { let data = ctx.data.read().await; let global = data.get::().unwrap(); - let selection = if msg.content.as_str().starts_with("!insult") { - &global.cfg.insults + let pool = if msg.content.as_str().starts_with("!insult") { + ResponseType::Insult } else if msg.content.as_str().starts_with("!compliment") { - &global.cfg.compliments + ResponseType::Compliment } else { msg.reply(&ctx, "The h*ck did you just say to me??").await?; return Ok(()); @@ -275,13 +274,14 @@ async fn insult(ctx: &Context, msg: &Message, args: Args) -> CommandResult { let target = args.rest(); - let output = selection - .iter() - .choose(&mut thread_rng()) - .unwrap() - .render(target)?; + let output = RandomResponseTemplate::get_random_response(&global.db, pool, target)?; - msg.reply(&ctx.http, output).await?; + if let Some(output) = output { + msg.reply(&ctx.http, output).await?; + } else { + msg.reply(&ctx, format!("No {}s, mr freeman??", msg.content)) + .await?; + } Ok(()) } diff --git a/src/insult_compliment.rs b/src/insult_compliment.rs deleted file mode 100644 index d863c87..0000000 --- a/src/insult_compliment.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::error::Error; -use rand::seq::SliceRandom; -use rand::thread_rng; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use tera::{Context, Tera}; - -#[derive(Debug, Deserialize, Serialize, Clone, Default)] -pub struct InsultComplimentTemplate { - pub template: String, - pub word_bank: HashMap>, -} - -impl InsultComplimentTemplate { - pub fn render(&self, target: &str) -> Result { - let mut context = Context::new(); - context.insert("target", target); - - for (key, words) in &self.word_bank { - context.insert(key, &words.choose(&mut thread_rng()).unwrap()); - } - - Ok(Tera::one_off(&self.template, &context, false)?) - } -} diff --git a/src/main.rs b/src/main.rs index 78664ef..fbb2081 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,7 +2,6 @@ mod config; mod discord; mod error; mod imgur; -mod insult_compliment; mod inventory; mod models; mod user; diff --git a/src/models/insult_compliment.rs b/src/models/insult_compliment.rs new file mode 100644 index 0000000..0e941ab --- /dev/null +++ b/src/models/insult_compliment.rs @@ -0,0 +1,75 @@ +use crate::error::Error; +use j_db::database::Database; +use j_db::model::JdbModel; +use rand::seq::SliceRandom; +use rand::thread_rng; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use tera::{Context, Tera}; + +#[derive(Debug, Deserialize, Serialize, Clone, Eq, PartialEq)] +pub enum ResponseType { + Insult, + Compliment, +} + +#[derive(Debug, Deserialize, Serialize, Clone)] +pub struct RandomResponseTemplate { + id: Option, + pub response_type: ResponseType, + pub template: String, + pub word_bank: HashMap>, +} + +impl RandomResponseTemplate { + pub fn render(&self, target: &str) -> Result { + let mut context = Context::new(); + context.insert("target", target); + + for (key, words) in &self.word_bank { + context.insert(key, &words.choose(&mut thread_rng()).unwrap()); + } + + Ok(Tera::one_off(&self.template, &context, false)?) + } + + pub fn get_all_responses_for_type( + db: &Database, + resp_type: ResponseType, + ) -> Result, Error> { + Ok(db + .filter(|_, random_response: &RandomResponseTemplate| { + random_response.response_type == resp_type + })? + .collect()) + } + + pub fn get_random_response( + db: &Database, + resp_type: ResponseType, + target: &str, + ) -> Result, Error> { + let templates = Self::get_all_responses_for_type(db, resp_type)?; + let template = templates.choose(&mut thread_rng()); + + if let Some(template) = template { + Ok(Some(template.render(target)?)) + } else { + Ok(None) + } + } +} + +impl JdbModel for RandomResponseTemplate { + fn id(&self) -> Option { + self.id + } + + fn set_id(&mut self, id: u64) { + self.id = Some(id) + } + + fn tree() -> String { + "RandomResponseTemplate".to_string() + } +} diff --git a/src/models/mod.rs b/src/models/mod.rs index 7bcbfe0..7ae479b 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1 +1,2 @@ +pub mod insult_compliment; pub mod random;