Add support for command permissions to the framework

This commit is contained in:
2025-08-14 23:44:22 -03:00
parent deb76941ea
commit 208e0ddbf5
3 changed files with 29 additions and 6 deletions
+4
View File
@@ -9,6 +9,7 @@ pub mod arguments;
pub mod context;
pub mod messages;
pub mod runner;
pub mod permissions;
#[derive(Debug, Error)]
pub enum CommandError {
@@ -37,6 +38,9 @@ pub trait Command<T>: Send + Sync + Debug {
fn arguments(&self) -> &'static [Argument] {
&[]
}
fn permissions(&self) -> &'static [Box<dyn permissions::Permission<T> + Send + Sync>] {
&[]
}
/// Returns the command name + all its aliases.
///
+10
View File
@@ -0,0 +1,10 @@
use std::fmt::Debug;
use async_trait::async_trait;
use crate::framework::commands::{CommandError, context::CommandContext};
#[async_trait]
pub trait Permission<S: Send + Sync + 'static>: Debug {
async fn check(&self, ctx: &CommandContext<S>) -> Result<bool, CommandError>;
}
+15 -6
View File
@@ -31,12 +31,21 @@ impl<T: Send + Sync + 'static> OnMessageHandler<T> for CommandRunner {
});
if let Some(command) = command {
command
.execute(
CommandContext::new(event, rt.clone(), &prefixes[0]),
parts.args,
)
.await?;
let ctx = CommandContext::new(event, rt.clone(), &prefixes[0]);
for permission in command.permissions() {
if !permission
.check(&ctx)
.await
.inspect_err(|e| log::error!("Permission check failed: {e}"))?
{
return Err(
format!("The check for permission {permission:?} failed").into()
);
}
}
command.execute(ctx, parts.args).await?;
break;
}