From b14c1e82788494663edbb835626c0392990153fe Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Mon, 19 Dec 2022 19:07:17 -0700 Subject: [PATCH] Added more ways to get fren coin + other fixes + Clippy + fmt --- src/config.rs | 7 +++-- src/discord/album.rs | 22 +++++++++---- src/discord/fren_coin.rs | 33 +++++++++++++++++++ src/discord/joke.rs | 2 +- src/discord/mod.rs | 68 ++++++++++++++++++++++++++-------------- src/error.rs | 2 ++ 6 files changed, 100 insertions(+), 34 deletions(-) diff --git a/src/config.rs b/src/config.rs index a1bb074..3043615 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,5 @@ use crate::error::Error; +use crate::error::Error::NoAlbumFound; use crate::imgur; use crate::imgur::Image; use config::{Config, File}; @@ -111,11 +112,11 @@ impl BotState { }) } - pub fn get_image(&self, album_name: &str, tags: Vec<&str>) -> Option { + pub fn get_image(&self, album_name: &str, tags: Vec<&str>) -> Result, Error> { let mut rng = rand::thread_rng(); let album = match self.albums.get(album_name) { - None => return None, + None => return Err(NoAlbumFound), Some(a) => a, }; @@ -139,7 +140,7 @@ impl BotState { .collect() }; - album.choose(&mut rng).cloned() + Ok(album.choose(&mut rng).cloned()) } } diff --git a/src/discord/album.rs b/src/discord/album.rs index edb7ac4..12f8913 100644 --- a/src/discord/album.rs +++ b/src/discord/album.rs @@ -131,11 +131,21 @@ pub async fn parse_album( let data = ctx.data.read().await; let global_data = data.get::().unwrap(); - Ok(match global_data.bot_state.get_image(album_name, tags) { - Some(image) => { - msg.reply(&ctx.http, &image.link).await?; - true + let img = match global_data.bot_state.get_image(album_name, tags) { + Ok(img) => img, + Err(err) => { + return match err { + Error::NoAlbumFound => Ok(false), + _ => Err(err), + } } - None => false, - }) + }; + + if let Some(img) = img { + msg.reply(&ctx.http, img.link).await?; + } else { + msg.reply(&ctx.http, "No image found :(").await?; + } + + Ok(true) } diff --git a/src/discord/fren_coin.rs b/src/discord/fren_coin.rs index 715f647..febb12f 100644 --- a/src/discord/fren_coin.rs +++ b/src/discord/fren_coin.rs @@ -1,5 +1,7 @@ use crate::config::{BotConfig, GlobalData, Wallet}; +use crate::error::Error; use crate::{command, group}; +use rand::{thread_rng, Rng}; use serenity::client::Context; use serenity::framework::standard::{Args, CommandResult}; use serenity::model::channel::Message; @@ -102,3 +104,34 @@ async fn gift(ctx: &Context, msg: &Message, mut args: Args) -> CommandResult { global_data.cfg.save(&global_data.args.cfg_path).await?; Ok(()) } + +pub async fn give_coin( + ctx: &Context, + user: UserId, + percent: f64, + numer_of_coins: i64, +) -> Result { + let should_get_coin = { + let mut thread_rng = thread_rng(); + + thread_rng.gen_bool(percent) + }; + + if should_get_coin { + let mut data = ctx.data.write().await; + let global_data = data.get_mut::().unwrap(); + + { + let wallet = get_user_wallet(&mut global_data.cfg, user); + wallet.coin_count += numer_of_coins; + } + + global_data + .cfg + .save(&global_data.args.cfg_path) + .await + .unwrap(); + } + + Ok(should_get_coin) +} diff --git a/src/discord/joke.rs b/src/discord/joke.rs index e13b74a..9d2bf8d 100644 --- a/src/discord/joke.rs +++ b/src/discord/joke.rs @@ -56,7 +56,7 @@ impl RandomCtx { let mut random_image: HashMap = HashMap::new(); for album in &global_data.cfg.albums { - let image = global_data.bot_state.get_image(&album.name, Vec::new()); + let image = global_data.bot_state.get_image(&album.name, Vec::new())?; if let Some(image) = image { random_image.insert(album.name.clone(), image.link); diff --git a/src/discord/mod.rs b/src/discord/mod.rs index ab8bff4..303b1f1 100644 --- a/src/discord/mod.rs +++ b/src/discord/mod.rs @@ -6,16 +6,17 @@ pub mod fren_coin; pub mod joke; pub mod story; -use crate::discord::fren_coin::get_user_wallet; +use crate::discord::fren_coin::give_coin; use crate::discord::joke::random; use crate::{help, hook, GlobalData}; -use rand::{thread_rng, Rng}; +use rand::prelude::IteratorRandom; +use rand::thread_rng; use serenity::async_trait; use serenity::client::Context; use serenity::framework::standard::{ help_commands, Args, CommandGroup, CommandResult, HelpOptions, }; -use serenity::model::channel::Message; +use serenity::model::channel::{Message, ReactionType}; use serenity::model::id::UserId; use serenity::model::prelude::{GuildId, Ready}; use serenity::prelude::EventHandler; @@ -50,6 +51,10 @@ impl EventHandler for Handler { return; } + if new_message.guild_id.is_none() { + return; + } + if new_message.content.eq_ignore_ascii_case("yes") || new_message.content.eq_ignore_ascii_case("mhmm") { @@ -63,6 +68,39 @@ impl EventHandler for Handler { } } } + + if new_message.content.to_lowercase().contains("good bot") { + let recv_coin = give_coin(&ctx, new_message.author.id, 0.50, 25) + .await + .unwrap(); + + if recv_coin { + let emojis = new_message.guild(&ctx.cache).unwrap().emojis; + + let emoji = { + let mut rng = thread_rng(); + emojis.iter().choose(&mut rng) + }; + + if let Some(emoji) = emoji { + new_message + .react( + &ctx.http, + ReactionType::Custom { + animated: emoji.1.animated, + id: emoji.1.id, + name: Some(emoji.1.name.clone()), + }, + ) + .await + .unwrap(); + } + } + } + + give_coin(&ctx, new_message.author.id, 0.05, 5) + .await + .unwrap(); } async fn ready(&self, _: Context, ready: Ready) { @@ -80,27 +118,7 @@ pub async fn after( match command_result { Ok(()) => { println!("Processed command '{}'", command_name); - - let give_coins = { - let mut rng = thread_rng(); - rng.gen_bool(0.10) - }; - - if give_coins { - let mut data = ctx.data.write().await; - let global_data = data.get_mut::().unwrap(); - - { - let wallet = get_user_wallet(&mut global_data.cfg, msg.author.id); - wallet.coin_count += 5; - } - - global_data - .cfg - .save(&global_data.args.cfg_path) - .await - .unwrap(); - } + give_coin(ctx, msg.author.id, 0.10, 10).await.unwrap(); } Err(why) => { println!("Command '{}' returned error {:?}", command_name, why); @@ -142,6 +160,8 @@ pub async fn unrecognised_command_hook( Err(e) => println!("Error processing random command: {}", e), } } + + give_coin(ctx, msg.author.id, 0.5, 10).await.unwrap(); } #[help] diff --git a/src/error.rs b/src/error.rs index 44385e9..bdabc2e 100644 --- a/src/error.rs +++ b/src/error.rs @@ -10,6 +10,7 @@ pub enum Error { ImgurError(ImgurError), SerenityError(serenity::Error), TeraError(tera::Error), + NoAlbumFound, } impl StdError for Error {} @@ -39,6 +40,7 @@ impl Display for Error { Error::ImgurError(e) => write!(f, "Imgur error: {}", e), Error::SerenityError(e) => write!(f, "Discord error: {}", e), Error::TeraError(e) => write!(f, "Tera error: {}", e), + Error::NoAlbumFound => write!(f, "No album found"), } } }