/// <summary> /// Calculate the time until an automation event in milliseconds /// </summary> /// <param name="automationTime">Automation event</param> /// <returns>Time in milliseconds</returns> public double CalculateTime(AutomationTime automationTime) { DateTime nowTime = DateTime.Now; DateTime restartTime = new DateTime(nowTime.Year, nowTime.Month, nowTime.Day, automationTime.Time.Hours, automationTime.Time.Minutes, 0); if (restartTime < nowTime) { restartTime = restartTime.AddDays(1); } return((restartTime - nowTime).TotalMilliseconds); }
private void WriteAutomationInfo(AutomationTime automationTime, string time) { if (automationTime is RestartTime) { ApplicationManager.Instance.ActiveEntities[Server].StandardInput .WriteLineAsync("say Next server restart in " + time + "!"); } else if (automationTime is StopTime) { ApplicationManager.Instance.ActiveEntities[Server].StandardInput .WriteLineAsync("say Server shutdown in " + time + "!"); } }
/// <summary> /// Dispose existing timers and set timer for the next automation event of a given server. /// This should be called every time the server status changes, or the settings change. /// </summary> /// <param name="viewModel"></param> public void UpdateAutomation(ServerViewModel viewModel) { DisposeAutomation(viewModel); AutomationTime nextAutomationTime = GetNextAutomation(viewModel); if (nextAutomationTime != null) { RegisterRestart(viewModel, nextAutomationTime); } viewModel.SetAutomationTime(nextAutomationTime); }
private void RegisterRestart(ServerViewModel server, AutomationTime time) { double restartTime = CalculateTime(time); Timer t = new Timer(restartTime); //t.AutoReset = cyclic; t.Elapsed += async(sender, e) => await Task.Factory.StartNew(() => TimerElapsed(server, t, time)); if (!Timers.ContainsKey(server)) { Timers.Add(server, new List <Timer>()); } Timers[server].Add(t); t.Start(); }
private AutomationTime GetNextAutomation(ServerViewModel server) { double nextTimer = double.MaxValue; AutomationTime result = null; List <AutomationTime> relevantTimes = GetRelevantTimes(server); foreach (AutomationTime automationTime in relevantTimes) { if (automationTime.Enabled) { double t = CalculateTime(automationTime); if (t < nextTimer) { nextTimer = t; result = automationTime; } } } return(result); }
private void TimerElapsed(ServerViewModel server, Timer t, AutomationTime time) { if (time is RestartTime) { TimerElapsedRestart(server); } else if (time is StopTime) { TimerElapsedStop(server); } else if (time is StartTime) { TimerElapsedStart(server); } if (!t.AutoReset) { t.Dispose(); Timers[server].Remove(t); } }
public void SetAutomationTime(AutomationTime automationTime) { restartTimer?.Dispose(); AutomationEnabled = false; if (automationTime == null) { return; } if (automationTime is RestartTime) { NextAutomationName = "Restart"; } else if (automationTime is StopTime) { NextAutomationName = "Shutdown"; } else if (automationTime is StartTime) { NextAutomationName = "Starting"; } TimeSpan timeSpan = TimeSpan.FromMilliseconds(ServerAutomationManager.Instance.CalculateTime(automationTime)); AutomationEnabled = true; NextAutomationHours = timeSpan.Hours.ToString(); NextAutomationMinutes = timeSpan.Minutes.ToString(); NextAutomationSeconds = timeSpan.Seconds.ToString(); new Thread(() => { restartTimer = new Timer { Interval = 1000 }; restartTimer.Elapsed += (sender, args) => { timeSpan = timeSpan.Subtract(TimeSpan.FromMilliseconds(1000)); AutomationEnabled = true; NextAutomationHours = timeSpan.Hours.ToString(); NextAutomationMinutes = timeSpan.Minutes.ToString(); NextAutomationSeconds = timeSpan.Seconds.ToString(); if (timeSpan.Hours == 0 && timeSpan.Minutes == 30 && timeSpan.Seconds == 0) { WriteAutomationInfo(automationTime, "30 minutes"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 5 && timeSpan.Seconds == 0) { WriteAutomationInfo(automationTime, "5 minutes"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 1 && timeSpan.Seconds == 0) { WriteAutomationInfo(automationTime, "1 minute"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 10) { WriteAutomationInfo(automationTime, "10 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 9) { WriteAutomationInfo(automationTime, "9 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 8) { WriteAutomationInfo(automationTime, "8 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 7) { WriteAutomationInfo(automationTime, "7 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 6) { WriteAutomationInfo(automationTime, "6 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 5) { WriteAutomationInfo(automationTime, "5 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 4) { WriteAutomationInfo(automationTime, "4 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 3) { WriteAutomationInfo(automationTime, "3 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 2) { WriteAutomationInfo(automationTime, "2 seconds"); } else if (timeSpan.Hours == 0 && timeSpan.Minutes == 0 && timeSpan.Seconds == 1) { WriteAutomationInfo(automationTime, "1 seconds"); } }; restartTimer.AutoReset = true; restartTimer.Enabled = true; }) { IsBackground = true }.Start(); }