diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs index a92a28dd8c..1c26c38daa 100644 --- a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs +++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs @@ -29,6 +29,7 @@ using System; using System.Reflection; using System.Timers; using System.Threading; +using System.Collections.Generic; using log4net; using Nini.Config; using OpenMetaverse; @@ -46,6 +47,12 @@ namespace OpenSim.Region.CoreModules.World.Region protected Scene m_Scene; protected Timer m_CountdownTimer = null; + protected DateTime m_RestartBegin; + protected List m_Alerts; + protected string m_Message; + protected UUID m_Initiator; + protected bool m_Notice = false; + protected IDialogModule m_DialogModule = null; public void Initialise(IConfigSource config) { @@ -54,6 +61,7 @@ namespace OpenSim.Region.CoreModules.World.Region public void AddRegion(Scene scene) { m_Scene = scene; + m_DialogModule = m_Scene.RequestModuleInterface(); } public void RegionLoaded(Scene scene) @@ -80,14 +88,117 @@ namespace OpenSim.Region.CoreModules.World.Region public TimeSpan TimeUntilRestart { - get { return TimeSpan.FromSeconds(0); } + get { return DateTime.Now - m_RestartBegin; } } - public void ScheduleRestart(UUID initiator, string message, int seconds, int[] alerts, bool notice) + + public void ScheduleRestart(UUID initiator, string message, int[] alerts, bool notice) { + if (m_CountdownTimer != null) + return; + + if (alerts == null) + { + m_Scene.RestartNow(); + return; + } + + m_Message = message; + m_Initiator = initiator; + m_Notice = notice; + m_Alerts = new List(alerts); + m_Alerts.Sort(); + m_Alerts.Reverse(); + + if (m_Alerts[0] == 0) + { + m_Scene.RestartNow(); + return; + } + + int nextInterval = DoOneNotice(); + + SetTimer(nextInterval); + } + + public int DoOneNotice() + { + if (m_Alerts.Count == 0 || m_Alerts[0] == 0) + { + m_Scene.RestartNow(); + return 0; + } + + int nextAlert = 0; + while (m_Alerts.Count > 1) + { + if (m_Alerts[1] == m_Alerts[0]) + { + m_Alerts.RemoveAt(0); + continue; + } + nextAlert = m_Alerts[1]; + } + + int currentAlert = m_Alerts[0]; + + m_Alerts.RemoveAt(0); + + int minutes = currentAlert / 60; + string currentAlertString = ""; + if (minutes > 0) + { + if (minutes == 1) + currentAlertString += "1 minute"; + else + currentAlertString += String.Format("{0} minutes", minutes); + if ((currentAlert % 60) != 0) + currentAlertString += " and "; + } + if ((currentAlert % 60) != 0) + { + int seconds = currentAlert % 60; + if (seconds == 1) + currentAlertString += "1 second"; + else + currentAlertString += String.Format("{0} seconds", seconds); + } + + string msg = String.Format(m_Message, currentAlertString); + + if (m_DialogModule != null) + { + if (m_Notice) + m_DialogModule.SendGeneralAlert(msg); + else + m_DialogModule.SendNotificationToUsersInRegion(m_Initiator, "System", msg); + } + + return currentAlert - nextAlert; + } + + public void SetTimer(int intervalSeconds) + { + m_CountdownTimer = new Timer(); + m_CountdownTimer.AutoReset = false; + m_CountdownTimer.Interval = intervalSeconds * 1000; + m_CountdownTimer.Elapsed += OnTimer; + m_CountdownTimer.Start(); + } + + private void OnTimer(object source, ElapsedEventArgs e) + { + int nextInterval = DoOneNotice(); + + SetTimer(nextInterval); } public void AbortRestart(string message) { + if (m_CountdownTimer != null) + { + m_CountdownTimer.Stop(); + m_CountdownTimer = null; + } } } } diff --git a/OpenSim/Region/Framework/Interfaces/IRestartModule.cs b/OpenSim/Region/Framework/Interfaces/IRestartModule.cs index d8cac7b66b..c68550f393 100644 --- a/OpenSim/Region/Framework/Interfaces/IRestartModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRestartModule.cs @@ -33,7 +33,7 @@ namespace OpenSim.Region.Framework.Interfaces public interface IRestartModule { TimeSpan TimeUntilRestart { get; } - void ScheduleRestart(UUID initiator, string message, int seconds, int[] alerts, bool notice); + void ScheduleRestart(UUID initiator, string message, int[] alerts, bool notice); void AbortRestart(string message); } }