84 lines
2.8 KiB
Rust
84 lines
2.8 KiB
Rust
use pumpkin_util::permission::{Permission, PermissionDefault};
|
|
|
|
use crate::{commands::init_java_command, proto::patchbukkit::command::RegisterCommandRequest};
|
|
|
|
pub fn ffi_native_bridge_register_command_impl(request: RegisterCommandRequest) -> Option<()> {
|
|
let Some(context) = super::CALLBACK_CONTEXT.get() else {
|
|
tracing::warn!(
|
|
"Failed to register command '{}': CALLBACK_CONTEXT is not initialized",
|
|
request.cmd_name
|
|
);
|
|
return None;
|
|
};
|
|
|
|
let cmd_name = request.cmd_name;
|
|
let aliases = request.aliases;
|
|
let description = request.description;
|
|
let plugin_name = request.plugin_name;
|
|
let command_tx = context.command_tx.clone();
|
|
let plugin_context = context.plugin_context.clone();
|
|
|
|
tracing::info!(
|
|
"Registering Bukkit command '{}' from plugin '{}' (aliases: {:?})",
|
|
cmd_name,
|
|
plugin_name,
|
|
aliases
|
|
);
|
|
|
|
context.runtime.spawn(async move {
|
|
let mut raw_names: Vec<String> = vec![cmd_name.clone()];
|
|
raw_names.extend(aliases.clone());
|
|
|
|
let mut names: Vec<String> = Vec::new();
|
|
for name in raw_names {
|
|
let clean = name.trim_start_matches('/').to_string();
|
|
if !clean.is_empty() {
|
|
if !names.contains(&clean) {
|
|
names.push(clean.clone());
|
|
}
|
|
let single = format!("/{}", clean);
|
|
if !names.contains(&single) {
|
|
names.push(single);
|
|
}
|
|
let double = format!("//{}", clean);
|
|
if !names.contains(&double) {
|
|
names.push(double);
|
|
}
|
|
}
|
|
}
|
|
|
|
let primary_name = cmd_name.trim_start_matches('/').to_string();
|
|
let alias_names: Vec<String> = names
|
|
.iter()
|
|
.filter(|n| *n != &primary_name)
|
|
.cloned()
|
|
.collect();
|
|
|
|
let node = init_java_command(primary_name, command_tx, description);
|
|
|
|
let clean_perm = cmd_name.trim_start_matches('/');
|
|
let permission = format!("patchbukkit:command.{clean_perm}");
|
|
|
|
let registry = plugin_context.server.permission_manager.clone();
|
|
|
|
if let Err(e) = registry.register_permission(Permission::new(
|
|
&permission,
|
|
&format!("Allows running command `{cmd_name}` from `{plugin_name}`"),
|
|
PermissionDefault::Allow,
|
|
)) {
|
|
tracing::debug!("Permission '{}' registration notice: {}", permission, e);
|
|
}
|
|
|
|
plugin_context.register_command_with_aliases(node, &alias_names, permission.clone());
|
|
|
|
tracing::info!(
|
|
"Successfully registered command '{}' with names {:?} and permission '{}'",
|
|
cmd_name,
|
|
names,
|
|
permission
|
|
);
|
|
});
|
|
|
|
Some(())
|
|
}
|