aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/World/Region/RestartModule.cs115
-rw-r--r--OpenSim/Region/Framework/Interfaces/IRestartModule.cs2
2 files changed, 114 insertions, 3 deletions
diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
index a92a28d..1c26c38 100644
--- a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
+++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
@@ -29,6 +29,7 @@ using System;
29using System.Reflection; 29using System.Reflection;
30using System.Timers; 30using System.Timers;
31using System.Threading; 31using System.Threading;
32using System.Collections.Generic;
32using log4net; 33using log4net;
33using Nini.Config; 34using Nini.Config;
34using OpenMetaverse; 35using OpenMetaverse;
@@ -46,6 +47,12 @@ namespace OpenSim.Region.CoreModules.World.Region
46 47
47 protected Scene m_Scene; 48 protected Scene m_Scene;
48 protected Timer m_CountdownTimer = null; 49 protected Timer m_CountdownTimer = null;
50 protected DateTime m_RestartBegin;
51 protected List<int> m_Alerts;
52 protected string m_Message;
53 protected UUID m_Initiator;
54 protected bool m_Notice = false;
55 protected IDialogModule m_DialogModule = null;
49 56
50 public void Initialise(IConfigSource config) 57 public void Initialise(IConfigSource config)
51 { 58 {
@@ -54,6 +61,7 @@ namespace OpenSim.Region.CoreModules.World.Region
54 public void AddRegion(Scene scene) 61 public void AddRegion(Scene scene)
55 { 62 {
56 m_Scene = scene; 63 m_Scene = scene;
64 m_DialogModule = m_Scene.RequestModuleInterface<IDialogModule>();
57 } 65 }
58 66
59 public void RegionLoaded(Scene scene) 67 public void RegionLoaded(Scene scene)
@@ -80,14 +88,117 @@ namespace OpenSim.Region.CoreModules.World.Region
80 88
81 public TimeSpan TimeUntilRestart 89 public TimeSpan TimeUntilRestart
82 { 90 {
83 get { return TimeSpan.FromSeconds(0); } 91 get { return DateTime.Now - m_RestartBegin; }
84 } 92 }
85 public void ScheduleRestart(UUID initiator, string message, int seconds, int[] alerts, bool notice) 93
94 public void ScheduleRestart(UUID initiator, string message, int[] alerts, bool notice)
95 {
96 if (m_CountdownTimer != null)
97 return;
98
99 if (alerts == null)
100 {
101 m_Scene.RestartNow();
102 return;
103 }
104
105 m_Message = message;
106 m_Initiator = initiator;
107 m_Notice = notice;
108 m_Alerts = new List<int>(alerts);
109 m_Alerts.Sort();
110 m_Alerts.Reverse();
111
112 if (m_Alerts[0] == 0)
113 {
114 m_Scene.RestartNow();
115 return;
116 }
117
118 int nextInterval = DoOneNotice();
119
120 SetTimer(nextInterval);
121 }
122
123 public int DoOneNotice()
124 {
125 if (m_Alerts.Count == 0 || m_Alerts[0] == 0)
126 {
127 m_Scene.RestartNow();
128 return 0;
129 }
130
131 int nextAlert = 0;
132 while (m_Alerts.Count > 1)
133 {
134 if (m_Alerts[1] == m_Alerts[0])
135 {
136 m_Alerts.RemoveAt(0);
137 continue;
138 }
139 nextAlert = m_Alerts[1];
140 }
141
142 int currentAlert = m_Alerts[0];
143
144 m_Alerts.RemoveAt(0);
145
146 int minutes = currentAlert / 60;
147 string currentAlertString = "";
148 if (minutes > 0)
149 {
150 if (minutes == 1)
151 currentAlertString += "1 minute";
152 else
153 currentAlertString += String.Format("{0} minutes", minutes);
154 if ((currentAlert % 60) != 0)
155 currentAlertString += " and ";
156 }
157 if ((currentAlert % 60) != 0)
158 {
159 int seconds = currentAlert % 60;
160 if (seconds == 1)
161 currentAlertString += "1 second";
162 else
163 currentAlertString += String.Format("{0} seconds", seconds);
164 }
165
166 string msg = String.Format(m_Message, currentAlertString);
167
168 if (m_DialogModule != null)
169 {
170 if (m_Notice)
171 m_DialogModule.SendGeneralAlert(msg);
172 else
173 m_DialogModule.SendNotificationToUsersInRegion(m_Initiator, "System", msg);
174 }
175
176 return currentAlert - nextAlert;
177 }
178
179 public void SetTimer(int intervalSeconds)
86 { 180 {
181 m_CountdownTimer = new Timer();
182 m_CountdownTimer.AutoReset = false;
183 m_CountdownTimer.Interval = intervalSeconds * 1000;
184 m_CountdownTimer.Elapsed += OnTimer;
185 m_CountdownTimer.Start();
186 }
187
188 private void OnTimer(object source, ElapsedEventArgs e)
189 {
190 int nextInterval = DoOneNotice();
191
192 SetTimer(nextInterval);
87 } 193 }
88 194
89 public void AbortRestart(string message) 195 public void AbortRestart(string message)
90 { 196 {
197 if (m_CountdownTimer != null)
198 {
199 m_CountdownTimer.Stop();
200 m_CountdownTimer = null;
201 }
91 } 202 }
92 } 203 }
93} 204}
diff --git a/OpenSim/Region/Framework/Interfaces/IRestartModule.cs b/OpenSim/Region/Framework/Interfaces/IRestartModule.cs
index d8cac7b..c68550f 100644
--- a/OpenSim/Region/Framework/Interfaces/IRestartModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IRestartModule.cs
@@ -33,7 +33,7 @@ namespace OpenSim.Region.Framework.Interfaces
33 public interface IRestartModule 33 public interface IRestartModule
34 { 34 {
35 TimeSpan TimeUntilRestart { get; } 35 TimeSpan TimeUntilRestart { get; }
36 void ScheduleRestart(UUID initiator, string message, int seconds, int[] alerts, bool notice); 36 void ScheduleRestart(UUID initiator, string message, int[] alerts, bool notice);
37 void AbortRestart(string message); 37 void AbortRestart(string message);
38 } 38 }
39} 39}