84 lines
2.9 KiB
Rust
84 lines
2.9 KiB
Rust
use std::net::IpAddr;
|
|
use std::str::FromStr;
|
|
|
|
use pumpkin_data::translation;
|
|
use pumpkin_util::PermissionLvl;
|
|
use pumpkin_util::permission::{Permission, PermissionDefault, PermissionRegistry};
|
|
use pumpkin_util::text::TextComponent;
|
|
|
|
use crate::command::argument_builder::{ArgumentBuilder, argument, command};
|
|
use crate::command::argument_types::core::string::StringArgumentType;
|
|
use crate::command::context::command_context::CommandContext;
|
|
use crate::command::errors::error_types::CommandErrorType;
|
|
use crate::command::node::dispatcher::CommandDispatcher;
|
|
use crate::command::node::{CommandExecutor, CommandExecutorResult};
|
|
use crate::data::SaveJSONConfiguration;
|
|
|
|
const DESCRIPTION: &str = "unbans a ip";
|
|
const PERMISSION: &str = "minecraft:command.pardonip";
|
|
|
|
const ERROR_PARDONIP_INVALID: CommandErrorType<0> = CommandErrorType::new(
|
|
translation::java::COMMANDS_PARDONIP_INVALID,
|
|
translation::bedrock::COMMANDS_UNBANIP_INVALID,
|
|
);
|
|
|
|
const ERROR_PARDONIP_FAILED: CommandErrorType<0> = CommandErrorType::new(
|
|
translation::java::COMMANDS_PARDONIP_FAILED,
|
|
translation::java::COMMANDS_PARDONIP_FAILED,
|
|
);
|
|
|
|
struct PardonIpExecutor;
|
|
|
|
impl CommandExecutor for PardonIpExecutor {
|
|
fn execute(&self, context: &CommandContext) -> CommandExecutorResult {
|
|
let target = StringArgumentType::get(context, "target")?;
|
|
let ip = IpAddr::from_str(target)
|
|
.map_err(|_| ERROR_PARDONIP_INVALID.create_without_context())?;
|
|
|
|
let server = context.source.server();
|
|
let mut lock = server
|
|
.data
|
|
.banned_ip_list
|
|
.write()
|
|
.unwrap_or_else(std::sync::PoisonError::into_inner);
|
|
|
|
let result = lock
|
|
.banned_ips
|
|
.iter()
|
|
.position(|entry| entry.ip == ip)
|
|
.map_or_else(
|
|
|| Err(ERROR_PARDONIP_FAILED.create_without_context()),
|
|
|idx| {
|
|
lock.banned_ips.remove(idx);
|
|
context.source.send_feedback(
|
|
TextComponent::translate_cross(
|
|
translation::java::COMMANDS_PARDONIP_SUCCESS,
|
|
translation::bedrock::COMMANDS_UNBANIP_SUCCESS,
|
|
[TextComponent::text(ip.to_string())],
|
|
),
|
|
true,
|
|
);
|
|
Ok(1)
|
|
},
|
|
);
|
|
|
|
lock.save();
|
|
|
|
result
|
|
}
|
|
}
|
|
|
|
pub fn register(dispatcher: &mut CommandDispatcher, registry: &PermissionRegistry) {
|
|
registry.register_permission_or_panic(Permission::new(
|
|
PERMISSION,
|
|
DESCRIPTION,
|
|
PermissionDefault::Op(PermissionLvl::Three),
|
|
));
|
|
|
|
let cmd = command("pardon-ip", DESCRIPTION)
|
|
.requires(PERMISSION)
|
|
.then(argument("target", StringArgumentType::SingleWord).executes(PardonIpExecutor));
|
|
|
|
dispatcher.register_with_aliases(cmd, &["pardonip"]);
|
|
}
|