Files
lunch-games/source/lunch/main.d
2025-04-29 01:59:15 +02:00

129 lines
2.9 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()
{
// 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, default_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 main()
{
try
{
app();
}
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();
}
}
}
}