diff --git a/config.yml b/config.yml index 362909b..79b70ba 100644 --- a/config.yml +++ b/config.yml @@ -13,10 +13,11 @@ index: index.html denied-pages: [] # Your domains (one per time). To redirect a domain here, put one per line then go to your registar CPanel and add a CName record that redirects to it ! -Domains: [] +Domains: ["localhost"] #Parked domains: Domains that redirects to one of your domains. Same setup as shown above. -Parked domains: [] +Parked domains: + 127.0.0.1: localhost # Here you can choose if the server automaticly disable itself on server stop. diff --git a/index.html b/index.html deleted file mode 100644 index 6a7d8ff..0000000 --- a/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - -Welcome to your new website ! - - -

Welcome to your new website ! You can edit it in your new folder !

- - \ No newline at end of file diff --git a/plugin.yml b/plugin.yml index 80c2242..4834e6c 100644 --- a/plugin.yml +++ b/plugin.yml @@ -2,9 +2,10 @@ name: Online author: Ad5001 version: 1.6 -api: [2.0.0] +api: [2.0.0, 3.0.0, 3.0.0-ALPHA1, 3.0.0-ALPHA2, 3.0.0-ALPHA3,] description: "You're own website, on PocketMine.'" main: Ad5001\Online\Main +load: STARTUP commands: [] permissions: [] ... \ No newline at end of file diff --git a/resources/handler.php b/resources/handler.php index 2ba78c0..082e69c 100644 --- a/resources/handler.php +++ b/resources/handler.php @@ -5,7 +5,26 @@ Copyright (C) Ad5001 2016 All rights reserved. Do not attemped to modify this file if you're not sure on how it works. This file process 404, 403 requests, custom index and some other stuff. */ -$cfg = yaml_parse(file_get_contents(__DIR__ . "/config.yml")); + +// Definitions +$cfg = yaml_parse(file_get_contents(__DIR__ . "/../config.yml")); +$args = json_decode(file_get_contents(__DIR__ . "/args"), true); +$_POCKETMINE = $args["POCKETMINE"]; +$_PLUGINS = $args["PLUGINS"]; +$_PLAYERS = $args["PLAYERS"]; +$_LEVELS = $args["LEVELS"]; + + +// Calling handlers. +foreach($args["HANDLERS"] as $handler) { + // echo $handler; + if((include $handler) == false) { + return true; + } +} + + +// Domains parsing $host = $_SERVER["HTTP_HOST"]; if(isset($cfg["Parked domains"][$host])) { $host = $cfg["Parked domains"][$host]; @@ -16,21 +35,27 @@ if(in_array($host, $cfg["Domains"])) { unallowedDomain(); return true; } + + +// Removing GET from the request $uri = $_SERVER["REQUEST_URI"]; if(strpos($uri, "?") !== false) { $uri = explode("?", $uri)[0]; } -if(!file_exists(__DIR__ . "/" . $uri)) { - echo file_get_contents(__DIR__ . "/" . $host . "/" . $cfg[404]); -} elseif(in_array($uri, yaml_parse(file_get_contents(__DIR__ . "/config.yml"))["denied-pages"])) { - echo file_get_contents(__DIR__ . "/" . $host . "/" . $cfg[403]); -} elseif(is_dir(__DIR__ . "/" .$uri)) { - if(file_exists(__DIR__ . "/" . $uri . "index.html")) { - include(__DIR__ . "/" . $uri . "index.html"); - } elseif(file_exists(__DIR__ . "/" . $uri . "index.php")) { - include(__DIR__ . "/" . $uri . "index.php"); - } elseif(file_exists(__DIR__ . "/" . $uri . $cfg["index"])) { - include(__DIR__ . "/" . $uri . $cfg["index"]); + + +// Getting the file & output it if possible. +if(!file_exists(__DIR__ . "/../" . $uri)) { + echo file_get_contents(__DIR__ . "/../" . $host . "/" . $cfg[404]); +} elseif(in_array($uri, $cfg["denied-pages"])) { + echo file_get_contents(__DIR__ . "/../" . $host . "/" . $cfg[403]); +} elseif(is_dir(__DIR__ . "/../" .$uri)) { + if(file_exists(__DIR__ . "/../" . $uri . "index.html")) { + include(__DIR__ . "/../" . $uri . "index.html"); + } elseif(file_exists(__DIR__ . "/../" . $uri . "index.php")) { + include(__DIR__ . "/../" . $uri . "index.php"); + } elseif(file_exists(__DIR__ . "/../" . $uri . $cfg["index"])) { + include(__DIR__ . "/../" . $uri . $cfg["index"]); } } else { include(__DIR__ . "/" . $uri); @@ -42,28 +67,29 @@ function unallowedDomain() { echo << + - +
-

Unallowed domain


+

Unallowed domain


