diff --git a/src/command/Command.php b/src/command/Command.php index 65d4decea..b144ad404 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -33,7 +33,7 @@ use pocketmine\permission\PermissionManager; use pocketmine\Server; use pocketmine\utils\BroadcastLoggerForwarder; use pocketmine\utils\TextFormat; -use function explode; +use function implode; use function str_replace; abstract class Command{ @@ -55,7 +55,8 @@ abstract class Command{ protected Translatable|string $usageMessage; - private ?string $permission = null; + /** @var string[] */ + private array $permission = []; private ?string $permissionMessage = null; /** @@ -81,19 +82,28 @@ abstract class Command{ return $this->name; } - public function getPermission() : ?string{ + /** + * @return string[] + */ + public function getPermission() : array{ return $this->permission; } - public function setPermission(?string $permission) : void{ - if($permission !== null){ - foreach(explode(";", $permission) as $perm){ - if(PermissionManager::getInstance()->getPermission($perm) === null){ - throw new \InvalidArgumentException("Cannot use non-existing permission \"$perm\""); - } + /** + * @param string[]|string|null $permissions + */ + public function setPermissions(array $permissions) : void{ + $permissionManager = PermissionManager::getInstance(); + foreach($permissions as $perm){ + if($permissionManager->getPermission($perm) === null){ + throw new \InvalidArgumentException("Cannot use non-existing permission \"$perm\""); } } - $this->permission = $permission; + $this->permission = $permissions; + } + + public function setPermission(?string $permission) : void{ + $this->setPermissions($permission === null ? [] : explode(";", $permission)); } public function testPermission(CommandSender $target, ?string $permission = null) : bool{ @@ -104,19 +114,15 @@ abstract class Command{ if($this->permissionMessage === null){ $target->sendMessage(KnownTranslationFactory::pocketmine_command_error_permission($this->name)->prefix(TextFormat::RED)); }elseif($this->permissionMessage !== ""){ - $target->sendMessage(str_replace("", $permission ?? $this->permission, $this->permissionMessage)); + $target->sendMessage(str_replace("", $permission ?? implode(";", $this->permission), $this->permissionMessage)); } return false; } public function testPermissionSilent(CommandSender $target, ?string $permission = null) : bool{ - $permission ??= $this->permission; - if($permission === null || $permission === ""){ - return false; - } - - foreach(explode(";", $permission) as $p){ + $list = $permission !== null ? [$permission] : $this->permission; + foreach($list as $p){ if($target->hasPermission($p)){ return true; } diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index b46a24d08..525ecd317 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -139,7 +139,7 @@ class SimpleCommandMap implements CommandMap{ } public function register(string $fallbackPrefix, Command $command, ?string $label = null) : bool{ - if($command->getPermission() === null){ + if(count($command->getPermission()) === 0){ throw new \InvalidArgumentException("Commands must have a permission set"); } diff --git a/src/command/defaults/ClearCommand.php b/src/command/defaults/ClearCommand.php index 4e312b4e9..f6f491fbf 100644 --- a/src/command/defaults/ClearCommand.php +++ b/src/command/defaults/ClearCommand.php @@ -35,7 +35,6 @@ use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use pocketmine\utils\TextFormat; use function count; -use function implode; use function min; class ClearCommand extends VanillaCommand{ @@ -46,7 +45,7 @@ class ClearCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_clear_description(), KnownTranslationFactory::pocketmine_command_clear_usage() ); - $this->setPermission(implode(";", [DefaultPermissionNames::COMMAND_CLEAR_SELF, DefaultPermissionNames::COMMAND_CLEAR_OTHER])); + $this->setPermissions([DefaultPermissionNames::COMMAND_CLEAR_SELF, DefaultPermissionNames::COMMAND_CLEAR_OTHER]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/EffectCommand.php b/src/command/defaults/EffectCommand.php index 187fd4573..938323222 100644 --- a/src/command/defaults/EffectCommand.php +++ b/src/command/defaults/EffectCommand.php @@ -32,7 +32,6 @@ use pocketmine\permission\DefaultPermissionNames; use pocketmine\utils\Limits; use pocketmine\utils\TextFormat; use function count; -use function implode; use function strtolower; class EffectCommand extends VanillaCommand{ @@ -43,10 +42,10 @@ class EffectCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_effect_description(), KnownTranslationFactory::commands_effect_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_EFFECT_SELF, DefaultPermissionNames::COMMAND_EFFECT_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/EnchantCommand.php b/src/command/defaults/EnchantCommand.php index 26d7d9bec..583bd59ec 100644 --- a/src/command/defaults/EnchantCommand.php +++ b/src/command/defaults/EnchantCommand.php @@ -30,7 +30,6 @@ use pocketmine\item\enchantment\StringToEnchantmentParser; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use function count; -use function implode; class EnchantCommand extends VanillaCommand{ @@ -40,10 +39,10 @@ class EnchantCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_enchant_description(), KnownTranslationFactory::commands_enchant_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_ENCHANT_SELF, DefaultPermissionNames::COMMAND_ENCHANT_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/GamemodeCommand.php b/src/command/defaults/GamemodeCommand.php index 8fe4e38e9..86ca8e9df 100644 --- a/src/command/defaults/GamemodeCommand.php +++ b/src/command/defaults/GamemodeCommand.php @@ -30,7 +30,6 @@ use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use pocketmine\player\GameMode; use function count; -use function implode; class GamemodeCommand extends VanillaCommand{ @@ -40,10 +39,10 @@ class GamemodeCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_gamemode_description(), KnownTranslationFactory::commands_gamemode_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_GAMEMODE_SELF, DefaultPermissionNames::COMMAND_GAMEMODE_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/GiveCommand.php b/src/command/defaults/GiveCommand.php index 424904492..72d33688b 100644 --- a/src/command/defaults/GiveCommand.php +++ b/src/command/defaults/GiveCommand.php @@ -47,10 +47,10 @@ class GiveCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_give_description(), KnownTranslationFactory::pocketmine_command_give_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_GIVE_SELF, DefaultPermissionNames::COMMAND_GIVE_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/KillCommand.php b/src/command/defaults/KillCommand.php index 169905563..e58234ead 100644 --- a/src/command/defaults/KillCommand.php +++ b/src/command/defaults/KillCommand.php @@ -30,7 +30,6 @@ use pocketmine\event\entity\EntityDamageEvent; use pocketmine\lang\KnownTranslationFactory; use pocketmine\permission\DefaultPermissionNames; use function count; -use function implode; class KillCommand extends VanillaCommand{ @@ -41,7 +40,7 @@ class KillCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_kill_usage(), ["suicide"] ); - $this->setPermission(implode(";", [DefaultPermissionNames::COMMAND_KILL_SELF, DefaultPermissionNames::COMMAND_KILL_OTHER])); + $this->setPermissions([DefaultPermissionNames::COMMAND_KILL_SELF, DefaultPermissionNames::COMMAND_KILL_OTHER]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/SpawnpointCommand.php b/src/command/defaults/SpawnpointCommand.php index e037a6829..614a749d5 100644 --- a/src/command/defaults/SpawnpointCommand.php +++ b/src/command/defaults/SpawnpointCommand.php @@ -32,7 +32,6 @@ use pocketmine\player\Player; use pocketmine\world\Position; use pocketmine\world\World; use function count; -use function implode; use function round; class SpawnpointCommand extends VanillaCommand{ @@ -43,10 +42,10 @@ class SpawnpointCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_spawnpoint_description(), KnownTranslationFactory::commands_spawnpoint_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_SPAWNPOINT_SELF, DefaultPermissionNames::COMMAND_SPAWNPOINT_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/TeleportCommand.php b/src/command/defaults/TeleportCommand.php index 8ccfcec32..b506364bf 100644 --- a/src/command/defaults/TeleportCommand.php +++ b/src/command/defaults/TeleportCommand.php @@ -35,7 +35,6 @@ use pocketmine\utils\TextFormat; use pocketmine\world\World; use function array_shift; use function count; -use function implode; use function round; class TeleportCommand extends VanillaCommand{ @@ -47,10 +46,10 @@ class TeleportCommand extends VanillaCommand{ KnownTranslationFactory::commands_tp_usage(), ["teleport"] ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_TELEPORT_SELF, DefaultPermissionNames::COMMAND_TELEPORT_OTHER - ])); + ]); } private function findPlayer(CommandSender $sender, string $playerName) : ?Player{ diff --git a/src/command/defaults/TimeCommand.php b/src/command/defaults/TimeCommand.php index 325e178a8..8e937b21b 100644 --- a/src/command/defaults/TimeCommand.php +++ b/src/command/defaults/TimeCommand.php @@ -31,7 +31,6 @@ use pocketmine\permission\DefaultPermissionNames; use pocketmine\player\Player; use pocketmine\world\World; use function count; -use function implode; class TimeCommand extends VanillaCommand{ @@ -41,13 +40,13 @@ class TimeCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_time_description(), KnownTranslationFactory::pocketmine_command_time_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_TIME_ADD, DefaultPermissionNames::COMMAND_TIME_SET, DefaultPermissionNames::COMMAND_TIME_START, DefaultPermissionNames::COMMAND_TIME_STOP, DefaultPermissionNames::COMMAND_TIME_QUERY - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/TitleCommand.php b/src/command/defaults/TitleCommand.php index e3bc247d7..ecc4c569c 100644 --- a/src/command/defaults/TitleCommand.php +++ b/src/command/defaults/TitleCommand.php @@ -39,10 +39,10 @@ class TitleCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_title_description(), KnownTranslationFactory::commands_title_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_TITLE_SELF, DefaultPermissionNames::COMMAND_TITLE_OTHER - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){ diff --git a/src/command/defaults/WhitelistCommand.php b/src/command/defaults/WhitelistCommand.php index cbf72902d..65860aefa 100644 --- a/src/command/defaults/WhitelistCommand.php +++ b/src/command/defaults/WhitelistCommand.php @@ -44,14 +44,14 @@ class WhitelistCommand extends VanillaCommand{ KnownTranslationFactory::pocketmine_command_whitelist_description(), KnownTranslationFactory::commands_whitelist_usage() ); - $this->setPermission(implode(";", [ + $this->setPermissions([ DefaultPermissionNames::COMMAND_WHITELIST_RELOAD, DefaultPermissionNames::COMMAND_WHITELIST_ENABLE, DefaultPermissionNames::COMMAND_WHITELIST_DISABLE, DefaultPermissionNames::COMMAND_WHITELIST_LIST, DefaultPermissionNames::COMMAND_WHITELIST_ADD, DefaultPermissionNames::COMMAND_WHITELIST_REMOVE - ])); + ]); } public function execute(CommandSender $sender, string $commandLabel, array $args){