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 = vec![cmd_name.clone()]; raw_names.extend(aliases.clone()); let mut names: Vec = 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 = 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(()) }