From 2bca755fe74fc9b7cf7a3ab017085e8059b61163 Mon Sep 17 00:00:00 2001 From: crazydeacy Date: Mon, 17 Jan 2022 22:22:06 +0900 Subject: [PATCH] Now available in API 4.0 (TODO: Refactoring) --- plugin.yml | 14 +- .../mydeacy/serverdocument/ServerDocument.php | 16 +-- .../elements/CommandElement.php | 5 +- .../elements/DirectoryElement.php | 6 - .../serverdocument/elements/ElementBase.php | 22 +-- .../serverdocument/elements/FileElement.php | 12 +- .../serverdocument/forms/ContentForm.php | 24 +--- .../serverdocument/forms/ExplorerForm.php | 29 ++-- .../serverdocument/forms/SimpleForm.php | 8 +- .../serverdocument/util/ElementFactory.php | 45 ++++-- .../util/ElementFactoryImpl.php | 54 -------- ...ementManagerImpl.php => ElementLoader.php} | 128 ++++++++---------- .../serverdocument/util/ElementManager.php | 15 -- 13 files changed, 136 insertions(+), 242 deletions(-) delete mode 100644 src/net/mydeacy/serverdocument/util/ElementFactoryImpl.php rename src/net/mydeacy/serverdocument/util/{ElementManagerImpl.php => ElementLoader.php} (81%) delete mode 100644 src/net/mydeacy/serverdocument/util/ElementManager.php diff --git a/plugin.yml b/plugin.yml index b7a18b3..6777ffa 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,10 +1,14 @@ name: ServerDocument -api: [3.9] -version: 1.0.0 +api: [ 4.0.0 ] +version: 1.1.0 main: net\mydeacy\serverdocument\ServerDocument author: MyDeacy description: View text files from server commands: - sd: - description: open document directory. - usage: /sd \ No newline at end of file + sd: + description: open document directory. + usage: /sd + permission: serverdocument.common +permissions: + serverdocument.common: + default: true \ No newline at end of file diff --git a/src/net/mydeacy/serverdocument/ServerDocument.php b/src/net/mydeacy/serverdocument/ServerDocument.php index a44b3bb..7dddc2c 100644 --- a/src/net/mydeacy/serverdocument/ServerDocument.php +++ b/src/net/mydeacy/serverdocument/ServerDocument.php @@ -2,12 +2,12 @@ namespace net\mydeacy\serverdocument; +use Exception; use net\mydeacy\serverdocument\forms\ExplorerForm; -use net\mydeacy\serverdocument\util\ElementManager; -use net\mydeacy\serverdocument\util\ElementManagerImpl; +use net\mydeacy\serverdocument\util\ElementLoader; use pocketmine\command\Command; use pocketmine\command\CommandSender; -use pocketmine\Player; +use pocketmine\player\Player; use pocketmine\plugin\PluginBase; class ServerDocument extends PluginBase { @@ -17,14 +17,14 @@ class ServerDocument extends PluginBase { const READ_ERROR = "Reading of the file failed."; /** - * @var ElementManager + * @var ElementLoader */ - private $manager; + private ElementLoader $manager; - public function onEnable() { + public function onEnable() :void { try { - $this->manager = new ElementManagerImpl($this->getDataFolder() . self::PUBLIC_DIR); - } catch (\Exception $e) { + $this->manager = new ElementLoader($this->getDataFolder() . self::PUBLIC_DIR); + } catch (Exception $e) { $this->getLogger()->critical(self::READ_ERROR); } } diff --git a/src/net/mydeacy/serverdocument/elements/CommandElement.php b/src/net/mydeacy/serverdocument/elements/CommandElement.php index ca31220..bc0d361 100644 --- a/src/net/mydeacy/serverdocument/elements/CommandElement.php +++ b/src/net/mydeacy/serverdocument/elements/CommandElement.php @@ -10,7 +10,7 @@ class CommandElement extends ElementBase implements CommandFile { /** * @var string */ - private $command; + private string $command; /** * CommandElement constructor. @@ -24,9 +24,6 @@ public function __construct(string $title, string $command, ?Directory $director $this->command = $command; } - /** - * @inheritDoc - */ function getCommand() :string { return $this->command; } diff --git a/src/net/mydeacy/serverdocument/elements/DirectoryElement.php b/src/net/mydeacy/serverdocument/elements/DirectoryElement.php index ecd840a..4741bb8 100644 --- a/src/net/mydeacy/serverdocument/elements/DirectoryElement.php +++ b/src/net/mydeacy/serverdocument/elements/DirectoryElement.php @@ -6,12 +6,6 @@ class DirectoryElement extends ElementBase implements Directory { - /** - * DirectoryElement constructor. - * - * @param string $title - * @param Directory|null $directory - */ public function __construct(string $title, ?Directory $directory) { parent::__construct($title, self::BUTTON_IMAGE, $directory); } diff --git a/src/net/mydeacy/serverdocument/elements/ElementBase.php b/src/net/mydeacy/serverdocument/elements/ElementBase.php index 0494728..9b9d1d9 100644 --- a/src/net/mydeacy/serverdocument/elements/ElementBase.php +++ b/src/net/mydeacy/serverdocument/elements/ElementBase.php @@ -9,48 +9,32 @@ abstract class ElementBase { /** * @var string */ - private $buttonImage; + private string $buttonImage; /** * @var string */ - private $title; + private string $title; /** * @var Directory|null */ - private $directory; + private ?Directory $directory; - /** - * ElementBase constructor. - * - * @param string $title - * @param string $buttonImage - * @param Directory|null $directory - */ public function __construct(string $title, string $buttonImage, ?Directory $directory) { $this->buttonImage = $buttonImage; $this->title = $title; $this->directory = $directory; } - /** - * @return string - */ public final function getButtonImage() :string { return $this->buttonImage; } - /** - * @return string - */ public final function getTitle() :string { return $this->title; } - /** - * @return Directory|null - */ public final function getDirectory() :?Directory { return $this->directory; } diff --git a/src/net/mydeacy/serverdocument/elements/FileElement.php b/src/net/mydeacy/serverdocument/elements/FileElement.php index c26fc9c..04ee675 100644 --- a/src/net/mydeacy/serverdocument/elements/FileElement.php +++ b/src/net/mydeacy/serverdocument/elements/FileElement.php @@ -10,23 +10,13 @@ class FileElement extends ElementBase implements TextFile { /** * @var string */ - private $content; + private string $content; - /** - * FileElement constructor. - * - * @param string $title - * @param string $content - * @param Directory|null $directory - */ public function __construct(string $title, string $content, ?Directory $directory) { parent::__construct($title, self::BUTTON_IMAGE, $directory); $this->content = $content; } - /** - * @inheritDoc - */ function getContent() :string { return $this->content; } diff --git a/src/net/mydeacy/serverdocument/forms/ContentForm.php b/src/net/mydeacy/serverdocument/forms/ContentForm.php index a720d34..6bb44c3 100644 --- a/src/net/mydeacy/serverdocument/forms/ContentForm.php +++ b/src/net/mydeacy/serverdocument/forms/ContentForm.php @@ -2,10 +2,10 @@ namespace net\mydeacy\serverdocument\forms; -use net\mydeacy\serverdocument\util\ElementManager; use net\mydeacy\serverdocument\elements\interfaces\TextFile; +use net\mydeacy\serverdocument\util\ElementLoader; use pocketmine\form\Form; -use pocketmine\Player; +use pocketmine\player\Player; class ContentForm implements Form { @@ -15,27 +15,18 @@ class ContentForm implements Form { /** * @var TextFile */ - private $fileElement; + private TextFile $fileElement; /** - * @var ElementManager + * @var ElementLoader */ - private $manager; + private ElementLoader $manager; - /** - * ContentForm constructor. - * - * @param TextFile $fileElement - * @param ElementManager $manager - */ - public function __construct(TextFile $fileElement, ElementManager $manager) { + public function __construct(TextFile $fileElement, ElementLoader $manager) { $this->fileElement = $fileElement; $this->manager = $manager; } - /** - * @inheritDoc - */ public function handleResponse(Player $player, $data) :void { if (!isset($data)) { return; @@ -43,9 +34,6 @@ public function handleResponse(Player $player, $data) :void { $player->sendForm(new ExplorerForm($this->fileElement->getDirectory(), $this->manager)); } - /** - * @inheritDoc - */ public function jsonSerialize() { $form = (new SimpleForm()) ->setTitle($this->fileElement->getTitle()) diff --git a/src/net/mydeacy/serverdocument/forms/ExplorerForm.php b/src/net/mydeacy/serverdocument/forms/ExplorerForm.php index 16ee9a5..45c37eb 100644 --- a/src/net/mydeacy/serverdocument/forms/ExplorerForm.php +++ b/src/net/mydeacy/serverdocument/forms/ExplorerForm.php @@ -6,9 +6,9 @@ use net\mydeacy\serverdocument\elements\interfaces\Directory; use net\mydeacy\serverdocument\elements\interfaces\Element; use net\mydeacy\serverdocument\elements\interfaces\TextFile; -use net\mydeacy\serverdocument\util\ElementManager; +use net\mydeacy\serverdocument\util\ElementLoader; use pocketmine\form\Form; -use pocketmine\Player; +use pocketmine\player\Player; use pocketmine\Server; class ExplorerForm implements Form { @@ -19,39 +19,30 @@ class ExplorerForm implements Form { /** * @var Element[] */ - private $elements = []; + private array $elements = []; /** * @var Directory|null */ - private $directory; + private ?Directory $directory; /** - * @var ElementManager + * @var ElementLoader */ - private $manager; + private ElementLoader $manager; /** * @var bool */ - private $isBaseDir; + private bool $isBaseDir; - /** - * ExplorerForm constructor. - * - * @param Directory|null $directory - * @param ElementManager $manager - */ - public function __construct(?Directory $directory, ElementManager $manager) { + public function __construct(?Directory $directory, ElementLoader $manager) { $this->directory = $directory; $this->isBaseDir = !isset($directory); $this->elements = $manager->getFilesByDirectory($directory); $this->manager = $manager; } - /** - * @inheritDoc - */ public function handleResponse(Player $player, $data) :void { if (!isset($data)) { return; @@ -60,7 +51,6 @@ public function handleResponse(Player $player, $data) :void { if ($select === -1 && !$this->isBaseDir) { $beforeDir = $this->isBaseDir ? null : $this->directory->getDirectory(); $player->sendForm(new ExplorerForm($beforeDir, $this->manager)); - return; } else { $element = $this->elements[$select]; if ($element instanceof TextFile) { @@ -73,9 +63,6 @@ public function handleResponse(Player $player, $data) :void { } } - /** - * @inheritDoc - */ public function jsonSerialize() { $form = new SimpleForm(); $head = $this->isBaseDir ? "/" : $this->directory->getTitle(); diff --git a/src/net/mydeacy/serverdocument/forms/SimpleForm.php b/src/net/mydeacy/serverdocument/forms/SimpleForm.php index fb5ae82..e8bd712 100644 --- a/src/net/mydeacy/serverdocument/forms/SimpleForm.php +++ b/src/net/mydeacy/serverdocument/forms/SimpleForm.php @@ -7,7 +7,7 @@ class SimpleForm { /** * @var string[] */ - private $formData = []; + private array $formData = []; public function __construct() { $this->formData = [ @@ -18,17 +18,17 @@ public function __construct() { ]; } - public function setTitle(String $title) { + public function setTitle(string $title) :static { $this->formData["title"] = $title; return $this; } - public function setContent(String $text) { + public function setContent(string $text) :static { $this->formData["content"] = $text; return $this; } - public function addButton(String $text, $image = null) { + public function addButton(string $text, $image = null) :static { if ($image !== null) { $this->formData["buttons"][] = [ "text" => $text, diff --git a/src/net/mydeacy/serverdocument/util/ElementFactory.php b/src/net/mydeacy/serverdocument/util/ElementFactory.php index 58f79b3..abda9f5 100644 --- a/src/net/mydeacy/serverdocument/util/ElementFactory.php +++ b/src/net/mydeacy/serverdocument/util/ElementFactory.php @@ -2,17 +2,44 @@ namespace net\mydeacy\serverdocument\util; +use net\mydeacy\serverdocument\elements\CommandElement; +use net\mydeacy\serverdocument\elements\DirectoryElement; +use net\mydeacy\serverdocument\elements\FileElement; use net\mydeacy\serverdocument\elements\interfaces\Directory; use net\mydeacy\serverdocument\elements\interfaces\Element; +use pocketmine\utils\Config; -interface ElementFactory { +class ElementFactory { - /** - * @param string $fileName - * @param string $dir - * @param Directory|null $directory - * - * @return Element|null - */ - function createElement(string $fileName, string $dir, ?Directory $directory) :?Element; + public function createElement(string $fileName, string $dir, ?Directory $directory) :?Element { + $element = null; + $fullPath = $dir . $fileName; + if (is_file($fullPath)) { + switch (pathinfo($fullPath)["extension"] ?? "") { + case "txt": + $content = preg_replace('/(\r\n|\r|\n)/s', "\n", file_get_contents($fullPath)); + $element = new FileElement(pathinfo($fullPath)["filename"], $content, $directory); + break; + case "yml": + $element = $this->createByYaml($fullPath, $directory); + break; + } + } elseif (is_dir($fullPath)) { + $element = new DirectoryElement($fileName, $directory); + } + return $element; + } + + private function createByYaml(string $fullPath, ?Directory $directory) :Element { + $config = new Config($fullPath, CONFIG::YAML); + switch ($config->get("type", "")) { + case "command": + $command = $config->get("cmd-body", ""); + $element = new CommandElement(pathinfo($fullPath)["filename"], $command, $directory); + break; + default: + $element = null; + } + return $element; + } } \ No newline at end of file diff --git a/src/net/mydeacy/serverdocument/util/ElementFactoryImpl.php b/src/net/mydeacy/serverdocument/util/ElementFactoryImpl.php deleted file mode 100644 index 08a2318..0000000 --- a/src/net/mydeacy/serverdocument/util/ElementFactoryImpl.php +++ /dev/null @@ -1,54 +0,0 @@ -createByYaml($fullPath, $directory); - break; - } - } elseif (is_dir($fullPath)) { - $element = new DirectoryElement($fileName, $directory); - } - return $element; - } - - /** - * @param string $fullPath - * @param Directory|null $directory - * - * @return Element - */ - private function createByYaml(string $fullPath, ?Directory $directory) :Element { - $config = new Config($fullPath, CONFIG::YAML); - switch ($config->get("type", "")) { - case "command": - $command = $config->get("cmd-body", ""); - $element = new CommandElement(pathinfo($fullPath)["filename"], $command, $directory); - break; - default: - $element = null; - } - return $element; - } -} \ No newline at end of file diff --git a/src/net/mydeacy/serverdocument/util/ElementManagerImpl.php b/src/net/mydeacy/serverdocument/util/ElementLoader.php similarity index 81% rename from src/net/mydeacy/serverdocument/util/ElementManagerImpl.php rename to src/net/mydeacy/serverdocument/util/ElementLoader.php index 9f35cf9..d7cca0a 100644 --- a/src/net/mydeacy/serverdocument/util/ElementManagerImpl.php +++ b/src/net/mydeacy/serverdocument/util/ElementLoader.php @@ -1,69 +1,61 @@ -loadElements(null, $baseDir, new ElementFactoryImpl()); - arsort($this->elements); - uasort($this->elements, function($a, $b) { - return $a instanceof Directory && !$b instanceof Directory ? -1 : 1; - }); - } - - /** - * @inheritDoc - */ - public function getFilesByDirectory(?Directory $directory) :array { - $list = []; - foreach ($this->elements as $element) { - if ($element->getDirectory() === $directory) { - $list[] = $element; - } - } - return $list; - } - - /** - * @param Directory|null $directory - * @param string $dir - * @param ElementFactory $factory - */ - private function loadElements(?Directory $directory, string $dir, ElementFactory $factory) :void { - if (!isset($directory)) { - $this->elements = []; - } - $dir .= (isset($directory) ? $directory->getTitle() . "/" : "/"); - $files = scandir($dir); - foreach ($files as $fileName) { - if ($fileName === "." || $fileName === "..") { - continue; - } - $element = $factory->createElement($fileName, $dir, $directory); - if ($element === null) { - continue; - } - $this->elements[] = $element; - if ($element instanceof Directory) { - $this->loadElements($element, $dir, $factory); - } - } - } +loadElements(null, $baseDir, new ElementFactory()); + arsort($this->elements); + uasort($this->elements, function($a, $b) { + return $a instanceof Directory && !$b instanceof Directory ? -1 : 1; + }); + } + + public function getFilesByDirectory(?Directory $directory) :array { + $list = []; + foreach ($this->elements as $element) { + if ($element->getDirectory() === $directory) { + $list[] = $element; + } + } + return $list; + } + + /** + * @param Directory|null $directory + * @param string $dir + * @param ElementFactory $factory + */ + private function loadElements(?Directory $directory, string $dir, ElementFactory $factory) :void { + if (!isset($directory)) { + $this->elements = []; + } + $dir .= (isset($directory) ? $directory->getTitle() . "/" : "/"); + $files = scandir($dir); + foreach ($files as $fileName) { + if ($fileName === "." || $fileName === "..") { + continue; + } + $element = $factory->createElement($fileName, $dir, $directory); + if ($element === null) { + continue; + } + $this->elements[] = $element; + if ($element instanceof Directory) { + $this->loadElements($element, $dir, $factory); + } + } + } } \ No newline at end of file diff --git a/src/net/mydeacy/serverdocument/util/ElementManager.php b/src/net/mydeacy/serverdocument/util/ElementManager.php deleted file mode 100644 index b65894d..0000000 --- a/src/net/mydeacy/serverdocument/util/ElementManager.php +++ /dev/null @@ -1,15 +0,0 @@ -