diff --git a/src/commands/mods/deny.rs b/src/commands/mods/deny.rs new file mode 100644 index 0000000..2b6b4e3 --- /dev/null +++ b/src/commands/mods/deny.rs @@ -0,0 +1,22 @@ +use crate::entities::moderator::Feature; +use spinners::*; +fn subtract_vecs(v1: &Vec, v2: &Vec) -> Vec + where T: Eq + Clone +{ + v1.iter().filter(|&x| !v2.contains(x)).cloned().collect() +} +pub fn deny(id: u128, features: Vec) { + let token = super::expect_token(); + let app_id = crate::handle_result!(super::ask_for_app(token.clone(), "modify the mod's permissions")); + let mut spinner = Spinner::new(Spinners::Toggle2, "Removing the permissions...".into()); + let moderator = crate::handle_result!(crate::entities::moderator::Mod::fetch_mod(token.clone(), id, app_id)); + match moderator { + Some(mut moderator) => { + crate::handle_result!(moderator.set_features(subtract_vecs(&moderator.get_features(), &features), token.clone()), spinner); + spinner.stop_with_message(super::format_log(&format!("{:?} were removed successfully!", features))); + }, + None => { + spinner.stop_with_message(super::format_err("That moderator doesn't exist!")); + } + } +} \ No newline at end of file diff --git a/src/commands/mods/mod.rs b/src/commands/mods/mod.rs index 1aaf2de..eb6e90c 100644 --- a/src/commands/mods/mod.rs +++ b/src/commands/mods/mod.rs @@ -1,4 +1,5 @@ pub mod add; pub mod remove; pub mod allow; +pub mod deny; use super::*; \ No newline at end of file diff --git a/src/entities/moderator.rs b/src/entities/moderator.rs index 95df9f7..7f3ddfa 100644 --- a/src/entities/moderator.rs +++ b/src/entities/moderator.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use serde_enum_str::*; use std::fmt::Debug; -#[derive(Deserialize_enum_str, Serialize_enum_str, Clone)] +#[derive(Deserialize_enum_str, Serialize_enum_str, Clone, Eq, PartialEq)] pub enum Feature { #[serde(rename = "start_app")] Start, diff --git a/src/main.rs b/src/main.rs index 096359c..db8e4d0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -141,6 +141,17 @@ fn main() -> std::io::Result<()> { .multiple_occurrences(true) ) ) + .subcommand( + Command::new("deny") + .about("Removes permissions from a moderator") + .arg(Arg::new("id").value_parser(value_parser!(u128)).action(clap::ArgAction::Set)) + .arg( + Arg::new("perm") + .value_parser(value_parser!(Feature)) + .action(clap::ArgAction::Append) + .multiple_occurrences(true) + ) + ) .after_help("Be careful with what people you add and what permissions you give: With Great Power comes Great Responsability.") ); let matches = cmd.get_matches(); @@ -196,6 +207,14 @@ fn main() -> std::io::Result<()> { commands::mods::remove::remove(id); Ok(()) } + Some(("deny", matches)) => { + let id: u128 = *matches.get_one("id").unwrap(); + let features: Vec = matches.get_many("perm").unwrap() + .map(|perm: &Feature| perm.clone()) + .collect(); + commands::mods::deny::deny(id, features); + Ok(()) + } Some(("allow", matches)) => { let id: u128 = *matches.get_one("id").unwrap(); let features: Vec = matches.get_many("perm").unwrap()