From daf3b29bb2fb63922ad81b539fa6ef489ff87559 Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Thu, 23 Jan 2025 22:09:12 +0100 Subject: [PATCH] fix: op command allow multiple targets --- pumpkin/src/command/commands/cmd_op.rs | 85 +++++++++++++------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/pumpkin/src/command/commands/cmd_op.rs b/pumpkin/src/command/commands/cmd_op.rs index 713147524..49d322e33 100644 --- a/pumpkin/src/command/commands/cmd_op.rs +++ b/pumpkin/src/command/commands/cmd_op.rs @@ -14,7 +14,7 @@ use CommandError::InvalidConsumption; const NAMES: [&str; 1] = ["op"]; const DESCRIPTION: &str = "Grants operator status to a player."; -const ARG_TARGET: &str = "player"; +const ARG_TARGETS: &str = "targets"; struct OpExecutor; @@ -28,59 +28,58 @@ impl CommandExecutor for OpExecutor { ) -> Result<(), CommandError> { let mut config = OPERATOR_CONFIG.write().await; - let Some(Arg::Players(targets)) = args.get(&ARG_TARGET) else { - return Err(InvalidConsumption(Some(ARG_TARGET.into()))); + let Some(Arg::Players(targets)) = args.get(&ARG_TARGETS) else { + return Err(InvalidConsumption(Some(ARG_TARGETS.into()))); }; - // from the command tree, the command can only be executed with one player - let player = &targets[0]; + for player in targets { + let new_level = BASIC_CONFIG + .op_permission_level + .min(sender.permission_lvl()); - let new_level = BASIC_CONFIG - .op_permission_level - .min(sender.permission_lvl()); + if player.permission_lvl.load() == new_level { + sender + .send_message(TextComponent::translate("commands.op.failed", [])) + .await; + continue; + } - if player.permission_lvl.load() == new_level { - sender - .send_message(TextComponent::translate("commands.op.failed", [])) + if let Some(op) = config + .ops + .iter_mut() + .find(|o| o.uuid == player.gameprofile.id) + { + op.level = new_level; + } else { + let op_entry = Op::new( + player.gameprofile.id, + player.gameprofile.name.clone(), + new_level, + false, + ); + config.ops.push(op_entry); + } + + config.save(); + + player + .set_permission_lvl(new_level, &server.command_dispatcher) + .await; + + let player_name = &player.gameprofile.name; + sender + .send_message(TextComponent::translate( + "commands.op.success", + [player_name.clone().into()], + )) .await; - return Ok(()); } - if let Some(op) = config - .ops - .iter_mut() - .find(|o| o.uuid == player.gameprofile.id) - { - op.level = new_level; - } else { - let op_entry = Op::new( - player.gameprofile.id, - player.gameprofile.name.clone(), - new_level, - false, - ); - config.ops.push(op_entry); - } - - config.save(); - - player - .set_permission_lvl(new_level, &server.command_dispatcher) - .await; - - let player_name = &player.gameprofile.name; - sender - .send_message(TextComponent::translate( - "commands.op.success", - [player_name.clone().into()], - )) - .await; - Ok(()) } } pub fn init_command_tree() -> CommandTree { CommandTree::new(NAMES, DESCRIPTION) - .with_child(argument(ARG_TARGET, PlayersArgumentConsumer).execute(OpExecutor)) + .with_child(argument(ARG_TARGETS, PlayersArgumentConsumer).execute(OpExecutor)) }