public static void ServerUpdateWValidate(ArkServerInfo Server)
        {
            string command = Server.SteamCMDDir + "SteamCMD.exe " + "+login anonymous +force_install_dir " + Server.ServerDir + " +app_update 376030 validate";

            command = command + " +force_install_dir " + Server.SteamWorkshopDownloadDir;
            foreach (string mod in GlobalVariables.ActiveServerMods(Server))
            {
                command = command + " +workshop_download_item 346110 " + mod;
            }

            command = command + " +quit";


            Process steamUpdateServer = new Process();

            steamUpdateServer.StartInfo.UseShellExecute        = false;
            steamUpdateServer.StartInfo.RedirectStandardInput  = true;
            steamUpdateServer.StartInfo.RedirectStandardOutput = true;
            //steamUpdateServer.StartInfo.CreateNoWindow = false;
            steamUpdateServer.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            steamUpdateServer.EnableRaisingEvents   = true;
            steamUpdateServer.StartInfo.FileName    = "cmd.exe";
            steamUpdateServer.Exited += (sender, e) =>
            {
                //Console.WriteLine(DateTime.Now + ": Process Complete for " + Server.Name + "    Time: {0} sec " +
                //"Exit code:    {1}", DateTime.Now.Second - steamUpdateServer.StartTime.Second, steamUpdateServer.ExitCode);
                Methods.Log(Server, DateTime.Now + ": Process Complete for " + Server.Name + " Time: " + (DateTime.Now.Second - steamUpdateServer.StartTime.Second) + " sec " +
                            "Exit code: " + steamUpdateServer.ExitCode);
                Server.CurrentlyUpdating = false;

                if (!Server.stopServerTimer)
                {
                    Server.GameUpdateNeeded = GlobalVariables.NeedsArkUpdate(Server);
                    Server.ModUpdateNeeded  = GlobalVariables.NeedsModUpdate(Server);
                }
                Methods.StartServerProcedure(Server);
                ((Process)sender).Dispose();
            };
            steamUpdateServer.Start();
            //Console.WriteLine(DateTime.Now + ": Running ServerUpdate with Validate method for " + Server.Name);
            Methods.Log(Server, DateTime.Now + ": Running ServerUpdate with Validate method for " + Server.Name);
            steamUpdateServer.StandardOutput.ReadToEndAsync();
            steamUpdateServer.StandardInput.WriteLine(command);
            Server.CurrentlyUpdating = true;
            steamUpdateServer.StandardInput.WriteLine("exit");
        }
        public static void ServerUpdate(ArkServerInfo Server)
        {
            Process steamUpdateServer = new Process();

            steamUpdateServer.StartInfo.UseShellExecute        = false;
            steamUpdateServer.StartInfo.RedirectStandardInput  = true;
            steamUpdateServer.StartInfo.RedirectStandardOutput = true;
            //steamUpdateServer.StartInfo.CreateNoWindow = false;
            //steamUpdateServer.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            steamUpdateServer.EnableRaisingEvents = true;
            steamUpdateServer.StartInfo.FileName  = "cmd.exe";
            steamUpdateServer.Exited += (sender, e) =>
            {
                //Console.WriteLine(DateTime.Now + ": Process Complete for " + Server.Name + "    Time: {0} sec " +
                //"Exit code:    {1}", DateTime.Now.Second - steamUpdateServer.StartTime.Second, steamUpdateServer.ExitCode);
                Methods.Log(Server, DateTime.Now + ": Process Complete for " + Server.Name + " Time: " + (DateTime.Now.Second - steamUpdateServer.StartTime.Second) + " sec " +
                            "Exit code: " + steamUpdateServer.ExitCode);

                Server.CurrentlyUpdating = false;

                if (!Server.stopServerTimer)
                {
                    Server.GameUpdateNeeded = GlobalVariables.NeedsArkUpdate(Server);
                    Server.ModUpdateNeeded  = GlobalVariables.NeedsModUpdate(Server);
                }
                Methods.StartServerProcedure(Server);
                ((Process)sender).Dispose();
            };
            //Console.WriteLine(DateTime.Now + ": Running ServerUpdate method for " + Server.Name);
            Methods.Log(Server, DateTime.Now + ": Running ServerUpdate method for " + Server.Name);
            steamUpdateServer.Start();
            Server.CurrentlyUpdating = true;
            steamUpdateServer.StandardInput.WriteLine(GlobalVariables.SteamCMDCommand(Server));
            steamUpdateServer.StandardOutput.ReadToEndAsync();
            steamUpdateServer.StandardInput.WriteLine("exit");
        }
        private static void CheckRoutine(object sender, EventArgs e)
        {
            //Run Server check
            foreach (var Server in Servers)
            {
                //Log that server is currently updating game files
                if (Server.CurrentlyUpdating)
                {
                    //Console.WriteLine(DateTime.Now + ": " + Server.Name + " is currently updating.");
                    Methods.Log(Server, DateTime.Now + ": " + Server.Name + " is currently updating.");
                }
                //If any event was triggered, or if the server is updating, do not run check routines.
                if (!Server.stopServerTimer && !Server.CurrentlyUpdating)
                {
                    //Console.WriteLine(DateTime.Now + ": Entered " + Server.Name + "'s check method. RunningTimer = " + nRunningEventsTriggered);
                    Methods.Log(Server, DateTime.Now + ": Entered " + Server.Name + "'s check method. RunningTimer = " + nRunningEventsTriggered);
                    bool processOpen        = GlobalVariables.IsProcessOpen(Server);
                    bool ServerIsResponding = RCONCommands.IsServerResponding(Server);

                    //Console.WriteLine("Server Response: " + ServerIsResponding);
                    Methods.Log(Server, "Server Response: " + ServerIsResponding);
                    Server.ModUpdateNeeded = GlobalVariables.NeedsModUpdate(Server);

                    //Console.WriteLine("Mods are up to date: " + !Server.ModUpdateNeeded);
                    Methods.Log(Server, DateTime.Now + ": Mods are up to date: " + !Server.ModUpdateNeeded);
                    Server.GameUpdateNeeded = GlobalVariables.NeedsArkUpdate(Server);

                    //Console.WriteLine("Game is up to date: " + !Server.GameUpdateNeeded);
                    Methods.Log(Server, DateTime.Now + ": Game are up to date: " + !Server.GameUpdateNeeded);

                    if (Server.ModUpdateNeeded && processOpen)
                    {
                        //Restart and Update the server if update is needed.
                        RestartProcedures.BroadCastArkUpdateRestartTimer(Server, "Mod Update: " + Server.theModNeedingUpdate);
                        Server.ModUpdateNeeded = false;
                        Server.stopServerTimer = true;
                    }
                    //If process is open and game needs to be updated, trigger restart counter
                    if (Server.GameUpdateNeeded && processOpen)
                    {
                        RestartProcedures.BroadCastArkUpdateRestartTimer(Server, "Ark Update");
                        Server.GameUpdateNeeded = false;
                        Server.stopServerTimer  = true;
                    }
                    if (processOpen && !ServerIsResponding)
                    {
                        if (Server.nEventsProcessOpenNotResponding == 10)
                        {
                            RestartUnresponsive(Server);
                        }
                        if (!Server.CurrentlyUpdating)
                        {
                            Server.nEventsProcessOpenNotResponding++;
                        }
                    }
                    if (nRunningEventsTriggered % 60 == 0)
                    {
                        string message = "25 TC Reward points for recruiting players. See Dicord for more information.";
                        Console.WriteLine(DateTime.Now + ": Message sent to " + Server.Name + " - " + message);
                        RCONCommands.GlobalNotification(Server, message);
                    }
                    //Run Game Version Update every 20 minutes
                    if (nRunningEventsTriggered % 20 == 0)
                    {
                        Processes.ModVersionUpdate(Server);
                    }
                    //If process is not running, AND timer is not stopped and server is not update then trigger the start routine.
                    if (!processOpen)
                    {
                        Methods.StartServerProcedure(Server);
                    }
                }
                //If the server has ran for 12 hours, trigger the routine maintenance restart.
                //if (nRagEventsTriggered % GlobalVariables.timeIntervalMaintenanceRestart == 0 && RagProcessOpen)
                //{
                //    ServerRestartForModORRoutineMaintenance(Ragnarok, "Routine Maintenance");
                //    RagnarokTimerTriggerStopped = true;
                //}
                //Backup the server every 2 hours.
                if (nRunningEventsTriggered % 30 == 0)
                {
                    Methods.BackupServerFiles(Server);
                }
            }
            nRunningEventsTriggered++;
        }