PatchBukkit/rust/src/java/native_callbacks/command.rs
2026-09-18 20:19:58 +02:00

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(())
}