Introduction Some plugins require configuration before being run the first time on the server. It gets awkward what the plugin should do the first time it is run -- you can't expect the user to priorly create config files, because default config files aren't created yet; you can't continue to run, because the config values are required; there are no default values, because you require something like MySQL credentials, online API tokens, or custom passwords, etc.; you don't want to stop the server completely, because users will yell "This plugin crashed my server upon installation" (usually with a bit worse English and "Sorry for bad English" behind that); you don't want to just disable your plugin, because users may not notice your alert on console and complain that your plugin isn't working. Proposal It is proposed that a first-run wizard API similar to the PocketMine installation wizard be exposed to plugins. It is expected that plugins can simply run a few lines to ask for necessary values: PHP: public function onEnable() { $special = FirstRunWizard::init($this, "special.yml") // will try to load dataFolder/special.yml if exists ->query("mysql.host", "Please enter MySQL host", "127.0.0.1") // will query for mysql.host if not present in special.yml ->query("mysql.user", "Please enter MySQL username", "root") // otherwise will just continue running ->query("mysql.password", "Please enter MySQL password", "", function(string $input, string &$problem) : bool{ if(strlen($input) > 4){ $problem = "Password too short!"; return false; } return true; }) // function to validate input ->query("server-password", "Please enter the password to use this plugin") // no default value ->flush(); // store, if any, new values queried into special.yml // flush() returns the data in special $mysql = new mysqli($special["mysql"]["host"], $special["mysql"]["user"], $special["mysql"]["password"]);} There is necessity for an API to receive input from console directly, because there is right now no reliable method to query data from console without racing with the CommandReader thread. Also works well with updates, since only unused values are queried. P.S. Possible implementation of FirstRunWizard: PHP: class FirstRunWizard{ public static function init(Plugin $plugin, $file) : FirstRunWizard{ $data = is_file($plugin->getDataFolder() . $file) ? yaml_parse_file($plugin->getDataFolder() . $file) : []; return new FirstRunWizard($plugin, $file, $data); } private function __construct($plugin, $file, $data){ /* skipped */ } public function query(string $key, string $question, string $default = "", callable $validate = null) : FirstRunWizard{ if(!$this->exists($key)){ // similar implementation as Config velociraptor: // https://xkcd.com/292 echo $question, " [$default] "; $input = api_method_to_read_stdin(); if($validate !== null){ if(!$validate($input, $problem)){ echo $problem; goto velociraptor; } } $this->set($key, $input); } return $this; } public function flush(){ yaml_emit_file($this->file, $this->data; return $this->data; }}
it somewhat works, to some extend but what about on multi craft as example? even if it works no one would expect they need to go on console and input some value i am expecting PM threads wont work until info have been entered which users would just complain it make the server worst, cant even be joined all without any realizition of input is needed via console
Then simply skip the wizard when the --no-wizard argument is passed in the startup params. Plugins should still be able to function without going through the wizard, it would exist as a way to help less advanced users get slightly more advanced plugins running quickly.
It's really useful for not advanced people. But as Jack said there should be a '--no-wizard' argument.
Could you elaborate more? MultiCraft still has a console, right? It doesn't block the server when auto restarting; basically, it only blocks the server when a new plugin is installed. The trivial user should at least stay and see if the plugin works... Otherwise, the MultiCraft host can automatically generate the config files. They should either not let users apply these plugins directly, or force users to enter the required values and generate the config file at the appropriate location before installing the plugin. The main point of this RFC is that some configuration cannot have default values... I'm especially referring to plugins that completely depend on the configuration, such as MySQL database, or an online API access token. Say, I have a plugin that sends a message to my Slack channel every time someone joins (for whatever stupid reason). How could I put a default value for the API token used here? My point is that plugins that are unable to function without going through the wizard need installation wizards.
And advanced users will know they need to edit the config files to setup the plugin so it will work won't they? A plugin installation wizard shouldn't be necessary, no matter what information is required for the plugin to run, there should be a way to skip it; even if it's simply to help with consistency between the included wizards within PocketMine.
This has nothing to do with advanced users or not. I don't know why you keep mentioning advanced users. A wizard is supposed to help people setup, not to reserve features for advanced users. What is the logic of this? I'm not talking about consistency at all. A plugin requires a MySQL connection, and you must enter it before using the plugin. What's so controversial about this? A user normally looks at his console the first time he installs the plugin, unless the plugin is automatically updated, which then is the responsibility of the automatic updater.