feat: implemented new slash commands

This commit is contained in:
Ladislav Hano 2024-10-06 16:53:12 +02:00
parent 05829327d6
commit 23f5009c4a
16 changed files with 118 additions and 8 deletions

View file

@ -1,2 +1,11 @@
pub mod moove;
pub mod say;
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;

View file

@ -0,0 +1,7 @@
pub use moove::*;
pub use say::*;
pub use gif::*;
pub mod moove;
pub mod say;
pub mod gif;

View file

View file

View file

@ -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(())
}

View file

@ -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(())
}

View file

@ -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::<u32>() % 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(())
}

View file

@ -0,0 +1,6 @@
pub use headpat::*;
pub use hug::*;
pub mod interaction;
pub mod headpat;
pub mod hug;

View file

@ -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 {

View file

@ -30,7 +30,7 @@ async fn announce_event(guild_id: GuildId, name: &str, special_message: &str, ht
.color(Colour::new(rand::random::<u32>() % 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::<u32>() % 0xFFFFFF))

View file

@ -2,4 +2,4 @@
pub type Error = Box<dyn std::error::Error + Send + Sync>;
// 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>;

9
src/util/gifs.rs Normal file
View file

@ -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<String, TenorError> {
let index = rand::random::<usize>() % limit as usize;
match tenor::get_gif_url(MediaFilter::gif, tenor_response) {
Ok(urls) => Ok(urls[index].clone()),
Err(e) => Err(e)
}
}

View file

@ -1,2 +1,3 @@
pub mod debug;
pub mod utilities;
pub mod gifs;

View file

@ -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<Http>) -> anyhow::Result<ChannelId> {
pub async fn get_system_channel(guild_id: GuildId, http: &Http) -> anyhow::Result<ChannelId> {
return http.get_guild(guild_id).await?.system_channel_id
.context(format!("System channel of guild: {} not found", guild_id.get()));
}