136 lines
3.1 KiB
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();
|
|
}
|
|
}
|
|
}
|
|
}
|