From 1f629511315907d075bfa9f76857b52eedb26b0e Mon Sep 17 00:00:00 2001 From: jellywx Date: Wed, 16 Jun 2021 16:32:19 +0100 Subject: [PATCH] with global application commands, check if they exist --- src/event_handlers.rs | 11 ++++- src/framework.rs | 99 ++++++++++++++++++++++++++++++++----------- 2 files changed, 85 insertions(+), 25 deletions(-) diff --git a/src/event_handlers.rs b/src/event_handlers.rs index 1c20b2e..e0f39cf 100644 --- a/src/event_handlers.rs +++ b/src/event_handlers.rs @@ -10,7 +10,12 @@ use serenity::{ async_trait, client::{Context, EventHandler}, model::{ - channel::Channel, guild::Guild, id::GuildId, interactions::Interaction, voice::VoiceState, + channel::Channel, + gateway::{Activity, Ready}, + guild::Guild, + id::GuildId, + interactions::Interaction, + voice::VoiceState, }, utils::shard_id, }; @@ -36,6 +41,10 @@ pub struct Handler; #[serenity::async_trait] impl EventHandler for Handler { + async fn ready(&self, ctx: Context, _: Ready) { + ctx.set_activity(Activity::watching("for /play")).await; + } + async fn cache_ready(&self, ctx: Context, _: Vec) { let framework = ctx .data diff --git a/src/framework.rs b/src/framework.rs index 69d13cd..4cacd17 100644 --- a/src/framework.rs +++ b/src/framework.rs @@ -451,11 +451,6 @@ impl RegexFramework { } pub async fn build_slash(&self, http: impl AsRef) { - if env::var("REBUILD_COMMANDS").is_err() { - info!("No rebuild"); - return; - } - info!("Building slash commands..."); let mut count = 0; @@ -491,28 +486,84 @@ impl RegexFramework { count += 1; } } else { - for command in self.commands_.iter().filter(|c| c.allow_slash) { - ApplicationCommand::create_global_application_command(&http, |a| { - a.name(command.names[0]).description(command.desc); + info!("Checking for existing commands..."); - for arg in command.args { - a.create_option(|o| { - o.name(arg.name) - .description(arg.description) - .kind(arg.kind) - .required(arg.required) - }); - } - - a - }) + let current_commands = ApplicationCommand::get_global_application_commands(&http) .await - .expect(&format!( - "Failed to create application command for {}", - command.names[0] - )); + .expect("Failed to fetch existing commands"); - count += 1; + info!("Existing commands: {:?}", current_commands); + + // delete commands not in use + for command in ¤t_commands { + if self + .commands_ + .iter() + .find(|c| c.names[0] == command.name) + .is_none() + { + info!("Deleting command {}", command.name); + + ApplicationCommand::delete_global_application_command(&http, command.id) + .await + .expect("Failed to delete an unused command"); + } + } + + for command in self.commands_.iter().filter(|c| c.allow_slash) { + let already_created = if let Some(current_command) = current_commands + .iter() + .find(|curr| curr.name == command.names[0]) + { + if current_command.description == command.desc + && current_command.options.len() == command.args.len() + { + let mut has_different_arg = false; + + for (arg, option) in + command.args.iter().zip(current_command.options.clone()) + { + if arg.required != option.required + || arg.name != option.name + || arg.description != option.description + || arg.kind != option.kind + { + has_different_arg = true; + break; + } + } + + !has_different_arg + } else { + false + } + } else { + false + }; + + if !already_created { + ApplicationCommand::create_global_application_command(&http, |a| { + a.name(command.names[0]).description(command.desc); + + for arg in command.args { + a.create_option(|o| { + o.name(arg.name) + .description(arg.description) + .kind(arg.kind) + .required(arg.required) + }); + } + + a + }) + .await + .expect(&format!( + "Failed to create application command for {}", + command.names[0] + )); + + count += 1; + } } }