From cb1f22f7e3322f6329eded524e9353c02eda6ecc Mon Sep 17 00:00:00 2001 From: kedor <99351777+aure31@users.noreply.github.com> Date: Thu, 20 Aug 2026 08:42:39 +0200 Subject: [PATCH] feat(command): updating say commands to use the new node format (#2996) * updating say commands to the new node format * fix clippy --- crates/pumpkin/src/command/commands/mod.rs | 9 +--- crates/pumpkin/src/command/commands/say.rs | 56 ++++++++++------------ 2 files changed, 26 insertions(+), 39 deletions(-) diff --git a/crates/pumpkin/src/command/commands/mod.rs b/crates/pumpkin/src/command/commands/mod.rs index 22594aa4d..a7f374c89 100644 --- a/crates/pumpkin/src/command/commands/mod.rs +++ b/crates/pumpkin/src/command/commands/mod.rs @@ -131,7 +131,6 @@ pub fn default_dispatcher( dispatcher.register(rotate::init_command_tree(), "minecraft:command.rotate"); dispatcher.register(damage::init_command_tree(), "minecraft:command.damage"); dispatcher.register(bossbar::init_command_tree(), "minecraft:command.bossbar"); - dispatcher.register(say::init_command_tree(), "minecraft:command.say"); dispatcher.register(gamemode::init_command_tree(), "minecraft:command.gamemode"); dispatcher.register(gamerule::init_command_tree(), "minecraft:command.gamerule"); dispatcher.register( @@ -174,6 +173,7 @@ pub fn default_dispatcher( wrapper_dispatcher }; + say::register(&mut dispatcher, registry); banlist::register(&mut dispatcher, registry); difficulty::register(&mut dispatcher, registry); dialog::register(&mut dispatcher, registry); @@ -506,13 +506,6 @@ fn register_level_2_permissions(registry: &PermissionRegistry) { PermissionDefault::Op(PermissionLvl::Two), )) .unwrap_or_else(|e| tracing::warn!("{e}")); - registry - .register_permission(Permission::new( - "minecraft:command.say", - "Broadcasts a message to multiple players", - PermissionDefault::Op(PermissionLvl::Two), - )) - .unwrap_or_else(|e| tracing::warn!("{e}")); registry .register_permission(Permission::new( "minecraft:command.gamemode", diff --git a/crates/pumpkin/src/command/commands/say.rs b/crates/pumpkin/src/command/commands/say.rs index cb17b76c4..4c92d6283 100644 --- a/crates/pumpkin/src/command/commands/say.rs +++ b/crates/pumpkin/src/command/commands/say.rs @@ -1,46 +1,32 @@ use pumpkin_data::world::SAY_COMMAND; use pumpkin_util::text::TextComponent; -use crate::command::{ - CommandError, CommandExecutor, CommandResult, CommandSender, - args::{Arg, ConsumedArgs, message::MsgArgConsumer}, - tree::{CommandTree, builder::argument}, -}; -use CommandError::InvalidConsumption; +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::node::dispatcher::CommandDispatcher; +use crate::command::node::{CommandExecutor, CommandExecutorResult}; +use pumpkin_util::PermissionLvl; +use pumpkin_util::permission::{Permission, PermissionDefault, PermissionRegistry}; -const NAMES: [&str; 1] = ["say"]; +const NAME: &str = "say"; const DESCRIPTION: &str = "Broadcast a message to all Players."; - +const PERMISSION: &str = "minecraft:command.say"; const ARG_MESSAGE: &str = "message"; struct Executor; impl CommandExecutor for Executor { - fn execute<'a>( - &'a self, - sender: &'a CommandSender, - server: &'a crate::server::Server, - args: &'a ConsumedArgs<'a>, - ) -> CommandResult<'a> { + fn execute<'a>(&'a self, context: &'a CommandContext) -> CommandExecutorResult<'a> { Box::pin(async move { - let Some(Arg::Msg(msg)) = args.get(ARG_MESSAGE) else { - return Err(InvalidConsumption(Some(ARG_MESSAGE.into()))); - }; + let msg = context.get_argument::(ARG_MESSAGE)?; - let Some(server_arc) = sender - .world_or_first(server) - .and_then(|w| w.server.upgrade()) - else { - return Err(CommandError::CommandFailed(TextComponent::text( - "Failed to get server instance", - ))); - }; - - server_arc + context + .server() .broadcast_message( &TextComponent::text(msg.clone()), - &TextComponent::text(format!("{sender}")), + &context.source.display_name, SAY_COMMAND, None, ) @@ -51,7 +37,15 @@ impl CommandExecutor for Executor { } } -pub fn init_command_tree() -> CommandTree { - CommandTree::new(NAMES, DESCRIPTION) - .then(argument(ARG_MESSAGE, MsgArgConsumer).execute(Executor)) +pub fn register(dispatcher: &mut CommandDispatcher, registry: &PermissionRegistry) { + registry.register_permission_or_panic(Permission::new( + PERMISSION, + DESCRIPTION, + PermissionDefault::Op(PermissionLvl::Two), + )); + dispatcher.register( + command(NAME, DESCRIPTION) + .requires(PERMISSION) + .then(argument(ARG_MESSAGE, StringArgumentType::GreedyPhrase).executes(Executor)), + ); }