diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs | 113 |
1 files changed, 26 insertions, 87 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs b/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs index df3402d..4aee66d 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Concierge/ConciergeModule.cs | |||
@@ -55,10 +55,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge | |||
55 | 55 | ||
56 | private List<IScene> m_scenes = new List<IScene>(); | 56 | private List<IScene> m_scenes = new List<IScene>(); |
57 | private List<IScene> m_conciergedScenes = new List<IScene>(); | 57 | private List<IScene> m_conciergedScenes = new List<IScene>(); |
58 | private Dictionary<IScene, List<UUID>> m_sceneAttendees = | ||
59 | new Dictionary<IScene, List<UUID>>(); | ||
60 | private Dictionary<UUID, string> m_attendeeNames = | ||
61 | new Dictionary<UUID, string>(); | ||
62 | 58 | ||
63 | private bool m_replacingChatModule = false; | 59 | private bool m_replacingChatModule = false; |
64 | 60 | ||
@@ -103,6 +99,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge | |||
103 | { | 99 | { |
104 | if (config.Configs["Chat"] == null) | 100 | if (config.Configs["Chat"] == null) |
105 | { | 101 | { |
102 | // if Chat module has not been configured it's | ||
103 | // enabled by default, so we are not going to | ||
104 | // replace it. | ||
106 | m_replacingChatModule = false; | 105 | m_replacingChatModule = false; |
107 | } | 106 | } |
108 | else | 107 | else |
@@ -312,15 +311,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge | |||
312 | 311 | ||
313 | if (m_conciergedScenes.Contains(client.Scene)) | 312 | if (m_conciergedScenes.Contains(client.Scene)) |
314 | { | 313 | { |
315 | m_log.DebugFormat("[Concierge]: {0} logs off from {1}", client.Name, client.Scene.RegionInfo.RegionName); | 314 | Scene scene = client.Scene as Scene; |
316 | RemoveFromAttendeeList(client.AgentId, client.Name, client.Scene); | 315 | m_log.DebugFormat("[Concierge]: {0} logs off from {1}", client.Name, scene.RegionInfo.RegionName); |
317 | lock (m_sceneAttendees) | 316 | List<ScenePresence> avs = scene.GetAvatars(); |
318 | { | 317 | AnnounceToAgentsRegion(scene, String.Format(m_announceLeaving, client.Name, scene.RegionInfo.RegionName, avs.Count)); |
319 | AnnounceToAgentsRegion(client.Scene, String.Format(m_announceLeaving, client.Name, client.Scene.RegionInfo.RegionName, | 318 | UpdateBroker(scene, avs); |
320 | m_sceneAttendees[client.Scene].Count)); | ||
321 | UpdateBroker(client.Scene); | ||
322 | m_attendeeNames.Remove(client.AgentId); | ||
323 | } | ||
324 | } | 319 | } |
325 | } | 320 | } |
326 | 321 | ||
@@ -329,12 +324,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge | |||
329 | { | 324 | { |
330 | if (m_conciergedScenes.Contains(agent.Scene)) | 325 | if (m_conciergedScenes.Contains(agent.Scene)) |
331 | { | 326 | { |
332 | m_log.DebugFormat("[Concierge]: {0} enters {1}", agent.Name, agent.Scene.RegionInfo.RegionName); | 327 | Scene scene = agent.Scene; |
333 | AddToAttendeeList(agent.UUID, agent.Name, agent.Scene); | 328 | m_log.DebugFormat("[Concierge]: {0} enters {1}", agent.Name, scene.RegionInfo.RegionName); |
334 | WelcomeAvatar(agent, agent.Scene); | 329 | List<ScenePresence> avs = scene.GetAvatars(); |
335 | AnnounceToAgentsRegion(agent.Scene, String.Format(m_announceEntering, agent.Name, agent.Scene.RegionInfo.RegionName, | 330 | WelcomeAvatar(agent, scene); |
336 | m_sceneAttendees[agent.Scene].Count)); | 331 | AnnounceToAgentsRegion(scene, String.Format(m_announceEntering, agent.Name, |
337 | UpdateBroker(agent.Scene); | 332 | scene.RegionInfo.RegionName, avs.Count)); |
333 | UpdateBroker(scene, avs); | ||
338 | } | 334 | } |
339 | } | 335 | } |
340 | 336 | ||
@@ -343,49 +339,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge | |||
343 | { | 339 | { |
344 | if (m_conciergedScenes.Contains(agent.Scene)) | 340 | if (m_conciergedScenes.Contains(agent.Scene)) |
345 | { | 341 | { |
346 | m_log.DebugFormat("[Concierge]: {0} leaves {1}", agent.Name, agent.Scene.RegionInfo.RegionName); | 342 | Scene scene = agent.Scene; |
347 | RemoveFromAttendeeList(agent.UUID, agent.Name, agent.Scene); | 343 | m_log.DebugFormat("[Concierge]: {0} leaves {1}", agent.Name, scene.RegionInfo.RegionName); |
348 | AnnounceToAgentsRegion(agent.Scene, String.Format(m_announceLeaving, agent.Name, agent.Scene.RegionInfo.RegionName, | 344 | List<ScenePresence> avs = scene.GetAvatars(); |
349 | m_sceneAttendees[agent.Scene].Count)); | 345 | AnnounceToAgentsRegion(scene, String.Format(m_announceLeaving, agent.Name, |
350 | UpdateBroker(agent.Scene); | 346 | scene.RegionInfo.RegionName, avs.Count)); |
351 | } | 347 | UpdateBroker(scene, avs); |
352 | } | ||
353 | |||
354 | protected void AddToAttendeeList(UUID agentID, string name, Scene scene) | ||
355 | { | ||
356 | lock (m_sceneAttendees) | ||
357 | { | ||
358 | if (!m_sceneAttendees.ContainsKey(scene)) | ||
359 | m_sceneAttendees[scene] = new List<UUID>(); | ||
360 | |||
361 | List<UUID> attendees = m_sceneAttendees[scene]; | ||
362 | if (!attendees.Contains(agentID)) | ||
363 | { | ||
364 | attendees.Add(agentID); | ||
365 | m_attendeeNames[agentID] = name; | ||
366 | } | ||
367 | } | ||
368 | } | ||
369 | |||
370 | protected void RemoveFromAttendeeList(UUID agentID, String name, IScene scene) | ||
371 | { | ||
372 | lock (m_sceneAttendees) | ||
373 | { | ||
374 | if (!m_sceneAttendees.ContainsKey(scene)) | ||
375 | { | ||
376 | m_log.WarnFormat("[Concierge]: attendee list missing for region {0}", scene.RegionInfo.RegionName); | ||
377 | return; | ||
378 | } | ||
379 | |||
380 | List<UUID> attendees = m_sceneAttendees[scene]; | ||
381 | if (!attendees.Contains(agentID)) | ||
382 | { | ||
383 | m_log.WarnFormat("[Concierge]: avatar {0} must have sneaked in to region {1} earlier", | ||
384 | name, scene.RegionInfo.RegionName); | ||
385 | return; | ||
386 | } | ||
387 | |||
388 | attendees.Remove(agentID); | ||
389 | } | 348 | } |
390 | } | 349 | } |
391 | 350 | ||
@@ -404,29 +363,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge | |||
404 | } | 363 | } |
405 | } | 364 | } |
406 | 365 | ||
407 | protected void UpdateBroker(IScene scene) | 366 | protected void UpdateBroker(IScene scene, List<ScenePresence> avatars) |
408 | { | 367 | { |
409 | if (String.IsNullOrEmpty(m_brokerURI)) | 368 | if (String.IsNullOrEmpty(m_brokerURI)) |
410 | return; | 369 | return; |
411 | 370 | ||
412 | string uri = String.Format(m_brokerURI, scene.RegionInfo.RegionName, scene.RegionInfo.RegionID); | 371 | string uri = String.Format(m_brokerURI, scene.RegionInfo.RegionName, scene.RegionInfo.RegionID); |
413 | 372 | ||
414 | // get attendee list for the scene | ||
415 | List<UUID> attendees; | ||
416 | lock (m_sceneAttendees) | ||
417 | { | ||
418 | if (!m_sceneAttendees.ContainsKey(scene)) | ||
419 | { | ||
420 | m_log.DebugFormat("[Concierge]: attendee list missing for region {0}", scene.RegionInfo.RegionName); | ||
421 | return; | ||
422 | } | ||
423 | |||
424 | attendees = m_sceneAttendees[scene]; | ||
425 | } | ||
426 | |||
427 | // create XML sniplet | 373 | // create XML sniplet |
428 | StringBuilder list = new StringBuilder(); | 374 | StringBuilder list = new StringBuilder(); |
429 | if (0 == attendees.Count) | 375 | if (0 == avatars.Count) |
430 | { | 376 | { |
431 | list.Append(String.Format("<avatars count=\"0\" region_name=\"{0}\" region_uuid=\"{1}\" timestamp=\"{2}\" />", | 377 | list.Append(String.Format("<avatars count=\"0\" region_name=\"{0}\" region_uuid=\"{1}\" timestamp=\"{2}\" />", |
432 | scene.RegionInfo.RegionName, scene.RegionInfo.RegionID, | 378 | scene.RegionInfo.RegionName, scene.RegionInfo.RegionID, |
@@ -435,19 +381,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.Concierge | |||
435 | else | 381 | else |
436 | { | 382 | { |
437 | list.Append(String.Format("<avatars count=\"{0}\" region_name=\"{1}\" region_uuid=\"{2}\" timestamp=\"{3}\">\n", | 383 | list.Append(String.Format("<avatars count=\"{0}\" region_name=\"{1}\" region_uuid=\"{2}\" timestamp=\"{3}\">\n", |
438 | attendees.Count, scene.RegionInfo.RegionName, | 384 | avatars.Count, scene.RegionInfo.RegionName, |
439 | scene.RegionInfo.RegionID, | 385 | scene.RegionInfo.RegionID, |
440 | DateTime.UtcNow.ToString("s"))); | 386 | DateTime.UtcNow.ToString("s"))); |
441 | lock (m_sceneAttendees) | 387 | foreach (ScenePresence av in avatars) |
442 | { | 388 | { |
443 | foreach (UUID uuid in attendees) | 389 | list.Append(String.Format(" <avatar name=\"{0}\" uuid=\"{1}\" />\n", av.Name, av.UUID)); |
444 | { | ||
445 | if (m_attendeeNames.ContainsKey(uuid)) | ||
446 | { | ||
447 | string name = m_attendeeNames[uuid]; | ||
448 | list.Append(String.Format(" <avatar name=\"{0}\" uuid=\"{1}\" />\n", name, uuid)); | ||
449 | } | ||
450 | } | ||
451 | } | 390 | } |
452 | list.Append("</avatars>"); | 391 | list.Append("</avatars>"); |
453 | } | 392 | } |