diff --git a/src/pocketmine/wizard/SetupWizard.php b/src/pocketmine/wizard/SetupWizard.php index 06e4d34f7..e4c8f5156 100644 --- a/src/pocketmine/wizard/SetupWizard.php +++ b/src/pocketmine/wizard/SetupWizard.php @@ -46,41 +46,40 @@ class SetupWizard{ } public function run(){ - echo "[*] PocketMine-MP set-up wizard\n"; + $this->message("PocketMine-MP set-up wizard"); $langs = BaseLang::getLanguageList(); if(empty($langs)){ - echo "[!] No language files found, please use provided builds or clone the repository recursively." . PHP_EOL; + $this->error("No language files found, please use provided builds or clone the repository recursively."); return false; } - echo "[*] Please select a language:\n"; + $this->message("Please select a language"); foreach($langs as $short => $native){ - echo " $native => $short\n"; + $this->writeLine(" $native => $short"); } + do{ - echo "[?] Language (eng): "; - $lang = strtolower($this->getInput("eng")); + $lang = strtolower($this->getInput("Language", "eng")); if(!isset($langs[$lang])){ - echo "[!] Couldn't find the language\n"; + $this->error("Couldn't find the language"); $lang = null; } }while($lang === null); $this->lang = new BaseLang($lang); - - echo "[*] " . $this->lang->get("language_has_been_selected") . "\n"; + $this->message($this->lang->get("language_has_been_selected")); if(!$this->showLicense()){ return false; } - echo "[?] " . $this->lang->get("skip_installer") . " (y/N): "; - if(strtolower($this->getInput()) === "y"){ + if(strtolower($this->getInput($this->lang->get("skip_installer"), "n", "y/N")) === "y"){ return true; } - echo "\n"; + + $this->writeLine(); $this->welcome(); $this->generateBaseConfig(); $this->generateUserFiles(); @@ -88,11 +87,12 @@ class SetupWizard{ $this->networkFunctions(); $this->endWizard(); + return true; } private function showLicense(){ - echo $this->lang->get("welcome_to_pocketmine") . "\n"; + $this->message($this->lang->get("welcome_to_pocketmine")); echo <<lang->get("accept_license") . " (y/N): "; - if(strtolower($this->getInput("n")) != "y"){ - echo "[!] " . $this->lang->get("you_have_to_accept_the_license") . "\n"; + $this->writeLine(); + if(strtolower($this->getInput($this->lang->get("accept_license"), "n", "y/N")) !== "y"){ + $this->error($this->lang->get("you_have_to_accept_the_license")); sleep(5); return false; @@ -113,61 +113,67 @@ LICENSE; } private function welcome(){ - echo "[*] " . $this->lang->get("setting_up_server_now") . "\n"; - echo "[*] " . $this->lang->get("default_values_info") . "\n"; - echo "[*] " . $this->lang->get("server_properties") . "\n"; - + $this->message($this->lang->get("setting_up_server_now")); + $this->message($this->lang->get("default_values_info")); + $this->message($this->lang->get("server_properties")); } private function generateBaseConfig(){ $config = new Config(\pocketmine\DATA . "server.properties", Config::PROPERTIES); - echo "[?] " . $this->lang->get("name_your_server") . " (" . self::DEFAULT_NAME . "): "; - $config->set("motd", ($name = $this->getInput(self::DEFAULT_NAME))); + + $config->set("motd", ($name = $this->getInput($this->lang->get("name_your_server"), self::DEFAULT_NAME))); $config->set("server-name", $name); - echo "[*] " . $this->lang->get("port_warning") . "\n"; + + $this->message($this->lang->get("port_warning")); + do{ - echo "[?] " . $this->lang->get("server_port") . " (" . self::DEFAULT_PORT . "): "; - $port = (int) $this->getInput(self::DEFAULT_PORT); + $port = (int) $this->getInput($this->lang->get("server_port"), (string) self::DEFAULT_PORT); if($port <= 0 or $port > 65535){ - echo "[!] " . $this->lang->get("invalid_port") . "\n"; + $this->error($this->lang->get("invalid_port")); + continue; } - }while($port <= 0 or $port > 65535); + + break; + }while(true); $config->set("server-port", $port); - echo "[*] " . $this->lang->get("gamemode_info") . "\n"; + $this->message($this->lang->get("gamemode_info")); + do{ - echo "[?] " . $this->lang->get("default_gamemode") . ": (" . self::DEFAULT_GAMEMODE . "): "; - $gamemode = (int) $this->getInput(self::DEFAULT_GAMEMODE); + $gamemode = (int) $this->getInput($this->lang->get("default_gamemode"), (string) self::DEFAULT_GAMEMODE); }while($gamemode < 0 or $gamemode > 3); $config->set("gamemode", $gamemode); - echo "[?] " . $this->lang->get("max_players") . " (" . self::DEFAULT_PLAYERS . "): "; - $config->set("max-players", (int) $this->getInput(self::DEFAULT_PLAYERS)); - echo "[*] " . $this->lang->get("spawn_protection_info") . "\n"; - echo "[?] " . $this->lang->get("spawn_protection") . " (Y/n): "; - if(strtolower($this->getInput("y")) == "n"){ + + $config->set("max-players", (int) $this->getInput($this->lang->get("max_players"), (string) self::DEFAULT_PLAYERS)); + + $this->message($this->lang->get("spawn_protection_info")); + + if(strtolower($this->getInput($this->lang->get("spawn_protection"), "y", "Y/n")) === "n"){ $config->set("spawn-protection", -1); }else{ $config->set("spawn-protection", 16); } + $config->save(); } private function generateUserFiles(){ - echo "[*] " . $this->lang->get("op_info") . "\n"; - echo "[?] " . $this->lang->get("op_who") . ": "; - $op = strtolower($this->getInput("")); + $this->message($this->lang->get("op_info")); + + $op = strtolower($this->getInput($this->lang->get("op_who"), "")); if($op === ""){ - echo "[!] " . $this->lang->get("op_warning") . "\n"; + $this->error($this->lang->get("op_warning")); }else{ $ops = new Config(\pocketmine\DATA . "ops.txt", Config::ENUM); $ops->set($op, true); $ops->save(); } - echo "[*] " . $this->lang->get("whitelist_info") . "\n"; - echo "[?] " . $this->lang->get("whitelist_enable") . " (y/N): "; + + $this->message($this->lang->get("whitelist_info")); + $config = new Config(\pocketmine\DATA . "server.properties", Config::PROPERTIES); - if(strtolower($this->getInput("n")) === "y"){ - echo "[!] " . $this->lang->get("whitelist_warning") . "\n"; + if(strtolower($this->getInput($this->lang->get("whitelist_enable"), "n", "y/N")) === "y"){ + $this->error($this->lang->get("whitelist_warning")); $config->set("white-list", true); }else{ $config->set("white-list", false); @@ -177,55 +183,78 @@ LICENSE; private function networkFunctions(){ $config = new Config(\pocketmine\DATA . "server.properties", Config::PROPERTIES); - echo "[!] " . $this->lang->get("query_warning1") . "\n"; - echo "[!] " . $this->lang->get("query_warning2") . "\n"; - echo "[?] " . $this->lang->get("query_disable") . " (y/N): "; - if(strtolower($this->getInput("n")) === "y"){ + $this->error($this->lang->get("query_warning1")); + $this->error($this->lang->get("query_warning2")); + if(strtolower($this->getInput($this->lang->get("query_disable"), "n", "y/N")) === "y"){ $config->set("enable-query", false); }else{ $config->set("enable-query", true); } - echo "[*] " . $this->lang->get("rcon_info") . "\n"; - echo "[?] " . $this->lang->get("rcon_enable") . " (y/N): "; - if(strtolower($this->getInput("n")) === "y"){ + $this->message($this->lang->get("rcon_info")); + if(strtolower($this->getInput($this->lang->get("rcon_enable"), "n", "y/N")) === "y"){ $config->set("enable-rcon", true); $password = substr(base64_encode(random_bytes(20)), 3, 10); $config->set("rcon.password", $password); - echo "[*] " . $this->lang->get("rcon_password") . ": " . $password . "\n"; + $this->message($this->lang->get("rcon_password") . ": " . $password); }else{ $config->set("enable-rcon", false); } - /*echo "[*] " . $this->lang->usage_info . "\n"; - echo "[?] " . $this->lang->usage_disable . " (y/N): "; - if(strtolower($this->getInput("n")) === "y"){ - $config->set("send-usage", false); - }else{ - $config->set("send-usage", true); - }*/ $config->save(); - echo "[*] " . $this->lang->get("ip_get") . "\n"; + $this->message($this->lang->get("ip_get")); $externalIP = Utils::getIP(); + if($externalIP === false){ + $externalIP = "unknown (server offline)"; + } $internalIP = gethostbyname(trim(`hostname`)); - echo "[!] " . $this->lang->translateString("ip_warning", ["EXTERNAL_IP" => $externalIP, "INTERNAL_IP" => $internalIP]) . "\n"; - echo "[!] " . $this->lang->get("ip_confirm"); - $this->getInput(); + $this->error($this->lang->translateString("ip_warning", ["EXTERNAL_IP" => $externalIP, "INTERNAL_IP" => $internalIP])); + $this->error($this->lang->get("ip_confirm")); + $this->readLine(); } private function endWizard(){ - echo "[*] " . $this->lang->get("you_have_finished") . "\n"; - echo "[*] " . $this->lang->get("pocketmine_plugins") . "\n"; - echo "[*] " . $this->lang->get("pocketmine_will_start") . "\n\n\n"; + $this->message($this->lang->get("you_have_finished")); + $this->message($this->lang->get("pocketmine_plugins")); + $this->message($this->lang->get("pocketmine_will_start")); + + $this->writeLine(); + $this->writeLine(); + sleep(4); } - private function getInput($default = ""){ - $input = trim(fgets(STDIN)); + private function writeLine(string $line = ""){ + echo $line . PHP_EOL; + } + + private function readLine() : string{ + return trim((string) fgets(STDIN)); + } + + private function message(string $message){ + $this->writeLine("[*] " . $message); + } + + private function error(string $message){ + $this->writeLine("[!] " . $message); + } + + private function getInput(string $message, string $default = "", string $options = ""){ + $message = "[?] " . $message; + + if($options !== "" or $default !== ""){ + $message .= " (" . ($options === "" ? $default : $options) . ")"; + } + $message .= ": "; + + echo $message; + + $input = $this->readLine(); return $input === "" ? $default : $input; }