Files
lunch-games/source/lunch/app.d

136 lines
3.1 KiB
D

module lunch.main;
import std.stdio;
import std.conv;
import std.path;
import std.file : readText, writeFile = write, exists, chdir, thisExePath;
import std.string;
import toml;
import lunch.conf;
import lunch.http;
import lunch.color;
import lunch.logger;
import lunch.update;
import lunch.launch;;
void _app(string config_toml)
{
// Hide the cursor, reveal when exiting
write("\33[?25l");
scope (exit) write("\33[?25h");
// Load default config
wrapTOML(cast()config, config_toml.parseTOML());
// Focus on exe
chdir( thisExePath.dirName() );
// Dynamicly load the config.
if (config.app.load_config && exists(config.app.config_name))
try
{
info("Loading external configuration");
wrapTOML(cast()config, readText(config.app.config_name).parseTOML(), true);
}
catch (Exception e)
warne("Failed loading external configuration", e);
// Auto update
if (config.app.auto_update)
update();
// Auto launch
if (config.app.auto_launch)
launch();
// Show UI
bool exit_ui = false;
while (config.ui.enabled && !exit_ui)
{
void delegate()[] options;
writeln("\x1B[3J\x1B[1;1H");
writeln(config.ui.message);
writeln();
if (config.ui.launch)
{
options ~= () { launch(); };
writefln("[%d] %s", options.length, config.ui.launch_label);
}
if (config.ui.update)
{
options ~= () { update(); };
if (config.app.check_update && updateAvailable())
writefln("[%d] %s", options.length, config.ui.update_avail_label);
else
writefln("[%d] %s", options.length, config.ui.update_label);
}
if (config.ui.config_dump)
{
options ~= () { writeFile(config.app.config_name, config_toml); };
writefln("[%d] %s", options.length, config.ui.config_dump_label);
}
if (config.ui.exit)
{
options ~= () { exit_ui = true; };
writefln("[%d] %s", options.length, config.ui.exit_label);
}
int opt;
try
{
writef("\nSelect 1-%d : ", options.length);
opt = readln().strip().to!int - 1;
}
catch (Exception ex)
{
continue;
}
if (opt >= 0 && opt < options.length)
options[opt]();
}
info("Exit");
}
void app(string config_toml)
{
try
{
_app(config_toml);
}
catch (Exception ex)
{
debug
{
writefln("\x1B[31m%s\x1B[0m", ex);
}
else
{
writeln("Critical error".red, ": ", ex.message.yellow);
if (config.app.report_errors)
{
try
{
writefln("Log reported to: %s", put(config.app.report_url, log).cyan);
}
catch (Exception) { }
}
version (Windows)
{
writeln("\nPress enter to exit...");
readln();
}
}
}
}