From 59e33a32a9ac4c6de48aeb4005812a5e33ae9b48 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Fri, 28 Jun 2024 17:07:17 -0600 Subject: [PATCH] Added emoji 8ball --- Cargo.lock | 10 ++++++ Cargo.toml | 1 + src/config.rs | 11 +++--- src/discord/joke.rs | 83 +++++++++++++++++++++++++++++++++++++++----- src/discord/shop.rs | 17 ++++----- src/inventory/mod.rs | 2 +- 6 files changed, 101 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c9a3bd4..537668b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -766,6 +766,15 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "emojis" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f619a926616ae7149a0d82610b051134a0d6c4ae2962d990c06c847a445c5d9" +dependencies = [ + "phf", +] + [[package]] name = "encoding_rs" version = "0.8.33" @@ -874,6 +883,7 @@ dependencies = [ "chrono", "chrono-tz", "config", + "emojis", "j_db", "json", "log", diff --git a/Cargo.toml b/Cargo.toml index 9e8765c..0cefdef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ serde_json = "1.0.113" raas_types = { version = "0.0.9", registry = "jojo-dev"} prost = "0.12.6" tonic = "0.11.0" +emojis = "0.6.2" [dependencies.serenity] version = "0.12.0" diff --git a/src/config.rs b/src/config.rs index 996a201..7a55e52 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,8 +1,9 @@ use crate::album_manager::AlbumManager; use crate::error::Error; -use crate::migrations::{CURRENT_DB_VERSION, do_migration}; +use crate::migrations::{do_migration, CURRENT_DB_VERSION}; use config::{Config, File}; use j_db::database::Database; +use j_db::metadata::DBMetadata; use reqwest::Url; use serde::{Deserialize, Serialize}; use serenity::model::id::ChannelId; @@ -11,7 +12,6 @@ use serenity::prelude::TypeMapKey; use std::net::SocketAddr; use std::path::{Path, PathBuf}; use std::sync::Arc; -use j_db::metadata::DBMetadata; use structopt::StructOpt; use tokio::sync::mpsc::{channel, Receiver, Sender}; use tokio::sync::Mutex; @@ -85,12 +85,13 @@ impl GlobalData { let db = Database::new(&cfg.db_path)?; let version = db.version()?; - + if version == 0 { - db.insert::( DBMetadata { + db.insert::(DBMetadata { id: None, version: CURRENT_DB_VERSION, - }).unwrap(); + }) + .unwrap(); } do_migration(&db); diff --git a/src/discord/joke.rs b/src/discord/joke.rs index 01d3004..4780799 100644 --- a/src/discord/joke.rs +++ b/src/discord/joke.rs @@ -3,6 +3,13 @@ use crate::error::Error; use crate::models::insult_compliment::{RandomResponseTemplate, ResponseType}; use crate::models::random::{Random, RandomConfig}; use crate::{command, group, GlobalData, BAD_APPLE}; +use chrono::Utc; +use emojis::Group; +use raas_types::raas::bot::roll::{roll_response, Roll, RollCmd}; +use raas_types::raas::resp::response::Resp; +use raas_types::raas::service::raas_client::RaasClient; +use rand::prelude::SliceRandom; +use rand::thread_rng; use reqwest::Client; use serde::{Deserialize, Serialize}; use serenity::all::{CreateAttachment, CreateMessage}; @@ -14,13 +21,18 @@ use serenity::model::channel::Message; use serenity::utils::MessageBuilder; use std::collections::HashMap; use std::time::Duration; -use chrono::Utc; -use raas_types::raas::bot::roll::{Roll, roll_response, RollCmd}; -use raas_types::raas::resp::response::Resp; -use raas_types::raas::service::raas_client::RaasClient; #[group] -#[commands(dad_joke, roll, real_roll, bad_apple, insult, add_random, list_random)] +#[commands( + dad_joke, + roll, + real_roll, + bad_apple, + insult, + add_random, + list_random, + emoji_8ball +)] pub struct Joke; #[derive(Clone, Serialize, Deserialize)] @@ -249,7 +261,7 @@ async fn roll(ctx: &Context, msg: &Message, args: Args) -> CommandResult { async fn real_roll(ctx: &Context, msg: &Message, _args: Args) -> CommandResult { let data = ctx.data.read().await; let global = data.get::().unwrap(); - + let addr = global.cfg.raas_server.clone(); let mut client = RaasClient::connect(addr).await?; @@ -267,12 +279,16 @@ async fn real_roll(ctx: &Context, msg: &Message, _args: Args) -> CommandResult { let grpc_request = tonic::Request::new(roll_request); - msg.reply(&ctx.http, "Sent roll request, please hang on!").await?; + msg.reply(&ctx.http, "Sent roll request, please hang on!") + .await?; let response = client.send_request(grpc_request).await?; let raas_response = response.into_inner(); - println!("Got resp: {} @ {}",raas_response.id, raas_response.timestamp); + println!( + "Got resp: {} @ {}", + raas_response.id, raas_response.timestamp + ); match raas_response.resp.unwrap() { Resp::RollResp(roll_resp) => { @@ -288,7 +304,14 @@ async fn real_roll(ctx: &Context, msg: &Message, _args: Args) -> CommandResult { } } Resp::Error(err) => { - msg.reply(&ctx.http, format!("My real flesh encountered an error. Get Dad to fix it. `{}`", err.msg)).await?; + msg.reply( + &ctx.http, + format!( + "My real flesh encountered an error. Get Dad to fix it. `{}`", + err.msg + ), + ) + .await?; } } @@ -365,3 +388,45 @@ async fn insult(ctx: &Context, msg: &Message, args: Args) -> CommandResult { Ok(()) } + +fn get_unicode_emojis() -> Vec { + let groups = [ + Group::SmileysAndEmotion, + Group::Activities, + Group::Objects, + Group::AnimalsAndNature, + Group::PeopleAndBody, + Group::FoodAndDrink, + ]; + + let mut emoji = Vec::new(); + + for group in groups { + emoji.extend(group.emojis()) + } + + emoji.iter().map(|e| e.to_string()).collect() +} + +#[command] +#[aliases("🎱")] +async fn emoji_8ball(ctx: &Context, msg: &Message) -> CommandResult { + let data = ctx.data.read().await; + let global = data.get::().unwrap(); + + let guild_emojis = global.cfg.guild_id.emojis(&ctx.http).await?; + let mut emojis: Vec = guild_emojis.iter().map(|e| e.to_string()).collect(); + + let mut unicode_emojis = get_unicode_emojis(); + + emojis.append(&mut unicode_emojis); + + let emoji_msg: Vec = emojis + .choose_multiple(&mut thread_rng(), 3) + .cloned() + .collect(); + + msg.reply(&ctx.http, emoji_msg.join("")).await?; + + Ok(()) +} diff --git a/src/discord/shop.rs b/src/discord/shop.rs index 3136b5b..17aff00 100644 --- a/src/discord/shop.rs +++ b/src/discord/shop.rs @@ -342,21 +342,22 @@ async fn use_item(ctx: &Context, msg: &Message, args: Args) -> CommandResult { .await?; } ItemType::TacticalNuke => { - let mut users: Vec = global_data.db.filter(|_, _user: &User| { - true - } - )?.collect(); + let mut users: Vec = global_data.db.filter(|_, _user: &User| true)?.collect(); for user in &mut users { for item in &mut user.inventory.inventory { - if item.item_type == ItemType::KillGun || item.item_type == ItemType::CancelRay || item.item_type == ItemType::CancelInsurance || item.item_type == ItemType::Helmet { + if item.item_type == ItemType::KillGun + || item.item_type == ItemType::CancelRay + || item.item_type == ItemType::CancelInsurance + || item.item_type == ItemType::Helmet + { item.quantity = 0; } } - + global_data.db.insert(user.clone())?; } - + msg.reply(&ctx.http, "I have become cancel, the canceller of worlds. https://tenor.com/view/explosion-mushroom-cloud-atomic-bomb-bomb-boom-gif-4464831").await?; } } @@ -473,7 +474,7 @@ pub async fn restock_shop(ctx: &Context, global_data: &GlobalData) -> Result<(), bot_user .inventory .give_item(ItemType::Helmet, thread_rng().gen_range(1..=3), None); - + bot_user .inventory .give_item(ItemType::TacticalNuke, thread_rng().gen_range(0..=1), None); diff --git a/src/inventory/mod.rs b/src/inventory/mod.rs index 2a9d3d3..5e34422 100644 --- a/src/inventory/mod.rs +++ b/src/inventory/mod.rs @@ -106,7 +106,7 @@ impl Display for ItemType { ItemType::KillGun => "Kill Gun".to_string(), ItemType::Helmet => "Helmet".to_string(), ItemType::CancelRay => "Cancel Ray".to_string(), - ItemType::TacticalNuke => "Tactical Nuke".to_string() + ItemType::TacticalNuke => "Tactical Nuke".to_string(), }; write!(f, "{}", name)