aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Tools/pCampBot/BotManager.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Tools/pCampBot/BotManager.cs67
1 files changed, 49 insertions, 18 deletions
diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs
index 0f501b7..d615b3f 100644
--- a/OpenSim/Tools/pCampBot/BotManager.cs
+++ b/OpenSim/Tools/pCampBot/BotManager.cs
@@ -49,6 +49,14 @@ namespace pCampBot
49 { 49 {
50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51 51
52 public const int DefaultLoginDelay = 5000;
53
54 /// <summary>
55 /// Delay between logins of multiple bots.
56 /// </summary>
57 /// <remarks>TODO: This value needs to be configurable by a command line argument.</remarks>
58 public int LoginDelay { get; set; }
59
52 /// <summary> 60 /// <summary>
53 /// Command console 61 /// Command console
54 /// </summary> 62 /// </summary>
@@ -84,6 +92,8 @@ namespace pCampBot
84 /// </summary> 92 /// </summary>
85 public BotManager() 93 public BotManager()
86 { 94 {
95 LoginDelay = DefaultLoginDelay;
96
87 Rng = new Random(Environment.TickCount); 97 Rng = new Random(Environment.TickCount);
88 AssetsReceived = new Dictionary<UUID, bool>(); 98 AssetsReceived = new Dictionary<UUID, bool>();
89 RegionsKnown = new Dictionary<ulong, GridRegion>(); 99 RegionsKnown = new Dictionary<ulong, GridRegion>();
@@ -151,28 +161,34 @@ namespace pCampBot
151 Array.ForEach<string>( 161 Array.ForEach<string>(
152 cs.GetString("behaviours", "p").Split(new char[] { ',' }), b => behaviourSwitches.Add(b)); 162 cs.GetString("behaviours", "p").Split(new char[] { ',' }), b => behaviourSwitches.Add(b));
153 163
164 MainConsole.Instance.OutputFormat(
165 "[BOT MANAGER]: Starting {0} bots connecting to {1}, named {2} {3}_<n>",
166 botcount,
167 loginUri,
168 firstName,
169 lastNameStem);
170
171 MainConsole.Instance.OutputFormat("[BOT MANAGER]: Delay between logins is {0}ms", LoginDelay);
172
154 for (int i = 0; i < botcount; i++) 173 for (int i = 0; i < botcount; i++)
155 { 174 {
156 string lastName = string.Format("{0}_{1}", lastNameStem, i); 175 string lastName = string.Format("{0}_{1}", lastNameStem, i);
157 176
177 // We must give each bot its own list of instantiated behaviours since they store state.
158 List<IBehaviour> behaviours = new List<IBehaviour>(); 178 List<IBehaviour> behaviours = new List<IBehaviour>();
159 179
160 // Hard-coded for now 180 // Hard-coded for now
161 if (behaviourSwitches.Contains("p")) 181 if (behaviourSwitches.Contains("p"))
162 behaviours.Add(new PhysicsBehaviour()); 182 behaviours.Add(new PhysicsBehaviour());
163 183
164 if (behaviourSwitches.Contains("g")) 184 if (behaviourSwitches.Contains("g"))
165 behaviours.Add(new GrabbingBehaviour()); 185 behaviours.Add(new GrabbingBehaviour());
166 186
167 if (behaviourSwitches.Contains("t")) 187 if (behaviourSwitches.Contains("t"))
168 behaviours.Add(new TeleportBehaviour()); 188 behaviours.Add(new TeleportBehaviour());
169 189
170 if (behaviourSwitches.Contains("c")) 190 if (behaviourSwitches.Contains("c"))
171 behaviours.Add(new CrossBehaviour()); 191 behaviours.Add(new CrossBehaviour());
172
173 MainConsole.Instance.OutputFormat(
174 "[BOT MANAGER]: Bot {0} {1} configured for behaviours {2}",
175 firstName, lastName, string.Join(",", behaviours.ConvertAll<string>(b => b.Name).ToArray()));
176 192
177 StartBot(this, behaviours, firstName, lastName, password, loginUri); 193 StartBot(this, behaviours, firstName, lastName, password, loginUri);
178 } 194 }
@@ -211,6 +227,10 @@ namespace pCampBot
211 BotManager bm, List<IBehaviour> behaviours, 227 BotManager bm, List<IBehaviour> behaviours,
212 string firstName, string lastName, string password, string loginUri) 228 string firstName, string lastName, string password, string loginUri)
213 { 229 {
230 MainConsole.Instance.OutputFormat(
231 "[BOT MANAGER]: Starting bot {0} {1}, behaviours are {2}",
232 firstName, lastName, string.Join(",", behaviours.ConvertAll<string>(b => b.Name).ToArray()));
233
214 Bot pb = new Bot(bm, behaviours, firstName, lastName, password, loginUri); 234 Bot pb = new Bot(bm, behaviours, firstName, lastName, password, loginUri);
215 235
216 pb.OnConnected += handlebotEvent; 236 pb.OnConnected += handlebotEvent;
@@ -222,7 +242,11 @@ namespace pCampBot
222 Thread pbThread = new Thread(pb.startup); 242 Thread pbThread = new Thread(pb.startup);
223 pbThread.Name = pb.Name; 243 pbThread.Name = pb.Name;
224 pbThread.IsBackground = true; 244 pbThread.IsBackground = true;
245
225 pbThread.Start(); 246 pbThread.Start();
247
248 // Stagger logins
249 Thread.Sleep(LoginDelay);
226 } 250 }
227 251
228 /// <summary> 252 /// <summary>
@@ -242,7 +266,7 @@ namespace pCampBot
242 266
243 lock (m_lBot) 267 lock (m_lBot)
244 { 268 {
245 if (m_lBot.TrueForAll(b => !b.IsConnected)) 269 if (m_lBot.TrueForAll(b => b.ConnectionState == ConnectionState.Disconnected))
246 Environment.Exit(0); 270 Environment.Exit(0);
247 271
248 break; 272 break;
@@ -251,13 +275,21 @@ namespace pCampBot
251 } 275 }
252 276
253 /// <summary> 277 /// <summary>
254 /// Shutting down all bots 278 /// Shut down all bots
255 /// </summary> 279 /// </summary>
280 /// <remarks>
281 /// We launch each shutdown on its own thread so that a slow shutting down bot doesn't hold up all the others.
282 /// </remarks>
256 public void doBotShutdown() 283 public void doBotShutdown()
257 { 284 {
258 lock (m_lBot) 285 lock (m_lBot)
259 foreach (Bot pb in m_lBot) 286 {
260 pb.shutdown(); 287 foreach (Bot bot in m_lBot)
288 {
289 Bot thisBot = bot;
290 Util.FireAndForget(o => thisBot.shutdown());
291 }
292 }
261 } 293 }
262 294
263 /// <summary> 295 /// <summary>
@@ -271,11 +303,8 @@ namespace pCampBot
271 303
272 private void HandleShutdown(string module, string[] cmd) 304 private void HandleShutdown(string module, string[] cmd)
273 { 305 {
274 Util.FireAndForget(o => 306 m_log.Info("[BOTMANAGER]: Shutting down bots");
275 { 307 doBotShutdown();
276 m_log.Warn("[BOTMANAGER]: Shutting down bots");
277 doBotShutdown();
278 });
279 } 308 }
280 309
281 private void HandleShowRegions(string module, string[] cmd) 310 private void HandleShowRegions(string module, string[] cmd)
@@ -302,9 +331,11 @@ namespace pCampBot
302 { 331 {
303 foreach (Bot pb in m_lBot) 332 foreach (Bot pb in m_lBot)
304 { 333 {
334 Simulator currentSim = pb.Client.Network.CurrentSim;
335
305 MainConsole.Instance.OutputFormat( 336 MainConsole.Instance.OutputFormat(
306 outputFormat, 337 outputFormat,
307 pb.Name, pb.Client.Network.CurrentSim.Name, pb.IsConnected ? "Connected" : "Disconnected"); 338 pb.Name, currentSim != null ? currentSim.Name : "(none)", pb.ConnectionState);
308 } 339 }
309 } 340 }
310 } 341 }