From 23f5009c4ab4a2a9f989d342651ab55eaec72a68 Mon Sep 17 00:00:00 2001 From: Ladislav Hano Date: Sun, 6 Oct 2024 16:53:12 +0200 Subject: [PATCH] feat: implemented new slash commands --- src/commands/mod.rs | 13 ++++++- src/commands/moover/mod.rs | 7 ++++ src/commands/{ => moover}/moove.rs | 0 src/commands/{ => moover}/say.rs | 0 src/commands/notice/birthday.rs | 0 src/commands/notice/events.rs | 0 src/commands/user_interactions/headpat.rs | 20 ++++++++++ src/commands/user_interactions/hug.rs | 20 ++++++++++ src/commands/user_interactions/interaction.rs | 38 +++++++++++++++++++ src/commands/user_interactions/mod.rs | 6 +++ src/message_handler.rs | 2 +- src/other/notice.rs | 4 +- src/types.rs | 2 +- src/util/gifs.rs | 9 +++++ src/util/mod.rs | 3 +- src/util/utilities.rs | 2 +- 16 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 src/commands/moover/mod.rs rename src/commands/{ => moover}/moove.rs (100%) rename src/commands/{ => moover}/say.rs (100%) create mode 100644 src/commands/notice/birthday.rs create mode 100644 src/commands/notice/events.rs create mode 100644 src/commands/user_interactions/headpat.rs create mode 100644 src/commands/user_interactions/hug.rs create mode 100644 src/commands/user_interactions/interaction.rs create mode 100644 src/commands/user_interactions/mod.rs create mode 100644 src/util/gifs.rs diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 98ea7cd..92a8ea2 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -1,2 +1,11 @@ -pub mod moove; -pub mod say; \ No newline at end of file +pub use moover::*; +pub use notice::*; +pub use other::*; +pub use user_interactions::*; + +pub mod moover; +pub mod notice; +pub mod user_interactions; +pub mod other; + +pub mod channel_test; \ No newline at end of file diff --git a/src/commands/moover/mod.rs b/src/commands/moover/mod.rs new file mode 100644 index 0000000..4b6fd56 --- /dev/null +++ b/src/commands/moover/mod.rs @@ -0,0 +1,7 @@ +pub use moove::*; +pub use say::*; +pub use gif::*; + +pub mod moove; +pub mod say; +pub mod gif; \ No newline at end of file diff --git a/src/commands/moove.rs b/src/commands/moover/moove.rs similarity index 100% rename from src/commands/moove.rs rename to src/commands/moover/moove.rs diff --git a/src/commands/say.rs b/src/commands/moover/say.rs similarity index 100% rename from src/commands/say.rs rename to src/commands/moover/say.rs diff --git a/src/commands/notice/birthday.rs b/src/commands/notice/birthday.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/commands/notice/events.rs b/src/commands/notice/events.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/commands/user_interactions/headpat.rs b/src/commands/user_interactions/headpat.rs new file mode 100644 index 0000000..8d33ad8 --- /dev/null +++ b/src/commands/user_interactions/headpat.rs @@ -0,0 +1,20 @@ +use poise; +use serenity::all::User; + +use super::interaction::send_with_embed; +use crate::types::{Error, Context}; + +#[poise::command( + slash_command, + description_localized("en-US", "Headpat all your friends!") +)] +pub async fn headpat(ctx: Context<'_>, + #[description = "Who is the lucky one?"] + user: User +) -> Result<(), Error> { + let title = "HEADPATS!"; + let desc = format!("{} headpats {}", ctx.author(), user); + send_with_embed(ctx, "headpat", &title, &desc).await?; + ctx.reply("Done!").await?; + Ok(()) +} \ No newline at end of file diff --git a/src/commands/user_interactions/hug.rs b/src/commands/user_interactions/hug.rs new file mode 100644 index 0000000..31dbe8c --- /dev/null +++ b/src/commands/user_interactions/hug.rs @@ -0,0 +1,20 @@ +use poise; +use serenity::all::User; + +use super::interaction::send_with_embed; +use crate::types::{Error, Context}; + +#[poise::command( + slash_command, + description_localized("en-US", "Hug all your friends!") +)] +pub async fn hug(ctx: Context<'_>, + #[description = "Who is the lucky one?"] + user: User +) -> Result<(), Error> { + let title = "HUGS!"; + let desc = format!("{} hugs {}", ctx.author(), user); + send_with_embed(ctx, "hug", &title, &desc).await?; + ctx.reply("Done!").await?; + Ok(()) +} \ No newline at end of file diff --git a/src/commands/user_interactions/interaction.rs b/src/commands/user_interactions/interaction.rs new file mode 100644 index 0000000..439ef72 --- /dev/null +++ b/src/commands/user_interactions/interaction.rs @@ -0,0 +1,38 @@ +use anyhow::anyhow; +use serenity::all::{Colour, CreateEmbed, CreateMessage}; +use tenorv2::tenor_builder::Tenor; + +use crate::{types::Context, util::{gifs::get_random_tenor_gif, utilities}}; + +pub(super) async fn send_with_embed(ctx: Context<'_>, query: &str, title: &str, desc: &str) -> anyhow::Result<()> { + let tenor_response = Tenor::new()? + .random(true) + .search(query).await?; + + const LIMIT: u8 = 20; + let url = get_random_tenor_gif(tenor_response, LIMIT).await?; + + let embed = CreateEmbed::new() + .color(Colour::new(rand::random::() % 0xFFFFFF)) + .title(title) + .description(desc) + .image(url.as_str()); + + if ctx.guild_id().is_none() { + return Err(anyhow!("Guild id not available in context")); + } + + utilities::get_system_channel( + ctx.guild_id().unwrap(), ctx.http() + ).await? + .send_message( + ctx.http(), + CreateMessage::new().add_embed(embed) + ).await?; + + Ok(()) +} + +pub(super) async fn send(ctx: Context<'_>, msg: &str) -> anyhow::Result<()> { + Ok(()) +} \ No newline at end of file diff --git a/src/commands/user_interactions/mod.rs b/src/commands/user_interactions/mod.rs new file mode 100644 index 0000000..0e8654b --- /dev/null +++ b/src/commands/user_interactions/mod.rs @@ -0,0 +1,6 @@ +pub use headpat::*; +pub use hug::*; + +pub mod interaction; +pub mod headpat; +pub mod hug; \ No newline at end of file diff --git a/src/message_handler.rs b/src/message_handler.rs index 1183998..767448a 100644 --- a/src/message_handler.rs +++ b/src/message_handler.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use crate::util::debug::send_error; use crate::util::utilities; -use crate::commands::moove::{moove, moove_check}; +use crate::commands::moover::moove::{moove, moove_check}; pub async fn handle(ctx: Context, msg: Message) { if msg.author.bot { diff --git a/src/other/notice.rs b/src/other/notice.rs index e7fde2e..2294637 100644 --- a/src/other/notice.rs +++ b/src/other/notice.rs @@ -30,7 +30,7 @@ async fn announce_event(guild_id: GuildId, name: &str, special_message: &str, ht .color(Colour::new(rand::random::() % 0xFFFFFF)) .title("Today's event is:"); - let system_channel = utilities::get_system_channel(guild_id, http.clone()).await?; + let system_channel = utilities::get_system_channel(guild_id, &http).await?; if special_message.contains("http") { event_embed = event_embed.description(name); @@ -65,7 +65,7 @@ async fn celebrate_birthday(guild_id: GuildId, user_id: UserId, nick: &str, http } }; - let system_channel = utilities::get_system_channel(guild_id, http.clone()).await?; + let system_channel = utilities::get_system_channel(guild_id, &http).await?; let mut embed = CreateEmbed::new() .color(Colour::new(rand::random::() % 0xFFFFFF)) diff --git a/src/types.rs b/src/types.rs index 2571aab..b5ebced 100644 --- a/src/types.rs +++ b/src/types.rs @@ -2,4 +2,4 @@ pub type Error = Box; // replace () with Data if you ever need to store some additional data -// pub type Context<'a> = poise::Context<'a, (), Error>; +pub type Context<'a> = poise::Context<'a, (), Error>; diff --git a/src/util/gifs.rs b/src/util/gifs.rs new file mode 100644 index 0000000..f128ea9 --- /dev/null +++ b/src/util/gifs.rs @@ -0,0 +1,9 @@ +use tenorv2::{tenor, tenor_types::{MediaFilter, TenorError}, JsonValue}; + +pub async fn get_random_tenor_gif(tenor_response: JsonValue, limit: u8) -> Result { + let index = rand::random::() % limit as usize; + match tenor::get_gif_url(MediaFilter::gif, tenor_response) { + Ok(urls) => Ok(urls[index].clone()), + Err(e) => Err(e) + } +} \ No newline at end of file diff --git a/src/util/mod.rs b/src/util/mod.rs index d3d2689..a259bb4 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -1,2 +1,3 @@ pub mod debug; -pub mod utilities; \ No newline at end of file +pub mod utilities; +pub mod gifs; \ No newline at end of file diff --git a/src/util/utilities.rs b/src/util/utilities.rs index 7669eb7..8b5f470 100644 --- a/src/util/utilities.rs +++ b/src/util/utilities.rs @@ -4,7 +4,7 @@ use serenity::{all::{ChannelId, CreateMessage, GuildId, Message}, http::Http}; use anyhow::Context; -pub async fn get_system_channel(guild_id: GuildId, http: Arc) -> anyhow::Result { +pub async fn get_system_channel(guild_id: GuildId, http: &Http) -> anyhow::Result { return http.get_guild(guild_id).await?.system_channel_id .context(format!("System channel of guild: {} not found", guild_id.get())); }