This IP does not have any domain on this machine. Please refer to your server administartor if you think it's an error.

-

Online 1.5 - Eclipse edition

+

Online 1.6 - Eclipse edition

A; diff --git a/src/Ad5001/Online/Main.php b/src/Ad5001/Online/Main.php index b08b48a..5376b1e 100644 --- a/src/Ad5001/Online/Main.php +++ b/src/Ad5001/Online/Main.php @@ -10,60 +10,119 @@ use pocketmine\Player; class Main extends PluginBase{ -public function onEnable(){ -$this->saveDefaultConfig(); -if(!stream_resolve_include_path("router.php")) { - file_put_contents($this->getDataFolder() . "router.php", $this->getResource("handler.php")); -} -foreach($this->getConfig()->get("Domains") as $d) { - @mkdir($this->getDataFolder() . $d); - if(!file_exists($this->getDataFolder() . $d . "/index.html") and !file_exists($this->getDataFolder() . $d . "/index.php")) { - file_put_contents($this->getDataFolder() .$d. "/index.html", $this->getResource("index.html")); + protected $handlers; + protected $arguments; + + + public function onEnable(){ + $this->saveDefaultConfig(); + $this->handlers = []; + $this->arguments = []; + + + $this->getServer()->getScheduler()->scheduleRepeatingTask($task = new ArgFillTask($this), 20*10); + @mkdir($this->getDataFolder() . "tmp"); + $task->onRun(0); + + if(!file_exists($this->getDataFolder() . "tmp/router.php")) { + file_put_contents($this->getDataFolder() . "tmp/router.php", $this->getResource("handler.php")); + } + foreach($this->getConfig()->get("Domains") as $d) { + @mkdir($this->getDataFolder() . $d); + if(!file_exists($this->getDataFolder() . $d . "/index.html") and !file_exists($this->getDataFolder() . $d . "/index.php")) { + file_put_contents($this->getDataFolder() .$d. "/index.html", $this->getResource("index.html")); + } + if(!file_exists($this->getDataFolder() .$d. "/404.html")) { + file_put_contents($this->getDataFolder() . $d . "/404.html", $this->getResource("404.html")); + } + if(!file_exists($this->getDataFolder() . $d . "/403.html")) { + file_put_contents($this->getDataFolder() .$d . "/403.html", $this->getResource("403.html")); + } + } + + + set_time_limit(0); + + $this->port = $this->getConfig()->get("port"); + + if(!UPnP::PortForward($this->port)) {// Beta for Windows + $this->getLogger()->info("Not able to port forward!"); + } + + $this->getServer()->getScheduler()->scheduleAsyncTask(new execTask($this->getServer()->getFilePath())); } - if(!file_exists($this->getDataFolder() .$d. "/404.html")) { - file_put_contents($this->getDataFolder() . $d . "/404.html", $this->getResource("404.html")); - } - if(!file_exists($this->getDataFolder() . $d . "/403.html")) { - file_put_contents($this->getDataFolder() .$d . "/403.html", $this->getResource("403.html")); - } -} -register_shutdown_function("Ad5001\\Online\\Main::shutdown"); - -set_time_limit(0); - -$this->port = $this->getConfig()->get("port"); - -if(!UPnP::PortForward($this->port)) {// Beta for Windows - $this->getLogger()->info("Not able to port forward!"); -} - -$this->getServer()->getScheduler()->scheduleAsyncTask(new execTask($this->getServer()->getFilePath())); -} - -public static function shutdown() { - echo "Shutdowned !"; -} - -public function onDisable() { - if($this->getConfig()->get("KillOnShutdown") !== "false") { - $this->getLogger()->info("Shutdowning....."); - switch(true) { - case stristr(PHP_OS, "WIN"): - shell_exec('FOR /F "tokens=5" %P IN (\'netstat -a -n -o ^| findstr 0.0.0.0:'. $this->port .'\') DO TaskKill.exe /F /PID %P'); - $this->getLogger()->info("Shutdowned on Windows !"); - break; - case stristr(PHP_OS, "DAR") or stristr(PHP_OS, "LINUX"): - shell_exec("kill -kill `lsof -t -i tcp:$this->port`"); - $this->getLogger()->info("Shutdowned on Linux or MAC !"); - break; + public function onDisable() { + if($this->getConfig()->get("KillOnShutdown") !== "false") { + $this->getLogger()->info("Shutdowning....."); + switch(true) { + case stristr(PHP_OS, "WIN"): + shell_exec('FOR /F "tokens=5" %P IN (\'netstat -a -n -o ^| findstr 0.0.0.0:'. $this->port .'\') DO TaskKill.exe /F /PID %P'); + $this->getLogger()->info("Shutdowned on Windows !"); + break; + case stristr(PHP_OS, "DAR") or stristr(PHP_OS, "LINUX"): + shell_exec("kill -kill `lsof -t -i tcp:$this->port`"); + $this->getLogger()->info("Shutdowned on Linux or MAC !"); + break; + } } } - -} + + + /* + Adds a PHP handler + @param $path string + @return bool + */ + public function addHandler(string $path) : bool { + if(file_exists($path)) { + $this->handlers[$path] = $path; + return true; + } + return false; + } + + + /* + Return an array with all handlers + @return array + */ + public function getHandlers() : array { + return $this->handlers; + } + + + /* + Sets a plugin argument + @param $plugin \pocketmine\plugin\Plugin + @param $id string + @param $value mixed + @return bool + */ + public function setArgument(\pocketmine\plugin\Plugin $plugin, string $id, $value) : bool { + if(!isset($this->arguments[$plugin->getName()])) $this->arguments[$plugin->getName()] = []; + $this->arguments[$plugin->getName()][$id] = $value; + return true; + } + + + /* + Gets a plugin arguments + @param $plugin \pocketmine\plugin\Plugin + @return array + */ + public function getArguments(\pocketmine\plugin\Plugin $plugin) : array { + return isset($this->arguments[$plugin->getName()]) ? $this->arguments[$plugin->getName()] : []; + } + + + } + + + /** * Setting rguments for the pocketine infos */ @@ -74,8 +133,9 @@ class ArgFillTask extends \pocketmine\scheduler\PluginTask { @param $main Main */ public function __construct(Main $main) { + parent::__construct($main); $this->main = $main; - $this->server = $server; + $this->server = $main->getServer(); } /* @@ -83,14 +143,121 @@ class ArgFillTask extends \pocketmine\scheduler\PluginTask { @param $tick mixed */ public function onRun($tick) { - $args = []; + $server = $this->server; + $pmargs = []; + $pluginsargs = []; + $players = []; + $levels = []; // Filling the arguments - + + // 1. Pocketmine + $pmargs["software_name"] = $server->getName(); + $pmargs["software_codename"] = $server->getCodename(); + $pmargs["software_version"] = $server->getPocketmineVersion(); + $pmargs["mcpe_version"] = $server->getVersion(); + $pmargs["API"] = $server->getApiVersion(); + $pmargs["software_datapath"] = $server->getDataPath(); + $pmargs["software_pluginpath"] = $server->getPluginPath(); + $pmargs["max_players"] = $server->getMaxPlayers(); + $pmargs["port"] = $server->getPort(); + $pmargs["view_distance"] = $server->getViewDistance(); + $pmargs["ip"] = $server->getIp(); + $pmargs["server_unique_id"] = $server->getServerUniqueId(); + $pmargs["auto_save"] = $server->getAutoSave(); + $pmargs["default_gamemode"] = $server->getGamemode(); + $pmargs["force_gamemode"] = $server->getForceGamemode(); + $pmargs["difficulty"] = $server->getDifficulty(); + $pmargs["spawn_radius"] = $server->getSpawnRadius(); + $pmargs["allow_flight"] = $server->getAllowFlight(); + $pmargs["ultra_hardcore"] = $server->isHardcore(); + $pmargs["motd"] = $server->getMotd(); + $pmargs["tps"] = $server->getTicksPerSecond(); + $pmargs["lang_name"] = $server->getLanguage()->getName(); + $pmargs["lang_code"] = $server->getLanguage()->getLang(); + + // 2. Plugins + foreach($server->getPluginManager()->getPlugins() as $plugin) { + $pl = []; + $pl["name"] = $plugin->getName(); + $pl["is_enabled"] = $plugin->isEnabled(); + $pl["data_folder"] = $plugin->getDataFolder(); + $pl["apis"] = $plugin->getDescription()->getCompatibleApis(); + $pl["authors"] = $plugin->getDescription()->getAuthors(); + $pl["prefix"] = $plugin->getDescription()->getPrefix(); + $pl["commands"] = $plugin->getDescription()->getCommands(); + $pl["dependencies"] = $plugin->getDescription()->getDepend(); + $pl["description"] = $plugin->getDescription()->getDescription(); + $pl["load_before"] = $plugin->getDescription()->getLoadBefore(); + $pl["main"] = $plugin->getDescription()->getMain(); + $pl["order"] = $plugin->getDescription()->getOrder(); + $pl["soft_depend"] = $plugin->getDescription()->getSoftDepend(); + $pl["version"] = $plugin->getDescription()->getVersion(); + $pl["website"] = $plugin->getDescription()->getWebsite(); + foreach($this->main->getArguments($plugin) as $name => $arg) { + if(!isset($pl[$name])) { + $pl[$name] = $arg; + } + } + $pluginsargs[$plugin->getName()] = $pl; + } + + + // 3. Players + foreach ($server->getOnlinePlayers() as $player) { + $pl = []; + $pl["client_secret"] = $player->getClientSecret(); + $pl["banned"] = $player->isBanned(); // I don't know if tis could be to false but we never know xD + $pl["whitelisted"] = $player->isWhitelisted(); + $pl["client_secret"] = $player->getClientSecret(); + $pl["first_played"] = $player->getFirstPlayed(); + $pl["last_played"] = $player->getLastPlayed(); + $pl["played_before"] = $player->hasPlayedBefore(); + $pl["allow_flight"] = $player->getAllowFlight(); + $pl["flying"] = $player->isFlying(); + $pl["auto_jump"] = $player->hasAutoJump(); + $pl["op"] = $player->isOp(); + $pl["connected"] = $player->isConnected(); + $pl["display_name"] = $player->getDisplayName(); + $pl["ip"] = $player->getAddress(); + $pl["port"] = $player->getPort(); + $pl["is_sleeping"] = $player->isSleeping(); + $pl["ticks_in_air"] = $player->getInAirTicks(); + $pl["gamemode"] = $player->getGamemode(); + $pl["name"] = $player->getName(); + $pl["loader_id"] = $player->getLoaderId(); + $players[$player->getName()] = $pl; + } + + + // 4.Levels + foreach ($server->getLevels() as $level) { + $lvl = []; + $lvl["tick_rate"] = $level->getTickRate(); + $lvl["id"] = $level->getId(); + $lvl["auto_save"] = $level->getAutoSave(); + $lvl["tick_rate"] = $level->getTickRate(); + $lvl["players"] = []; + foreach ($level->getPlayers() as $pl) { + $lvl["players"][$pl->getName()] = $players[$pl->getName()]; + } + $lvl["time"] = $level->getTime(); + $lvl["name"] = $level->getName(); + $lvl["folder_name"] = $level->getFolderName(); + $lvl["seed"] = $level->getSeed(); + $levels[$lvl["name"]] = $lvl; + } + + file_put_contents($this->main->getDataFolder() . "tmp/args", json_encode(["POCKETMINE" => $pmargs, "PLUGINS" => $pluginsargs, "PLAYERS" => $players, "LEVELS" => $levels, "HANDLERS" => $this->main->getHandlers()])); } } + + + + + class execTask extends \pocketmine\scheduler\AsyncTask { public function __construct(string $path) { @@ -103,13 +270,13 @@ class execTask extends \pocketmine\scheduler\AsyncTask { switch(true) { case stristr(PHP_OS, "WIN"): // echo '"%CD%\\bin\\php\\php.exe -t %CD%\\plugins\\Online -n -d include_path=\'%CD%\\plugins\\Online\\\' -S ' . $address . ":" . $port . ' -f %CD%\\plugins\\Online\\router.php"'; - shell_exec('start /MIN cmd /c "%CD%\\bin\\php\\php.exe -t %CD%\\plugins\\Online -n -d include_path=\'%CD%\\plugins\\Online\\\' -d extension=\'%CD%\\bin\\php\\ext\\php_yaml.dll\' -S ' . $address . ":" . $port . ' router.php"'); + shell_exec('start /MIN cmd /c "%CD%\\bin\\php\\php.exe -t %CD%\\plugins\\Online -n -d include_path=\'%CD%\\plugins\\Online\\\' -d extension=\'%CD%\\bin\\php\\ext\\php_yaml.dll\' -S ' . $address . ":" . $port . ' tmp/router.php"'); break; case stristr(PHP_OS, "DAR"): - shell_exec('open -a Terminal "' . $this->path . "bin\\php\\php.exe -t " . $this->path . "plugins\\Online -n -d include_path=\'" . $this->path . "plugins\\Online\\\' -d extension=\'" . $this->path . "bin\\php\\ext\\php_yaml.dll\' -S " . $address . ":" . $port . ' router.php"'); + shell_exec('open -a Terminal php -t ' . $this->path . "plugins\\Online -n -d include_path=\'" . $this->path . "plugins\\Online\\\' -d extension=\'" . $this->path . "bin\\php\\ext\\php_yaml.dll\' -S " . $address . ":" . $port . ' tmp/router.php"'); break; case stristr(PHP_OS, "LINUX"): - shell_exec('gnome-terminal -e "' . $this->path . "bin\\php\\php.exe -t " . $this->path . "plugins\\Online -n -d include_path=\'" . $this->path . "plugins\\Online\\\' -d extension=\'" . $this->path . "bin\\php\\ext\\php_yaml.dll\' -S " . $address . ":" . $port . ' router.php"'); + shell_exec('gnome-terminal -e php -t ' . $this->path . "plugins\\Online -n -d include_path=\'" . $this->path . "plugins\\Online\\\' -d extension=\'" . $this->path . "bin\\php\\ext\\php_yaml.dll\' -S " . $address . ":" . $port . ' tmp/router.php"'); break; } }