diff --git a/src/pocketmine/plugin/DiskResourceProvider.php b/src/pocketmine/plugin/DiskResourceProvider.php new file mode 100644 index 000000000..09a703f43 --- /dev/null +++ b/src/pocketmine/plugin/DiskResourceProvider.php @@ -0,0 +1,83 @@ +file = rtrim($path, "/\\") . "/"; + } + + /** + * Gets an embedded resource on the plugin file. + * WARNING: You must close the resource given using fclose() + * + * @param string $filename + * + * @return null|resource Resource data, or null + */ + public function getResource(string $filename){ + $filename = rtrim(str_replace("\\", "/", $filename), "/"); + if(file_exists($this->file . "/resources/" . $filename)){ + return fopen($this->file . "/resources/" . $filename, "rb"); + } + + return null; + } + + /** + * Returns all the resources packaged with the plugin in the form ["path/in/resources" => SplFileInfo] + * + * @return \SplFileInfo[] + */ + public function getResources() : array{ + $resources = []; + if(is_dir($this->file . "resources/")){ + foreach(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->file . "resources/")) as $resource){ + if($resource->isFile()){ + $path = str_replace(DIRECTORY_SEPARATOR, "/", substr((string) $resource, strlen($this->file . "resources/"))); + $resources[$path] = $resource; + } + } + } + + return $resources; + } +} diff --git a/src/pocketmine/plugin/Plugin.php b/src/pocketmine/plugin/Plugin.php index a25a549cb..9813061be 100644 --- a/src/pocketmine/plugin/Plugin.php +++ b/src/pocketmine/plugin/Plugin.php @@ -34,7 +34,7 @@ use pocketmine\Server; */ interface Plugin{ - public function __construct(PluginLoader $loader, Server $server, PluginDescription $description, string $dataFolder, string $file); + public function __construct(PluginLoader $loader, Server $server, PluginDescription $description, string $dataFolder, string $file, ResourceProvider $resourceProvider); /** * @return bool diff --git a/src/pocketmine/plugin/PluginBase.php b/src/pocketmine/plugin/PluginBase.php index 66a267abb..27819d4fc 100644 --- a/src/pocketmine/plugin/PluginBase.php +++ b/src/pocketmine/plugin/PluginBase.php @@ -39,18 +39,13 @@ use function fopen; use function gettype; use function is_array; use function is_bool; -use function is_dir; use function is_string; use function mkdir; use function rtrim; -use function str_replace; use function stream_copy_to_stream; -use function strlen; use function strpos; use function strtolower; -use function substr; use function trim; -use const DIRECTORY_SEPARATOR; abstract class PluginBase implements Plugin, CommandExecutor{ @@ -81,15 +76,20 @@ abstract class PluginBase implements Plugin, CommandExecutor{ /** @var TaskScheduler */ private $scheduler; - public function __construct(PluginLoader $loader, Server $server, PluginDescription $description, string $dataFolder, string $file){ + /** @var ResourceProvider */ + private $resourceProvider; + + public function __construct(PluginLoader $loader, Server $server, PluginDescription $description, string $dataFolder, string $file, ResourceProvider $resourceProvider){ $this->loader = $loader; $this->server = $server; $this->description = $description; $this->dataFolder = rtrim($dataFolder, "\\/") . "/"; + //TODO: this is accessed externally via reflection, not unused $this->file = rtrim($file, "\\/") . "/"; $this->configFile = $this->dataFolder . "config.yml"; $this->logger = new PluginLogger($this); $this->scheduler = new TaskScheduler($this->getFullName()); + $this->resourceProvider = $resourceProvider; $this->onLoad(); @@ -263,12 +263,7 @@ abstract class PluginBase implements Plugin, CommandExecutor{ * @return null|resource Resource data, or null */ public function getResource(string $filename){ - $filename = rtrim(str_replace("\\", "/", $filename), "/"); - if(file_exists($this->file . "resources/" . $filename)){ - return fopen($this->file . "resources/" . $filename, "rb"); - } - - return null; + return $this->resourceProvider->getResource($filename); } /** @@ -309,17 +304,7 @@ abstract class PluginBase implements Plugin, CommandExecutor{ * @return \SplFileInfo[] */ public function getResources() : array{ - $resources = []; - if(is_dir($this->file . "resources/")){ - foreach(new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->file . "resources/")) as $resource){ - if($resource->isFile()){ - $path = str_replace(DIRECTORY_SEPARATOR, "/", substr((string) $resource, strlen($this->file . "resources/"))); - $resources[$path] = $resource; - } - } - } - - return $resources; + return $this->resourceProvider->getResources(); } /** diff --git a/src/pocketmine/plugin/PluginManager.php b/src/pocketmine/plugin/PluginManager.php index 8715df2a0..2aeadc14b 100644 --- a/src/pocketmine/plugin/PluginManager.php +++ b/src/pocketmine/plugin/PluginManager.php @@ -183,7 +183,7 @@ class PluginManager{ * @var Plugin $plugin * @see Plugin::__construct() */ - $plugin = new $mainClass($loader, $this->server, $description, $dataFolder, $prefixed); + $plugin = new $mainClass($loader, $this->server, $description, $dataFolder, $prefixed, new DiskResourceProvider($prefixed . "/")); $this->plugins[$plugin->getDescription()->getName()] = $plugin; return $plugin; diff --git a/src/pocketmine/plugin/ResourceProvider.php b/src/pocketmine/plugin/ResourceProvider.php new file mode 100644 index 000000000..2e4a3e0f0 --- /dev/null +++ b/src/pocketmine/plugin/ResourceProvider.php @@ -0,0 +1,43 @@ + SplFileInfo] + * + * @return \SplFileInfo[] + */ + public function getResources() : array; +}