internal async Task Start() { Logger.Server = this; Events = new EventManager(); Players = new List <Player>(); Levels = new List <Level>(); // Setup server Console.BackgroundColor = ConsoleColor.Black; Console.Clear(); start = DateTime.Now; input = string.Empty; clear = new string(' ', Console.WindowWidth); var stopwatch = Stopwatch.StartNew(); Logger.WriteLine($"{Constants.Strings.ServerTitle}"); Logger.WriteLine($"Server is starting now, on {DateTime.Now.ToString("U", new CultureInfo("en-US"))}"); // Initialize Properties Commands = CommandParser.CreateNew().UsePrefix(string.Empty).OnError(OnParseError); RegisterCommands(); // Initialize Components IO = new IOComponent(this); Plugins = new PluginComponent(this); Database = new DatabaseComponent(this); Net = new NetworkComponent(this); await IO.Init(); await Plugins.Init(); await Database.Init(); await Net.Init(); // Create save timer saveTimer = new Timer(IO.Config.Server.AutoSaveTime * 1000 * 60); saveTimer.Elapsed += async(sender, args) => await SaveAll(); saveTimer.Start(); stopwatch.Stop(); Logger.WriteBreak(); Logger.WriteLine("Ready. ({0}s) Type /help for commands.", Math.Round(stopwatch.Elapsed.TotalSeconds, 2)); Logger.WriteBreak(); WriteHeader(); while (true) // Parse commands now that messaging has been handed off to another thread { input = string.Empty; WriteCommandCursor(); // Read input and parse commands while (true) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.Backspace) { if (input.Length - 1 >= 0) { input = input.Substring(0, input.Length - 1); Console.CursorLeft = 3 + input.Length - 1; Console.Write(' '); Console.CursorLeft = 3 + input.Length - 1; } continue; } if (key.Key == ConsoleKey.Enter) { Console.WriteLine(""); break; } input += key.KeyChar; Console.Write(key.KeyChar); } Commands.Parse(input.Trim()); WriteHeader(); } // ReSharper disable once FunctionNeverReturns }