public Program()
        {
            _handler += new EventHandler(Handler);
            SetConsoleCtrlHandler(_handler, true);

            //if (!Dev)
            //AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CrashDump.CurrentDomain_UnhandledException);

            CurrentGameVerson = SteamCMD.GetGameVersion();
            Console.Title     = WindowTitle;
        }
            // TODO: This isn't very reliable and may break in the future. Also not very fast :(
            public static long?GetLatestVersion()
            {
                var result = SteamCMD.RunRead($"+@ShutdownOnFailedCommand 1 +@NoPromptForPassword 1 +@sSteamCmdForcePlatformType windows +login anonymous +app_info_print 896660 +quit");

                if (!String.IsNullOrWhiteSpace(result))
                {
                    Match match = rxBuildID.Match(result);

                    if (match.Success)
                    {
                        if (long.TryParse(match.Groups[1].Value, out long buildid))
                        {
                            return(buildid);
                        }
                    }
                }

                return(null);
            }
            // TODO: Rework this, it's pretty nasty, make async?
            public static async Task <bool> UpdateValdiate(string path)
            {
                MainWindow mw = (Application.Current.MainWindow as MainWindow);

                if (!String.IsNullOrWhiteSpace(path))
                {
                    if (!File.Exists(Path.Combine(path, "valheim_server.exe")))
                    {
                        var dialogResult = await DialogManager.ShowMessageAsync(mw, "No Server Found!", $"Chosen folder does not appear to have a server installed, would you like to download the server files to:\n\n{path}?", MessageDialogStyle.AffirmativeAndNegative);

                        if (dialogResult == MessageDialogResult.Negative)
                        {
                            return(false);
                        }
                    }

                    var controller = await DialogManager.ShowProgressAsync(mw, "Updating & Validating", "Please wait while SteamCMD updates and validates the files...", false, new MetroDialogSettings { AnimateShow = false, NegativeButtonText = "Ok" });

                    var result = SteamCMD.Run($"+@ShutdownOnFailedCommand 1 +@NoPromptForPassword 1 +@sSteamCmdForcePlatformType windows +login anonymous +force_install_dir \"{path}\" +app_update 896660 validate +quit");

                    controller.Canceled += new EventHandler(async delegate(Object o, EventArgs e) {
                        await controller.CloseAsync();
                    });

                    if (result != 0)
                    {
                        controller.SetMessage($"Failed to update... SteamCMD returned code: {result.ToString()}");
                        controller.SetCancelable(true);
                    }
                    else
                    {
                        controller.SetMessage("SteamCMD successfully updated and validated the files!");
                        controller.SetProgress(1.0);
                        controller.SetCancelable(true);
                        return(false);
                    }
                }

                return(false);
            }
        // this is where stuff goes!
        private void Run(string[] args)
        {
            // This is for args that should be used before IRSE loads

            string configPath = ExtenderGlobals.GetFilePath(IRSEFileName.NLogConfig);

            LogManager.Configuration = new XmlLoggingConfiguration(configPath);

            _useGui = true;

            if (args.Contains("-nogui"))
            {
                _useGui = false;
            }

            if (args.Contains("-usedevversion") || Config.Settings.EnableDevelopmentVersion)
            {
                Console.WriteLine(string.Format(Program.Localization.Sentences["UseDevVersion"]));
            }

            if (args.Contains("-noupdateirse") || !Config.Settings.EnableExtenderAutomaticUpdates)
            {
                UpdateManager.EnableAutoUpdates = false;
                Console.WriteLine(string.Format(Program.Localization.Sentences["NoUpdate"]));
                Console.WriteLine();
            }

            if (args.Contains("-autorestart") || Config.Settings.AutoRestartsEnable)
            {
                UpdateManager.EnableAutoRestarts = true;
                Console.WriteLine(string.Format("IRSE: (Arg: -autorestart is set) IRSE Will auto restart when it needs to."));
            }

            Console.WriteLine();
            Console.ResetColor();

            // Run anything that doesn't require the loading of IR references above here

            //Harmony
            if (Harmony.DEBUG)
            {
                Console.WriteLine("IRSE: Harmony Debug enabled, logging will be in the file 'harmony.log.txt' on your desktop.");
            }

            Console.WriteLine("Initializing Harmony Patches...");
            Harmony = new Harmony("com.tse.irse");
            Harmony.PatchAll();
            Console.WriteLine();

            m_serverInstance = new ServerInstance();

            ThisGameVersion = m_serverInstance.Assembly.GetName().Version.ToString();

            Console.ForegroundColor = ConsoleColor.White;
            Console.Write(string.Format(Program.Localization.Sentences["ForGameVersion"]));
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write(ForGameVersion + "\n");
            Console.ForegroundColor = ConsoleColor.White;
            Console.Write(string.Format(Program.Localization.Sentences["ThisGameVersion"]));
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write(ThisGameVersion + "\n");
            Console.ForegroundColor = ConsoleColor.White;
            Console.Write(string.Format(Program.Localization.Sentences["OnlineGameVersion"]));
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write(SteamCMD.GetGameVersion() + "\n");
            Console.ForegroundColor = ConsoleColor.White;

            Console.ForegroundColor = ConsoleColor.Yellow;
            if (new Version(ThisGameVersion) < SteamCMD.GetGameVersion())
            {
                Console.WriteLine(string.Format(Program.Localization.Sentences["NewIRVersion"]));
            }

            if (new Version(ForGameVersion) < new Version(ThisGameVersion))
            {
                Console.WriteLine(string.Format(Program.Localization.Sentences["IRNewer"]));
            }

            Console.WriteLine();
            Console.ResetColor();

            ServerInstance.Instance.OnServerStarted += Instance_OnServerStarted;

            updateManager = new UpdateManager(); // REPO NEEDS TO BE PUBLIC

            //Build IR's paths so we can use the Localization system
            Game.Program.InitFileSystems();
            Game.Program.InitGameDirectory("InterstellarRift");
            Game.Program.CommandLineArgs = new string[1];

            m_serverInstance.PluginManager.LoadAllPlugins();

            SetupGUI();

            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write("IRSE: Ready for Input, try using ");
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write("help\n\n");
            Console.ResetColor();

            if (args.Contains("-autostart") || Config.Settings.AutoStartEnable)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine(string.Format(Program.Localization.Sentences["AutoStart"]));
                Console.ResetColor();
                StartServer();
            }

            // run only when they change properties to update the non manual section of ServerConfigProperties
            //new Modules.GameConfig.ServerConfigConverter().BuildAndUpdateConfigProperties();

            //console logic for commands
            ReadConsoleCommands(args);
        }
        private static void Main(string[] args)
        {
            SetTitle();

            new FolderStructure().Build();

            m_config  = new Config();
            debugMode = m_config.Settings.DebugMode;

            AppDomain.CurrentDomain.AssemblyResolve += (sender, rArgs) =>
            {
                Assembly     executingAssembly = Assembly.GetExecutingAssembly();
                AssemblyName assemblyName      = new AssemblyName(rArgs.Name);

                var pathh = assemblyName.Name + ".dll";
                if (assemblyName.CultureInfo != null && assemblyName.CultureInfo.Equals(CultureInfo.InvariantCulture) == false)
                {
                    pathh = String.Format(@"{0}\{1}", assemblyName.CultureInfo, pathh);
                }

                // get binaries in plugins
                String   modPath        = Path.Combine(FolderStructure.IRSEFolderPath, "plugins");
                String[] subDirectories = Directory.GetDirectories(modPath);
                foreach (String subDirectory in subDirectories)
                {
                    string path = Path.Combine(Path.GetFullPath(FolderStructure.IRSEFolderPath), "plugins", subDirectory, pathh);
                    if (File.Exists(path))
                    {
                        return(Assembly.LoadFrom(path));
                    }


                    // maybe a subfolder?
                    foreach (String subDirectory2 in Directory.GetDirectories(subDirectory))
                    {
                        string path2 = Path.Combine(Path.GetFullPath(FolderStructure.IRSEFolderPath), "plugins", subDirectory2, "bin", pathh);
                        if (File.Exists(path2))
                        {
                            return(Assembly.LoadFrom(path2));
                        }
                    }
                }

                using (Stream stream = executingAssembly.GetManifestResourceStream(pathh))
                {
                    if (stream == null)
                    {
                        return(null);
                    }

                    var assemblyRawBytes = new byte[stream.Length];
                    stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length);
                    //Console.WriteLine("found missing dll: " + pathh);
                    return(Assembly.Load(assemblyRawBytes));
                }
            };

            string configPath = ExtenderGlobals.GetFilePath(IRSEFileName.NLogConfig);

            LogManager.Configuration = new XmlLoggingConfiguration(configPath);

            Console.WriteLine($"Interstellar Rift Extended Server v{Version} Initializing....");

            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine($"Git Branch: {ThisAssembly.Git.Branch}");
            if (Dev)
            {
                Console.WriteLine($"Git Commit: {ThisAssembly.Git.Commit}");
                Console.WriteLine($"Git SHA: {ThisAssembly.Git.Sha}");
            }
            Console.WriteLine();
            // This is for args that should be used before IRSE loads
            bool noUpdateIRSE          = false;
            bool noUpdateIR            = false;
            bool usePrereleaseVersions = false;

            Console.ForegroundColor = ConsoleColor.Green;
            foreach (string arg in args)
            {
                if (arg.Equals("-noupdateirse"))
                {
                    noUpdateIRSE = true;
                }

                if (arg.Equals("-noupdateir"))
                {
                    noUpdateIR = true;
                }

                if (arg.Equals("-usedevversion"))
                {
                    usePrereleaseVersions = true;
                }
            }

            if (usePrereleaseVersions || Config.Settings.EnableDevelopmentVersion)
            {
                Console.WriteLine("IRSE: (Arg: -usedevversion is set) IRSE Will use Pre-releases versions");
            }

            if (noUpdateIRSE || !Config.Settings.EnableExtenderAutomaticUpdates)
            {
                UpdateManager.EnableAutoUpdates = false;
                Console.WriteLine("IRSE: (Arg: -noupdate is set or option in IRSE config is enabled) IRSE will not be auto-updated.");
            }

            if (noUpdateIR || !Config.Settings.EnableAutomaticUpdates)
            {
                SteamCMD.AutoUpdateIR = false;
                Console.WriteLine("IRSE: (Arg: -noupdateir is set) IsR Dedicated Serevr will not be auto-updated.");
            }
            Console.WriteLine();
            Console.ResetColor();

            //new SteamCMD().GetSteamCMD();

            // Run anything that doesn't require the loading of IR references above here

            if (!File.Exists(Path.Combine(FolderStructure.RootFolderPath, "IR.exe")))
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("IRSE: IR.EXE wasn't found.");
                Console.WriteLine("Make sure IRSE.exe is in the same folder as IR.exe.");
                Console.WriteLine("Press enter to close.");
                Console.ReadLine();
                Environment.Exit(0);
            }



            m_serverInstance = new ServerInstance();
            ThisGameVersion  = m_serverInstance.Assembly.GetName().Version.ToString();

            Console.ForegroundColor = ConsoleColor.White;
            Console.Write("For Game Version: ");
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write(ForGameVersion + "\n");
            Console.ForegroundColor = ConsoleColor.White;
            Console.Write("This Game Version: ");
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write(ThisGameVersion + "\n");
            Console.ForegroundColor = ConsoleColor.White;
            Console.Write("Online Game Version: ");
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write(SteamCMD.GetGameVersion() + "\n");
            Console.ForegroundColor = ConsoleColor.White;

            Console.ForegroundColor = ConsoleColor.Yellow;
            if (new Version(ThisGameVersion) < SteamCMD.GetGameVersion())
            {
                Console.WriteLine("There is a new version of Interstellar Rift! Update your IR Installation!");
            }

            if (new Version(ForGameVersion) < new Version(ThisGameVersion))
            {
                Console.WriteLine("Interstellar Rifts Version is newer than what this version of IRSE Supports, Check for IRSE updates!");
            }

            Console.WriteLine();
            Console.ResetColor();

            updateManager = new UpdateManager(); // REPO NEEDS TO BE PUBLIC

            Instance = new Program();
            Instance.Run(args);
        }