diff --git a/Program.cs b/Program.cs index 3562520..b469ad7 100644 --- a/Program.cs +++ b/Program.cs @@ -1,7 +1,7 @@ namespace WorldTime; class Program { - private static WorldTime? _bot; + private static WorldTime _bot = null!; private static readonly DateTimeOffset _botStartTime = DateTimeOffset.UtcNow; /// @@ -15,14 +15,15 @@ class Program { cfg = new Configuration(); } catch (Exception ex) { Console.WriteLine(ex); - Environment.Exit((int)ExitCodes.ConfigError); + Environment.Exit(2); } - Console.CancelKeyPress += OnCancelKeyPressed; _bot = new WorldTime(cfg); - await _bot.StartAsync().ConfigureAwait(false); + AppDomain.CurrentDomain.ProcessExit += OnCancelEvent; + Console.CancelKeyPress += OnCancelEvent; - await Task.Delay(-1).ConfigureAwait(false); + await _bot.StartAsync(); + await Task.Delay(-1); } /// @@ -35,33 +36,19 @@ class Program { Console.WriteLine($"{ts:s} [{source}] {item}"); } - private static void OnCancelKeyPressed(object? sender, ConsoleCancelEventArgs e) { - e.Cancel = true; - Log("Shutdown", "Captured cancel key; sending shutdown."); - ProgramStop(); - } + private static bool _shutdownRequested = false; + private static void OnCancelEvent(object? sender, EventArgs e) { + if (e is ConsoleCancelEventArgs ce) ce.Cancel = true; + + if (_shutdownRequested) return; + _shutdownRequested = true; + Log("Shutdown", "Shutting down..."); - private static bool _stopping = false; - public static void ProgramStop() { - if (_stopping) return; - _stopping = true; - Log("Shutdown", "Commencing shutdown..."); - - var dispose = Task.Run(_bot!.Dispose); - if (!dispose.Wait(90000)) { - Log("Shutdown", "Normal shutdown has not concluded after 90 seconds. Will force quit."); - Environment.ExitCode &= (int)ExitCodes.ForcedExit; + var dispose = Task.Run(_bot.Dispose); + if (!dispose.Wait(15000)) { + Log("Shutdown", "Normal shutdown is taking too long. Will force quit."); + Environment.ExitCode = 1; } Environment.Exit(Environment.ExitCode); } - - [Flags] - public enum ExitCodes { - Normal = 0x0, - ForcedExit = 0x1, - ConfigError = 0x2, - DatabaseError = 0x4, - DeadShardThreshold = 0x8, - BadCommand = 0x10, - } }