aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/OptionalModules
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/OptionalModules')
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs266
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs321
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs66
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs326
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs1
5 files changed, 528 insertions, 452 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
index 00fe5df..06aad91 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
@@ -28,41 +28,30 @@
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31
32
33using log4net; 31using log4net;
34using Mono.Addins; 32using Mono.Addins;
35using Nini.Config; 33using Nini.Config;
36
37using OpenMetaverse; 34using OpenMetaverse;
38using OpenMetaverse.StructuredData; 35using OpenMetaverse.StructuredData;
39
40using OpenSim.Framework; 36using OpenSim.Framework;
41using OpenSim.Region.CoreModules.Framework.EventQueue; 37using OpenSim.Region.CoreModules.Framework.EventQueue;
42using OpenSim.Region.Framework.Interfaces; 38using OpenSim.Region.Framework.Interfaces;
43using OpenSim.Region.Framework.Scenes; 39using OpenSim.Region.Framework.Scenes;
44 40
45
46using Caps = OpenSim.Framework.Capabilities.Caps; 41using Caps = OpenSim.Framework.Capabilities.Caps;
47 42
48namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups 43namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
49{ 44{
50 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] 45 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
51 public class GroupsMessagingModule : ISharedRegionModule 46 public class GroupsMessagingModule : ISharedRegionModule, IGroupsMessagingModule
52 { 47 {
53
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 49
56 private List<Scene> m_sceneList = new List<Scene>(); 50 private List<Scene> m_sceneList = new List<Scene>();
57 51
58 private IMessageTransferModule m_msgTransferModule = null; 52 private IMessageTransferModule m_msgTransferModule = null;
59 53
60 private IGroupsModule m_groupsModule = null; 54 private IGroupsServicesConnector m_groupData = null;
61
62 // TODO: Move this off to the Groups Server
63 public Dictionary<Guid, List<Guid>> m_agentsInGroupSession = new Dictionary<Guid, List<Guid>>();
64 public Dictionary<Guid, List<Guid>> m_agentsDroppedSession = new Dictionary<Guid, List<Guid>>();
65
66 55
67 // Config Options 56 // Config Options
68 private bool m_groupMessagingEnabled = false; 57 private bool m_groupMessagingEnabled = false;
@@ -108,8 +97,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
108 97
109 public void AddRegion(Scene scene) 98 public void AddRegion(Scene scene)
110 { 99 {
111 // NoOp 100 if (!m_groupMessagingEnabled)
101 return;
102
103 scene.RegisterModuleInterface<IGroupsMessagingModule>(this);
112 } 104 }
105
113 public void RegionLoaded(Scene scene) 106 public void RegionLoaded(Scene scene)
114 { 107 {
115 if (!m_groupMessagingEnabled) 108 if (!m_groupMessagingEnabled)
@@ -117,12 +110,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
117 110
118 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 111 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
119 112
120 m_groupsModule = scene.RequestModuleInterface<IGroupsModule>(); 113 m_groupData = scene.RequestModuleInterface<IGroupsServicesConnector>();
121 114
122 // No groups module, no groups messaging 115 // No groups module, no groups messaging
123 if (m_groupsModule == null) 116 if (m_groupData == null)
124 { 117 {
125 m_log.Error("[GROUPS-MESSAGING]: Could not get IGroupsModule, GroupsMessagingModule is now disabled."); 118 m_log.Error("[GROUPS-MESSAGING]: Could not get IGroupsServicesConnector, GroupsMessagingModule is now disabled.");
126 Close(); 119 Close();
127 m_groupMessagingEnabled = false; 120 m_groupMessagingEnabled = false;
128 return; 121 return;
@@ -144,7 +137,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
144 137
145 scene.EventManager.OnNewClient += OnNewClient; 138 scene.EventManager.OnNewClient += OnNewClient;
146 scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; 139 scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
147
148 } 140 }
149 141
150 public void RemoveRegion(Scene scene) 142 public void RemoveRegion(Scene scene)
@@ -172,7 +164,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
172 164
173 m_sceneList.Clear(); 165 m_sceneList.Clear();
174 166
175 m_groupsModule = null; 167 m_groupData = null;
176 m_msgTransferModule = null; 168 m_msgTransferModule = null;
177 } 169 }
178 170
@@ -197,6 +189,75 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
197 189
198 #endregion 190 #endregion
199 191
192 /// <summary>
193 /// Not really needed, but does confirm that the group exists.
194 /// </summary>
195 public bool StartGroupChatSession(UUID agentID, UUID groupID)
196 {
197 if (m_debugEnabled)
198 m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
199
200 GroupRecord groupInfo = m_groupData.GetGroupRecord(agentID, groupID, null);
201
202 if (groupInfo != null)
203 {
204 return true;
205 }
206 else
207 {
208 return false;
209 }
210 }
211
212 public void SendMessageToGroup(GridInstantMessage im, UUID groupID)
213 {
214 if (m_debugEnabled)
215 m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
216
217
218 foreach (GroupMembersData member in m_groupData.GetGroupMembers(UUID.Zero, groupID))
219 {
220 if (m_groupData.hasAgentDroppedGroupChatSession(member.AgentID, groupID))
221 {
222 // Don't deliver messages to people who have dropped this session
223 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} has dropped session, not delivering to them", member.AgentID);
224 continue;
225 }
226
227 // Copy Message
228 GridInstantMessage msg = new GridInstantMessage();
229 msg.imSessionID = groupID.Guid;
230 msg.fromAgentName = im.fromAgentName;
231 msg.message = im.message;
232 msg.dialog = im.dialog;
233 msg.offline = im.offline;
234 msg.ParentEstateID = im.ParentEstateID;
235 msg.Position = im.Position;
236 msg.RegionID = im.RegionID;
237 msg.binaryBucket = im.binaryBucket;
238 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
239
240 msg.fromAgentID = im.fromAgentID;
241 msg.fromGroup = true;
242
243 msg.toAgentID = member.AgentID.Guid;
244
245 IClientAPI client = GetActiveClient(member.AgentID);
246 if (client == null)
247 {
248 // If they're not local, forward across the grid
249 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Delivering to {0} via Grid", member.AgentID);
250 m_msgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
251 }
252 else
253 {
254 // Deliver locally, directly
255 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Passing to ProcessMessageFromGroupSession to deliver to {0} locally", client.Name);
256 ProcessMessageFromGroupSession(msg);
257 }
258 }
259 }
260
200 #region SimGridEventHandlers 261 #region SimGridEventHandlers
201 262
202 private void OnNewClient(IClientAPI client) 263 private void OnNewClient(IClientAPI client)
@@ -236,42 +297,46 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
236 { 297 {
237 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Session message from {0} going to agent {1}", msg.fromAgentName, msg.toAgentID); 298 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Session message from {0} going to agent {1}", msg.fromAgentName, msg.toAgentID);
238 299
300 UUID AgentID = new UUID(msg.fromAgentID);
301 UUID GroupID = new UUID(msg.imSessionID);
302
239 switch (msg.dialog) 303 switch (msg.dialog)
240 { 304 {
241 case (byte)InstantMessageDialog.SessionAdd: 305 case (byte)InstantMessageDialog.SessionAdd:
242 AddAgentToGroupSession(msg.fromAgentID, msg.imSessionID); 306 m_groupData.AgentInvitedToGroupChatSession(AgentID, GroupID);
243 break; 307 break;
244 308
245 case (byte)InstantMessageDialog.SessionDrop: 309 case (byte)InstantMessageDialog.SessionDrop:
246 RemoveAgentFromGroupSession(msg.fromAgentID, msg.imSessionID); 310 m_groupData.AgentDroppedFromGroupChatSession(AgentID, GroupID);
247 break; 311 break;
248 312
249 case (byte)InstantMessageDialog.SessionSend: 313 case (byte)InstantMessageDialog.SessionSend:
250 if (!m_agentsInGroupSession.ContainsKey(msg.toAgentID) 314 if (!m_groupData.hasAgentDroppedGroupChatSession(AgentID, GroupID)
251 && !m_agentsDroppedSession.ContainsKey(msg.toAgentID)) 315 && !m_groupData.hasAgentBeenInvitedToGroupChatSession(AgentID, GroupID)
316 )
252 { 317 {
253 // Agent not in session and hasn't dropped from session 318 // Agent not in session and hasn't dropped from session
254 // Add them to the session for now, and Invite them 319 // Add them to the session for now, and Invite them
255 AddAgentToGroupSession(msg.toAgentID, msg.imSessionID); 320 m_groupData.AgentInvitedToGroupChatSession(AgentID, GroupID);
256 321
257 UUID toAgentID = new UUID(msg.toAgentID); 322 UUID toAgentID = new UUID(msg.toAgentID);
258 IClientAPI activeClient = GetActiveClient(toAgentID); 323 IClientAPI activeClient = GetActiveClient(toAgentID);
259 if (activeClient != null) 324 if (activeClient != null)
260 { 325 {
261 UUID groupID = new UUID(msg.fromAgentID); 326 GroupRecord groupInfo = m_groupData.GetGroupRecord(UUID.Zero, GroupID, null);
262
263 GroupRecord groupInfo = m_groupsModule.GetGroupRecord(groupID);
264 if (groupInfo != null) 327 if (groupInfo != null)
265 { 328 {
266 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Sending chatterbox invite instant message"); 329 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Sending chatterbox invite instant message");
267 330
268 // Force? open the group session dialog??? 331 // Force? open the group session dialog???
332 // and simultanously deliver the message, so we don't need to do a seperate client.SendInstantMessage(msg);
269 IEventQueue eq = activeClient.Scene.RequestModuleInterface<IEventQueue>(); 333 IEventQueue eq = activeClient.Scene.RequestModuleInterface<IEventQueue>();
270 eq.ChatterboxInvitation( 334 eq.ChatterboxInvitation(
271 groupID 335 GroupID
272 , groupInfo.GroupName 336 , groupInfo.GroupName
273 , new UUID(msg.fromAgentID) 337 , new UUID(msg.fromAgentID)
274 , msg.message, new UUID(msg.toAgentID) 338 , msg.message
339 , new UUID(msg.toAgentID)
275 , msg.fromAgentName 340 , msg.fromAgentName
276 , msg.dialog 341 , msg.dialog
277 , msg.timestamp 342 , msg.timestamp
@@ -285,7 +350,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
285 ); 350 );
286 351
287 eq.ChatterBoxSessionAgentListUpdates( 352 eq.ChatterBoxSessionAgentListUpdates(
288 new UUID(groupID) 353 new UUID(GroupID)
289 , new UUID(msg.fromAgentID) 354 , new UUID(msg.fromAgentID)
290 , new UUID(msg.toAgentID) 355 , new UUID(msg.toAgentID)
291 , false //canVoiceChat 356 , false //canVoiceChat
@@ -295,7 +360,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
295 } 360 }
296 } 361 }
297 } 362 }
298 else if (!m_agentsDroppedSession.ContainsKey(msg.toAgentID)) 363 else if (!m_groupData.hasAgentDroppedGroupChatSession(AgentID, GroupID))
299 { 364 {
300 // User hasn't dropped, so they're in the session, 365 // User hasn't dropped, so they're in the session,
301 // maybe we should deliver it. 366 // maybe we should deliver it.
@@ -321,56 +386,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
321 386
322 #endregion 387 #endregion
323 388
324 #region ClientEvents
325
326 private void RemoveAgentFromGroupSession(Guid agentID, Guid sessionID)
327 {
328 if (m_agentsInGroupSession.ContainsKey(sessionID))
329 {
330 // If in session remove
331 if (m_agentsInGroupSession[sessionID].Contains(agentID))
332 {
333 m_agentsInGroupSession[sessionID].Remove(agentID);
334 }
335
336 // If not in dropped list, add
337 if (!m_agentsDroppedSession[sessionID].Contains(agentID))
338 {
339 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Dropped {1} from session {0}", sessionID, agentID);
340 m_agentsDroppedSession[sessionID].Add(agentID);
341 }
342 }
343 }
344
345 private void AddAgentToGroupSession(Guid agentID, Guid sessionID)
346 {
347 // Add Session Status if it doesn't exist for this session
348 CreateGroupSessionTracking(sessionID);
349
350 // If nessesary, remove from dropped list
351 if (m_agentsDroppedSession[sessionID].Contains(agentID))
352 {
353 m_agentsDroppedSession[sessionID].Remove(agentID);
354 }
355
356 // If nessesary, add to in session list
357 if (!m_agentsInGroupSession[sessionID].Contains(agentID))
358 {
359 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Added {1} to session {0}", sessionID, agentID);
360 m_agentsInGroupSession[sessionID].Add(agentID);
361 }
362 }
363
364 private void CreateGroupSessionTracking(Guid sessionID)
365 {
366 if (!m_agentsInGroupSession.ContainsKey(sessionID))
367 {
368 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Creating session tracking for : {0}", sessionID);
369 m_agentsInGroupSession.Add(sessionID, new List<Guid>());
370 m_agentsDroppedSession.Add(sessionID, new List<Guid>());
371 }
372 }
373 389
390 #region ClientEvents
374 private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im) 391 private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
375 { 392 {
376 if (m_debugEnabled) 393 if (m_debugEnabled)
@@ -383,21 +400,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
383 // Start group IM session 400 // Start group IM session
384 if ((im.dialog == (byte)InstantMessageDialog.SessionGroupStart)) 401 if ((im.dialog == (byte)InstantMessageDialog.SessionGroupStart))
385 { 402 {
386 UUID groupID = new UUID(im.toAgentID); 403 if (m_debugEnabled) m_log.InfoFormat("[GROUPS-MESSAGING]: imSessionID({0}) toAgentID({1})", im.imSessionID, im.toAgentID);
387 404
388 GroupRecord groupInfo = m_groupsModule.GetGroupRecord(groupID); 405 UUID GroupID = new UUID(im.imSessionID);
406 UUID AgentID = new UUID(im.fromAgentID);
407
408 GroupRecord groupInfo = m_groupData.GetGroupRecord(UUID.Zero, GroupID, null);
409
389 if (groupInfo != null) 410 if (groupInfo != null)
390 { 411 {
391 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Start Group Session for {0}", groupInfo.GroupName); 412 m_groupData.AgentInvitedToGroupChatSession(AgentID, GroupID);
392
393 AddAgentToGroupSession(im.fromAgentID, im.imSessionID);
394 413
395 ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, groupID); 414 ChatterBoxSessionStartReplyViaCaps(remoteClient, groupInfo.GroupName, GroupID);
396 415
397 IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>(); 416 IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
398 queue.ChatterBoxSessionAgentListUpdates( 417 queue.ChatterBoxSessionAgentListUpdates(
399 new UUID(groupID) 418 GroupID
400 , new UUID(im.fromAgentID) 419 , AgentID
401 , new UUID(im.toAgentID) 420 , new UUID(im.toAgentID)
402 , false //canVoiceChat 421 , false //canVoiceChat
403 , false //isModerator 422 , false //isModerator
@@ -409,64 +428,21 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
409 // Send a message from locally connected client to a group 428 // Send a message from locally connected client to a group
410 if ((im.dialog == (byte)InstantMessageDialog.SessionSend)) 429 if ((im.dialog == (byte)InstantMessageDialog.SessionSend))
411 { 430 {
412 UUID groupID = new UUID(im.toAgentID); 431 UUID GroupID = new UUID(im.imSessionID);
432 UUID AgentID = new UUID(im.fromAgentID);
413 433
414 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Send message to session for group {0} with session ID {1}", groupID, im.imSessionID.ToString()); 434 if (m_debugEnabled)
435 m_log.DebugFormat("[GROUPS-MESSAGING]: Send message to session for group {0} with session ID {1}", GroupID, im.imSessionID.ToString());
415 436
416 SendMessageToGroup(im, groupID); 437 //If this agent is sending a message, then they want to be in the session
438 m_groupData.AgentInvitedToGroupChatSession(AgentID, GroupID);
439
440 SendMessageToGroup(im, GroupID);
417 } 441 }
418 } 442 }
419 443
420 #endregion 444 #endregion
421 445
422 private void SendMessageToGroup(GridInstantMessage im, UUID groupID)
423 {
424 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
425
426 foreach (GroupMembersData member in m_groupsModule.GroupMembersRequest(null, groupID))
427 {
428 if (!m_agentsDroppedSession.ContainsKey(im.imSessionID) || m_agentsDroppedSession[im.imSessionID].Contains(member.AgentID.Guid))
429 {
430 // Don't deliver messages to people who have dropped this session
431 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} has dropped session, not delivering to them", member.AgentID);
432 continue;
433 }
434
435 // Copy Message
436 GridInstantMessage msg = new GridInstantMessage();
437 msg.imSessionID = im.imSessionID;
438 msg.fromAgentName = im.fromAgentName;
439 msg.message = im.message;
440 msg.dialog = im.dialog;
441 msg.offline = im.offline;
442 msg.ParentEstateID = im.ParentEstateID;
443 msg.Position = im.Position;
444 msg.RegionID = im.RegionID;
445 msg.binaryBucket = im.binaryBucket;
446 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
447
448 // Updat Pertinate fields to make it a "group message"
449 msg.fromAgentID = groupID.Guid;
450 msg.fromGroup = true;
451
452 msg.toAgentID = member.AgentID.Guid;
453
454 IClientAPI client = GetActiveClient(member.AgentID);
455 if (client == null)
456 {
457 // If they're not local, forward across the grid
458 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Delivering to {0} via Grid", member.AgentID);
459 m_msgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
460 }
461 else
462 {
463 // Deliver locally, directly
464 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: Passing to ProcessMessageFromGroupSession to deliver to {0} locally", client.Name);
465 ProcessMessageFromGroupSession(msg);
466 }
467 }
468 }
469
470 void ChatterBoxSessionStartReplyViaCaps(IClientAPI remoteClient, string groupName, UUID groupID) 446 void ChatterBoxSessionStartReplyViaCaps(IClientAPI remoteClient, string groupName, UUID groupID)
471 { 447 {
472 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 448 if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
@@ -518,6 +494,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
518 /// </summary> 494 /// </summary>
519 private IClientAPI GetActiveClient(UUID agentID) 495 private IClientAPI GetActiveClient(UUID agentID)
520 { 496 {
497 if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Looking for local client {0}", agentID);
498
521 IClientAPI child = null; 499 IClientAPI child = null;
522 500
523 // Try root avatar first 501 // Try root avatar first
@@ -529,16 +507,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
529 ScenePresence user = (ScenePresence)scene.Entities[agentID]; 507 ScenePresence user = (ScenePresence)scene.Entities[agentID];
530 if (!user.IsChildAgent) 508 if (!user.IsChildAgent)
531 { 509 {
510 if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Found root agent for client : {0}", user.ControllingClient.Name);
532 return user.ControllingClient; 511 return user.ControllingClient;
533 } 512 }
534 else 513 else
535 { 514 {
515 if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Found child agent for client : {0}", user.ControllingClient.Name);
536 child = user.ControllingClient; 516 child = user.ControllingClient;
537 } 517 }
538 } 518 }
539 } 519 }
540 520
541 // If we didn't find a root, then just return whichever child we found, or null if none 521 // If we didn't find a root, then just return whichever child we found, or null if none
522 if (child == null)
523 {
524 if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Could not find local client for agent : {0}", agentID);
525 }
526 else
527 {
528 if (m_debugEnabled) m_log.WarnFormat("[GROUPS-MESSAGING]: Returning child agent for client : {0}", child.Name);
529 }
542 return child; 530 return child;
543 } 531 }
544 532
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index 8d32e66..3e05732 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -87,16 +87,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
87 87
88 private IGroupsServicesConnector m_groupData = null; 88 private IGroupsServicesConnector m_groupData = null;
89 89
90 class GroupRequestIDInfo
91 {
92 public GroupRequestID RequestID = new GroupRequestID();
93 public DateTime LastUsedTMStamp = DateTime.MinValue;
94 }
95 private Dictionary<UUID, GroupRequestIDInfo> m_clientRequestIDInfo = new Dictionary<UUID, GroupRequestIDInfo>();
96 private const int m_clientRequestIDFlushTimeOut = 300000; // Every 5 minutes
97 private Timer m_clientRequestIDFlushTimer;
98
99
100 // Configuration settings 90 // Configuration settings
101 private bool m_groupsEnabled = false; 91 private bool m_groupsEnabled = false;
102 private bool m_groupNoticesEnabled = true; 92 private bool m_groupNoticesEnabled = true;
@@ -133,30 +123,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
133 m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true); 123 m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true);
134 m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true); 124 m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true);
135 125
136 m_clientRequestIDFlushTimer = new Timer();
137 m_clientRequestIDFlushTimer.Interval = m_clientRequestIDFlushTimeOut;
138 m_clientRequestIDFlushTimer.Elapsed += FlushClientRequestIDInfoCache;
139 m_clientRequestIDFlushTimer.AutoReset = true;
140 m_clientRequestIDFlushTimer.Start();
141 }
142 }
143
144 void FlushClientRequestIDInfoCache(object sender, ElapsedEventArgs e)
145 {
146 lock (m_clientRequestIDInfo)
147 {
148 TimeSpan cacheTimeout = new TimeSpan(0,0, m_clientRequestIDFlushTimeOut / 1000);
149 UUID[] CurrentKeys = new UUID[m_clientRequestIDInfo.Count];
150 foreach (UUID key in CurrentKeys)
151 {
152 if (m_clientRequestIDInfo.ContainsKey(key))
153 {
154 if (DateTime.Now - m_clientRequestIDInfo[key].LastUsedTMStamp > cacheTimeout)
155 {
156 m_clientRequestIDInfo.Remove(key);
157 }
158 }
159 }
160 } 126 }
161 } 127 }
162 128
@@ -234,8 +200,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
234 return; 200 return;
235 201
236 if (m_debugEnabled) m_log.Debug("[GROUPS]: Shutting down Groups module."); 202 if (m_debugEnabled) m_log.Debug("[GROUPS]: Shutting down Groups module.");
237
238 m_clientRequestIDFlushTimer.Stop();
239 } 203 }
240 204
241 public Type ReplaceableInterface 205 public Type ReplaceableInterface
@@ -272,14 +236,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
272 // Used for Notices and Group Invites/Accept/Reject 236 // Used for Notices and Group Invites/Accept/Reject
273 client.OnInstantMessage += OnInstantMessage; 237 client.OnInstantMessage += OnInstantMessage;
274 238
275 lock (m_clientRequestIDInfo) 239 // Send client thier groups information.
276 {
277 if (m_clientRequestIDInfo.ContainsKey(client.AgentId))
278 {
279 // flush any old RequestID information
280 m_clientRequestIDInfo.Remove(client.AgentId);
281 }
282 }
283 SendAgentGroupDataUpdate(client, client.AgentId); 240 SendAgentGroupDataUpdate(client, client.AgentId);
284 } 241 }
285 242
@@ -287,7 +244,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
287 { 244 {
288 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 245 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
289 246
290 //GroupMembershipData[] avatarGroups = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(remoteClient), avatarID).ToArray(); 247 //GroupMembershipData[] avatarGroups = m_groupData.GetAgentGroupMemberships(GetRequestingAgentID(remoteClient), avatarID).ToArray();
291 GroupMembershipData[] avatarGroups = GetProfileListedGroupMemberships(remoteClient, avatarID); 248 GroupMembershipData[] avatarGroups = GetProfileListedGroupMemberships(remoteClient, avatarID);
292 remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups); 249 remoteClient.SendAvatarGroupsReply(avatarID, avatarGroups);
293 } 250 }
@@ -331,10 +288,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
331 { 288 {
332 if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups) 289 if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups)
333 { 290 {
334 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called with queryText({1}) queryFlags({2}) queryStart({3})", System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart); 291 if (m_debugEnabled)
292 m_log.DebugFormat(
293 "[GROUPS]: {0} called with queryText({1}) queryFlags({2}) queryStart({3})",
294 System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart);
335 295
336 // TODO: This currently ignores pretty much all the query flags including Mature and sort order 296 // TODO: This currently ignores pretty much all the query flags including Mature and sort order
337 remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(GetClientGroupRequestID(remoteClient), queryText).ToArray()); 297 remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(GetRequestingAgentID(remoteClient), queryText).ToArray());
338 } 298 }
339 299
340 } 300 }
@@ -348,7 +308,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
348 string activeGroupName = string.Empty; 308 string activeGroupName = string.Empty;
349 ulong activeGroupPowers = (ulong)GroupPowers.None; 309 ulong activeGroupPowers = (ulong)GroupPowers.None;
350 310
351 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(GetClientGroupRequestID(remoteClient), dataForAgentID); 311 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(GetRequestingAgentID(remoteClient), dataForAgentID);
352 if (membership != null) 312 if (membership != null)
353 { 313 {
354 activeGroupID = membership.GroupID; 314 activeGroupID = membership.GroupID;
@@ -361,13 +321,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
361 SendScenePresenceUpdate(dataForAgentID, activeGroupTitle); 321 SendScenePresenceUpdate(dataForAgentID, activeGroupTitle);
362 } 322 }
363 323
364 private void HandleUUIDGroupNameRequest(UUID GroupID,IClientAPI remoteClient) 324 private void HandleUUIDGroupNameRequest(UUID GroupID, IClientAPI remoteClient)
365 { 325 {
366 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 326 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
367 327
368 string GroupName; 328 string GroupName;
369 329
370 GroupRecord group = m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), GroupID, null); 330 GroupRecord group = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), GroupID, null);
371 if (group != null) 331 if (group != null)
372 { 332 {
373 GroupName = group.GroupName; 333 GroupName = group.GroupName;
@@ -382,13 +342,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
382 342
383 private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im) 343 private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
384 { 344 {
385 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 345 if (m_debugEnabled)
346 {
347 m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
348 m_log.DebugFormat("[GROUPS]: remoteClient ({0}) im ({1})", remoteClient, im);
349
350 }
351
386 352
387 // Group invitations 353 // Group invitations
388 if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)) 354 if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline))
389 { 355 {
390 UUID inviteID = new UUID(im.imSessionID); 356 UUID inviteID = new UUID(im.imSessionID);
391 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); 357 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
392 358
393 if (inviteInfo == null) 359 if (inviteInfo == null)
394 { 360 {
@@ -407,7 +373,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
407 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received an accept invite notice."); 373 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received an accept invite notice.");
408 374
409 // and the sessionid is the role 375 // and the sessionid is the role
410 m_groupData.AddAgentToGroup(GetClientGroupRequestID(remoteClient), inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID); 376 m_groupData.AddAgentToGroup(GetRequestingAgentID(remoteClient), inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID);
411 377
412 GridInstantMessage msg = new GridInstantMessage(); 378 GridInstantMessage msg = new GridInstantMessage();
413 msg.imSessionID = UUID.Zero.Guid; 379 msg.imSessionID = UUID.Zero.Guid;
@@ -431,14 +397,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
431 // TODO: If the inviter is still online, they need an agent dataupdate 397 // TODO: If the inviter is still online, they need an agent dataupdate
432 // and maybe group membership updates for the invitee 398 // and maybe group membership updates for the invitee
433 399
434 m_groupData.RemoveAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); 400 m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
435 } 401 }
436 402
437 // Reject 403 // Reject
438 if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline) 404 if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)
439 { 405 {
440 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received a reject invite notice."); 406 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received a reject invite notice.");
441 m_groupData.RemoveAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); 407 m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
442 } 408 }
443 } 409 }
444 } 410 }
@@ -452,7 +418,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
452 } 418 }
453 419
454 UUID GroupID = new UUID(im.toAgentID); 420 UUID GroupID = new UUID(im.toAgentID);
455 if (m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), GroupID, null) != null) 421 if (m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), GroupID, null) != null)
456 { 422 {
457 UUID NoticeID = UUID.Random(); 423 UUID NoticeID = UUID.Random();
458 string Subject = im.message.Substring(0, im.message.IndexOf('|')); 424 string Subject = im.message.Substring(0, im.message.IndexOf('|'));
@@ -496,14 +462,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
496 } 462 }
497 463
498 464
499 m_groupData.AddGroupNotice(GetClientGroupRequestID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket); 465 m_groupData.AddGroupNotice(GetRequestingAgentID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket);
500 if (OnNewGroupNotice != null) 466 if (OnNewGroupNotice != null)
501 { 467 {
502 OnNewGroupNotice(GroupID, NoticeID); 468 OnNewGroupNotice(GroupID, NoticeID);
503 } 469 }
504 470
505 // Send notice out to everyone that wants notices 471 // Send notice out to everyone that wants notices
506 foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), GroupID)) 472 foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), GroupID))
507 { 473 {
508 if (m_debugEnabled) 474 if (m_debugEnabled)
509 { 475 {
@@ -521,7 +487,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
521 if (member.AcceptNotices) 487 if (member.AcceptNotices)
522 { 488 {
523 // Build notice IIM 489 // Build notice IIM
524 GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice); 490 GridInstantMessage msg = CreateGroupNoticeIM(GetRequestingAgentID(remoteClient), NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice);
525 491
526 msg.toAgentID = member.AgentID.Guid; 492 msg.toAgentID = member.AgentID.Guid;
527 OutgoingInstantMessage(msg, member.AgentID); 493 OutgoingInstantMessage(msg, member.AgentID);
@@ -549,7 +515,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
549 IClientAPI ejectee = GetActiveClient(ejecteeID); 515 IClientAPI ejectee = GetActiveClient(ejecteeID);
550 if (ejectee != null) 516 if (ejectee != null)
551 { 517 {
552 UUID groupID = new UUID(im.fromAgentID); 518 UUID groupID = new UUID(im.imSessionID);
553 ejectee.SendAgentDropGroup(groupID); 519 ejectee.SendAgentDropGroup(groupID);
554 } 520 }
555 } 521 }
@@ -588,20 +554,25 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
588 554
589 public GroupRecord GetGroupRecord(UUID GroupID) 555 public GroupRecord GetGroupRecord(UUID GroupID)
590 { 556 {
591 return m_groupData.GetGroupRecord(null, GroupID, null); 557 return m_groupData.GetGroupRecord(UUID.Zero, GroupID, null);
592 } 558 }
593 559
560 public GroupRecord GetGroupRecord(string name)
561 {
562 return m_groupData.GetGroupRecord(UUID.Zero, UUID.Zero, name);
563 }
564
594 public void ActivateGroup(IClientAPI remoteClient, UUID groupID) 565 public void ActivateGroup(IClientAPI remoteClient, UUID groupID)
595 { 566 {
596 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 567 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
597 568
598 m_groupData.SetAgentActiveGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID); 569 m_groupData.SetAgentActiveGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
599 570
600 // Changing active group changes title, active powers, all kinds of things 571 // Changing active group changes title, active powers, all kinds of things
601 // anyone who is in any region that can see this client, should probably be 572 // anyone who is in any region that can see this client, should probably be
602 // updated with new group info. At a minimum, they should get ScenePresence 573 // updated with new group info. At a minimum, they should get ScenePresence
603 // updated with new title. 574 // updated with new title.
604 UpdateAllClientsWithGroupInfo(remoteClient.AgentId); 575 UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient));
605 } 576 }
606 577
607 /// <summary> 578 /// <summary>
@@ -611,10 +582,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
611 { 582 {
612 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 583 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
613 584
614 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
615 585
616 List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(grID, remoteClient.AgentId, groupID); 586 List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
617 GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(grID, remoteClient.AgentId, groupID); 587 GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
618 588
619 List<GroupTitlesData> titles = new List<GroupTitlesData>(); 589 List<GroupTitlesData> titles = new List<GroupTitlesData>();
620 foreach (GroupRolesData role in agentRoles) 590 foreach (GroupRolesData role in agentRoles)
@@ -636,8 +606,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
636 public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID) 606 public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID)
637 { 607 {
638 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 608 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
609 List<GroupMembersData> data = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID);
639 610
640 List<GroupMembersData> data = m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), groupID); 611 if (m_debugEnabled)
612 {
613 foreach (GroupMembersData member in data)
614 {
615 m_log.DebugFormat("[GROUPS]: Member({0}) - IsOwner({1})", member.AgentID, member.IsOwner);
616 }
617 }
641 618
642 return data; 619 return data;
643 620
@@ -647,21 +624,25 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
647 { 624 {
648 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 625 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
649 626
650 List<GroupRolesData> data = m_groupData.GetGroupRoles(GetClientGroupRequestID(remoteClient), groupID); 627 List<GroupRolesData> data = m_groupData.GetGroupRoles(GetRequestingAgentID(remoteClient), groupID);
651 628
652 return data; 629 return data;
653
654 } 630 }
655 631
656 public List<GroupRoleMembersData> GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID) 632 public List<GroupRoleMembersData> GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID)
657 { 633 {
658 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 634 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
659 635
660 List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetClientGroupRequestID(remoteClient), groupID); 636 List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetRequestingAgentID(remoteClient), groupID);
661 637
638 if (m_debugEnabled)
639 {
640 foreach (GroupRoleMembersData member in data)
641 {
642 m_log.DebugFormat("[GROUPS]: Member({0}) - Role({1})", member.MemberID, member.RoleID);
643 }
644 }
662 return data; 645 return data;
663
664
665 } 646 }
666 647
667 public GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID) 648 public GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID)
@@ -670,17 +651,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
670 651
671 GroupProfileData profile = new GroupProfileData(); 652 GroupProfileData profile = new GroupProfileData();
672 653
673 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
674 654
675 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), groupID, null); 655 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), groupID, null);
676 if (groupInfo != null) 656 if (groupInfo != null)
677 { 657 {
678 profile.AllowPublish = groupInfo.AllowPublish; 658 profile.AllowPublish = groupInfo.AllowPublish;
679 profile.Charter = groupInfo.Charter; 659 profile.Charter = groupInfo.Charter;
680 profile.FounderID = groupInfo.FounderID; 660 profile.FounderID = groupInfo.FounderID;
681 profile.GroupID = groupID; 661 profile.GroupID = groupID;
682 profile.GroupMembershipCount = m_groupData.GetGroupMembers(grID, groupID).Count; 662 profile.GroupMembershipCount = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID).Count;
683 profile.GroupRolesCount = m_groupData.GetGroupRoles(grID, groupID).Count; 663 profile.GroupRolesCount = m_groupData.GetGroupRoles(GetRequestingAgentID(remoteClient), groupID).Count;
684 profile.InsigniaID = groupInfo.GroupPicture; 664 profile.InsigniaID = groupInfo.GroupPicture;
685 profile.MaturePublish = groupInfo.MaturePublish; 665 profile.MaturePublish = groupInfo.MaturePublish;
686 profile.MembershipFee = groupInfo.MembershipFee; 666 profile.MembershipFee = groupInfo.MembershipFee;
@@ -691,7 +671,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
691 profile.ShowInList = groupInfo.ShowInList; 671 profile.ShowInList = groupInfo.ShowInList;
692 } 672 }
693 673
694 GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(grID, remoteClient.AgentId, groupID); 674 GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
695 if (memberInfo != null) 675 if (memberInfo != null)
696 { 676 {
697 profile.MemberTitle = memberInfo.GroupTitle; 677 profile.MemberTitle = memberInfo.GroupTitle;
@@ -705,40 +685,40 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
705 { 685 {
706 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 686 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
707 687
708 return m_groupData.GetAgentGroupMemberships(null, agentID).ToArray(); 688 return m_groupData.GetAgentGroupMemberships(UUID.Zero, agentID).ToArray();
709 } 689 }
710 690
711 public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID) 691 public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID)
712 { 692 {
713 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 693 if (m_debugEnabled)
694 m_log.DebugFormat(
695 "[GROUPS]: {0} called with groupID={1}, agentID={2}",
696 System.Reflection.MethodBase.GetCurrentMethod().Name, groupID, agentID);
714 697
715 return m_groupData.GetAgentGroupMembership(null, agentID, groupID); 698 return m_groupData.GetAgentGroupMembership(UUID.Zero, agentID, groupID);
716 } 699 }
717 700
718 public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) 701 public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
719 { 702 {
720 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 703 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
721 704
722 // TODO: Security Check? 705 // Note: Permissions checking for modification rights is handled by the Groups Server/Service
723 706 m_groupData.UpdateGroup(GetRequestingAgentID(remoteClient), groupID, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish);
724 m_groupData.UpdateGroup(GetClientGroupRequestID(remoteClient), groupID, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish);
725 } 707 }
726 708
727 public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile) 709 public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile)
728 { 710 {
729 // TODO: Security Check? 711 // Note: Permissions checking for modification rights is handled by the Groups Server/Service
730 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 712 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
731 713
732 m_groupData.SetAgentGroupInfo(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, acceptNotices, listInProfile); 714 m_groupData.SetAgentGroupInfo(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, acceptNotices, listInProfile);
733 } 715 }
734 716
735 public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) 717 public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
736 { 718 {
737 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 719 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
738 720
739 GroupRequestID grID = GetClientGroupRequestID(remoteClient); 721 if (m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), UUID.Zero, name) != null)
740
741 if (m_groupData.GetGroupRecord(grID, UUID.Zero, name) != null)
742 { 722 {
743 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists."); 723 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists.");
744 return UUID.Zero; 724 return UUID.Zero;
@@ -754,12 +734,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
754 } 734 }
755 money.ApplyGroupCreationCharge(remoteClient.AgentId); 735 money.ApplyGroupCreationCharge(remoteClient.AgentId);
756 } 736 }
757 UUID groupID = m_groupData.CreateGroup(grID, name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, remoteClient.AgentId); 737 UUID groupID = m_groupData.CreateGroup(GetRequestingAgentID(remoteClient), name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, GetRequestingAgentID(remoteClient));
758 738
759 remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly"); 739 remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly");
760 740
761 // Update the founder with new group information. 741 // Update the founder with new group information.
762 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 742 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
763 743
764 return groupID; 744 return groupID;
765 } 745 }
@@ -770,7 +750,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
770 750
771 // ToDo: check if agent is a member of group and is allowed to see notices? 751 // ToDo: check if agent is a member of group and is allowed to see notices?
772 752
773 return m_groupData.GetGroupNotices(GetClientGroupRequestID(remoteClient), groupID).ToArray(); 753 return m_groupData.GetGroupNotices(GetRequestingAgentID(remoteClient), groupID).ToArray();
774 } 754 }
775 755
776 /// <summary> 756 /// <summary>
@@ -780,7 +760,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
780 { 760 {
781 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 761 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
782 762
783 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(null, avatarID); 763 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(UUID.Zero, avatarID);
784 if (membership != null) 764 if (membership != null)
785 { 765 {
786 return membership.GroupTitle; 766 return membership.GroupTitle;
@@ -795,13 +775,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
795 { 775 {
796 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 776 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
797 777
798 m_groupData.SetAgentActiveGroupRole(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, titleRoleID); 778 m_groupData.SetAgentActiveGroupRole(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, titleRoleID);
799 779
800 // TODO: Not sure what all is needed here, but if the active group role change is for the group 780 // TODO: Not sure what all is needed here, but if the active group role change is for the group
801 // the client currently has set active, then we need to do a scene presence update too 781 // the client currently has set active, then we need to do a scene presence update too
802 // if (m_groupData.GetAgentActiveMembership(remoteClient.AgentId).GroupID == GroupID) 782 // if (m_groupData.GetAgentActiveMembership(GetRequestingAgentID(remoteClient)).GroupID == GroupID)
803 783
804 UpdateAllClientsWithGroupInfo(remoteClient.AgentId); 784 UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient));
805 } 785 }
806 786
807 787
@@ -811,16 +791,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
811 791
812 // Security Checks are handled in the Groups Service. 792 // Security Checks are handled in the Groups Service.
813 793
814 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
815
816 switch ((OpenMetaverse.GroupRoleUpdate)updateType) 794 switch ((OpenMetaverse.GroupRoleUpdate)updateType)
817 { 795 {
818 case OpenMetaverse.GroupRoleUpdate.Create: 796 case OpenMetaverse.GroupRoleUpdate.Create:
819 m_groupData.AddGroupRole(grID, groupID, UUID.Random(), name, description, title, powers); 797 m_groupData.AddGroupRole(GetRequestingAgentID(remoteClient), groupID, UUID.Random(), name, description, title, powers);
820 break; 798 break;
821 799
822 case OpenMetaverse.GroupRoleUpdate.Delete: 800 case OpenMetaverse.GroupRoleUpdate.Delete:
823 m_groupData.RemoveGroupRole(grID, groupID, roleID); 801 m_groupData.RemoveGroupRole(GetRequestingAgentID(remoteClient), groupID, roleID);
824 break; 802 break;
825 803
826 case OpenMetaverse.GroupRoleUpdate.UpdateAll: 804 case OpenMetaverse.GroupRoleUpdate.UpdateAll:
@@ -831,7 +809,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
831 GroupPowers gp = (GroupPowers)powers; 809 GroupPowers gp = (GroupPowers)powers;
832 m_log.DebugFormat("[GROUPS]: Role ({0}) updated with Powers ({1}) ({2})", name, powers.ToString(), gp.ToString()); 810 m_log.DebugFormat("[GROUPS]: Role ({0}) updated with Powers ({1}) ({2})", name, powers.ToString(), gp.ToString());
833 } 811 }
834 m_groupData.UpdateGroupRole(grID, groupID, roleID, name, description, title, powers); 812 m_groupData.UpdateGroupRole(GetRequestingAgentID(remoteClient), groupID, roleID, name, description, title, powers);
835 break; 813 break;
836 814
837 case OpenMetaverse.GroupRoleUpdate.NoUpdate: 815 case OpenMetaverse.GroupRoleUpdate.NoUpdate:
@@ -842,7 +820,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
842 } 820 }
843 821
844 // TODO: This update really should send out updates for everyone in the role that just got changed. 822 // TODO: This update really should send out updates for everyone in the role that just got changed.
845 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 823 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
846 } 824 }
847 825
848 public void GroupRoleChanges(IClientAPI remoteClient, UUID groupID, UUID roleID, UUID memberID, uint changes) 826 public void GroupRoleChanges(IClientAPI remoteClient, UUID groupID, UUID roleID, UUID memberID, uint changes)
@@ -850,18 +828,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
850 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 828 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
851 // Todo: Security check 829 // Todo: Security check
852 830
853 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
854
855 switch (changes) 831 switch (changes)
856 { 832 {
857 case 0: 833 case 0:
858 // Add 834 // Add
859 m_groupData.AddAgentToGroupRole(grID, memberID, groupID, roleID); 835 m_groupData.AddAgentToGroupRole(GetRequestingAgentID(remoteClient), memberID, groupID, roleID);
860 836
861 break; 837 break;
862 case 1: 838 case 1:
863 // Remove 839 // Remove
864 m_groupData.RemoveAgentFromGroupRole(grID, memberID, groupID, roleID); 840 m_groupData.RemoveAgentFromGroupRole(GetRequestingAgentID(remoteClient), memberID, groupID, roleID);
865 841
866 break; 842 break;
867 default: 843 default:
@@ -870,25 +846,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
870 } 846 }
871 847
872 // TODO: This update really should send out updates for everyone in the role that just got changed. 848 // TODO: This update really should send out updates for everyone in the role that just got changed.
873 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 849 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
874 } 850 }
875 851
876 public void GroupNoticeRequest(IClientAPI remoteClient, UUID groupNoticeID) 852 public void GroupNoticeRequest(IClientAPI remoteClient, UUID groupNoticeID)
877 { 853 {
878 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 854 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
879 855
880 GroupRequestID grID = GetClientGroupRequestID(remoteClient); 856 GroupNoticeInfo data = m_groupData.GetGroupNotice(GetRequestingAgentID(remoteClient), groupNoticeID);
881
882 GroupNoticeInfo data = m_groupData.GetGroupNotice(grID, groupNoticeID);
883 857
884 if (data != null) 858 if (data != null)
885 { 859 {
886 GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, data.GroupID, null); 860 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), data.GroupID, null);
887 861
888 GridInstantMessage msg = new GridInstantMessage(); 862 GridInstantMessage msg = new GridInstantMessage();
889 msg.imSessionID = UUID.Zero.Guid; 863 msg.imSessionID = UUID.Zero.Guid;
890 msg.fromAgentID = data.GroupID.Guid; 864 msg.fromAgentID = data.GroupID.Guid;
891 msg.toAgentID = remoteClient.AgentId.Guid; 865 msg.toAgentID = GetRequestingAgentID(remoteClient).Guid;
892 msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 866 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
893 msg.fromAgentName = "Group Notice : " + groupInfo == null ? "Unknown" : groupInfo.GroupName; 867 msg.fromAgentName = "Group Notice : " + groupInfo == null ? "Unknown" : groupInfo.GroupName;
894 msg.message = data.noticeData.Subject + "|" + data.Message; 868 msg.message = data.noticeData.Subject + "|" + data.Message;
@@ -900,7 +874,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
900 msg.RegionID = UUID.Zero.Guid; 874 msg.RegionID = UUID.Zero.Guid;
901 msg.binaryBucket = data.BinaryBucket; 875 msg.binaryBucket = data.BinaryBucket;
902 876
903 OutgoingInstantMessage(msg, remoteClient.AgentId); 877 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient));
904 } 878 }
905 879
906 } 880 }
@@ -920,7 +894,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
920 msg.Position = Vector3.Zero; 894 msg.Position = Vector3.Zero;
921 msg.RegionID = UUID.Zero.Guid; 895 msg.RegionID = UUID.Zero.Guid;
922 896
923 GroupNoticeInfo info = m_groupData.GetGroupNotice(null, groupNoticeID); 897 GroupNoticeInfo info = m_groupData.GetGroupNotice(agentID, groupNoticeID);
924 if (info != null) 898 if (info != null)
925 { 899 {
926 msg.fromAgentID = info.GroupID.Guid; 900 msg.fromAgentID = info.GroupID.Guid;
@@ -947,7 +921,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
947 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 921 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
948 922
949 // Send agent information about his groups 923 // Send agent information about his groups
950 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 924 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
951 } 925 }
952 926
953 public void JoinGroupRequest(IClientAPI remoteClient, UUID groupID) 927 public void JoinGroupRequest(IClientAPI remoteClient, UUID groupID)
@@ -955,19 +929,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
955 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 929 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
956 930
957 // Should check to see if OpenEnrollment, or if there's an outstanding invitation 931 // Should check to see if OpenEnrollment, or if there's an outstanding invitation
958 m_groupData.AddAgentToGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, UUID.Zero); 932 m_groupData.AddAgentToGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, UUID.Zero);
959 933
960 remoteClient.SendJoinGroupReply(groupID, true); 934 remoteClient.SendJoinGroupReply(groupID, true);
961 935
962 // Should this send updates to everyone in the group? 936 // Should this send updates to everyone in the group?
963 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 937 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
964 } 938 }
965 939
966 public void LeaveGroupRequest(IClientAPI remoteClient, UUID groupID) 940 public void LeaveGroupRequest(IClientAPI remoteClient, UUID groupID)
967 { 941 {
968 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 942 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
969 943
970 m_groupData.RemoveAgentFromGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID); 944 m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
971 945
972 remoteClient.SendLeaveGroupReply(groupID, true); 946 remoteClient.SendLeaveGroupReply(groupID, true);
973 947
@@ -975,21 +949,20 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
975 949
976 // SL sends out notifcations to the group messaging session that the person has left 950 // SL sends out notifcations to the group messaging session that the person has left
977 // Should this also update everyone who is in the group? 951 // Should this also update everyone who is in the group?
978 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 952 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
979 } 953 }
980 954
981 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID) 955 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID)
982 { 956 {
983 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 957 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
984 958
985 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
986 959
987 // Todo: Security check? 960 // Todo: Security check?
988 m_groupData.RemoveAgentFromGroup(grID, ejecteeID, groupID); 961 m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), ejecteeID, groupID);
989 962
990 remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, groupID, true); 963 remoteClient.SendEjectGroupMemberReply(GetRequestingAgentID(remoteClient), groupID, true);
991 964
992 GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, groupID, null); 965 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), groupID, null);
993 UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(ejecteeID); 966 UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(ejecteeID);
994 967
995 if ((groupInfo == null) || (userProfile == null)) 968 if ((groupInfo == null) || (userProfile == null))
@@ -1002,7 +975,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1002 GridInstantMessage msg = new GridInstantMessage(); 975 GridInstantMessage msg = new GridInstantMessage();
1003 976
1004 msg.imSessionID = UUID.Zero.Guid; 977 msg.imSessionID = UUID.Zero.Guid;
1005 msg.fromAgentID = remoteClient.AgentId.Guid; 978 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
1006 // msg.fromAgentID = info.GroupID; 979 // msg.fromAgentID = info.GroupID;
1007 msg.toAgentID = ejecteeID.Guid; 980 msg.toAgentID = ejecteeID.Guid;
1008 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 981 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
@@ -1028,8 +1001,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1028 1001
1029 msg = new GridInstantMessage(); 1002 msg = new GridInstantMessage();
1030 msg.imSessionID = UUID.Zero.Guid; 1003 msg.imSessionID = UUID.Zero.Guid;
1031 msg.fromAgentID = remoteClient.AgentId.Guid; 1004 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
1032 msg.toAgentID = remoteClient.AgentId.Guid; 1005 msg.toAgentID = GetRequestingAgentID(remoteClient).Guid;
1033 msg.timestamp = 0; 1006 msg.timestamp = 0;
1034 msg.fromAgentName = remoteClient.Name; 1007 msg.fromAgentName = remoteClient.Name;
1035 if (userProfile != null) 1008 if (userProfile != null)
@@ -1047,7 +1020,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1047 msg.Position = Vector3.Zero; 1020 msg.Position = Vector3.Zero;
1048 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1021 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid;
1049 msg.binaryBucket = new byte[0]; 1022 msg.binaryBucket = new byte[0];
1050 OutgoingInstantMessage(msg, remoteClient.AgentId); 1023 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient));
1051 1024
1052 1025
1053 // SL sends out messages to everyone in the group 1026 // SL sends out messages to everyone in the group
@@ -1057,17 +1030,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1057 1030
1058 public void InviteGroupRequest(IClientAPI remoteClient, UUID groupID, UUID invitedAgentID, UUID roleID) 1031 public void InviteGroupRequest(IClientAPI remoteClient, UUID groupID, UUID invitedAgentID, UUID roleID)
1059 { 1032 {
1060 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 1033 if (m_debugEnabled)
1034 {
1035 m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
1036 m_log.DebugFormat("[GROUPS]: remoteClient({0}) groupID({0}) invitedAgentID({0}) roleID({0})", remoteClient, groupID, invitedAgentID, roleID);
1037 }
1038
1061 1039
1062 // Todo: Security check, probably also want to send some kind of notification 1040 // Todo: Security check, probably also want to send some kind of notification
1063 UUID InviteID = UUID.Random(); 1041 UUID InviteID = UUID.Random();
1064 GroupRequestID grid = GetClientGroupRequestID(remoteClient);
1065 1042
1066 m_groupData.AddAgentToGroupInvite(grid, InviteID, groupID, roleID, invitedAgentID); 1043 UUID requestingAgentID = GetRequestingAgentID(remoteClient);
1044 if (requestingAgentID == UUID.Zero)
1045 {
1046 m_log.Error("[GROUPS] Group Invite Requires a valid requesting agent to be specified");
1047 }
1048 m_groupData.AddAgentToGroupInvite(requestingAgentID, InviteID, groupID, roleID, invitedAgentID);
1067 1049
1068 // Check to see if the invite went through, if it did not then it's possible 1050 // Check to see if the invite went through, if it did not then it's possible
1069 // the remoteClient did not validate or did not have permission to invite. 1051 // the remoteClient did not validate or did not have permission to invite.
1070 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(grid, InviteID); 1052 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID);
1071 1053
1072 if (inviteInfo != null) 1054 if (inviteInfo != null)
1073 { 1055 {
@@ -1079,7 +1061,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1079 1061
1080 msg.imSessionID = inviteUUID; 1062 msg.imSessionID = inviteUUID;
1081 1063
1082 // msg.fromAgentID = remoteClient.AgentId.Guid; 1064 // msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
1083 msg.fromAgentID = groupID.Guid; 1065 msg.fromAgentID = groupID.Guid;
1084 msg.toAgentID = invitedAgentID.Guid; 1066 msg.toAgentID = invitedAgentID.Guid;
1085 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 1067 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
@@ -1132,57 +1114,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1132 return child; 1114 return child;
1133 } 1115 }
1134 1116
1135 private GroupRequestID GetClientGroupRequestID(IClientAPI client)
1136 {
1137 if (client == null)
1138 {
1139 return new GroupRequestID();
1140 }
1141
1142 lock (m_clientRequestIDInfo)
1143 {
1144 if (!m_clientRequestIDInfo.ContainsKey(client.AgentId))
1145 {
1146 GroupRequestIDInfo info = new GroupRequestIDInfo();
1147 info.RequestID.AgentID = client.AgentId;
1148 info.RequestID.SessionID = client.SessionId;
1149
1150 UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(client.AgentId);
1151 if (userProfile == null)
1152 {
1153 // This should be impossible. If I've been passed a reference to a client
1154 // that client should be registered with the UserService. So something
1155 // is horribly wrong somewhere.
1156
1157 m_log.WarnFormat("[GROUPS]: Could not find a user profile for {0} / {1}", client.Name, client.AgentId);
1158
1159 // Default to local user service and hope for the best?
1160 info.RequestID.UserServiceURL = m_sceneList[0].CommsManager.NetworkServersInfo.UserURL;
1161
1162 }
1163 else if (userProfile is ForeignUserProfileData)
1164 {
1165 // They aren't from around here
1166 ForeignUserProfileData fupd = (ForeignUserProfileData)userProfile;
1167 info.RequestID.UserServiceURL = fupd.UserServerURI;
1168 }
1169 else
1170 {
1171 // They're a local user, use this:
1172 info.RequestID.UserServiceURL = m_sceneList[0].CommsManager.NetworkServersInfo.UserURL;
1173 }
1174
1175 m_clientRequestIDInfo.Add(client.AgentId, info);
1176 }
1177
1178 m_clientRequestIDInfo[client.AgentId].LastUsedTMStamp = DateTime.Now;
1179
1180 return m_clientRequestIDInfo[client.AgentId].RequestID;
1181 }
1182// Unreachable code!
1183// return new GroupRequestID();
1184 }
1185
1186 /// <summary> 1117 /// <summary>
1187 /// Send 'remoteClient' the group membership 'data' for agent 'dataForAgentID'. 1118 /// Send 'remoteClient' the group membership 'data' for agent 'dataForAgentID'.
1188 /// </summary> 1119 /// </summary>
@@ -1231,6 +1162,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1231 llDataStruct.Add("GroupData", GroupData); 1162 llDataStruct.Add("GroupData", GroupData);
1232 llDataStruct.Add("NewGroupData", NewGroupData); 1163 llDataStruct.Add("NewGroupData", NewGroupData);
1233 1164
1165 if (m_debugEnabled)
1166 {
1167 m_log.InfoFormat("[GROUPS]: {0}", OSDParser.SerializeJsonString(llDataStruct));
1168 }
1169
1234 IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>(); 1170 IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
1235 1171
1236 if (queue != null) 1172 if (queue != null)
@@ -1308,7 +1244,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1308 /// <returns></returns> 1244 /// <returns></returns>
1309 private GroupMembershipData[] GetProfileListedGroupMemberships(IClientAPI requestingClient, UUID dataForAgentID) 1245 private GroupMembershipData[] GetProfileListedGroupMemberships(IClientAPI requestingClient, UUID dataForAgentID)
1310 { 1246 {
1311 List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(requestingClient), dataForAgentID); 1247 List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(requestingClient.AgentId, dataForAgentID);
1312 GroupMembershipData[] membershipArray; 1248 GroupMembershipData[] membershipArray;
1313 1249
1314 if (requestingClient.AgentId != dataForAgentID) 1250 if (requestingClient.AgentId != dataForAgentID)
@@ -1330,7 +1266,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1330 m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId); 1266 m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId);
1331 foreach (GroupMembershipData membership in membershipArray) 1267 foreach (GroupMembershipData membership in membershipArray)
1332 { 1268 {
1333 m_log.InfoFormat("[GROUPS]: {0} :: {1} - {2}", dataForAgentID, membership.GroupName, membership.GroupTitle); 1269 m_log.InfoFormat("[GROUPS]: {0} :: {1} - {2} - {3}", dataForAgentID, membership.GroupName, membership.GroupTitle, membership.GroupPowers);
1334 } 1270 }
1335 } 1271 }
1336 1272
@@ -1389,6 +1325,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1389 } 1325 }
1390 1326
1391 #endregion 1327 #endregion
1328
1329 private UUID GetRequestingAgentID(IClientAPI client)
1330 {
1331 UUID requestingAgentID = UUID.Zero;
1332 if (client != null)
1333 {
1334 requestingAgentID = client.AgentId;
1335 }
1336 return requestingAgentID;
1337 }
1392 } 1338 }
1393 1339
1340 public class GroupNoticeInfo
1341 {
1342 public GroupNoticeData noticeData = new GroupNoticeData();
1343 public UUID GroupID = UUID.Zero;
1344 public string Message = string.Empty;
1345 public byte[] BinaryBucket = new byte[0];
1346 }
1394} 1347}
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs
index 9e0fa2d..a046e09 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs
@@ -36,42 +36,47 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
36{ 36{
37 interface IGroupsServicesConnector 37 interface IGroupsServicesConnector
38 { 38 {
39 UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish, UUID founderID); 39 UUID CreateGroup(UUID RequestingAgentID, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish, UUID founderID);
40 void UpdateGroup(GroupRequestID requestID, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish); 40 void UpdateGroup(UUID RequestingAgentID, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish);
41 GroupRecord GetGroupRecord(GroupRequestID requestID, UUID GroupID, string GroupName); 41 GroupRecord GetGroupRecord(UUID RequestingAgentID, UUID GroupID, string GroupName);
42 List<DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search); 42 List<DirGroupsReplyData> FindGroups(UUID RequestingAgentID, string search);
43 List<GroupMembersData> GetGroupMembers(GroupRequestID requestID, UUID GroupID); 43 List<GroupMembersData> GetGroupMembers(UUID RequestingAgentID, UUID GroupID);
44 44
45 void AddGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers); 45 void AddGroupRole(UUID RequestingAgentID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers);
46 void UpdateGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers); 46 void UpdateGroupRole(UUID RequestingAgentID, UUID groupID, UUID roleID, string name, string description, string title, ulong powers);
47 void RemoveGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID); 47 void RemoveGroupRole(UUID RequestingAgentID, UUID groupID, UUID roleID);
48 List<GroupRolesData> GetGroupRoles(GroupRequestID requestID, UUID GroupID); 48 List<GroupRolesData> GetGroupRoles(UUID RequestingAgentID, UUID GroupID);
49 List<GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, UUID GroupID); 49 List<GroupRoleMembersData> GetGroupRoleMembers(UUID RequestingAgentID, UUID GroupID);
50 50
51 void AddAgentToGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID); 51 void AddAgentToGroup(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
52 void RemoveAgentFromGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID); 52 void RemoveAgentFromGroup(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
53 53
54 void AddAgentToGroupInvite(GroupRequestID requestID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID); 54 void AddAgentToGroupInvite(UUID RequestingAgentID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID);
55 GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, UUID inviteID); 55 GroupInviteInfo GetAgentToGroupInvite(UUID RequestingAgentID, UUID inviteID);
56 void RemoveAgentToGroupInvite(GroupRequestID requestID, UUID inviteID); 56 void RemoveAgentToGroupInvite(UUID RequestingAgentID, UUID inviteID);
57 57
58 void AddAgentToGroupRole(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
59 void RemoveAgentFromGroupRole(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
60 List<GroupRolesData> GetAgentGroupRoles(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
58 61
59 void AddAgentToGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID); 62 void SetAgentActiveGroup(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
60 void RemoveAgentFromGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID); 63 GroupMembershipData GetAgentActiveMembership(UUID RequestingAgentID, UUID AgentID);
61 List<GroupRolesData> GetAgentGroupRoles(GroupRequestID requestID, UUID AgentID, UUID GroupID);
62 64
63 void SetAgentActiveGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID); 65 void SetAgentActiveGroupRole(UUID RequestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID);
64 GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, UUID AgentID); 66 void SetAgentGroupInfo(UUID RequestingAgentID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile);
65 67
66 void SetAgentActiveGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID); 68 GroupMembershipData GetAgentGroupMembership(UUID RequestingAgentID, UUID AgentID, UUID GroupID);
67 void SetAgentGroupInfo(GroupRequestID requestID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile); 69 List<GroupMembershipData> GetAgentGroupMemberships(UUID RequestingAgentID, UUID AgentID);
68 70
69 GroupMembershipData GetAgentGroupMembership(GroupRequestID requestID, UUID AgentID, UUID GroupID); 71 void AddGroupNotice(UUID RequestingAgentID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket);
70 List<GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, UUID AgentID); 72 GroupNoticeInfo GetGroupNotice(UUID RequestingAgentID, UUID noticeID);
73 List<GroupNoticeData> GetGroupNotices(UUID RequestingAgentID, UUID GroupID);
71 74
72 void AddGroupNotice(GroupRequestID requestID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket); 75 void ResetAgentGroupChatSessions(UUID agentID);
73 GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, UUID noticeID); 76 bool hasAgentBeenInvitedToGroupChatSession(UUID agentID, UUID groupID);
74 List<GroupNoticeData> GetGroupNotices(GroupRequestID requestID, UUID GroupID); 77 bool hasAgentDroppedGroupChatSession(UUID agentID, UUID groupID);
78 void AgentDroppedFromGroupChatSession(UUID agentID, UUID groupID);
79 void AgentInvitedToGroupChatSession(UUID agentID, UUID groupID);
75 } 80 }
76 81
77 public class GroupInviteInfo 82 public class GroupInviteInfo
@@ -81,11 +86,4 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
81 public UUID AgentID = UUID.Zero; 86 public UUID AgentID = UUID.Zero;
82 public UUID InviteID = UUID.Zero; 87 public UUID InviteID = UUID.Zero;
83 } 88 }
84
85 public class GroupRequestID
86 {
87 public UUID AgentID = UUID.Zero;
88 public string UserServiceURL = string.Empty;
89 public UUID SessionID = UUID.Zero;
90 }
91} 89}
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
index 964d0bb..861731c 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
@@ -40,6 +40,7 @@ using OpenMetaverse;
40using OpenMetaverse.StructuredData; 40using OpenMetaverse.StructuredData;
41 41
42using OpenSim.Framework; 42using OpenSim.Framework;
43using OpenSim.Framework.Communications;
43using OpenSim.Region.Framework.Interfaces; 44using OpenSim.Region.Framework.Interfaces;
44 45
45namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups 46namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
@@ -47,9 +48,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
47 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] 48 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
48 public class XmlRpcGroupsServicesConnectorModule : ISharedRegionModule, IGroupsServicesConnector 49 public class XmlRpcGroupsServicesConnectorModule : ISharedRegionModule, IGroupsServicesConnector
49 { 50 {
50 private static readonly ILog m_log = 51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52
53 52
54 public const GroupPowers m_DefaultEveryonePowers = GroupPowers.AllowSetHome | 53 public const GroupPowers m_DefaultEveryonePowers = GroupPowers.AllowSetHome |
55 GroupPowers.Accountable | 54 GroupPowers.Accountable |
@@ -61,13 +60,26 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
61 60
62 private bool m_connectorEnabled = false; 61 private bool m_connectorEnabled = false;
63 62
64 private string m_serviceURL = string.Empty; 63 private string m_groupsServerURI = string.Empty;
65 64
66 private bool m_disableKeepAlive = false; 65 private bool m_disableKeepAlive = false;
67 66
68 private string m_groupReadKey = string.Empty; 67 private string m_groupReadKey = string.Empty;
69 private string m_groupWriteKey = string.Empty; 68 private string m_groupWriteKey = string.Empty;
70 69
70 private IUserService m_userService = null;
71 private CommunicationsManager m_commManager = null;
72
73 private bool m_debugEnabled = false;
74
75
76 // Used to track which agents are have dropped from a group chat session
77 // Should be reset per agent, on logon
78 // TODO: move this to Flotsam XmlRpc Service
79 // SessionID, List<AgentID>
80 private Dictionary<UUID, List<UUID>> m_groupsAgentsDroppedFromChatSession = new Dictionary<UUID, List<UUID>>();
81 private Dictionary<UUID, List<UUID>> m_groupsAgentsInvitedToChatSession = new Dictionary<UUID, List<UUID>>();
82
71 83
72 #region IRegionModuleBase Members 84 #region IRegionModuleBase Members
73 85
@@ -104,11 +116,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
104 116
105 m_log.InfoFormat("[GROUPS-CONNECTOR]: Initializing {0}", this.Name); 117 m_log.InfoFormat("[GROUPS-CONNECTOR]: Initializing {0}", this.Name);
106 118
107 m_serviceURL = groupsConfig.GetString("XmlRpcServiceURL", string.Empty); 119 m_groupsServerURI = groupsConfig.GetString("GroupsServerURI", groupsConfig.GetString("XmlRpcServiceURL", string.Empty));
108 if ((m_serviceURL == null) || 120 if ((m_groupsServerURI == null) ||
109 (m_serviceURL == string.Empty)) 121 (m_groupsServerURI == string.Empty))
110 { 122 {
111 m_log.ErrorFormat("Please specify a valid URL for XmlRpcServiceURL in OpenSim.ini, [Groups]"); 123 m_log.ErrorFormat("Please specify a valid URL for GroupsServerURI in OpenSim.ini, [Groups]");
112 m_connectorEnabled = false; 124 m_connectorEnabled = false;
113 return; 125 return;
114 } 126 }
@@ -118,6 +130,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
118 m_groupReadKey = groupsConfig.GetString("XmlRpcServiceReadKey", string.Empty); 130 m_groupReadKey = groupsConfig.GetString("XmlRpcServiceReadKey", string.Empty);
119 m_groupWriteKey = groupsConfig.GetString("XmlRpcServiceWriteKey", string.Empty); 131 m_groupWriteKey = groupsConfig.GetString("XmlRpcServiceWriteKey", string.Empty);
120 132
133 m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true);
134
135
121 // If we got all the config options we need, lets start'er'up 136 // If we got all the config options we need, lets start'er'up
122 m_connectorEnabled = true; 137 m_connectorEnabled = true;
123 } 138 }
@@ -131,13 +146,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
131 public void AddRegion(OpenSim.Region.Framework.Scenes.Scene scene) 146 public void AddRegion(OpenSim.Region.Framework.Scenes.Scene scene)
132 { 147 {
133 if (m_connectorEnabled) 148 if (m_connectorEnabled)
149 {
134 scene.RegisterModuleInterface<IGroupsServicesConnector>(this); 150 scene.RegisterModuleInterface<IGroupsServicesConnector>(this);
151
152 if (m_userService == null)
153 {
154 m_userService = scene.CommsManager.UserService;
155 m_commManager = scene.CommsManager;
156 }
157 }
135 } 158 }
136 159
137 public void RemoveRegion(OpenSim.Region.Framework.Scenes.Scene scene) 160 public void RemoveRegion(OpenSim.Region.Framework.Scenes.Scene scene)
138 { 161 {
139 if (scene.RequestModuleInterface<IGroupsServicesConnector>() == this) 162 if (scene.RequestModuleInterface<IGroupsServicesConnector>() == this)
163 {
140 scene.UnregisterModuleInterface<IGroupsServicesConnector>(this); 164 scene.UnregisterModuleInterface<IGroupsServicesConnector>(this);
165 }
141 } 166 }
142 167
143 public void RegionLoaded(OpenSim.Region.Framework.Scenes.Scene scene) 168 public void RegionLoaded(OpenSim.Region.Framework.Scenes.Scene scene)
@@ -157,14 +182,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
157 182
158 #endregion 183 #endregion
159 184
160
161
162 #region IGroupsServicesConnector Members 185 #region IGroupsServicesConnector Members
163 186
164 /// <summary> 187 /// <summary>
165 /// Create a Group, including Everyone and Owners Role, place FounderID in both groups, select Owner as selected role, and newly created group as agent's active role. 188 /// Create a Group, including Everyone and Owners Role, place FounderID in both groups, select Owner as selected role, and newly created group as agent's active role.
166 /// </summary> 189 /// </summary>
167 public UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID, 190 public UUID CreateGroup(UUID requestingAgentID, string name, string charter, bool showInList, UUID insigniaID,
168 int membershipFee, bool openEnrollment, bool allowPublish, 191 int membershipFee, bool openEnrollment, bool allowPublish,
169 bool maturePublish, UUID founderID) 192 bool maturePublish, UUID founderID)
170 { 193 {
@@ -236,7 +259,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
236 259
237 260
238 261
239 Hashtable respData = XmlRpcCall(requestID, "groups.createGroup", param); 262 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.createGroup", param);
240 263
241 if (respData.Contains("error")) 264 if (respData.Contains("error"))
242 { 265 {
@@ -248,7 +271,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
248 return UUID.Parse((string)respData["GroupID"]); 271 return UUID.Parse((string)respData["GroupID"]);
249 } 272 }
250 273
251 public void UpdateGroup(GroupRequestID requestID, UUID groupID, string charter, bool showInList, 274 public void UpdateGroup(UUID requestingAgentID, UUID groupID, string charter, bool showInList,
252 UUID insigniaID, int membershipFee, bool openEnrollment, 275 UUID insigniaID, int membershipFee, bool openEnrollment,
253 bool allowPublish, bool maturePublish) 276 bool allowPublish, bool maturePublish)
254 { 277 {
@@ -262,10 +285,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
262 param["AllowPublish"] = allowPublish == true ? 1 : 0; 285 param["AllowPublish"] = allowPublish == true ? 1 : 0;
263 param["MaturePublish"] = maturePublish == true ? 1 : 0; 286 param["MaturePublish"] = maturePublish == true ? 1 : 0;
264 287
265 XmlRpcCall(requestID, "groups.updateGroup", param); 288 XmlRpcCall(requestingAgentID, "groups.updateGroup", param);
266 } 289 }
267 290
268 public void AddGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, 291 public void AddGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID, string name, string description,
269 string title, ulong powers) 292 string title, ulong powers)
270 { 293 {
271 Hashtable param = new Hashtable(); 294 Hashtable param = new Hashtable();
@@ -276,19 +299,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
276 param["Title"] = title; 299 param["Title"] = title;
277 param["Powers"] = powers.ToString(); 300 param["Powers"] = powers.ToString();
278 301
279 XmlRpcCall(requestID, "groups.addRoleToGroup", param); 302 XmlRpcCall(requestingAgentID, "groups.addRoleToGroup", param);
280 } 303 }
281 304
282 public void RemoveGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID) 305 public void RemoveGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID)
283 { 306 {
284 Hashtable param = new Hashtable(); 307 Hashtable param = new Hashtable();
285 param["GroupID"] = groupID.ToString(); 308 param["GroupID"] = groupID.ToString();
286 param["RoleID"] = roleID.ToString(); 309 param["RoleID"] = roleID.ToString();
287 310
288 XmlRpcCall(requestID, "groups.removeRoleFromGroup", param); 311 XmlRpcCall(requestingAgentID, "groups.removeRoleFromGroup", param);
289 } 312 }
290 313
291 public void UpdateGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, 314 public void UpdateGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID, string name, string description,
292 string title, ulong powers) 315 string title, ulong powers)
293 { 316 {
294 Hashtable param = new Hashtable(); 317 Hashtable param = new Hashtable();
@@ -308,10 +331,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
308 } 331 }
309 param["Powers"] = powers.ToString(); 332 param["Powers"] = powers.ToString();
310 333
311 XmlRpcCall(requestID, "groups.updateGroupRole", param); 334 XmlRpcCall(requestingAgentID, "groups.updateGroupRole", param);
312 } 335 }
313 336
314 public GroupRecord GetGroupRecord(GroupRequestID requestID, UUID GroupID, string GroupName) 337 public GroupRecord GetGroupRecord(UUID requestingAgentID, UUID GroupID, string GroupName)
315 { 338 {
316 Hashtable param = new Hashtable(); 339 Hashtable param = new Hashtable();
317 if (GroupID != UUID.Zero) 340 if (GroupID != UUID.Zero)
@@ -323,7 +346,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
323 param["Name"] = GroupName.ToString(); 346 param["Name"] = GroupName.ToString();
324 } 347 }
325 348
326 Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param); 349 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroup", param);
327 350
328 if (respData.Contains("error")) 351 if (respData.Contains("error"))
329 { 352 {
@@ -334,12 +357,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
334 357
335 } 358 }
336 359
337 public GroupProfileData GetMemberGroupProfile(GroupRequestID requestID, UUID GroupID, UUID AgentID) 360 public GroupProfileData GetMemberGroupProfile(UUID requestingAgentID, UUID GroupID, UUID AgentID)
338 { 361 {
339 Hashtable param = new Hashtable(); 362 Hashtable param = new Hashtable();
340 param["GroupID"] = GroupID.ToString(); 363 param["GroupID"] = GroupID.ToString();
341 364
342 Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param); 365 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroup", param);
343 366
344 if (respData.Contains("error")) 367 if (respData.Contains("error"))
345 { 368 {
@@ -347,38 +370,35 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
347 return new GroupProfileData(); 370 return new GroupProfileData();
348 } 371 }
349 372
350 GroupMembershipData MemberInfo = GetAgentGroupMembership(requestID, AgentID, GroupID); 373 GroupMembershipData MemberInfo = GetAgentGroupMembership(requestingAgentID, AgentID, GroupID);
351 GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData); 374 GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData);
352 375
353 MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle; 376 MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle;
354 MemberGroupProfile.PowersMask = MemberInfo.GroupPowers; 377 MemberGroupProfile.PowersMask = MemberInfo.GroupPowers;
355 378
356 return MemberGroupProfile; 379 return MemberGroupProfile;
357
358 } 380 }
359 381
360 382 public void SetAgentActiveGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID)
361
362 public void SetAgentActiveGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID)
363 { 383 {
364 Hashtable param = new Hashtable(); 384 Hashtable param = new Hashtable();
365 param["AgentID"] = AgentID.ToString(); 385 param["AgentID"] = AgentID.ToString();
366 param["GroupID"] = GroupID.ToString(); 386 param["GroupID"] = GroupID.ToString();
367 387
368 XmlRpcCall(requestID, "groups.setAgentActiveGroup", param); 388 XmlRpcCall(requestingAgentID, "groups.setAgentActiveGroup", param);
369 } 389 }
370 390
371 public void SetAgentActiveGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) 391 public void SetAgentActiveGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
372 { 392 {
373 Hashtable param = new Hashtable(); 393 Hashtable param = new Hashtable();
374 param["AgentID"] = AgentID.ToString(); 394 param["AgentID"] = AgentID.ToString();
375 param["GroupID"] = GroupID.ToString(); 395 param["GroupID"] = GroupID.ToString();
376 param["SelectedRoleID"] = RoleID.ToString(); 396 param["SelectedRoleID"] = RoleID.ToString();
377 397
378 XmlRpcCall(requestID, "groups.setAgentGroupInfo", param); 398 XmlRpcCall(requestingAgentID, "groups.setAgentGroupInfo", param);
379 } 399 }
380 400
381 public void SetAgentGroupInfo(GroupRequestID requestID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile) 401 public void SetAgentGroupInfo(UUID requestingAgentID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile)
382 { 402 {
383 Hashtable param = new Hashtable(); 403 Hashtable param = new Hashtable();
384 param["AgentID"] = AgentID.ToString(); 404 param["AgentID"] = AgentID.ToString();
@@ -386,11 +406,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
386 param["AcceptNotices"] = AcceptNotices ? "1" : "0"; 406 param["AcceptNotices"] = AcceptNotices ? "1" : "0";
387 param["ListInProfile"] = ListInProfile ? "1" : "0"; 407 param["ListInProfile"] = ListInProfile ? "1" : "0";
388 408
389 XmlRpcCall(requestID, "groups.setAgentGroupInfo", param); 409 XmlRpcCall(requestingAgentID, "groups.setAgentGroupInfo", param);
390 410
391 } 411 }
392 412
393 public void AddAgentToGroupInvite(GroupRequestID requestID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID) 413 public void AddAgentToGroupInvite(UUID requestingAgentID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID)
394 { 414 {
395 Hashtable param = new Hashtable(); 415 Hashtable param = new Hashtable();
396 param["InviteID"] = inviteID.ToString(); 416 param["InviteID"] = inviteID.ToString();
@@ -398,16 +418,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
398 param["RoleID"] = roleID.ToString(); 418 param["RoleID"] = roleID.ToString();
399 param["GroupID"] = groupID.ToString(); 419 param["GroupID"] = groupID.ToString();
400 420
401 XmlRpcCall(requestID, "groups.addAgentToGroupInvite", param); 421 XmlRpcCall(requestingAgentID, "groups.addAgentToGroupInvite", param);
402 422
403 } 423 }
404 424
405 public GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, UUID inviteID) 425 public GroupInviteInfo GetAgentToGroupInvite(UUID requestingAgentID, UUID inviteID)
406 { 426 {
407 Hashtable param = new Hashtable(); 427 Hashtable param = new Hashtable();
408 param["InviteID"] = inviteID.ToString(); 428 param["InviteID"] = inviteID.ToString();
409 429
410 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentToGroupInvite", param); 430 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentToGroupInvite", param);
411 431
412 if (respData.Contains("error")) 432 if (respData.Contains("error"))
413 { 433 {
@@ -423,60 +443,59 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
423 return inviteInfo; 443 return inviteInfo;
424 } 444 }
425 445
426 public void RemoveAgentToGroupInvite(GroupRequestID requestID, UUID inviteID) 446 public void RemoveAgentToGroupInvite(UUID requestingAgentID, UUID inviteID)
427 { 447 {
428 Hashtable param = new Hashtable(); 448 Hashtable param = new Hashtable();
429 param["InviteID"] = inviteID.ToString(); 449 param["InviteID"] = inviteID.ToString();
430 450
431 XmlRpcCall(requestID, "groups.removeAgentToGroupInvite", param); 451 XmlRpcCall(requestingAgentID, "groups.removeAgentToGroupInvite", param);
432 } 452 }
433 453
434 public void AddAgentToGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) 454 public void AddAgentToGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
435 { 455 {
436 Hashtable param = new Hashtable(); 456 Hashtable param = new Hashtable();
437 param["AgentID"] = AgentID.ToString(); 457 param["AgentID"] = AgentID.ToString();
438 param["GroupID"] = GroupID.ToString(); 458 param["GroupID"] = GroupID.ToString();
439 param["RoleID"] = RoleID.ToString(); 459 param["RoleID"] = RoleID.ToString();
440 460
441 XmlRpcCall(requestID, "groups.addAgentToGroup", param); 461 XmlRpcCall(requestingAgentID, "groups.addAgentToGroup", param);
442 } 462 }
443 463
444 public void RemoveAgentFromGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID) 464 public void RemoveAgentFromGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID)
445 { 465 {
446 Hashtable param = new Hashtable(); 466 Hashtable param = new Hashtable();
447 param["AgentID"] = AgentID.ToString(); 467 param["AgentID"] = AgentID.ToString();
448 param["GroupID"] = GroupID.ToString(); 468 param["GroupID"] = GroupID.ToString();
449 469
450 XmlRpcCall(requestID, "groups.removeAgentFromGroup", param); 470 XmlRpcCall(requestingAgentID, "groups.removeAgentFromGroup", param);
451 } 471 }
452 472
453 public void AddAgentToGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) 473 public void AddAgentToGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
454 { 474 {
455 Hashtable param = new Hashtable(); 475 Hashtable param = new Hashtable();
456 param["AgentID"] = AgentID.ToString(); 476 param["AgentID"] = AgentID.ToString();
457 param["GroupID"] = GroupID.ToString(); 477 param["GroupID"] = GroupID.ToString();
458 param["RoleID"] = RoleID.ToString(); 478 param["RoleID"] = RoleID.ToString();
459 479
460 XmlRpcCall(requestID, "groups.addAgentToGroupRole", param); 480 XmlRpcCall(requestingAgentID, "groups.addAgentToGroupRole", param);
461 } 481 }
462 482
463 public void RemoveAgentFromGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) 483 public void RemoveAgentFromGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
464 { 484 {
465 Hashtable param = new Hashtable(); 485 Hashtable param = new Hashtable();
466 param["AgentID"] = AgentID.ToString(); 486 param["AgentID"] = AgentID.ToString();
467 param["GroupID"] = GroupID.ToString(); 487 param["GroupID"] = GroupID.ToString();
468 param["RoleID"] = RoleID.ToString(); 488 param["RoleID"] = RoleID.ToString();
469 489
470 XmlRpcCall(requestID, "groups.removeAgentFromGroupRole", param); 490 XmlRpcCall(requestingAgentID, "groups.removeAgentFromGroupRole", param);
471 } 491 }
472 492
473 493 public List<DirGroupsReplyData> FindGroups(UUID requestingAgentID, string search)
474 public List<DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search)
475 { 494 {
476 Hashtable param = new Hashtable(); 495 Hashtable param = new Hashtable();
477 param["Search"] = search; 496 param["Search"] = search;
478 497
479 Hashtable respData = XmlRpcCall(requestID, "groups.findGroups", param); 498 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.findGroups", param);
480 499
481 List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>(); 500 List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>();
482 501
@@ -498,13 +517,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
498 return findings; 517 return findings;
499 } 518 }
500 519
501 public GroupMembershipData GetAgentGroupMembership(GroupRequestID requestID, UUID AgentID, UUID GroupID) 520 public GroupMembershipData GetAgentGroupMembership(UUID requestingAgentID, UUID AgentID, UUID GroupID)
502 { 521 {
503 Hashtable param = new Hashtable(); 522 Hashtable param = new Hashtable();
504 param["AgentID"] = AgentID.ToString(); 523 param["AgentID"] = AgentID.ToString();
505 param["GroupID"] = GroupID.ToString(); 524 param["GroupID"] = GroupID.ToString();
506 525
507 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMembership", param); 526 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentGroupMembership", param);
508 527
509 if (respData.Contains("error")) 528 if (respData.Contains("error"))
510 { 529 {
@@ -516,12 +535,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
516 return data; 535 return data;
517 } 536 }
518 537
519 public GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, UUID AgentID) 538 public GroupMembershipData GetAgentActiveMembership(UUID requestingAgentID, UUID AgentID)
520 { 539 {
521 Hashtable param = new Hashtable(); 540 Hashtable param = new Hashtable();
522 param["AgentID"] = AgentID.ToString(); 541 param["AgentID"] = AgentID.ToString();
523 542
524 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentActiveMembership", param); 543 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentActiveMembership", param);
525 544
526 if (respData.Contains("error")) 545 if (respData.Contains("error"))
527 { 546 {
@@ -531,13 +550,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
531 return HashTableToGroupMembershipData(respData); 550 return HashTableToGroupMembershipData(respData);
532 } 551 }
533 552
534 553 public List<GroupMembershipData> GetAgentGroupMemberships(UUID requestingAgentID, UUID AgentID)
535 public List<GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, UUID AgentID)
536 { 554 {
537 Hashtable param = new Hashtable(); 555 Hashtable param = new Hashtable();
538 param["AgentID"] = AgentID.ToString(); 556 param["AgentID"] = AgentID.ToString();
539 557
540 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMemberships", param); 558 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentGroupMemberships", param);
541 559
542 List<GroupMembershipData> memberships = new List<GroupMembershipData>(); 560 List<GroupMembershipData> memberships = new List<GroupMembershipData>();
543 561
@@ -552,13 +570,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
552 return memberships; 570 return memberships;
553 } 571 }
554 572
555 public List<GroupRolesData> GetAgentGroupRoles(GroupRequestID requestID, UUID AgentID, UUID GroupID) 573 public List<GroupRolesData> GetAgentGroupRoles(UUID requestingAgentID, UUID AgentID, UUID GroupID)
556 { 574 {
557 Hashtable param = new Hashtable(); 575 Hashtable param = new Hashtable();
558 param["AgentID"] = AgentID.ToString(); 576 param["AgentID"] = AgentID.ToString();
559 param["GroupID"] = GroupID.ToString(); 577 param["GroupID"] = GroupID.ToString();
560 578
561 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentRoles", param); 579 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentRoles", param);
562 580
563 List<GroupRolesData> Roles = new List<GroupRolesData>(); 581 List<GroupRolesData> Roles = new List<GroupRolesData>();
564 582
@@ -584,12 +602,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
584 602
585 } 603 }
586 604
587 public List<GroupRolesData> GetGroupRoles(GroupRequestID requestID, UUID GroupID) 605 public List<GroupRolesData> GetGroupRoles(UUID requestingAgentID, UUID GroupID)
588 { 606 {
589 Hashtable param = new Hashtable(); 607 Hashtable param = new Hashtable();
590 param["GroupID"] = GroupID.ToString(); 608 param["GroupID"] = GroupID.ToString();
591 609
592 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoles", param); 610 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupRoles", param);
593 611
594 List<GroupRolesData> Roles = new List<GroupRolesData>(); 612 List<GroupRolesData> Roles = new List<GroupRolesData>();
595 613
@@ -617,12 +635,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
617 635
618 636
619 637
620 public List<GroupMembersData> GetGroupMembers(GroupRequestID requestID, UUID GroupID) 638 public List<GroupMembersData> GetGroupMembers(UUID requestingAgentID, UUID GroupID)
621 { 639 {
622 Hashtable param = new Hashtable(); 640 Hashtable param = new Hashtable();
623 param["GroupID"] = GroupID.ToString(); 641 param["GroupID"] = GroupID.ToString();
624 642
625 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupMembers", param); 643 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupMembers", param);
626 644
627 List<GroupMembersData> members = new List<GroupMembersData>(); 645 List<GroupMembersData> members = new List<GroupMembersData>();
628 646
@@ -650,12 +668,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
650 668
651 } 669 }
652 670
653 public List<GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, UUID GroupID) 671 public List<GroupRoleMembersData> GetGroupRoleMembers(UUID requestingAgentID, UUID GroupID)
654 { 672 {
655 Hashtable param = new Hashtable(); 673 Hashtable param = new Hashtable();
656 param["GroupID"] = GroupID.ToString(); 674 param["GroupID"] = GroupID.ToString();
657 675
658 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoleMembers", param); 676 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupRoleMembers", param);
659 677
660 List<GroupRoleMembersData> members = new List<GroupRoleMembersData>(); 678 List<GroupRoleMembersData> members = new List<GroupRoleMembersData>();
661 679
@@ -674,12 +692,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
674 return members; 692 return members;
675 } 693 }
676 694
677 public List<GroupNoticeData> GetGroupNotices(GroupRequestID requestID, UUID GroupID) 695 public List<GroupNoticeData> GetGroupNotices(UUID requestingAgentID, UUID GroupID)
678 { 696 {
679 Hashtable param = new Hashtable(); 697 Hashtable param = new Hashtable();
680 param["GroupID"] = GroupID.ToString(); 698 param["GroupID"] = GroupID.ToString();
681 699
682 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotices", param); 700 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupNotices", param);
683 701
684 List<GroupNoticeData> values = new List<GroupNoticeData>(); 702 List<GroupNoticeData> values = new List<GroupNoticeData>();
685 703
@@ -701,12 +719,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
701 return values; 719 return values;
702 720
703 } 721 }
704 public GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, UUID noticeID) 722 public GroupNoticeInfo GetGroupNotice(UUID requestingAgentID, UUID noticeID)
705 { 723 {
706 Hashtable param = new Hashtable(); 724 Hashtable param = new Hashtable();
707 param["NoticeID"] = noticeID.ToString(); 725 param["NoticeID"] = noticeID.ToString();
708 726
709 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotice", param); 727 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupNotice", param);
710 728
711 729
712 if (respData.Contains("error")) 730 if (respData.Contains("error"))
@@ -732,7 +750,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
732 750
733 return data; 751 return data;
734 } 752 }
735 public void AddGroupNotice(GroupRequestID requestID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket) 753 public void AddGroupNotice(UUID requestingAgentID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket)
736 { 754 {
737 string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, ""); 755 string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, "");
738 756
@@ -745,7 +763,70 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
745 param["BinaryBucket"] = binBucket; 763 param["BinaryBucket"] = binBucket;
746 param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString(); 764 param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString();
747 765
748 XmlRpcCall(requestID, "groups.addGroupNotice", param); 766 XmlRpcCall(requestingAgentID, "groups.addGroupNotice", param);
767 }
768
769
770
771 #endregion
772
773 #region GroupSessionTracking
774
775 public void ResetAgentGroupChatSessions(UUID agentID)
776 {
777 foreach (List<UUID> agentList in m_groupsAgentsDroppedFromChatSession.Values)
778 {
779 agentList.Remove(agentID);
780 }
781 }
782
783 public bool hasAgentBeenInvitedToGroupChatSession(UUID agentID, UUID groupID)
784 {
785 // If we're tracking this group, and we can find them in the tracking, then they've been invited
786 return m_groupsAgentsInvitedToChatSession.ContainsKey(groupID)
787 && m_groupsAgentsInvitedToChatSession[groupID].Contains(agentID);
788 }
789
790 public bool hasAgentDroppedGroupChatSession(UUID agentID, UUID groupID)
791 {
792 // If we're tracking drops for this group,
793 // and we find them, well... then they've dropped
794 return m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID)
795 && m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID);
796 }
797
798 public void AgentDroppedFromGroupChatSession(UUID agentID, UUID groupID)
799 {
800 if (m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID))
801 {
802 // If not in dropped list, add
803 if (!m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID))
804 {
805 m_groupsAgentsDroppedFromChatSession[groupID].Add(agentID);
806 }
807 }
808 }
809
810 public void AgentInvitedToGroupChatSession(UUID agentID, UUID groupID)
811 {
812 // Add Session Status if it doesn't exist for this session
813 CreateGroupChatSessionTracking(groupID);
814
815 // If nessesary, remove from dropped list
816 if (m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID))
817 {
818 m_groupsAgentsDroppedFromChatSession[groupID].Remove(agentID);
819 }
820 }
821
822 private void CreateGroupChatSessionTracking(UUID groupID)
823 {
824 if (!m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID))
825 {
826 m_groupsAgentsDroppedFromChatSession.Add(groupID, new List<UUID>());
827 m_groupsAgentsInvitedToChatSession.Add(groupID, new List<UUID>());
828 }
829
749 } 830 }
750 #endregion 831 #endregion
751 832
@@ -778,7 +859,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
778 859
779 private GroupRecord GroupProfileHashtableToGroupRecord(Hashtable groupProfile) 860 private GroupRecord GroupProfileHashtableToGroupRecord(Hashtable groupProfile)
780 { 861 {
781
782 GroupRecord group = new GroupRecord(); 862 GroupRecord group = new GroupRecord();
783 group.GroupID = UUID.Parse((string)groupProfile["GroupID"]); 863 group.GroupID = UUID.Parse((string)groupProfile["GroupID"]);
784 group.GroupName = groupProfile["Name"].ToString(); 864 group.GroupName = groupProfile["Name"].ToString();
@@ -797,6 +877,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
797 877
798 return group; 878 return group;
799 } 879 }
880
800 private static GroupMembershipData HashTableToGroupMembershipData(Hashtable respData) 881 private static GroupMembershipData HashTableToGroupMembershipData(Hashtable respData)
801 { 882 {
802 GroupMembershipData data = new GroupMembershipData(); 883 GroupMembershipData data = new GroupMembershipData();
@@ -829,6 +910,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
829 data.MembershipFee = int.Parse((string)respData["MembershipFee"]); 910 data.MembershipFee = int.Parse((string)respData["MembershipFee"]);
830 data.OpenEnrollment = ((string)respData["OpenEnrollment"] == "1"); 911 data.OpenEnrollment = ((string)respData["OpenEnrollment"] == "1");
831 data.ShowInList = ((string)respData["ShowInList"] == "1"); 912 data.ShowInList = ((string)respData["ShowInList"] == "1");
913
832 return data; 914 return data;
833 } 915 }
834 916
@@ -837,20 +919,27 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
837 /// <summary> 919 /// <summary>
838 /// Encapsulate the XmlRpc call to standardize security and error handling. 920 /// Encapsulate the XmlRpc call to standardize security and error handling.
839 /// </summary> 921 /// </summary>
840 private Hashtable XmlRpcCall(GroupRequestID requestID, string function, Hashtable param) 922 private Hashtable XmlRpcCall(UUID requestingAgentID, string function, Hashtable param)
841 { 923 {
842 if (requestID == null) 924 string UserService;
843 { 925 UUID SessionID;
844 requestID = new GroupRequestID(); 926 GetClientGroupRequestID(requestingAgentID, out UserService, out SessionID);
845 } 927 param.Add("RequestingAgentID", requestingAgentID.ToString());
846 param.Add("RequestingAgentID", requestID.AgentID.ToString()); 928 param.Add("RequestingAgentUserService", UserService);
847 param.Add("RequestingAgentUserService", requestID.UserServiceURL); 929 param.Add("RequestingSessionID", SessionID.ToString());
848 param.Add("RequestingSessionID", requestID.SessionID.ToString());
849 930
850 931
851 param.Add("ReadKey", m_groupReadKey); 932 param.Add("ReadKey", m_groupReadKey);
852 param.Add("WriteKey", m_groupWriteKey); 933 param.Add("WriteKey", m_groupWriteKey);
853 934
935 if (m_debugEnabled)
936 {
937 m_log.Debug("[XMLRPCGROUPDATA] XmlRpcCall Params:");
938 foreach (string key in param.Keys)
939 {
940 m_log.DebugFormat("[XMLRPCGROUPDATA] {0} : {1}", key, param[key]);
941 }
942 }
854 943
855 IList parameters = new ArrayList(); 944 IList parameters = new ArrayList();
856 parameters.Add(param); 945 parameters.Add(param);
@@ -862,7 +951,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
862 951
863 try 952 try
864 { 953 {
865 resp = req.Send(m_serviceURL, 10000); 954 resp = req.Send(m_groupsServerURI, 10000);
866 } 955 }
867 catch (Exception e) 956 catch (Exception e)
868 { 957 {
@@ -871,10 +960,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
871 m_log.ErrorFormat("[XMLRPCGROUPDATA]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function); 960 m_log.ErrorFormat("[XMLRPCGROUPDATA]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function);
872 m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", e.ToString()); 961 m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", e.ToString());
873 962
874 foreach (string ResponseLine in req.RequestResponse.Split(new string[] { Environment.NewLine },StringSplitOptions.None)) 963 if ((req != null) && (req.RequestResponse != null))
964 {
965 foreach (string ResponseLine in req.RequestResponse.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
875 { 966 {
876 m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", ResponseLine); 967 m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} ", ResponseLine);
877 } 968 }
969 }
878 970
879 foreach (string key in param.Keys) 971 foreach (string key in param.Keys)
880 { 972 {
@@ -886,12 +978,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
886 return respData; 978 return respData;
887 } 979 }
888 980
981
889 if (resp.Value is Hashtable) 982 if (resp.Value is Hashtable)
890 { 983 {
891 Hashtable respData = (Hashtable)resp.Value; 984 Hashtable respData = (Hashtable)resp.Value;
892 if (respData.Contains("error") && !respData.Contains("succeed")) 985 if (respData.Contains("error") && !respData.Contains("succeed"))
893 { 986 {
894 LogRespDataToConsoleError(respData); 987 LogRespDataToConsoleError(function, respData);
895 } 988 }
896 989
897 return respData; 990 return respData;
@@ -919,32 +1012,75 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
919 return error; 1012 return error;
920 } 1013 }
921 1014
922 private void LogRespDataToConsoleError(Hashtable respData) 1015 private void LogRespDataToConsoleError(string function, Hashtable respData)
923 { 1016 {
1017 m_log.ErrorFormat("[XMLRPCGROUPDATA]: Error data from XmlRpcGroups server method: {0}", function);
924 m_log.Error("[XMLRPCGROUPDATA]: Error:"); 1018 m_log.Error("[XMLRPCGROUPDATA]: Error:");
925 1019
926 foreach (string key in respData.Keys) 1020 foreach (string key in respData.Keys)
927 { 1021 {
928 m_log.ErrorFormat("[XMLRPCGROUPDATA]: Key: {0}", key); 1022 m_log.ErrorFormat("[XMLRPCGROUPDATA]: Key: {0}", key);
929 1023
930 string[] lines = respData[key].ToString().Split(new char[] { '\n' }); 1024 if ((respData != null) && (respData.ContainsKey(key)) && (respData[key]!=null))
931 foreach (string line in lines)
932 { 1025 {
933 m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0}", line); 1026 string[] lines = respData[key].ToString().Split(new char[] { '\n' });
1027 foreach (string line in lines)
1028 {
1029 m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0}", line);
1030 }
1031 }
1032 else
1033 {
1034 m_log.ErrorFormat("[XMLRPCGROUPDATA]: {0} : Empty/NULL", key);
934 } 1035 }
935 1036
936 } 1037 }
937 } 1038 }
938 1039
1040
1041 /// <summary>
1042 /// Group Request Tokens are an attempt to allow the groups service to authenticate
1043 /// requests.
1044 /// TODO: This broke after the big grid refactor, either find a better way, or discard this
1045 /// </summary>
1046 /// <param name="client"></param>
1047 /// <returns></returns>
1048 private void GetClientGroupRequestID(UUID AgentID, out string UserServiceURL, out UUID SessionID)
1049 {
1050 // Default to local grid user service
1051 UserServiceURL = m_commManager.NetworkServersInfo.UserURL; ;
939 1052
940 } 1053 // if AgentID == UUID, there will be no SessionID. This will be true when
1054 // the region is requesting information for region use (object permissions for example)
1055 SessionID = UUID.Zero;
941 1056
942 public class GroupNoticeInfo 1057 // Attempt to get User Profile, for SessionID
943 { 1058 UserProfileData userProfile = m_userService.GetUserProfile(AgentID);
944 public GroupNoticeData noticeData = new GroupNoticeData(); 1059
945 public UUID GroupID = UUID.Zero; 1060 if ((userProfile != null) && (userProfile is ForeignUserProfileData))
946 public string Message = string.Empty; 1061 {
947 public byte[] BinaryBucket = new byte[0]; 1062 // They aren't from around here
1063 ForeignUserProfileData fupd = (ForeignUserProfileData)userProfile;
1064 UserServiceURL = fupd.UserServerURI;
1065 SessionID = fupd.CurrentAgent.SessionID;
1066
1067 }
1068 else if (userProfile != null)
1069 {
1070 // Local, just use the local SessionID
1071 SessionID = userProfile.CurrentAgent.SessionID;
1072 }
1073 else if (AgentID != UUID.Zero)
1074 {
1075 // This should be impossible. If I've been passed a reference to a client
1076 // that client should be registered with the UserService. So something
1077 // is horribly wrong somewhere.
1078
1079 // m_log.WarnFormat("[XMLRPCGROUPDATA]: Could not find a UserServiceURL for {0}", AgentID);
1080
1081 }
1082 }
1083
948 } 1084 }
949} 1085}
950 1086
diff --git a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
index c653e98..672109b 100644
--- a/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/RegionReadyModule/RegionReadyModule.cs
@@ -146,6 +146,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
146 c.Position = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 30); 146 c.Position = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 30);
147 c.Sender = null; 147 c.Sender = null;
148 c.SenderUUID = UUID.Zero; 148 c.SenderUUID = UUID.Zero;
149 c.Scene = m_scene;
149 150
150 m_log.InfoFormat("[RegionReady]: Region \"{0}\" is ready: \"{1}\" on channel {2}", 151 m_log.InfoFormat("[RegionReady]: Region \"{0}\" is ready: \"{1}\" on channel {2}",
151 m_scene.RegionInfo.RegionName, c.Message, m_channelNotify); 152 m_scene.RegionInfo.RegionName, c.Message, m_channelNotify);