diff --git a/src/botv2/cmd/concour/keyword.rs b/src/botv2/cmd/concour/keyword.rs new file mode 100644 index 0000000..9d31a8c --- /dev/null +++ b/src/botv2/cmd/concour/keyword.rs @@ -0,0 +1,109 @@ +use crate::botv2::{ + domain::concour::{ + add_keyword::{add_keyword_concour, AddKeywordConcourError, KeyWordSource}, + check_if_allowed::check_if_allowed, + }, + init::{Context, Error}, +}; +use poise::{ + serenity_prelude::{model::colour, CreateEmbed, CreateEmbedFooter, Mentionable, RoleId}, + CreateReply, +}; +use tracing::instrument; + +/// Add keyword for concour (only for admin) +/// this function will turn into submodule in the futur +#[instrument(skip(ctx), level = "info", fields(channel = ctx.channel_id().get(), guild = ?ctx.guild_id().unwrap().get()))] +#[poise::command( + slash_command, + prefix_command, + category = "server_config", + guild_only = true +)] +pub async fn keyword( + ctx: Context<'_>, + #[description = "Delimiter de list (\\n par defaut)"] delimiter: Option, + #[description = "Url de la liste"] url: String, +) -> Result<(), Error> { + let guild = match ctx.guild_id() { + Some(guild) => guild, + None => return Ok(()), + }; + let entity_name = ctx.data().entity_name.clone(); + let footer = CreateEmbedFooter::new(entity_name.clone()); + match check_if_allowed(guild.get(), ctx.author().id.get(), ctx.http()).await { + Ok(ok) => { + if !ok { + let embed = CreateEmbed::new() + .title("You are not an admin") + .color(colour::Color::RED) + .footer(footer); + if let Err(why) = ctx + .send(CreateReply::default().embed(embed).ephemeral(true)) + .await + { + tracing::error!("Error sending message: {:?}", why); + } + return Ok(()); + } + } + Err(_) => { + let embed = CreateEmbed::new() + .title("You are not an admin") + .color(colour::Color::RED) + .footer(footer); + if let Err(why) = ctx + .send(CreateReply::default().embed(embed).ephemeral(true)) + .await + { + tracing::error!("Error sending message: {:?}", why); + } + return Ok(()); + } + }; + let concour = match add_keyword_concour( + guild.get(), + ctx.channel_id().get(), + KeyWordSource::Url(url, delimiter), + ) + .await + { + Ok(concour) => { + if concour.is_none() { + CreateEmbed::new() + .title("No concour updated") + .color(colour::Color::RED) + } else { + let concour = concour.unwrap(); + CreateEmbed::new() + .title(concour.title) + .description(concour.description) + .field("Start date", concour.start_date.to_string(), false) + .field("Periode", concour.periode.to_string(), false) + .field( + "Role récompense", + RoleId::new(concour.role_recompense).mention().to_string(), + false, + ) + .field("keyword", concour.keywords.len().to_string(), true) + } + } + Err(err) => match err { + AddKeywordConcourError::DoesntExist => CreateEmbed::new() + .title("Concour dont exist") + .color(colour::Color::RED), + _ => CreateEmbed::new() + .title("Error while creating concour") + .field("Please contact your administrator", "", false) + .field("Your concour is possibly not initied correctly", "", false) + .color(colour::Color::RED), + }, + }; + + let mut builder = CreateReply::default().ephemeral(true); + builder = builder.embed(concour.footer(footer)); + if let Err(why) = ctx.send(builder).await { + tracing::error!("Error sending message: {:?}", why); + } + Ok(()) +} diff --git a/src/botv2/cmd/concour/list.rs b/src/botv2/cmd/concour/list.rs index eb91ff2..9185a0f 100644 --- a/src/botv2/cmd/concour/list.rs +++ b/src/botv2/cmd/concour/list.rs @@ -71,6 +71,7 @@ pub async fn list(ctx: Context<'_>) -> Result<(), Error> { .description(c.description) .field("Start date", c.start_date.to_string(), false) .field("Periode", c.periode.to_string(), false) + .field("keyword", c.keywords.len().to_string(), true) .footer(footer.clone()); if c.role_recompense != 0 { output = output.field( diff --git a/src/botv2/cmd/concour/main.rs b/src/botv2/cmd/concour/main.rs index f68d843..a98366c 100644 --- a/src/botv2/cmd/concour/main.rs +++ b/src/botv2/cmd/concour/main.rs @@ -1,5 +1,5 @@ use crate::botv2::{ - cmd::concour::{create::create, list::list, update::update}, + cmd::concour::{create::create, keyword::keyword, list::list, update::update}, domain::concour::{ check_if_allowed::check_if_concour_allowed, get_channel_concour::get_channel_concour, }, @@ -17,7 +17,7 @@ use tracing::instrument; slash_command, prefix_command, category = "concour", - subcommands("get", "list", "update", "create"), + subcommands("get", "list", "update", "create", "keyword"), guild_only = true )] pub async fn concour( @@ -91,6 +91,7 @@ async fn concour_get(ctx: Context<'_>, ephemeral: Option) -> Result<(), Er .field("Description", concour.description, false) .field("Start date", concour.start_date.to_string(), false) .field("Periode", concour.periode.to_string(), false) + .field("keyword", concour.keywords.len().to_string(), true) .color(colour::Color::DARK_GREEN); if concour.role_recompense != 0 { diff --git a/src/botv2/cmd/concour/mod.rs b/src/botv2/cmd/concour/mod.rs index 0f493b6..c162024 100644 --- a/src/botv2/cmd/concour/mod.rs +++ b/src/botv2/cmd/concour/mod.rs @@ -1,4 +1,5 @@ pub mod create; +pub mod keyword; pub mod list; pub mod main; pub mod update; diff --git a/src/botv2/cmd/help.rs b/src/botv2/cmd/help.rs index e2860e2..81cf0f7 100644 --- a/src/botv2/cmd/help.rs +++ b/src/botv2/cmd/help.rs @@ -3,15 +3,14 @@ use poise::samples::HelpConfiguration; use tracing::instrument; /// Show help message -#[poise::command(prefix_command, track_edits, category = "Utility")] -#[instrument(skip(ctx), level = "info")] +#[instrument(skip(ctx), level = "info",fields(channel = ctx.channel_id().get(), guild = ?ctx.guild_id().unwrap().get()))] +#[poise::command(prefix_command, slash_command, track_edits, category = "Utility")] pub async fn help( ctx: Context<'_>, #[description = "Command to get help for"] #[rest] mut command: Option, ) -> Result<(), Error> { - tracing::info!(channel = ctx.channel_id().get(), guild = ?ctx.guild_id().unwrap().get(),"Help command called"); // This makes it possible to just make `help` a subcommand of any command // `/fruit help` turns into `/help fruit` // `/fruit help apple` turns into `/help fruit apple`