diff --git a/src/plugin/PluginBase.php b/src/plugin/PluginBase.php index d5460cf37..db29c40da 100644 --- a/src/plugin/PluginBase.php +++ b/src/plugin/PluginBase.php @@ -38,10 +38,6 @@ use function dirname; use function fclose; use function file_exists; use function fopen; -use function gettype; -use function is_array; -use function is_bool; -use function is_string; use function mkdir; use function rtrim; use function stream_copy_to_stream; @@ -171,47 +167,34 @@ abstract class PluginBase implements Plugin, CommandExecutor{ $this->logger->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_commandError($key, $this->getDescription()->getFullName()))); continue; } - if(is_array($data)){ //TODO: error out if it isn't - $newCmd = new PluginCommand($key, $this, $this); - if(isset($data["description"])){ - $newCmd->setDescription($data["description"]); - } - if(isset($data["usage"])){ - $newCmd->setUsage($data["usage"]); - } + $newCmd = new PluginCommand($key, $this, $this); + if(($description = $data->getDescription()) !== null){ + $newCmd->setDescription($description); + } - if(isset($data["aliases"]) and is_array($data["aliases"])){ - $aliasList = []; - foreach($data["aliases"] as $alias){ - if(strpos($alias, ":") !== false){ - $this->logger->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_aliasError($alias, $this->getDescription()->getFullName()))); - continue; - } - $aliasList[] = $alias; - } + if(($usageMessage = $data->getUsageMessage()) !== null){ + $newCmd->setUsage($usageMessage); + } - $newCmd->setAliases($aliasList); - } - - if(isset($data["permission"])){ - if(is_string($data["permission"])){ - $newCmd->setPermission($data["permission"]); - }else{ - $this->logger->error("Permission must be a string, " . gettype($data["permission"]) . " given for command $key"); - continue; - } - }else{ - $this->logger->error("No permission set for command $key"); + $aliasList = []; + foreach($data->getAliases() as $alias){ + if(strpos($alias, ":") !== false){ + $this->logger->error($this->server->getLanguage()->translate(KnownTranslationFactory::pocketmine_plugin_aliasError($alias, $this->getDescription()->getFullName()))); continue; } - - if(isset($data["permission-message"])){ - $newCmd->setPermissionMessage($data["permission-message"]); - } - - $pluginCmds[] = $newCmd; + $aliasList[] = $alias; } + + $newCmd->setAliases($aliasList); + + $newCmd->setPermission($data->getPermission()); + + if(($permissionDeniedMessage = $data->getPermissionDeniedMessage()) !== null){ + $newCmd->setPermissionMessage($permissionDeniedMessage); + } + + $pluginCmds[] = $newCmd; } if(count($pluginCmds) > 0){ diff --git a/src/plugin/PluginDescription.php b/src/plugin/PluginDescription.php index 090be61b1..0e34da74a 100644 --- a/src/plugin/PluginDescription.php +++ b/src/plugin/PluginDescription.php @@ -29,6 +29,7 @@ use pocketmine\permission\PermissionParserException; use function array_map; use function array_values; use function is_array; +use function is_string; use function phpversion; use function preg_match; use function str_replace; @@ -70,8 +71,8 @@ class PluginDescription{ /** @var string */ private $version; /** - * @var mixed[][] - * @phpstan-var array> + * @var PluginDescriptionCommandEntry[] + * @phpstan-var array */ private $commands = []; /** @var string */ @@ -123,7 +124,24 @@ class PluginDescription{ $this->compatibleOperatingSystems = array_map("\strval", (array) ($plugin["os"] ?? [])); if(isset($plugin["commands"]) and is_array($plugin["commands"])){ - $this->commands = $plugin["commands"]; + foreach($plugin["commands"] as $commandName => $commandData){ + if(!is_string($commandName)){ + throw new PluginDescriptionParseException("Invalid Plugin commands, key must be the name of the command"); + } + if(!is_array($commandData)){ + throw new PluginDescriptionParseException("Command $commandName has invalid properties"); + } + if(!isset($commandData["permission"]) || !is_string($commandData["permission"])){ + throw new PluginDescriptionParseException("Command $commandName does not have a permission set"); + } + $this->commands[$commandName] = new PluginDescriptionCommandEntry( + $commandData["description"] ?? null, + $commandData["usage"] ?? null, + $commandData["aliases"] ?? [], + $commandData["permission"], + $commandData["permission-message"] ?? null + ); + } } if(isset($plugin["depend"])){ @@ -221,8 +239,8 @@ class PluginDescription{ } /** - * @return mixed[][] - * @phpstan-return array> + * @return PluginDescriptionCommandEntry[] + * @phpstan-return array */ public function getCommands() : array{ return $this->commands; diff --git a/src/plugin/PluginDescriptionCommandEntry.php b/src/plugin/PluginDescriptionCommandEntry.php new file mode 100644 index 000000000..b9b618e8a --- /dev/null +++ b/src/plugin/PluginDescriptionCommandEntry.php @@ -0,0 +1,53 @@ + $aliases + */ + public function __construct( + private ?string $description, + private ?string $usageMessage, + private array $aliases, + private string $permission, + private ?string $permissionDeniedMessage, + ){} + + public function getDescription() : ?string{ return $this->description; } + + public function getUsageMessage() : ?string{ return $this->usageMessage; } + + /** + * @return string[] + * @phpstan-return list + */ + public function getAliases() : array{ return $this->aliases; } + + public function getPermission() : string{ return $this->permission; } + + public function getPermissionDeniedMessage() : ?string{ return $this->permissionDeniedMessage; } +}