fix: op command allow multiple targets

This commit is contained in:
Alexander Medvedev 2025-01-23 22:09:12 +01:00
parent c022914dbf
commit daf3b29bb2

View File

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