message(VersionInfo::NAME . " set-up wizard"); try{ $langs = Language::getLanguageList(); }catch(LanguageNotFoundException $e){ $this->error("No language files found, please use provided builds or clone the repository recursively."); return false; } $this->message("Please select a language"); foreach(Utils::stringifyKeys($langs) as $short => $native){ $this->writeLine(" $native => $short"); } do{ $lang = strtolower($this->getInput("Language", "eng")); if(!isset($langs[$lang])){ $this->error("Couldn't find the language"); $lang = null; } }while($lang === null); $this->lang = new Language($lang); $this->message($this->lang->translate(KnownTranslationFactory::language_has_been_selected())); if(!$this->showLicense()){ return false; } //this has to happen here to prevent user avoiding agreeing to license $config = new Config(Path::join($this->dataPath, "server.properties"), Config::PROPERTIES); $config->set(ServerProperties::LANGUAGE, $lang); $config->save(); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::skip_installer()), "n", "y/N")) === "y"){ $this->printIpDetails(); return true; } $this->writeLine(); $this->welcome(); $this->generateBaseConfig($config); $this->generateUserFiles($config); $this->networkFunctions($config); $config->save(); $this->printIpDetails(); $this->endWizard(); return true; } private function showLicense() : bool{ $this->message($this->lang->translate(KnownTranslationFactory::welcome_to_pocketmine(VersionInfo::NAME))); echo <<writeLine(); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::accept_license()), "n", "y/N")) !== "y"){ $this->error($this->lang->translate(KnownTranslationFactory::you_have_to_accept_the_license(VersionInfo::NAME))); sleep(5); return false; } return true; } private function welcome() : void{ $this->message($this->lang->translate(KnownTranslationFactory::setting_up_server_now())); $this->message($this->lang->translate(KnownTranslationFactory::default_values_info())); $this->message($this->lang->translate(KnownTranslationFactory::server_properties())); } private function askPort(Translatable $prompt, int $default) : int{ while(true){ $port = (int) $this->getInput($this->lang->translate($prompt), (string) $default); if($port <= 0 || $port > 65535){ $this->error($this->lang->translate(KnownTranslationFactory::invalid_port())); continue; } return $port; } } private function generateBaseConfig(Config $config) : void{ $config->set(ServerProperties::MOTD, ($name = $this->getInput($this->lang->translate(KnownTranslationFactory::name_your_server()), Server::DEFAULT_SERVER_NAME))); $this->message($this->lang->translate(KnownTranslationFactory::port_warning())); $config->set(ServerProperties::SERVER_PORT_IPV4, $this->askPort(KnownTranslationFactory::server_port_v4(), Server::DEFAULT_PORT_IPV4)); $config->set(ServerProperties::SERVER_PORT_IPV6, $this->askPort(KnownTranslationFactory::server_port_v6(), Server::DEFAULT_PORT_IPV6)); $this->message($this->lang->translate(KnownTranslationFactory::gamemode_info())); do{ $input = (int) $this->getInput($this->lang->translate(KnownTranslationFactory::default_gamemode()), "0"); $gamemode = match($input){ 0 => GameMode::SURVIVAL, 1 => GameMode::CREATIVE, default => null }; }while($gamemode === null); //TODO: this probably shouldn't use the enum name directly $config->set(ServerProperties::GAME_MODE, $gamemode->name); $config->set(ServerProperties::MAX_PLAYERS, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::max_players()), (string) Server::DEFAULT_MAX_PLAYERS)); $config->set(ServerProperties::VIEW_DISTANCE, (int) $this->getInput($this->lang->translate(KnownTranslationFactory::view_distance()), (string) Server::DEFAULT_MAX_VIEW_DISTANCE)); } private function generateUserFiles(Config $config) : void{ $this->message($this->lang->translate(KnownTranslationFactory::op_info())); $op = strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::op_who()), "")); if($op === ""){ $this->error($this->lang->translate(KnownTranslationFactory::op_warning())); }else{ $ops = new Config(Path::join($this->dataPath, "ops.txt"), Config::ENUM); $ops->set($op, true); $ops->save(); } $this->message($this->lang->translate(KnownTranslationFactory::whitelist_info())); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::whitelist_enable()), "n", "y/N")) === "y"){ $this->error($this->lang->translate(KnownTranslationFactory::whitelist_warning())); $config->set(ServerProperties::WHITELIST, true); }else{ $config->set(ServerProperties::WHITELIST, false); } } private function networkFunctions(Config $config) : void{ $this->error($this->lang->translate(KnownTranslationFactory::query_warning1())); $this->error($this->lang->translate(KnownTranslationFactory::query_warning2())); if(strtolower($this->getInput($this->lang->translate(KnownTranslationFactory::query_disable()), "n", "y/N")) === "y"){ $config->set(ServerProperties::ENABLE_QUERY, false); }else{ $config->set(ServerProperties::ENABLE_QUERY, true); } } private function printIpDetails() : void{ $this->message($this->lang->translate(KnownTranslationFactory::ip_get())); $externalIP = Internet::getIP(); if($externalIP === false){ $externalIP = "unknown (server offline)"; } try{ $internalIP = Internet::getInternalIP(); }catch(InternetException $e){ $internalIP = "unknown (" . $e->getMessage() . ")"; } $this->error($this->lang->translate(KnownTranslationFactory::ip_warning($externalIP, $internalIP))); $this->error($this->lang->translate(KnownTranslationFactory::ip_confirm())); $this->readLine(); } private function endWizard() : void{ $this->message($this->lang->translate(KnownTranslationFactory::you_have_finished())); $this->message($this->lang->translate(KnownTranslationFactory::pocketmine_plugins())); $this->message($this->lang->translate(KnownTranslationFactory::pocketmine_will_start(VersionInfo::NAME))); $this->writeLine(); $this->writeLine(); sleep(4); } private function writeLine(string $line = "") : void{ echo $line . PHP_EOL; } private function readLine() : string{ return trim((string) fgets(STDIN)); } private function message(string $message) : void{ $this->writeLine("[*] " . $message); } private function error(string $message) : void{ $this->writeLine("[!] " . $message); } private function getInput(string $message, string $default = "", string $options = "") : string{ $message = "[?] " . $message; if($options !== "" || $default !== ""){ $message .= " (" . ($options === "" ? $default : $options) . ")"; } $message .= ": "; echo $message; $input = $this->readLine(); return $input === "" ? $default : $input; } }