aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/OptionalModules
diff options
context:
space:
mode:
authorunknown2010-04-08 16:14:02 -0700
committerMelanie2010-05-05 16:09:53 +0100
commit8a69070b513f821bf295c32ad771d5f5009bec61 (patch)
tree9a629dd18860778dba3767811bbca1ebde35bfc5 /OpenSim/Region/OptionalModules
parentRevert "Patch from mcortez: Update groups, add ALPHA Siman grid connector for... (diff)
downloadopensim-SC-8a69070b513f821bf295c32ad771d5f5009bec61.zip
opensim-SC-8a69070b513f821bf295c32ad771d5f5009bec61.tar.gz
opensim-SC-8a69070b513f821bf295c32ad771d5f5009bec61.tar.bz2
opensim-SC-8a69070b513f821bf295c32ad771d5f5009bec61.tar.xz
back port groups changes
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs266
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs299
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/IGroupsServicesConnector.cs66
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs1329
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs281
5 files changed, 1798 insertions, 443 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..edd5af7 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;
@@ -388,7 +348,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
388 if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)) 348 if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline))
389 { 349 {
390 UUID inviteID = new UUID(im.imSessionID); 350 UUID inviteID = new UUID(im.imSessionID);
391 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); 351 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
392 352
393 if (inviteInfo == null) 353 if (inviteInfo == null)
394 { 354 {
@@ -407,7 +367,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
407 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received an accept invite notice."); 367 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received an accept invite notice.");
408 368
409 // and the sessionid is the role 369 // and the sessionid is the role
410 m_groupData.AddAgentToGroup(GetClientGroupRequestID(remoteClient), inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID); 370 m_groupData.AddAgentToGroup(GetRequestingAgentID(remoteClient), inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID);
411 371
412 GridInstantMessage msg = new GridInstantMessage(); 372 GridInstantMessage msg = new GridInstantMessage();
413 msg.imSessionID = UUID.Zero.Guid; 373 msg.imSessionID = UUID.Zero.Guid;
@@ -431,14 +391,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
431 // TODO: If the inviter is still online, they need an agent dataupdate 391 // TODO: If the inviter is still online, they need an agent dataupdate
432 // and maybe group membership updates for the invitee 392 // and maybe group membership updates for the invitee
433 393
434 m_groupData.RemoveAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); 394 m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
435 } 395 }
436 396
437 // Reject 397 // Reject
438 if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline) 398 if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)
439 { 399 {
440 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received a reject invite notice."); 400 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: Received a reject invite notice.");
441 m_groupData.RemoveAgentToGroupInvite(GetClientGroupRequestID(remoteClient), inviteID); 401 m_groupData.RemoveAgentToGroupInvite(GetRequestingAgentID(remoteClient), inviteID);
442 } 402 }
443 } 403 }
444 } 404 }
@@ -452,7 +412,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
452 } 412 }
453 413
454 UUID GroupID = new UUID(im.toAgentID); 414 UUID GroupID = new UUID(im.toAgentID);
455 if (m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), GroupID, null) != null) 415 if (m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), GroupID, null) != null)
456 { 416 {
457 UUID NoticeID = UUID.Random(); 417 UUID NoticeID = UUID.Random();
458 string Subject = im.message.Substring(0, im.message.IndexOf('|')); 418 string Subject = im.message.Substring(0, im.message.IndexOf('|'));
@@ -496,14 +456,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
496 } 456 }
497 457
498 458
499 m_groupData.AddGroupNotice(GetClientGroupRequestID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket); 459 m_groupData.AddGroupNotice(GetRequestingAgentID(remoteClient), GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket);
500 if (OnNewGroupNotice != null) 460 if (OnNewGroupNotice != null)
501 { 461 {
502 OnNewGroupNotice(GroupID, NoticeID); 462 OnNewGroupNotice(GroupID, NoticeID);
503 } 463 }
504 464
505 // Send notice out to everyone that wants notices 465 // Send notice out to everyone that wants notices
506 foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), GroupID)) 466 foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), GroupID))
507 { 467 {
508 if (m_debugEnabled) 468 if (m_debugEnabled)
509 { 469 {
@@ -549,7 +509,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
549 IClientAPI ejectee = GetActiveClient(ejecteeID); 509 IClientAPI ejectee = GetActiveClient(ejecteeID);
550 if (ejectee != null) 510 if (ejectee != null)
551 { 511 {
552 UUID groupID = new UUID(im.fromAgentID); 512 UUID groupID = new UUID(im.imSessionID);
553 ejectee.SendAgentDropGroup(groupID); 513 ejectee.SendAgentDropGroup(groupID);
554 } 514 }
555 } 515 }
@@ -588,20 +548,25 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
588 548
589 public GroupRecord GetGroupRecord(UUID GroupID) 549 public GroupRecord GetGroupRecord(UUID GroupID)
590 { 550 {
591 return m_groupData.GetGroupRecord(null, GroupID, null); 551 return m_groupData.GetGroupRecord(UUID.Zero, GroupID, null);
592 } 552 }
593 553
554 public GroupRecord GetGroupRecord(string name)
555 {
556 return m_groupData.GetGroupRecord(UUID.Zero, UUID.Zero, name);
557 }
558
594 public void ActivateGroup(IClientAPI remoteClient, UUID groupID) 559 public void ActivateGroup(IClientAPI remoteClient, UUID groupID)
595 { 560 {
596 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 561 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
597 562
598 m_groupData.SetAgentActiveGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID); 563 m_groupData.SetAgentActiveGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
599 564
600 // Changing active group changes title, active powers, all kinds of things 565 // 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 566 // 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 567 // updated with new group info. At a minimum, they should get ScenePresence
603 // updated with new title. 568 // updated with new title.
604 UpdateAllClientsWithGroupInfo(remoteClient.AgentId); 569 UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient));
605 } 570 }
606 571
607 /// <summary> 572 /// <summary>
@@ -611,10 +576,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
611 { 576 {
612 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 577 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
613 578
614 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
615 579
616 List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(grID, remoteClient.AgentId, groupID); 580 List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
617 GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(grID, remoteClient.AgentId, groupID); 581 GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
618 582
619 List<GroupTitlesData> titles = new List<GroupTitlesData>(); 583 List<GroupTitlesData> titles = new List<GroupTitlesData>();
620 foreach (GroupRolesData role in agentRoles) 584 foreach (GroupRolesData role in agentRoles)
@@ -636,8 +600,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
636 public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID) 600 public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID)
637 { 601 {
638 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 602 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
603 List<GroupMembersData> data = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID);
639 604
640 List<GroupMembersData> data = m_groupData.GetGroupMembers(GetClientGroupRequestID(remoteClient), groupID); 605 if (m_debugEnabled)
606 {
607 foreach (GroupMembersData member in data)
608 {
609 m_log.DebugFormat("[GROUPS]: Member({0}) - IsOwner({1})", member.AgentID, member.IsOwner);
610 }
611 }
641 612
642 return data; 613 return data;
643 614
@@ -647,21 +618,25 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
647 { 618 {
648 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 619 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
649 620
650 List<GroupRolesData> data = m_groupData.GetGroupRoles(GetClientGroupRequestID(remoteClient), groupID); 621 List<GroupRolesData> data = m_groupData.GetGroupRoles(GetRequestingAgentID(remoteClient), groupID);
651 622
652 return data; 623 return data;
653
654 } 624 }
655 625
656 public List<GroupRoleMembersData> GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID) 626 public List<GroupRoleMembersData> GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID)
657 { 627 {
658 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 628 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
659 629
660 List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetClientGroupRequestID(remoteClient), groupID); 630 List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(GetRequestingAgentID(remoteClient), groupID);
661 631
632 if (m_debugEnabled)
633 {
634 foreach (GroupRoleMembersData member in data)
635 {
636 m_log.DebugFormat("[GROUPS]: Member({0}) - Role({1})", member.MemberID, member.RoleID);
637 }
638 }
662 return data; 639 return data;
663
664
665 } 640 }
666 641
667 public GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID) 642 public GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID)
@@ -670,17 +645,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
670 645
671 GroupProfileData profile = new GroupProfileData(); 646 GroupProfileData profile = new GroupProfileData();
672 647
673 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
674 648
675 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetClientGroupRequestID(remoteClient), groupID, null); 649 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), groupID, null);
676 if (groupInfo != null) 650 if (groupInfo != null)
677 { 651 {
678 profile.AllowPublish = groupInfo.AllowPublish; 652 profile.AllowPublish = groupInfo.AllowPublish;
679 profile.Charter = groupInfo.Charter; 653 profile.Charter = groupInfo.Charter;
680 profile.FounderID = groupInfo.FounderID; 654 profile.FounderID = groupInfo.FounderID;
681 profile.GroupID = groupID; 655 profile.GroupID = groupID;
682 profile.GroupMembershipCount = m_groupData.GetGroupMembers(grID, groupID).Count; 656 profile.GroupMembershipCount = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID).Count;
683 profile.GroupRolesCount = m_groupData.GetGroupRoles(grID, groupID).Count; 657 profile.GroupRolesCount = m_groupData.GetGroupRoles(GetRequestingAgentID(remoteClient), groupID).Count;
684 profile.InsigniaID = groupInfo.GroupPicture; 658 profile.InsigniaID = groupInfo.GroupPicture;
685 profile.MaturePublish = groupInfo.MaturePublish; 659 profile.MaturePublish = groupInfo.MaturePublish;
686 profile.MembershipFee = groupInfo.MembershipFee; 660 profile.MembershipFee = groupInfo.MembershipFee;
@@ -691,7 +665,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
691 profile.ShowInList = groupInfo.ShowInList; 665 profile.ShowInList = groupInfo.ShowInList;
692 } 666 }
693 667
694 GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(grID, remoteClient.AgentId, groupID); 668 GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
695 if (memberInfo != null) 669 if (memberInfo != null)
696 { 670 {
697 profile.MemberTitle = memberInfo.GroupTitle; 671 profile.MemberTitle = memberInfo.GroupTitle;
@@ -705,40 +679,40 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
705 { 679 {
706 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 680 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
707 681
708 return m_groupData.GetAgentGroupMemberships(null, agentID).ToArray(); 682 return m_groupData.GetAgentGroupMemberships(UUID.Zero, agentID).ToArray();
709 } 683 }
710 684
711 public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID) 685 public GroupMembershipData GetMembershipData(UUID groupID, UUID agentID)
712 { 686 {
713 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 687 if (m_debugEnabled)
688 m_log.DebugFormat(
689 "[GROUPS]: {0} called with groupID={1}, agentID={2}",
690 System.Reflection.MethodBase.GetCurrentMethod().Name, groupID, agentID);
714 691
715 return m_groupData.GetAgentGroupMembership(null, agentID, groupID); 692 return m_groupData.GetAgentGroupMembership(UUID.Zero, agentID, groupID);
716 } 693 }
717 694
718 public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) 695 public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
719 { 696 {
720 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 697 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
721 698
722 // TODO: Security Check? 699 // Note: Permissions checking for modification rights is handled by the Groups Server/Service
723 700 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 } 701 }
726 702
727 public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile) 703 public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile)
728 { 704 {
729 // TODO: Security Check? 705 // 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); 706 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
731 707
732 m_groupData.SetAgentGroupInfo(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, acceptNotices, listInProfile); 708 m_groupData.SetAgentGroupInfo(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, acceptNotices, listInProfile);
733 } 709 }
734 710
735 public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) 711 public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
736 { 712 {
737 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 713 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
738 714
739 GroupRequestID grID = GetClientGroupRequestID(remoteClient); 715 if (m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), UUID.Zero, name) != null)
740
741 if (m_groupData.GetGroupRecord(grID, UUID.Zero, name) != null)
742 { 716 {
743 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists."); 717 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists.");
744 return UUID.Zero; 718 return UUID.Zero;
@@ -754,12 +728,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
754 } 728 }
755 money.ApplyGroupCreationCharge(remoteClient.AgentId); 729 money.ApplyGroupCreationCharge(remoteClient.AgentId);
756 } 730 }
757 UUID groupID = m_groupData.CreateGroup(grID, name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, remoteClient.AgentId); 731 UUID groupID = m_groupData.CreateGroup(GetRequestingAgentID(remoteClient), name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, GetRequestingAgentID(remoteClient));
758 732
759 remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly"); 733 remoteClient.SendCreateGroupReply(groupID, true, "Group created successfullly");
760 734
761 // Update the founder with new group information. 735 // Update the founder with new group information.
762 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 736 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
763 737
764 return groupID; 738 return groupID;
765 } 739 }
@@ -770,7 +744,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
770 744
771 // ToDo: check if agent is a member of group and is allowed to see notices? 745 // ToDo: check if agent is a member of group and is allowed to see notices?
772 746
773 return m_groupData.GetGroupNotices(GetClientGroupRequestID(remoteClient), groupID).ToArray(); 747 return m_groupData.GetGroupNotices(GetRequestingAgentID(remoteClient), groupID).ToArray();
774 } 748 }
775 749
776 /// <summary> 750 /// <summary>
@@ -780,7 +754,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
780 { 754 {
781 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 755 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
782 756
783 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(null, avatarID); 757 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(UUID.Zero, avatarID);
784 if (membership != null) 758 if (membership != null)
785 { 759 {
786 return membership.GroupTitle; 760 return membership.GroupTitle;
@@ -795,13 +769,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
795 { 769 {
796 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 770 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
797 771
798 m_groupData.SetAgentActiveGroupRole(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, titleRoleID); 772 m_groupData.SetAgentActiveGroupRole(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, titleRoleID);
799 773
800 // TODO: Not sure what all is needed here, but if the active group role change is for the group 774 // 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 775 // 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) 776 // if (m_groupData.GetAgentActiveMembership(GetRequestingAgentID(remoteClient)).GroupID == GroupID)
803 777
804 UpdateAllClientsWithGroupInfo(remoteClient.AgentId); 778 UpdateAllClientsWithGroupInfo(GetRequestingAgentID(remoteClient));
805 } 779 }
806 780
807 781
@@ -811,16 +785,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
811 785
812 // Security Checks are handled in the Groups Service. 786 // Security Checks are handled in the Groups Service.
813 787
814 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
815
816 switch ((OpenMetaverse.GroupRoleUpdate)updateType) 788 switch ((OpenMetaverse.GroupRoleUpdate)updateType)
817 { 789 {
818 case OpenMetaverse.GroupRoleUpdate.Create: 790 case OpenMetaverse.GroupRoleUpdate.Create:
819 m_groupData.AddGroupRole(grID, groupID, UUID.Random(), name, description, title, powers); 791 m_groupData.AddGroupRole(GetRequestingAgentID(remoteClient), groupID, UUID.Random(), name, description, title, powers);
820 break; 792 break;
821 793
822 case OpenMetaverse.GroupRoleUpdate.Delete: 794 case OpenMetaverse.GroupRoleUpdate.Delete:
823 m_groupData.RemoveGroupRole(grID, groupID, roleID); 795 m_groupData.RemoveGroupRole(GetRequestingAgentID(remoteClient), groupID, roleID);
824 break; 796 break;
825 797
826 case OpenMetaverse.GroupRoleUpdate.UpdateAll: 798 case OpenMetaverse.GroupRoleUpdate.UpdateAll:
@@ -831,7 +803,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
831 GroupPowers gp = (GroupPowers)powers; 803 GroupPowers gp = (GroupPowers)powers;
832 m_log.DebugFormat("[GROUPS]: Role ({0}) updated with Powers ({1}) ({2})", name, powers.ToString(), gp.ToString()); 804 m_log.DebugFormat("[GROUPS]: Role ({0}) updated with Powers ({1}) ({2})", name, powers.ToString(), gp.ToString());
833 } 805 }
834 m_groupData.UpdateGroupRole(grID, groupID, roleID, name, description, title, powers); 806 m_groupData.UpdateGroupRole(GetRequestingAgentID(remoteClient), groupID, roleID, name, description, title, powers);
835 break; 807 break;
836 808
837 case OpenMetaverse.GroupRoleUpdate.NoUpdate: 809 case OpenMetaverse.GroupRoleUpdate.NoUpdate:
@@ -842,7 +814,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
842 } 814 }
843 815
844 // TODO: This update really should send out updates for everyone in the role that just got changed. 816 // TODO: This update really should send out updates for everyone in the role that just got changed.
845 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 817 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
846 } 818 }
847 819
848 public void GroupRoleChanges(IClientAPI remoteClient, UUID groupID, UUID roleID, UUID memberID, uint changes) 820 public void GroupRoleChanges(IClientAPI remoteClient, UUID groupID, UUID roleID, UUID memberID, uint changes)
@@ -850,18 +822,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
850 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 822 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
851 // Todo: Security check 823 // Todo: Security check
852 824
853 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
854
855 switch (changes) 825 switch (changes)
856 { 826 {
857 case 0: 827 case 0:
858 // Add 828 // Add
859 m_groupData.AddAgentToGroupRole(grID, memberID, groupID, roleID); 829 m_groupData.AddAgentToGroupRole(GetRequestingAgentID(remoteClient), memberID, groupID, roleID);
860 830
861 break; 831 break;
862 case 1: 832 case 1:
863 // Remove 833 // Remove
864 m_groupData.RemoveAgentFromGroupRole(grID, memberID, groupID, roleID); 834 m_groupData.RemoveAgentFromGroupRole(GetRequestingAgentID(remoteClient), memberID, groupID, roleID);
865 835
866 break; 836 break;
867 default: 837 default:
@@ -870,25 +840,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
870 } 840 }
871 841
872 // TODO: This update really should send out updates for everyone in the role that just got changed. 842 // TODO: This update really should send out updates for everyone in the role that just got changed.
873 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 843 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
874 } 844 }
875 845
876 public void GroupNoticeRequest(IClientAPI remoteClient, UUID groupNoticeID) 846 public void GroupNoticeRequest(IClientAPI remoteClient, UUID groupNoticeID)
877 { 847 {
878 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 848 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
879 849
880 GroupRequestID grID = GetClientGroupRequestID(remoteClient); 850 GroupNoticeInfo data = m_groupData.GetGroupNotice(GetRequestingAgentID(remoteClient), groupNoticeID);
881
882 GroupNoticeInfo data = m_groupData.GetGroupNotice(grID, groupNoticeID);
883 851
884 if (data != null) 852 if (data != null)
885 { 853 {
886 GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, data.GroupID, null); 854 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), data.GroupID, null);
887 855
888 GridInstantMessage msg = new GridInstantMessage(); 856 GridInstantMessage msg = new GridInstantMessage();
889 msg.imSessionID = UUID.Zero.Guid; 857 msg.imSessionID = UUID.Zero.Guid;
890 msg.fromAgentID = data.GroupID.Guid; 858 msg.fromAgentID = data.GroupID.Guid;
891 msg.toAgentID = remoteClient.AgentId.Guid; 859 msg.toAgentID = GetRequestingAgentID(remoteClient).Guid;
892 msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 860 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
893 msg.fromAgentName = "Group Notice : " + groupInfo == null ? "Unknown" : groupInfo.GroupName; 861 msg.fromAgentName = "Group Notice : " + groupInfo == null ? "Unknown" : groupInfo.GroupName;
894 msg.message = data.noticeData.Subject + "|" + data.Message; 862 msg.message = data.noticeData.Subject + "|" + data.Message;
@@ -900,7 +868,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
900 msg.RegionID = UUID.Zero.Guid; 868 msg.RegionID = UUID.Zero.Guid;
901 msg.binaryBucket = data.BinaryBucket; 869 msg.binaryBucket = data.BinaryBucket;
902 870
903 OutgoingInstantMessage(msg, remoteClient.AgentId); 871 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient));
904 } 872 }
905 873
906 } 874 }
@@ -920,7 +888,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
920 msg.Position = Vector3.Zero; 888 msg.Position = Vector3.Zero;
921 msg.RegionID = UUID.Zero.Guid; 889 msg.RegionID = UUID.Zero.Guid;
922 890
923 GroupNoticeInfo info = m_groupData.GetGroupNotice(null, groupNoticeID); 891 GroupNoticeInfo info = m_groupData.GetGroupNotice(agentID, groupNoticeID);
924 if (info != null) 892 if (info != null)
925 { 893 {
926 msg.fromAgentID = info.GroupID.Guid; 894 msg.fromAgentID = info.GroupID.Guid;
@@ -947,7 +915,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
947 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 915 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
948 916
949 // Send agent information about his groups 917 // Send agent information about his groups
950 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 918 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
951 } 919 }
952 920
953 public void JoinGroupRequest(IClientAPI remoteClient, UUID groupID) 921 public void JoinGroupRequest(IClientAPI remoteClient, UUID groupID)
@@ -955,19 +923,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
955 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 923 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
956 924
957 // Should check to see if OpenEnrollment, or if there's an outstanding invitation 925 // Should check to see if OpenEnrollment, or if there's an outstanding invitation
958 m_groupData.AddAgentToGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID, UUID.Zero); 926 m_groupData.AddAgentToGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID, UUID.Zero);
959 927
960 remoteClient.SendJoinGroupReply(groupID, true); 928 remoteClient.SendJoinGroupReply(groupID, true);
961 929
962 // Should this send updates to everyone in the group? 930 // Should this send updates to everyone in the group?
963 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 931 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
964 } 932 }
965 933
966 public void LeaveGroupRequest(IClientAPI remoteClient, UUID groupID) 934 public void LeaveGroupRequest(IClientAPI remoteClient, UUID groupID)
967 { 935 {
968 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 936 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
969 937
970 m_groupData.RemoveAgentFromGroup(GetClientGroupRequestID(remoteClient), remoteClient.AgentId, groupID); 938 m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), GetRequestingAgentID(remoteClient), groupID);
971 939
972 remoteClient.SendLeaveGroupReply(groupID, true); 940 remoteClient.SendLeaveGroupReply(groupID, true);
973 941
@@ -975,21 +943,20 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
975 943
976 // SL sends out notifcations to the group messaging session that the person has left 944 // 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? 945 // Should this also update everyone who is in the group?
978 SendAgentGroupDataUpdate(remoteClient, remoteClient.AgentId); 946 SendAgentGroupDataUpdate(remoteClient, GetRequestingAgentID(remoteClient));
979 } 947 }
980 948
981 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID) 949 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID groupID, UUID ejecteeID)
982 { 950 {
983 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 951 if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
984 952
985 GroupRequestID grID = GetClientGroupRequestID(remoteClient);
986 953
987 // Todo: Security check? 954 // Todo: Security check?
988 m_groupData.RemoveAgentFromGroup(grID, ejecteeID, groupID); 955 m_groupData.RemoveAgentFromGroup(GetRequestingAgentID(remoteClient), ejecteeID, groupID);
989 956
990 remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, groupID, true); 957 remoteClient.SendEjectGroupMemberReply(GetRequestingAgentID(remoteClient), groupID, true);
991 958
992 GroupRecord groupInfo = m_groupData.GetGroupRecord(grID, groupID, null); 959 GroupRecord groupInfo = m_groupData.GetGroupRecord(GetRequestingAgentID(remoteClient), groupID, null);
993 UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(ejecteeID); 960 UserProfileData userProfile = m_sceneList[0].CommsManager.UserService.GetUserProfile(ejecteeID);
994 961
995 if ((groupInfo == null) || (userProfile == null)) 962 if ((groupInfo == null) || (userProfile == null))
@@ -1002,7 +969,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1002 GridInstantMessage msg = new GridInstantMessage(); 969 GridInstantMessage msg = new GridInstantMessage();
1003 970
1004 msg.imSessionID = UUID.Zero.Guid; 971 msg.imSessionID = UUID.Zero.Guid;
1005 msg.fromAgentID = remoteClient.AgentId.Guid; 972 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
1006 // msg.fromAgentID = info.GroupID; 973 // msg.fromAgentID = info.GroupID;
1007 msg.toAgentID = ejecteeID.Guid; 974 msg.toAgentID = ejecteeID.Guid;
1008 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 975 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
@@ -1028,8 +995,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1028 995
1029 msg = new GridInstantMessage(); 996 msg = new GridInstantMessage();
1030 msg.imSessionID = UUID.Zero.Guid; 997 msg.imSessionID = UUID.Zero.Guid;
1031 msg.fromAgentID = remoteClient.AgentId.Guid; 998 msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
1032 msg.toAgentID = remoteClient.AgentId.Guid; 999 msg.toAgentID = GetRequestingAgentID(remoteClient).Guid;
1033 msg.timestamp = 0; 1000 msg.timestamp = 0;
1034 msg.fromAgentName = remoteClient.Name; 1001 msg.fromAgentName = remoteClient.Name;
1035 if (userProfile != null) 1002 if (userProfile != null)
@@ -1047,7 +1014,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1047 msg.Position = Vector3.Zero; 1014 msg.Position = Vector3.Zero;
1048 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 1015 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid;
1049 msg.binaryBucket = new byte[0]; 1016 msg.binaryBucket = new byte[0];
1050 OutgoingInstantMessage(msg, remoteClient.AgentId); 1017 OutgoingInstantMessage(msg, GetRequestingAgentID(remoteClient));
1051 1018
1052 1019
1053 // SL sends out messages to everyone in the group 1020 // SL sends out messages to everyone in the group
@@ -1061,13 +1028,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1061 1028
1062 // Todo: Security check, probably also want to send some kind of notification 1029 // Todo: Security check, probably also want to send some kind of notification
1063 UUID InviteID = UUID.Random(); 1030 UUID InviteID = UUID.Random();
1064 GroupRequestID grid = GetClientGroupRequestID(remoteClient);
1065 1031
1066 m_groupData.AddAgentToGroupInvite(grid, InviteID, groupID, roleID, invitedAgentID); 1032 m_groupData.AddAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID, groupID, roleID, invitedAgentID);
1067 1033
1068 // Check to see if the invite went through, if it did not then it's possible 1034 // 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. 1035 // the remoteClient did not validate or did not have permission to invite.
1070 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(grid, InviteID); 1036 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(GetRequestingAgentID(remoteClient), InviteID);
1071 1037
1072 if (inviteInfo != null) 1038 if (inviteInfo != null)
1073 { 1039 {
@@ -1079,7 +1045,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1079 1045
1080 msg.imSessionID = inviteUUID; 1046 msg.imSessionID = inviteUUID;
1081 1047
1082 // msg.fromAgentID = remoteClient.AgentId.Guid; 1048 // msg.fromAgentID = GetRequestingAgentID(remoteClient).Guid;
1083 msg.fromAgentID = groupID.Guid; 1049 msg.fromAgentID = groupID.Guid;
1084 msg.toAgentID = invitedAgentID.Guid; 1050 msg.toAgentID = invitedAgentID.Guid;
1085 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 1051 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
@@ -1132,57 +1098,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1132 return child; 1098 return child;
1133 } 1099 }
1134 1100
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> 1101 /// <summary>
1187 /// Send 'remoteClient' the group membership 'data' for agent 'dataForAgentID'. 1102 /// Send 'remoteClient' the group membership 'data' for agent 'dataForAgentID'.
1188 /// </summary> 1103 /// </summary>
@@ -1231,6 +1146,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1231 llDataStruct.Add("GroupData", GroupData); 1146 llDataStruct.Add("GroupData", GroupData);
1232 llDataStruct.Add("NewGroupData", NewGroupData); 1147 llDataStruct.Add("NewGroupData", NewGroupData);
1233 1148
1149 if (m_debugEnabled)
1150 {
1151 m_log.InfoFormat("[GROUPS]: {0}", OSDParser.SerializeJsonString(llDataStruct));
1152 }
1153
1234 IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>(); 1154 IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
1235 1155
1236 if (queue != null) 1156 if (queue != null)
@@ -1308,7 +1228,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1308 /// <returns></returns> 1228 /// <returns></returns>
1309 private GroupMembershipData[] GetProfileListedGroupMemberships(IClientAPI requestingClient, UUID dataForAgentID) 1229 private GroupMembershipData[] GetProfileListedGroupMemberships(IClientAPI requestingClient, UUID dataForAgentID)
1310 { 1230 {
1311 List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(GetClientGroupRequestID(requestingClient), dataForAgentID); 1231 List<GroupMembershipData> membershipData = m_groupData.GetAgentGroupMemberships(requestingClient.AgentId, dataForAgentID);
1312 GroupMembershipData[] membershipArray; 1232 GroupMembershipData[] membershipArray;
1313 1233
1314 if (requestingClient.AgentId != dataForAgentID) 1234 if (requestingClient.AgentId != dataForAgentID)
@@ -1330,7 +1250,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1330 m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId); 1250 m_log.InfoFormat("[GROUPS]: Get group membership information for {0} requested by {1}", dataForAgentID, requestingClient.AgentId);
1331 foreach (GroupMembershipData membership in membershipArray) 1251 foreach (GroupMembershipData membership in membershipArray)
1332 { 1252 {
1333 m_log.InfoFormat("[GROUPS]: {0} :: {1} - {2}", dataForAgentID, membership.GroupName, membership.GroupTitle); 1253 m_log.InfoFormat("[GROUPS]: {0} :: {1} - {2} - {3}", dataForAgentID, membership.GroupName, membership.GroupTitle, membership.GroupPowers);
1334 } 1254 }
1335 } 1255 }
1336 1256
@@ -1389,6 +1309,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
1389 } 1309 }
1390 1310
1391 #endregion 1311 #endregion
1312
1313 private UUID GetRequestingAgentID(IClientAPI client)
1314 {
1315 UUID requestingAgentID = UUID.Zero;
1316 if (client != null)
1317 {
1318 requestingAgentID = client.AgentId;
1319 }
1320 return requestingAgentID;
1321 }
1392 } 1322 }
1393 1323
1324 public class GroupNoticeInfo
1325 {
1326 public GroupNoticeData noticeData = new GroupNoticeData();
1327 public UUID GroupID = UUID.Zero;
1328 public string Message = string.Empty;
1329 public byte[] BinaryBucket = new byte[0];
1330 }
1394} 1331}
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/SimianGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs
new file mode 100644
index 0000000..669373f
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/SimianGroupsServicesConnectorModule.cs
@@ -0,0 +1,1329 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Collections.Specialized;
32using System.Reflection;
33
34using Nwc.XmlRpc;
35
36using log4net;
37using Mono.Addins;
38using Nini.Config;
39
40using OpenMetaverse;
41using OpenMetaverse.StructuredData;
42
43using OpenSim.Framework;
44using OpenSim.Framework.Communications;
45using OpenSim.Region.Framework.Interfaces;
46using OpenSim.Services.Interfaces;
47
48/***************************************************************************
49 * Simian Data Map
50 * ===============
51 *
52 * OwnerID -> Type -> Key
53 * -----------------------
54 *
55 * UserID -> Group -> ActiveGroup
56 * + GroupID
57 *
58 * UserID -> GroupSessionDropped -> GroupID
59 * UserID -> GroupSessionInvited -> GroupID
60 *
61 * UserID -> GroupMember -> GroupID
62 * + SelectedRoleID [UUID]
63 * + AcceptNotices [bool]
64 * + ListInProfile [bool]
65 * + Contribution [int]
66 *
67 * UserID -> GroupRole[GroupID] -> RoleID
68 *
69 *
70 * GroupID -> Group -> GroupName
71 * + Charter
72 * + ShowInList
73 * + InsigniaID
74 * + MembershipFee
75 * + OpenEnrollment
76 * + AllowPublish
77 * + MaturePublish
78 * + FounderID
79 * + EveryonePowers
80 * + OwnerRoleID
81 * + OwnersPowers
82 *
83 * GroupID -> GroupRole -> RoleID
84 * + Name
85 * + Description
86 * + Title
87 * + Powers
88 *
89 * GroupID -> GroupMemberInvite -> InviteID
90 * + AgentID
91 * + RoleID
92 *
93 * GroupID -> GroupNotice -> NoticeID
94 * + TimeStamp [uint]
95 * + FromName [string]
96 * + Subject [string]
97 * + Message [string]
98 * + BinaryBucket [byte[]]
99 *
100 * */
101
102namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
103{
104 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
105 public class SimianGroupsServicesConnectorModule : ISharedRegionModule, IGroupsServicesConnector
106 {
107 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
108
109 public const GroupPowers m_DefaultEveryonePowers = GroupPowers.AllowSetHome |
110 GroupPowers.Accountable |
111 GroupPowers.JoinChat |
112 GroupPowers.AllowVoiceChat |
113 GroupPowers.ReceiveNotices |
114 GroupPowers.StartProposal |
115 GroupPowers.VoteOnProposal;
116
117 // Would this be cleaner as (GroupPowers)ulong.MaxValue;
118 public const GroupPowers m_DefaultOwnerPowers = GroupPowers.Accountable
119 | GroupPowers.AllowEditLand
120 | GroupPowers.AllowFly
121 | GroupPowers.AllowLandmark
122 | GroupPowers.AllowRez
123 | GroupPowers.AllowSetHome
124 | GroupPowers.AllowVoiceChat
125 | GroupPowers.AssignMember
126 | GroupPowers.AssignMemberLimited
127 | GroupPowers.ChangeActions
128 | GroupPowers.ChangeIdentity
129 | GroupPowers.ChangeMedia
130 | GroupPowers.ChangeOptions
131 | GroupPowers.CreateRole
132 | GroupPowers.DeedObject
133 | GroupPowers.DeleteRole
134 | GroupPowers.Eject
135 | GroupPowers.FindPlaces
136 | GroupPowers.Invite
137 | GroupPowers.JoinChat
138 | GroupPowers.LandChangeIdentity
139 | GroupPowers.LandDeed
140 | GroupPowers.LandDivideJoin
141 | GroupPowers.LandEdit
142 | GroupPowers.LandEjectAndFreeze
143 | GroupPowers.LandGardening
144 | GroupPowers.LandManageAllowed
145 | GroupPowers.LandManageBanned
146 | GroupPowers.LandManagePasses
147 | GroupPowers.LandOptions
148 | GroupPowers.LandRelease
149 | GroupPowers.LandSetSale
150 | GroupPowers.ModerateChat
151 | GroupPowers.ObjectManipulate
152 | GroupPowers.ObjectSetForSale
153 | GroupPowers.ReceiveNotices
154 | GroupPowers.RemoveMember
155 | GroupPowers.ReturnGroupOwned
156 | GroupPowers.ReturnGroupSet
157 | GroupPowers.ReturnNonGroup
158 | GroupPowers.RoleProperties
159 | GroupPowers.SendNotices
160 | GroupPowers.SetLandingPoint
161 | GroupPowers.StartProposal
162 | GroupPowers.VoteOnProposal;
163
164 private bool m_connectorEnabled = false;
165
166 private string m_groupsServerURI = string.Empty;
167
168 private bool m_debugEnabled = false;
169
170 // private IUserAccountService m_accountService = null;
171
172
173 #region IRegionModuleBase Members
174
175 public string Name
176 {
177 get { return "SimianGroupsServicesConnector"; }
178 }
179
180 // this module is not intended to be replaced, but there should only be 1 of them.
181 public Type ReplaceableInterface
182 {
183 get { return null; }
184 }
185
186 public void Initialise(IConfigSource config)
187 {
188 IConfig groupsConfig = config.Configs["Groups"];
189
190 if (groupsConfig == null)
191 {
192 // Do not run this module by default.
193 return;
194 }
195 else
196 {
197 // if groups aren't enabled, we're not needed.
198 // if we're not specified as the connector to use, then we're not wanted
199 if ((groupsConfig.GetBoolean("Enabled", false) == false)
200 || (groupsConfig.GetString("ServicesConnectorModule", "Default") != Name))
201 {
202 m_connectorEnabled = false;
203 return;
204 }
205
206 m_log.InfoFormat("[GROUPS-CONNECTOR]: Initializing {0}", this.Name);
207
208 m_groupsServerURI = groupsConfig.GetString("GroupsServerURI", string.Empty);
209 if ((m_groupsServerURI == null) ||
210 (m_groupsServerURI == string.Empty))
211 {
212 m_log.ErrorFormat("Please specify a valid Simian Server for GroupsServerURI in OpenSim.ini, [Groups]");
213 m_connectorEnabled = false;
214 return;
215 }
216
217 // If we got all the config options we need, lets start'er'up
218 m_connectorEnabled = true;
219
220 m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true);
221
222 }
223 }
224
225 public void Close()
226 {
227 m_log.InfoFormat("[GROUPS-CONNECTOR]: Closing {0}", this.Name);
228 }
229
230 public void AddRegion(OpenSim.Region.Framework.Scenes.Scene scene)
231 {
232 if (m_connectorEnabled)
233 {
234 scene.RegisterModuleInterface<IGroupsServicesConnector>(this);
235 }
236 }
237
238 public void RemoveRegion(OpenSim.Region.Framework.Scenes.Scene scene)
239 {
240 if (scene.RequestModuleInterface<IGroupsServicesConnector>() == this)
241 {
242 scene.UnregisterModuleInterface<IGroupsServicesConnector>(this);
243 }
244 }
245
246 public void RegionLoaded(OpenSim.Region.Framework.Scenes.Scene scene)
247 {
248 // TODO: May want to consider listenning for Agent Connections so we can pre-cache group info
249 // scene.EventManager.OnNewClient += OnNewClient;
250 }
251
252 #endregion
253
254 #region ISharedRegionModule Members
255
256 public void PostInitialise()
257 {
258 // NoOp
259 }
260
261 #endregion
262
263
264
265
266 #region IGroupsServicesConnector Members
267
268 /// <summary>
269 /// 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.
270 /// </summary>
271 public UUID CreateGroup(UUID requestingAgentID, string name, string charter, bool showInList, UUID insigniaID,
272 int membershipFee, bool openEnrollment, bool allowPublish,
273 bool maturePublish, UUID founderID)
274 {
275 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
276
277 UUID GroupID = UUID.Random();
278 UUID OwnerRoleID = UUID.Random();
279
280 OSDMap GroupInfoMap = new OSDMap();
281 GroupInfoMap["Charter"] = OSD.FromString(charter);
282 GroupInfoMap["ShowInList"] = OSD.FromBoolean(showInList);
283 GroupInfoMap["InsigniaID"] = OSD.FromUUID(insigniaID);
284 GroupInfoMap["MembershipFee"] = OSD.FromInteger(0);
285 GroupInfoMap["OpenEnrollment"] = OSD.FromBoolean(openEnrollment);
286 GroupInfoMap["AllowPublish"] = OSD.FromBoolean(allowPublish);
287 GroupInfoMap["MaturePublish"] = OSD.FromBoolean(maturePublish);
288 GroupInfoMap["FounderID"] = OSD.FromUUID(founderID);
289 GroupInfoMap["EveryonePowers"] = OSD.FromULong((ulong)m_DefaultEveryonePowers);
290 GroupInfoMap["OwnerRoleID"] = OSD.FromUUID(OwnerRoleID);
291 GroupInfoMap["OwnersPowers"] = OSD.FromULong((ulong)m_DefaultOwnerPowers);
292
293 if(SimianAddGeneric(GroupID, "Group", name, GroupInfoMap))
294 {
295 AddGroupRole(requestingAgentID, GroupID, UUID.Zero, "Everyone", "Members of " + name, "Member of " + name, (ulong)m_DefaultEveryonePowers);
296 AddGroupRole(requestingAgentID, GroupID, OwnerRoleID, "Owners", "Owners of " + name, "Owner of " + name, (ulong)m_DefaultOwnerPowers);
297
298 AddAgentToGroup(requestingAgentID, requestingAgentID, GroupID, OwnerRoleID);
299
300 return GroupID;
301 }
302 else
303 {
304 return UUID.Zero;
305 }
306 }
307
308
309 public void UpdateGroup(UUID requestingAgentID, UUID groupID, string charter, bool showInList,
310 UUID insigniaID, int membershipFee, bool openEnrollment,
311 bool allowPublish, bool maturePublish)
312 {
313 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
314 // TODO: Check to make sure requestingAgentID has permission to update group
315
316 string GroupName;
317 OSDMap GroupInfoMap;
318 if( SimianGetFirstGenericEntry(groupID, "GroupInfo", out GroupName, out GroupInfoMap) )
319 {
320 GroupInfoMap["Charter"] = OSD.FromString(charter);
321 GroupInfoMap["ShowInList"] = OSD.FromBoolean(showInList);
322 GroupInfoMap["InsigniaID"] = OSD.FromUUID(insigniaID);
323 GroupInfoMap["MembershipFee"] = OSD.FromInteger(0);
324 GroupInfoMap["OpenEnrollment"] = OSD.FromBoolean(openEnrollment);
325 GroupInfoMap["AllowPublish"] = OSD.FromBoolean(allowPublish);
326 GroupInfoMap["MaturePublish"] = OSD.FromBoolean(maturePublish);
327
328 SimianAddGeneric(groupID, "Group", GroupName, GroupInfoMap);
329 }
330
331 }
332
333
334 public void AddGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID, string name, string description,
335 string title, ulong powers)
336 {
337 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
338
339 OSDMap GroupRoleInfo = new OSDMap();
340 GroupRoleInfo["Name"] = OSD.FromString(name);
341 GroupRoleInfo["Description"] = OSD.FromString(description);
342 GroupRoleInfo["Title"] = OSD.FromString(title);
343 GroupRoleInfo["Powers"] = OSD.FromULong((ulong)powers);
344
345 // TODO: Add security, make sure that requestingAgentID has permision to add roles
346 SimianAddGeneric(groupID, "GroupRole", roleID.ToString(), GroupRoleInfo);
347 }
348
349 public void RemoveGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID)
350 {
351 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
352
353 // TODO: Add security
354
355 // Can't delete the Everyone Role
356 if (roleID != UUID.Zero)
357 {
358 // Remove all GroupRole Members from Role
359 Dictionary<UUID, OSDMap> GroupRoleMembers;
360 string GroupRoleMemberType = "GroupRole" + groupID.ToString();
361 if (SimianGetGenericEntries(GroupRoleMemberType, roleID.ToString(), out GroupRoleMembers))
362 {
363 foreach(UUID UserID in GroupRoleMembers.Keys)
364 {
365 EnsureRoleNotSelectedByMember(groupID, roleID, UserID);
366
367 SimianRemoveGenericEntry(UserID, GroupRoleMemberType, roleID.ToString());
368 }
369 }
370
371 // Remove role
372 SimianRemoveGenericEntry(groupID, "GroupRole", roleID.ToString());
373 }
374 }
375
376
377 public void UpdateGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID, string name, string description,
378 string title, ulong powers)
379 {
380 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
381
382 // TODO: Security, check that requestingAgentID is allowed to update group roles
383
384 OSDMap GroupRoleInfo;
385 if (SimianGetGenericEntry(groupID, "GroupRole", roleID.ToString(), out GroupRoleInfo))
386 {
387 if (name != null)
388 {
389 GroupRoleInfo["Name"] = OSD.FromString(name);
390 }
391 if (description != null)
392 {
393 GroupRoleInfo["Description"] = OSD.FromString(description);
394 }
395 if (title != null)
396 {
397 GroupRoleInfo["Title"] = OSD.FromString(title);
398 }
399 GroupRoleInfo["Powers"] = OSD.FromULong((ulong)powers);
400
401 }
402
403
404 SimianAddGeneric(groupID, "GroupRole", roleID.ToString(), GroupRoleInfo);
405 }
406
407 public GroupRecord GetGroupRecord(UUID requestingAgentID, UUID groupID, string groupName)
408 {
409 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
410
411 OSDMap GroupInfoMap = null;
412 if (groupID != UUID.Zero)
413 {
414 if (!SimianGetFirstGenericEntry(groupID, "Group", out groupName, out GroupInfoMap))
415 {
416 return null;
417 }
418 }
419 else if ((groupName != null) && (groupName != string.Empty))
420 {
421 if (!SimianGetFirstGenericEntry("Group", groupName, out groupID, out GroupInfoMap))
422 {
423 return null;
424 }
425 }
426
427 GroupRecord GroupInfo = new GroupRecord();
428
429 GroupInfo.GroupID = groupID;
430 GroupInfo.GroupName = groupName;
431 GroupInfo.Charter = GroupInfoMap["Charter"].AsString();
432 GroupInfo.ShowInList = GroupInfoMap["ShowInList"].AsBoolean();
433 GroupInfo.GroupPicture = GroupInfoMap["InsigniaID"].AsUUID();
434 GroupInfo.MembershipFee = GroupInfoMap["MembershipFee"].AsInteger();
435 GroupInfo.OpenEnrollment = GroupInfoMap["OpenEnrollment"].AsBoolean();
436 GroupInfo.AllowPublish = GroupInfoMap["AllowPublish"].AsBoolean();
437 GroupInfo.MaturePublish = GroupInfoMap["MaturePublish"].AsBoolean();
438 GroupInfo.FounderID = GroupInfoMap["FounderID"].AsUUID();
439 GroupInfo.OwnerRoleID = GroupInfoMap["OwnerRoleID"].AsUUID();
440
441 return GroupInfo;
442
443 }
444
445 public GroupProfileData GetMemberGroupProfile(UUID requestingAgentID, UUID groupID, UUID memberID)
446 {
447 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
448
449 OSDMap groupProfile;
450 string groupName;
451 if (!SimianGetFirstGenericEntry(groupID, "Group", out groupName, out groupProfile))
452 {
453 // GroupProfileData is not nullable
454 return new GroupProfileData();
455 }
456
457 GroupProfileData MemberGroupProfile = new GroupProfileData();
458 MemberGroupProfile.GroupID = groupID;
459 MemberGroupProfile.Name = groupName;
460
461 if (groupProfile["Charter"] != null)
462 {
463 MemberGroupProfile.Charter = groupProfile["Charter"].AsString();
464 }
465
466 MemberGroupProfile.ShowInList = groupProfile["ShowInList"].AsString() == "1";
467 MemberGroupProfile.InsigniaID = groupProfile["InsigniaID"].AsUUID();
468 MemberGroupProfile.MembershipFee = groupProfile["MembershipFee"].AsInteger();
469 MemberGroupProfile.OpenEnrollment = groupProfile["OpenEnrollment"].AsBoolean();
470 MemberGroupProfile.AllowPublish = groupProfile["AllowPublish"].AsBoolean();
471 MemberGroupProfile.MaturePublish = groupProfile["MaturePublish"].AsBoolean();
472 MemberGroupProfile.FounderID = groupProfile["FounderID"].AsUUID();;
473 MemberGroupProfile.OwnerRole = groupProfile["OwnerRoleID"].AsUUID();
474
475 Dictionary<UUID, OSDMap> Members;
476 if (SimianGetGenericEntries("GroupMember",groupID.ToString(), out Members))
477 {
478 MemberGroupProfile.GroupMembershipCount = Members.Count;
479 }
480
481 Dictionary<string, OSDMap> Roles;
482 if (SimianGetGenericEntries(groupID, "GroupRole", out Roles))
483 {
484 MemberGroupProfile.GroupRolesCount = Roles.Count;
485 }
486
487 // TODO: Get Group Money balance from somewhere
488 // group.Money = 0;
489
490 GroupMembershipData MemberInfo = GetAgentGroupMembership(requestingAgentID, memberID, groupID);
491
492 MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle;
493 MemberGroupProfile.PowersMask = MemberInfo.GroupPowers;
494
495 return MemberGroupProfile;
496 }
497
498 public void SetAgentActiveGroup(UUID requestingAgentID, UUID agentID, UUID groupID)
499 {
500 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
501
502 OSDMap ActiveGroup = new OSDMap();
503 ActiveGroup.Add("GroupID", OSD.FromUUID(groupID));
504 SimianAddGeneric(agentID, "Group", "ActiveGroup", ActiveGroup);
505 }
506
507 public void SetAgentActiveGroupRole(UUID requestingAgentID, UUID agentID, UUID groupID, UUID roleID)
508 {
509 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
510
511 OSDMap GroupMemberInfo;
512 if (!SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out GroupMemberInfo))
513 {
514 GroupMemberInfo = new OSDMap();
515 }
516
517 GroupMemberInfo["SelectedRoleID"] = OSD.FromUUID(roleID);
518 SimianAddGeneric(agentID, "GroupMember", groupID.ToString(), GroupMemberInfo);
519 }
520
521 public void SetAgentGroupInfo(UUID requestingAgentID, UUID agentID, UUID groupID, bool acceptNotices, bool listInProfile)
522 {
523 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
524
525 OSDMap GroupMemberInfo;
526 if (!SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out GroupMemberInfo))
527 {
528 GroupMemberInfo = new OSDMap();
529 }
530
531 GroupMemberInfo["AcceptNotices"] = OSD.FromBoolean(acceptNotices);
532 GroupMemberInfo["ListInProfile"] = OSD.FromBoolean(listInProfile);
533 GroupMemberInfo["Contribution"] = OSD.FromInteger(0);
534 GroupMemberInfo["SelectedRole"] = OSD.FromUUID(UUID.Zero);
535 SimianAddGeneric(agentID, "GroupMember", groupID.ToString(), GroupMemberInfo);
536 }
537
538 public void AddAgentToGroupInvite(UUID requestingAgentID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID)
539 {
540 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
541
542 OSDMap Invite = new OSDMap();
543 Invite["AgentID"] = OSD.FromUUID(agentID);
544 Invite["RoleID"] = OSD.FromUUID(roleID);
545
546 SimianAddGeneric(groupID, "GroupMemberInvite", inviteID.ToString(), Invite);
547 }
548
549 public GroupInviteInfo GetAgentToGroupInvite(UUID requestingAgentID, UUID inviteID)
550 {
551 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
552
553 OSDMap GroupMemberInvite;
554 UUID GroupID;
555 if (!SimianGetFirstGenericEntry("GroupMemberInvite", inviteID.ToString(), out GroupID, out GroupMemberInvite))
556 {
557 return null;
558 }
559
560 GroupInviteInfo inviteInfo = new GroupInviteInfo();
561 inviteInfo.InviteID = inviteID;
562 inviteInfo.GroupID = GroupID;
563 inviteInfo.AgentID = GroupMemberInvite["AgentID"].AsUUID();
564 inviteInfo.RoleID = GroupMemberInvite["RoleID"].AsUUID();
565
566 return inviteInfo;
567 }
568
569 public void RemoveAgentToGroupInvite(UUID requestingAgentID, UUID inviteID)
570 {
571 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
572
573 GroupInviteInfo invite = GetAgentToGroupInvite(requestingAgentID, inviteID);
574 SimianRemoveGenericEntry(invite.GroupID, "GroupMemberInvite", inviteID.ToString());
575 }
576
577 public void AddAgentToGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
578 {
579 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
580
581 // Setup Agent/Group information
582 SetAgentGroupInfo(requestingAgentID, AgentID, GroupID, true, true);
583
584 // Add agent to Everyone Group
585 AddAgentToGroupRole(requestingAgentID, AgentID, GroupID, UUID.Zero);
586
587 // Add agent to Specified Role
588 AddAgentToGroupRole(requestingAgentID, AgentID, GroupID, RoleID);
589
590 // Set selected role in this group to specified role
591 SetAgentActiveGroupRole(requestingAgentID, AgentID, GroupID, RoleID);
592 }
593
594 public void RemoveAgentFromGroup(UUID requestingAgentID, UUID agentID, UUID groupID)
595 {
596 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
597
598 // If current active group is the group the agent is being removed from, change their group to UUID.Zero
599 GroupMembershipData memberActiveMembership = GetAgentActiveMembership(requestingAgentID, agentID);
600 if (memberActiveMembership.GroupID == groupID)
601 {
602 SetAgentActiveGroup(agentID, agentID, UUID.Zero);
603 }
604
605 // Remove Group Member information for this group
606 SimianRemoveGenericEntry(agentID, "GroupMember", groupID.ToString());
607
608 // By using a Simian Generics Type consisting of a prefix and a groupID,
609 // combined with RoleID as key allows us to get a list of roles a particular member
610 // of a group is assigned to.
611 string GroupRoleMemberType = "GroupRole" + groupID.ToString();
612
613 // Take Agent out of all other group roles
614 Dictionary<string, OSDMap> GroupRoles;
615 if (SimianGetGenericEntries(agentID, GroupRoleMemberType, out GroupRoles))
616 {
617 foreach (string roleID in GroupRoles.Keys)
618 {
619 SimianRemoveGenericEntry(agentID, GroupRoleMemberType, roleID);
620 }
621 }
622 }
623
624 public void AddAgentToGroupRole(UUID requestingAgentID, UUID agentID, UUID groupID, UUID roleID)
625 {
626 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
627
628 SimianAddGeneric(agentID, "GroupRole" + groupID.ToString(), roleID.ToString(), new OSDMap());
629 }
630
631 public void RemoveAgentFromGroupRole(UUID requestingAgentID, UUID agentID, UUID groupID, UUID roleID)
632 {
633 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
634
635 // Cannot remove members from the Everyone Role
636 if (roleID != UUID.Zero)
637 {
638 EnsureRoleNotSelectedByMember(groupID, roleID, agentID);
639
640 string GroupRoleMemberType = "GroupRole" + groupID.ToString();
641 SimianRemoveGenericEntry(agentID, GroupRoleMemberType, roleID.ToString());
642 }
643 }
644
645 public List<DirGroupsReplyData> FindGroups(UUID requestingAgentID, string search)
646 {
647 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
648
649 List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>();
650
651 NameValueCollection requestArgs = new NameValueCollection
652 {
653 { "RequestMethod", "GetGenerics" },
654 { "Type", "Group" },
655 { "Key", search },
656 { "Fuzzy", "1" }
657 };
658
659
660 OSDMap response = WebUtil.PostToService(m_groupsServerURI, requestArgs);
661 if (response["Success"].AsBoolean() && response["Entries"] is OSDArray)
662 {
663 OSDArray entryArray = (OSDArray)response["Entries"];
664 foreach (OSDMap entryMap in entryArray)
665 {
666 DirGroupsReplyData data = new DirGroupsReplyData();
667 data.groupID = entryMap["OwnerID"].AsUUID();
668 data.groupName = entryMap["Key"].AsString();
669
670 // TODO: is there a better way to do this?
671 Dictionary<UUID, OSDMap> Members;
672 if (SimianGetGenericEntries("GroupMember", data.groupID.ToString(), out Members))
673 {
674 data.members = Members.Count;
675 }
676 else
677 {
678 data.members = 0;
679 }
680
681 // TODO: sort results?
682 // data.searchOrder = order;
683
684 findings.Add(data);
685 }
686 }
687
688
689 return findings;
690 }
691
692 public GroupMembershipData GetAgentGroupMembership(UUID requestingAgentID, UUID agentID, UUID groupID)
693 {
694 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
695
696 GroupMembershipData data = new GroupMembershipData();
697
698 ///////////////////////////////
699 // Agent Specific Information:
700 //
701 OSDMap UserActiveGroup;
702 if (SimianGetGenericEntry(agentID, "Group", "ActiveGroup", out UserActiveGroup))
703 {
704 data.Active = UserActiveGroup["GroupID"].AsUUID().Equals(groupID);
705 }
706
707 OSDMap UserGroupMemberInfo;
708 if( SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out UserGroupMemberInfo) )
709 {
710 data.AcceptNotices = UserGroupMemberInfo["AcceptNotices"].AsBoolean();
711 data.Contribution = UserGroupMemberInfo["Contribution"].AsInteger();
712 data.ListInProfile = UserGroupMemberInfo["ListInProfile"].AsBoolean();
713 data.ActiveRole = UserGroupMemberInfo["SelectedRoleID"].AsUUID();
714
715 ///////////////////////////////
716 // Role Specific Information:
717 //
718
719 OSDMap GroupRoleInfo;
720 if( SimianGetGenericEntry(groupID, "GroupRole", data.ActiveRole.ToString(), out GroupRoleInfo) )
721 {
722 data.GroupTitle = GroupRoleInfo["Title"].AsString();
723 data.GroupPowers = GroupRoleInfo["Powers"].AsULong();
724 }
725 }
726
727 ///////////////////////////////
728 // Group Specific Information:
729 //
730 OSDMap GroupInfo;
731 string GroupName;
732 if( SimianGetFirstGenericEntry(groupID, "Group", out GroupName, out GroupInfo) )
733 {
734 data.GroupID = groupID;
735 data.AllowPublish = GroupInfo["AllowPublish"].AsBoolean();
736 data.Charter = GroupInfo["Charter"].AsString();
737 data.FounderID = GroupInfo["FounderID"].AsUUID();
738 data.GroupName = GroupName;
739 data.GroupPicture = GroupInfo["InsigniaID"].AsUUID();
740 data.MaturePublish = GroupInfo["MaturePublish"].AsBoolean();
741 data.MembershipFee = GroupInfo["MembershipFee"].AsInteger();
742 data.OpenEnrollment = GroupInfo["OpenEnrollment"].AsBoolean();
743 data.ShowInList = GroupInfo["ShowInList"].AsBoolean();
744 }
745
746 return data;
747 }
748
749 public GroupMembershipData GetAgentActiveMembership(UUID requestingAgentID, UUID agentID)
750 {
751 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
752
753 UUID GroupID = UUID.Zero;
754 OSDMap UserActiveGroup;
755 if (SimianGetGenericEntry(agentID, "Group", "ActiveGroup", out UserActiveGroup))
756 {
757 GroupID = UserActiveGroup["GroupID"].AsUUID();
758 }
759
760 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] Active GroupID : {0}", GroupID.ToString());
761 return GetAgentGroupMembership(requestingAgentID, agentID, GroupID);
762 }
763
764 public List<GroupMembershipData> GetAgentGroupMemberships(UUID requestingAgentID, UUID agentID)
765 {
766 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
767
768 List<GroupMembershipData> memberships = new List<GroupMembershipData>();
769
770 Dictionary<string,OSDMap> GroupMemberShips;
771 if (SimianGetGenericEntries(agentID, "GroupMember", out GroupMemberShips))
772 {
773 foreach (string key in GroupMemberShips.Keys)
774 {
775 memberships.Add(GetAgentGroupMembership(requestingAgentID, agentID, UUID.Parse(key)));
776 }
777 }
778
779 return memberships;
780 }
781
782 public List<GroupRolesData> GetAgentGroupRoles(UUID requestingAgentID, UUID agentID, UUID groupID)
783 {
784 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
785
786 List<GroupRolesData> Roles = new List<GroupRolesData>();
787
788 Dictionary<string, OSDMap> GroupRoles;
789 if (SimianGetGenericEntries(groupID, "GroupRole", out GroupRoles))
790 {
791 Dictionary<string, OSDMap> MemberRoles;
792 if (SimianGetGenericEntries(agentID, "GroupRole" + groupID.ToString(), out MemberRoles))
793 {
794 foreach (KeyValuePair<string, OSDMap> kvp in MemberRoles)
795 {
796 GroupRolesData data = new GroupRolesData();
797 data.RoleID = UUID.Parse(kvp.Key);
798 data.Name = GroupRoles[kvp.Key]["Name"].AsString();
799 data.Description = GroupRoles[kvp.Key]["Description"].AsString();
800 data.Title = GroupRoles[kvp.Key]["Title"].AsString();
801 data.Powers = GroupRoles[kvp.Key]["Powers"].AsULong();
802
803 Roles.Add(data);
804 }
805 }
806 }
807 return Roles;
808 }
809
810 public List<GroupRolesData> GetGroupRoles(UUID requestingAgentID, UUID groupID)
811 {
812 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
813
814 List<GroupRolesData> Roles = new List<GroupRolesData>();
815
816 Dictionary<string, OSDMap> GroupRoles;
817 if (SimianGetGenericEntries(groupID, "GroupRole", out GroupRoles))
818 {
819 foreach (KeyValuePair<string, OSDMap> role in GroupRoles)
820 {
821 GroupRolesData data = new GroupRolesData();
822
823 data.RoleID = UUID.Parse(role.Key);
824
825 data.Name = role.Value["Name"].AsString();
826 data.Description = role.Value["Description"].AsString();
827 data.Title = role.Value["Title"].AsString();
828 data.Powers = role.Value["Powers"].AsULong();
829
830 Dictionary<UUID, OSDMap> GroupRoleMembers;
831 if (SimianGetGenericEntries("GroupRole" + groupID.ToString(), role.Key, out GroupRoleMembers))
832 {
833 data.Members = GroupRoleMembers.Count;
834 }
835 else
836 {
837 data.Members = 0;
838 }
839
840 Roles.Add(data);
841 }
842 }
843
844 return Roles;
845
846 }
847
848
849
850 public List<GroupMembersData> GetGroupMembers(UUID requestingAgentID, UUID GroupID)
851 {
852 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
853
854 List<GroupMembersData> members = new List<GroupMembersData>();
855
856 OSDMap GroupInfo;
857 string GroupName;
858 UUID GroupOwnerRoleID = UUID.Zero;
859 if (!SimianGetFirstGenericEntry(GroupID, "Group", out GroupName, out GroupInfo))
860 {
861 return members;
862 }
863 GroupOwnerRoleID = GroupInfo["OwnerRoleID"].AsUUID();
864
865 // Locally cache group roles, since we'll be needing this data for each member
866 Dictionary<string,OSDMap> GroupRoles;
867 SimianGetGenericEntries(GroupID, "GroupRole", out GroupRoles);
868
869 // Locally cache list of group owners
870 Dictionary<UUID, OSDMap> GroupOwners;
871 SimianGetGenericEntries("GroupRole" + GroupID.ToString(), GroupOwnerRoleID.ToString(), out GroupOwners);
872
873
874 Dictionary<UUID, OSDMap> GroupMembers;
875 if (SimianGetGenericEntries("GroupMember", GroupID.ToString(), out GroupMembers))
876 {
877 foreach (KeyValuePair<UUID, OSDMap> member in GroupMembers)
878 {
879 GroupMembersData data = new GroupMembersData();
880
881 data.AgentID = member.Key;
882
883 UUID SelectedRoleID = member.Value["SelectedRoleID"].AsUUID();
884
885 data.AcceptNotices = member.Value["AcceptNotices"].AsBoolean();
886 data.ListInProfile = member.Value["ListInProfile"].AsBoolean();
887 data.Contribution = member.Value["Contribution"].AsInteger();
888
889 data.IsOwner = GroupOwners.ContainsKey(member.Key);
890
891 OSDMap GroupRoleInfo = GroupRoles[SelectedRoleID.ToString()];
892 data.Title = GroupRoleInfo["Title"].AsString();
893 data.AgentPowers = GroupRoleInfo["Powers"].AsULong();
894
895 members.Add(data);
896 }
897 }
898
899 return members;
900
901 }
902
903 public List<GroupRoleMembersData> GetGroupRoleMembers(UUID requestingAgentID, UUID groupID)
904 {
905 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
906
907 List<GroupRoleMembersData> members = new List<GroupRoleMembersData>();
908
909 Dictionary<string, OSDMap> GroupRoles;
910 if (SimianGetGenericEntries(groupID, "GroupRole", out GroupRoles))
911 {
912 foreach( KeyValuePair<string, OSDMap> Role in GroupRoles )
913 {
914 Dictionary<UUID, OSDMap> GroupRoleMembers;
915 if( SimianGetGenericEntries("GroupRole"+groupID.ToString(), Role.Key, out GroupRoleMembers) )
916 {
917 foreach( KeyValuePair<UUID, OSDMap> GroupRoleMember in GroupRoleMembers )
918 {
919 GroupRoleMembersData data = new GroupRoleMembersData();
920
921 data.MemberID = GroupRoleMember.Key;
922 data.RoleID = UUID.Parse(Role.Key);
923
924 members.Add(data);
925 }
926 }
927 }
928 }
929
930 return members;
931 }
932
933 public List<GroupNoticeData> GetGroupNotices(UUID requestingAgentID, UUID GroupID)
934 {
935 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
936
937 List<GroupNoticeData> values = new List<GroupNoticeData>();
938
939 Dictionary<string, OSDMap> Notices;
940 if (SimianGetGenericEntries(GroupID, "GroupNotice", out Notices))
941 {
942 foreach (KeyValuePair<string, OSDMap> Notice in Notices)
943 {
944 GroupNoticeData data = new GroupNoticeData();
945 data.NoticeID = UUID.Parse(Notice.Key);
946 data.Timestamp = Notice.Value["TimeStamp"].AsUInteger();
947 data.FromName = Notice.Value["FromName"].AsString();
948 data.Subject = Notice.Value["Subject"].AsString();
949 data.HasAttachment = Notice.Value["BinaryBucket"].AsBinary().Length > 0;
950
951 //TODO: Figure out how to get this
952 data.AssetType = 0;
953
954 values.Add(data);
955 }
956 }
957
958 return values;
959
960 }
961 public GroupNoticeInfo GetGroupNotice(UUID requestingAgentID, UUID noticeID)
962 {
963 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
964
965 OSDMap GroupNotice;
966 UUID GroupID;
967 if (SimianGetFirstGenericEntry("GroupNotice", noticeID.ToString(), out GroupID, out GroupNotice))
968 {
969 GroupNoticeInfo data = new GroupNoticeInfo();
970 data.GroupID = GroupID;
971 data.Message = GroupNotice["Message"].AsString();
972 data.BinaryBucket = GroupNotice["BinaryBucket"].AsBinary();
973 data.noticeData.NoticeID = noticeID;
974 data.noticeData.Timestamp = GroupNotice["TimeStamp"].AsUInteger();
975 data.noticeData.FromName = GroupNotice["FromName"].AsString();
976 data.noticeData.Subject = GroupNotice["Subject"].AsString();
977 data.noticeData.HasAttachment = data.BinaryBucket.Length > 0;
978 data.noticeData.AssetType = 0;
979
980 if (data.Message == null)
981 {
982 data.Message = string.Empty;
983 }
984
985 return data;
986 }
987 return null;
988 }
989 public void AddGroupNotice(UUID requestingAgentID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket)
990 {
991 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
992
993 OSDMap Notice = new OSDMap();
994 Notice["TimeStamp"] = OSD.FromUInteger((uint)Util.UnixTimeSinceEpoch());
995 Notice["FromName"] = OSD.FromString(fromName);
996 Notice["Subject"] = OSD.FromString(subject);
997 Notice["Message"] = OSD.FromString(message);
998 Notice["BinaryBucket"] = OSD.FromBinary(binaryBucket);
999
1000 SimianAddGeneric(groupID, "GroupNotice", noticeID.ToString(), Notice);
1001
1002 }
1003 #endregion
1004
1005 #region GroupSessionTracking
1006
1007 public void ResetAgentGroupChatSessions(UUID agentID)
1008 {
1009 Dictionary<string, OSDMap> agentSessions;
1010
1011 if (SimianGetGenericEntries(agentID, "GroupSessionDropped", out agentSessions))
1012 {
1013 foreach (string GroupID in agentSessions.Keys)
1014 {
1015 SimianRemoveGenericEntry(agentID, "GroupSessionDropped", GroupID);
1016 }
1017 }
1018
1019 if (SimianGetGenericEntries(agentID, "GroupSessionInvited", out agentSessions))
1020 {
1021 foreach (string GroupID in agentSessions.Keys)
1022 {
1023 SimianRemoveGenericEntry(agentID, "GroupSessionInvited", GroupID);
1024 }
1025 }
1026 }
1027
1028 public bool hasAgentDroppedGroupChatSession(UUID agentID, UUID groupID)
1029 {
1030 OSDMap session;
1031 return SimianGetGenericEntry(agentID, "GroupSessionDropped", groupID.ToString(), out session);
1032 }
1033
1034 public void AgentDroppedFromGroupChatSession(UUID agentID, UUID groupID)
1035 {
1036 SimianAddGeneric(agentID, "GroupSessionDropped", groupID.ToString(), new OSDMap());
1037 }
1038
1039 public void AgentInvitedToGroupChatSession(UUID agentID, UUID groupID)
1040 {
1041 SimianAddGeneric(agentID, "GroupSessionInvited", groupID.ToString(), new OSDMap());
1042 }
1043
1044 public bool hasAgentBeenInvitedToGroupChatSession(UUID agentID, UUID groupID)
1045 {
1046 OSDMap session;
1047 return SimianGetGenericEntry(agentID, "GroupSessionDropped", groupID.ToString(), out session);
1048 }
1049
1050 #endregion
1051
1052 private void EnsureRoleNotSelectedByMember(UUID groupID, UUID roleID, UUID userID)
1053 {
1054 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
1055
1056 // If member's SelectedRole is roleID, change their selected role to Everyone
1057 // before removing them from the role
1058 OSDMap UserGroupInfo;
1059 if (SimianGetGenericEntry(userID, "GroupMember", groupID.ToString(), out UserGroupInfo))
1060 {
1061 if (UserGroupInfo["SelectedRoleID"].AsUUID() == roleID)
1062 {
1063 UserGroupInfo["SelectedRoleID"] = OSD.FromUUID(UUID.Zero);
1064 }
1065 SimianAddGeneric(userID, "GroupMember", groupID.ToString(), UserGroupInfo);
1066 }
1067 }
1068
1069
1070 #region Simian Util Methods
1071 private bool SimianAddGeneric(UUID ownerID, string type, string key, OSDMap map)
1072 {
1073 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2},{3})", System.Reflection.MethodBase.GetCurrentMethod().Name, ownerID, type, key);
1074
1075 string value = OSDParser.SerializeJsonString(map);
1076
1077 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] value: {0}", value);
1078
1079 NameValueCollection RequestArgs = new NameValueCollection
1080 {
1081 { "RequestMethod", "AddGeneric" },
1082 { "OwnerID", ownerID.ToString() },
1083 { "Type", type },
1084 { "Key", key },
1085 { "Value", value}
1086 };
1087
1088
1089 OSDMap Response = WebUtil.PostToService(m_groupsServerURI, RequestArgs);
1090 if (Response["Success"].AsBoolean())
1091 {
1092 return true;
1093 }
1094 else
1095 {
1096 m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: Error {0}, {1}, {2}, {3}", ownerID, type, key, Response["Message"]);
1097 return false;
1098 }
1099 }
1100
1101 /// <summary>
1102 /// Returns the first of possibly many entries for Owner/Type pair
1103 /// </summary>
1104 private bool SimianGetFirstGenericEntry(UUID ownerID, string type, out string key, out OSDMap map)
1105 {
1106 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2})", System.Reflection.MethodBase.GetCurrentMethod().Name, ownerID, type);
1107
1108 NameValueCollection RequestArgs = new NameValueCollection
1109 {
1110 { "RequestMethod", "GetGenerics" },
1111 { "OwnerID", ownerID.ToString() },
1112 { "Type", type }
1113 };
1114
1115
1116 OSDMap Response = WebUtil.PostToService(m_groupsServerURI, RequestArgs);
1117 if (Response["Success"].AsBoolean() && Response["Entries"] is OSDArray)
1118 {
1119 OSDArray entryArray = (OSDArray)Response["Entries"];
1120 if (entryArray.Count >= 1)
1121 {
1122 OSDMap entryMap = entryArray[0] as OSDMap;
1123 key = entryMap["Key"].AsString();
1124 map = (OSDMap)OSDParser.DeserializeJson(entryMap["Value"].AsString());
1125
1126 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}", entryMap["Value"].AsString());
1127
1128 return true;
1129 }
1130 else
1131 {
1132 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] No Generics Results");
1133 }
1134 }
1135 else
1136 {
1137 m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: Error retrieving group info ({0})", Response["Message"]);
1138 }
1139 key = null;
1140 map = null;
1141 return false;
1142 }
1143 private bool SimianGetFirstGenericEntry(string type, string key, out UUID ownerID, out OSDMap map)
1144 {
1145 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2})", System.Reflection.MethodBase.GetCurrentMethod().Name, type, key);
1146
1147
1148 NameValueCollection RequestArgs = new NameValueCollection
1149 {
1150 { "RequestMethod", "GetGenerics" },
1151 { "Type", type },
1152 { "Key", key}
1153 };
1154
1155
1156 OSDMap Response = WebUtil.PostToService(m_groupsServerURI, RequestArgs);
1157 if (Response["Success"].AsBoolean() && Response["Entries"] is OSDArray)
1158 {
1159 OSDArray entryArray = (OSDArray)Response["Entries"];
1160 if (entryArray.Count >= 1)
1161 {
1162 OSDMap entryMap = entryArray[0] as OSDMap;
1163 ownerID = entryMap["OwnerID"].AsUUID();
1164 map = (OSDMap)OSDParser.DeserializeJson(entryMap["Value"].AsString());
1165
1166 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}", entryMap["Value"].AsString());
1167
1168 return true;
1169 }
1170 else
1171 {
1172 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] No Generics Results");
1173 }
1174 }
1175 else
1176 {
1177 m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: Error retrieving group info ({0})", Response["Message"]);
1178 }
1179 ownerID = UUID.Zero;
1180 map = null;
1181 return false;
1182 }
1183
1184 private bool SimianGetGenericEntry(UUID ownerID, string type, string key, out OSDMap map)
1185 {
1186 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2},{3})", System.Reflection.MethodBase.GetCurrentMethod().Name, ownerID, type, key);
1187
1188 NameValueCollection RequestArgs = new NameValueCollection
1189 {
1190 { "RequestMethod", "GetGenerics" },
1191 { "OwnerID", ownerID.ToString() },
1192 { "Type", type },
1193 { "Key", key}
1194 };
1195
1196
1197 OSDMap Response = WebUtil.PostToService(m_groupsServerURI, RequestArgs);
1198 if (Response["Success"].AsBoolean() && Response["Entries"] is OSDArray)
1199 {
1200 OSDArray entryArray = (OSDArray)Response["Entries"];
1201 if (entryArray.Count == 1)
1202 {
1203 OSDMap entryMap = entryArray[0] as OSDMap;
1204 key = entryMap["Key"].AsString();
1205 map = (OSDMap)OSDParser.DeserializeJson(entryMap["Value"].AsString());
1206
1207 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}", entryMap["Value"].AsString());
1208
1209 return true;
1210 }
1211 else
1212 {
1213 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] No Generics Results");
1214 }
1215 }
1216 else
1217 {
1218 m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: Error retrieving group info ({0})", Response["Message"]);
1219 }
1220 map = null;
1221 return false;
1222 }
1223
1224 private bool SimianGetGenericEntries(UUID ownerID, string type, out Dictionary<string, OSDMap> maps)
1225 {
1226 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2})", System.Reflection.MethodBase.GetCurrentMethod().Name,ownerID, type);
1227
1228 NameValueCollection requestArgs = new NameValueCollection
1229 {
1230 { "RequestMethod", "GetGenerics" },
1231 { "OwnerID", ownerID.ToString() },
1232 { "Type", type }
1233 };
1234
1235
1236
1237 OSDMap response = WebUtil.PostToService(m_groupsServerURI, requestArgs);
1238 if (response["Success"].AsBoolean() && response["Entries"] is OSDArray)
1239 {
1240 maps = new Dictionary<string, OSDMap>();
1241
1242 OSDArray entryArray = (OSDArray)response["Entries"];
1243 foreach (OSDMap entryMap in entryArray)
1244 {
1245 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}", entryMap["Value"].AsString());
1246 maps.Add(entryMap["Key"].AsString(), (OSDMap)OSDParser.DeserializeJson(entryMap["Value"].AsString()));
1247 }
1248 if(maps.Count == 0)
1249 {
1250 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] No Generics Results");
1251 }
1252
1253 return true;
1254 }
1255 else
1256 {
1257 maps = null;
1258 m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: Error retrieving group info ({0})", response["Message"]);
1259 }
1260 return false;
1261 }
1262 private bool SimianGetGenericEntries(string type, string key, out Dictionary<UUID, OSDMap> maps)
1263 {
1264 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2})", System.Reflection.MethodBase.GetCurrentMethod().Name, type, key);
1265
1266 NameValueCollection requestArgs = new NameValueCollection
1267 {
1268 { "RequestMethod", "GetGenerics" },
1269 { "Type", type },
1270 { "Key", key }
1271 };
1272
1273
1274
1275 OSDMap response = WebUtil.PostToService(m_groupsServerURI, requestArgs);
1276 if (response["Success"].AsBoolean() && response["Entries"] is OSDArray)
1277 {
1278 maps = new Dictionary<UUID, OSDMap>();
1279
1280 OSDArray entryArray = (OSDArray)response["Entries"];
1281 foreach (OSDMap entryMap in entryArray)
1282 {
1283 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] Generics Result {0}", entryMap["Value"].AsString());
1284 maps.Add(entryMap["OwnerID"].AsUUID(), (OSDMap)OSDParser.DeserializeJson(entryMap["Value"].AsString()));
1285 }
1286 if (maps.Count == 0)
1287 {
1288 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] No Generics Results");
1289 }
1290 return true;
1291 }
1292 else
1293 {
1294 maps = null;
1295 m_log.WarnFormat("[SIMIAN-GROUPS-CONNECTOR]: Error retrieving group info ({0})", response["Message"]);
1296 }
1297 return false;
1298 }
1299
1300 private bool SimianRemoveGenericEntry(UUID ownerID, string type, string key)
1301 {
1302 if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called ({1},{2},{3})", System.Reflection.MethodBase.GetCurrentMethod().Name, ownerID, type, key);
1303
1304 NameValueCollection requestArgs = new NameValueCollection
1305 {
1306 { "RequestMethod", "RemoveGeneric" },
1307 { "OwnerID", ownerID.ToString() },
1308 { "Type", type },
1309 { "Key", key }
1310 };
1311
1312
1313 OSDMap response = WebUtil.PostToService(m_groupsServerURI, requestArgs);
1314 if (response["Success"].AsBoolean())
1315 {
1316 return true;
1317 }
1318 else
1319 {
1320 m_log.WarnFormat("[SIMIAN GROUPS CONNECTOR]: Error {0}, {1}, {2}, {3}", ownerID, type, key, response["Message"]);
1321 return false;
1322 }
1323 }
1324 #endregion
1325
1326 }
1327
1328}
1329
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
index 964d0bb..2a60b00 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
@@ -47,9 +47,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
47 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] 47 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
48 public class XmlRpcGroupsServicesConnectorModule : ISharedRegionModule, IGroupsServicesConnector 48 public class XmlRpcGroupsServicesConnectorModule : ISharedRegionModule, IGroupsServicesConnector
49 { 49 {
50 private static readonly ILog m_log = 50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52
53 51
54 public const GroupPowers m_DefaultEveryonePowers = GroupPowers.AllowSetHome | 52 public const GroupPowers m_DefaultEveryonePowers = GroupPowers.AllowSetHome |
55 GroupPowers.Accountable | 53 GroupPowers.Accountable |
@@ -61,7 +59,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
61 59
62 private bool m_connectorEnabled = false; 60 private bool m_connectorEnabled = false;
63 61
64 private string m_serviceURL = string.Empty; 62 private string m_groupsServerURI = string.Empty;
65 63
66 private bool m_disableKeepAlive = false; 64 private bool m_disableKeepAlive = false;
67 65
@@ -69,6 +67,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
69 private string m_groupWriteKey = string.Empty; 67 private string m_groupWriteKey = string.Empty;
70 68
71 69
70 // Used to track which agents are have dropped from a group chat session
71 // Should be reset per agent, on logon
72 // TODO: move this to Flotsam XmlRpc Service
73 // SessionID, List<AgentID>
74 private Dictionary<UUID, List<UUID>> m_groupsAgentsDroppedFromChatSession = new Dictionary<UUID, List<UUID>>();
75 private Dictionary<UUID, List<UUID>> m_groupsAgentsInvitedToChatSession = new Dictionary<UUID, List<UUID>>();
76
77
72 #region IRegionModuleBase Members 78 #region IRegionModuleBase Members
73 79
74 public string Name 80 public string Name
@@ -104,11 +110,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
104 110
105 m_log.InfoFormat("[GROUPS-CONNECTOR]: Initializing {0}", this.Name); 111 m_log.InfoFormat("[GROUPS-CONNECTOR]: Initializing {0}", this.Name);
106 112
107 m_serviceURL = groupsConfig.GetString("XmlRpcServiceURL", string.Empty); 113 m_groupsServerURI = groupsConfig.GetString("GroupsServerURI", string.Empty);
108 if ((m_serviceURL == null) || 114 if ((m_groupsServerURI == null) ||
109 (m_serviceURL == string.Empty)) 115 (m_groupsServerURI == string.Empty))
110 { 116 {
111 m_log.ErrorFormat("Please specify a valid URL for XmlRpcServiceURL in OpenSim.ini, [Groups]"); 117 m_log.ErrorFormat("Please specify a valid URL for GroupsServerURI in OpenSim.ini, [Groups]");
112 m_connectorEnabled = false; 118 m_connectorEnabled = false;
113 return; 119 return;
114 } 120 }
@@ -118,6 +124,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
118 m_groupReadKey = groupsConfig.GetString("XmlRpcServiceReadKey", string.Empty); 124 m_groupReadKey = groupsConfig.GetString("XmlRpcServiceReadKey", string.Empty);
119 m_groupWriteKey = groupsConfig.GetString("XmlRpcServiceWriteKey", string.Empty); 125 m_groupWriteKey = groupsConfig.GetString("XmlRpcServiceWriteKey", string.Empty);
120 126
127
128
129
121 // If we got all the config options we need, lets start'er'up 130 // If we got all the config options we need, lets start'er'up
122 m_connectorEnabled = true; 131 m_connectorEnabled = true;
123 } 132 }
@@ -131,13 +140,17 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
131 public void AddRegion(OpenSim.Region.Framework.Scenes.Scene scene) 140 public void AddRegion(OpenSim.Region.Framework.Scenes.Scene scene)
132 { 141 {
133 if (m_connectorEnabled) 142 if (m_connectorEnabled)
143 {
134 scene.RegisterModuleInterface<IGroupsServicesConnector>(this); 144 scene.RegisterModuleInterface<IGroupsServicesConnector>(this);
145 }
135 } 146 }
136 147
137 public void RemoveRegion(OpenSim.Region.Framework.Scenes.Scene scene) 148 public void RemoveRegion(OpenSim.Region.Framework.Scenes.Scene scene)
138 { 149 {
139 if (scene.RequestModuleInterface<IGroupsServicesConnector>() == this) 150 if (scene.RequestModuleInterface<IGroupsServicesConnector>() == this)
151 {
140 scene.UnregisterModuleInterface<IGroupsServicesConnector>(this); 152 scene.UnregisterModuleInterface<IGroupsServicesConnector>(this);
153 }
141 } 154 }
142 155
143 public void RegionLoaded(OpenSim.Region.Framework.Scenes.Scene scene) 156 public void RegionLoaded(OpenSim.Region.Framework.Scenes.Scene scene)
@@ -157,14 +170,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
157 170
158 #endregion 171 #endregion
159 172
160
161
162 #region IGroupsServicesConnector Members 173 #region IGroupsServicesConnector Members
163 174
164 /// <summary> 175 /// <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. 176 /// 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> 177 /// </summary>
167 public UUID CreateGroup(GroupRequestID requestID, string name, string charter, bool showInList, UUID insigniaID, 178 public UUID CreateGroup(UUID requestingAgentID, string name, string charter, bool showInList, UUID insigniaID,
168 int membershipFee, bool openEnrollment, bool allowPublish, 179 int membershipFee, bool openEnrollment, bool allowPublish,
169 bool maturePublish, UUID founderID) 180 bool maturePublish, UUID founderID)
170 { 181 {
@@ -236,7 +247,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
236 247
237 248
238 249
239 Hashtable respData = XmlRpcCall(requestID, "groups.createGroup", param); 250 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.createGroup", param);
240 251
241 if (respData.Contains("error")) 252 if (respData.Contains("error"))
242 { 253 {
@@ -248,7 +259,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
248 return UUID.Parse((string)respData["GroupID"]); 259 return UUID.Parse((string)respData["GroupID"]);
249 } 260 }
250 261
251 public void UpdateGroup(GroupRequestID requestID, UUID groupID, string charter, bool showInList, 262 public void UpdateGroup(UUID requestingAgentID, UUID groupID, string charter, bool showInList,
252 UUID insigniaID, int membershipFee, bool openEnrollment, 263 UUID insigniaID, int membershipFee, bool openEnrollment,
253 bool allowPublish, bool maturePublish) 264 bool allowPublish, bool maturePublish)
254 { 265 {
@@ -262,10 +273,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
262 param["AllowPublish"] = allowPublish == true ? 1 : 0; 273 param["AllowPublish"] = allowPublish == true ? 1 : 0;
263 param["MaturePublish"] = maturePublish == true ? 1 : 0; 274 param["MaturePublish"] = maturePublish == true ? 1 : 0;
264 275
265 XmlRpcCall(requestID, "groups.updateGroup", param); 276 XmlRpcCall(requestingAgentID, "groups.updateGroup", param);
266 } 277 }
267 278
268 public void AddGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, 279 public void AddGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID, string name, string description,
269 string title, ulong powers) 280 string title, ulong powers)
270 { 281 {
271 Hashtable param = new Hashtable(); 282 Hashtable param = new Hashtable();
@@ -276,19 +287,19 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
276 param["Title"] = title; 287 param["Title"] = title;
277 param["Powers"] = powers.ToString(); 288 param["Powers"] = powers.ToString();
278 289
279 XmlRpcCall(requestID, "groups.addRoleToGroup", param); 290 XmlRpcCall(requestingAgentID, "groups.addRoleToGroup", param);
280 } 291 }
281 292
282 public void RemoveGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID) 293 public void RemoveGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID)
283 { 294 {
284 Hashtable param = new Hashtable(); 295 Hashtable param = new Hashtable();
285 param["GroupID"] = groupID.ToString(); 296 param["GroupID"] = groupID.ToString();
286 param["RoleID"] = roleID.ToString(); 297 param["RoleID"] = roleID.ToString();
287 298
288 XmlRpcCall(requestID, "groups.removeRoleFromGroup", param); 299 XmlRpcCall(requestingAgentID, "groups.removeRoleFromGroup", param);
289 } 300 }
290 301
291 public void UpdateGroupRole(GroupRequestID requestID, UUID groupID, UUID roleID, string name, string description, 302 public void UpdateGroupRole(UUID requestingAgentID, UUID groupID, UUID roleID, string name, string description,
292 string title, ulong powers) 303 string title, ulong powers)
293 { 304 {
294 Hashtable param = new Hashtable(); 305 Hashtable param = new Hashtable();
@@ -308,10 +319,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
308 } 319 }
309 param["Powers"] = powers.ToString(); 320 param["Powers"] = powers.ToString();
310 321
311 XmlRpcCall(requestID, "groups.updateGroupRole", param); 322 XmlRpcCall(requestingAgentID, "groups.updateGroupRole", param);
312 } 323 }
313 324
314 public GroupRecord GetGroupRecord(GroupRequestID requestID, UUID GroupID, string GroupName) 325 public GroupRecord GetGroupRecord(UUID requestingAgentID, UUID GroupID, string GroupName)
315 { 326 {
316 Hashtable param = new Hashtable(); 327 Hashtable param = new Hashtable();
317 if (GroupID != UUID.Zero) 328 if (GroupID != UUID.Zero)
@@ -323,7 +334,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
323 param["Name"] = GroupName.ToString(); 334 param["Name"] = GroupName.ToString();
324 } 335 }
325 336
326 Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param); 337 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroup", param);
327 338
328 if (respData.Contains("error")) 339 if (respData.Contains("error"))
329 { 340 {
@@ -334,12 +345,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
334 345
335 } 346 }
336 347
337 public GroupProfileData GetMemberGroupProfile(GroupRequestID requestID, UUID GroupID, UUID AgentID) 348 public GroupProfileData GetMemberGroupProfile(UUID requestingAgentID, UUID GroupID, UUID AgentID)
338 { 349 {
339 Hashtable param = new Hashtable(); 350 Hashtable param = new Hashtable();
340 param["GroupID"] = GroupID.ToString(); 351 param["GroupID"] = GroupID.ToString();
341 352
342 Hashtable respData = XmlRpcCall(requestID, "groups.getGroup", param); 353 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroup", param);
343 354
344 if (respData.Contains("error")) 355 if (respData.Contains("error"))
345 { 356 {
@@ -347,38 +358,35 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
347 return new GroupProfileData(); 358 return new GroupProfileData();
348 } 359 }
349 360
350 GroupMembershipData MemberInfo = GetAgentGroupMembership(requestID, AgentID, GroupID); 361 GroupMembershipData MemberInfo = GetAgentGroupMembership(requestingAgentID, AgentID, GroupID);
351 GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData); 362 GroupProfileData MemberGroupProfile = GroupProfileHashtableToGroupProfileData(respData);
352 363
353 MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle; 364 MemberGroupProfile.MemberTitle = MemberInfo.GroupTitle;
354 MemberGroupProfile.PowersMask = MemberInfo.GroupPowers; 365 MemberGroupProfile.PowersMask = MemberInfo.GroupPowers;
355 366
356 return MemberGroupProfile; 367 return MemberGroupProfile;
357
358 } 368 }
359 369
360 370 public void SetAgentActiveGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID)
361
362 public void SetAgentActiveGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID)
363 { 371 {
364 Hashtable param = new Hashtable(); 372 Hashtable param = new Hashtable();
365 param["AgentID"] = AgentID.ToString(); 373 param["AgentID"] = AgentID.ToString();
366 param["GroupID"] = GroupID.ToString(); 374 param["GroupID"] = GroupID.ToString();
367 375
368 XmlRpcCall(requestID, "groups.setAgentActiveGroup", param); 376 XmlRpcCall(requestingAgentID, "groups.setAgentActiveGroup", param);
369 } 377 }
370 378
371 public void SetAgentActiveGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) 379 public void SetAgentActiveGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
372 { 380 {
373 Hashtable param = new Hashtable(); 381 Hashtable param = new Hashtable();
374 param["AgentID"] = AgentID.ToString(); 382 param["AgentID"] = AgentID.ToString();
375 param["GroupID"] = GroupID.ToString(); 383 param["GroupID"] = GroupID.ToString();
376 param["SelectedRoleID"] = RoleID.ToString(); 384 param["SelectedRoleID"] = RoleID.ToString();
377 385
378 XmlRpcCall(requestID, "groups.setAgentGroupInfo", param); 386 XmlRpcCall(requestingAgentID, "groups.setAgentGroupInfo", param);
379 } 387 }
380 388
381 public void SetAgentGroupInfo(GroupRequestID requestID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile) 389 public void SetAgentGroupInfo(UUID requestingAgentID, UUID AgentID, UUID GroupID, bool AcceptNotices, bool ListInProfile)
382 { 390 {
383 Hashtable param = new Hashtable(); 391 Hashtable param = new Hashtable();
384 param["AgentID"] = AgentID.ToString(); 392 param["AgentID"] = AgentID.ToString();
@@ -386,11 +394,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
386 param["AcceptNotices"] = AcceptNotices ? "1" : "0"; 394 param["AcceptNotices"] = AcceptNotices ? "1" : "0";
387 param["ListInProfile"] = ListInProfile ? "1" : "0"; 395 param["ListInProfile"] = ListInProfile ? "1" : "0";
388 396
389 XmlRpcCall(requestID, "groups.setAgentGroupInfo", param); 397 XmlRpcCall(requestingAgentID, "groups.setAgentGroupInfo", param);
390 398
391 } 399 }
392 400
393 public void AddAgentToGroupInvite(GroupRequestID requestID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID) 401 public void AddAgentToGroupInvite(UUID requestingAgentID, UUID inviteID, UUID groupID, UUID roleID, UUID agentID)
394 { 402 {
395 Hashtable param = new Hashtable(); 403 Hashtable param = new Hashtable();
396 param["InviteID"] = inviteID.ToString(); 404 param["InviteID"] = inviteID.ToString();
@@ -398,16 +406,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
398 param["RoleID"] = roleID.ToString(); 406 param["RoleID"] = roleID.ToString();
399 param["GroupID"] = groupID.ToString(); 407 param["GroupID"] = groupID.ToString();
400 408
401 XmlRpcCall(requestID, "groups.addAgentToGroupInvite", param); 409 XmlRpcCall(requestingAgentID, "groups.addAgentToGroupInvite", param);
402 410
403 } 411 }
404 412
405 public GroupInviteInfo GetAgentToGroupInvite(GroupRequestID requestID, UUID inviteID) 413 public GroupInviteInfo GetAgentToGroupInvite(UUID requestingAgentID, UUID inviteID)
406 { 414 {
407 Hashtable param = new Hashtable(); 415 Hashtable param = new Hashtable();
408 param["InviteID"] = inviteID.ToString(); 416 param["InviteID"] = inviteID.ToString();
409 417
410 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentToGroupInvite", param); 418 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentToGroupInvite", param);
411 419
412 if (respData.Contains("error")) 420 if (respData.Contains("error"))
413 { 421 {
@@ -423,60 +431,59 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
423 return inviteInfo; 431 return inviteInfo;
424 } 432 }
425 433
426 public void RemoveAgentToGroupInvite(GroupRequestID requestID, UUID inviteID) 434 public void RemoveAgentToGroupInvite(UUID requestingAgentID, UUID inviteID)
427 { 435 {
428 Hashtable param = new Hashtable(); 436 Hashtable param = new Hashtable();
429 param["InviteID"] = inviteID.ToString(); 437 param["InviteID"] = inviteID.ToString();
430 438
431 XmlRpcCall(requestID, "groups.removeAgentToGroupInvite", param); 439 XmlRpcCall(requestingAgentID, "groups.removeAgentToGroupInvite", param);
432 } 440 }
433 441
434 public void AddAgentToGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) 442 public void AddAgentToGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
435 { 443 {
436 Hashtable param = new Hashtable(); 444 Hashtable param = new Hashtable();
437 param["AgentID"] = AgentID.ToString(); 445 param["AgentID"] = AgentID.ToString();
438 param["GroupID"] = GroupID.ToString(); 446 param["GroupID"] = GroupID.ToString();
439 param["RoleID"] = RoleID.ToString(); 447 param["RoleID"] = RoleID.ToString();
440 448
441 XmlRpcCall(requestID, "groups.addAgentToGroup", param); 449 XmlRpcCall(requestingAgentID, "groups.addAgentToGroup", param);
442 } 450 }
443 451
444 public void RemoveAgentFromGroup(GroupRequestID requestID, UUID AgentID, UUID GroupID) 452 public void RemoveAgentFromGroup(UUID requestingAgentID, UUID AgentID, UUID GroupID)
445 { 453 {
446 Hashtable param = new Hashtable(); 454 Hashtable param = new Hashtable();
447 param["AgentID"] = AgentID.ToString(); 455 param["AgentID"] = AgentID.ToString();
448 param["GroupID"] = GroupID.ToString(); 456 param["GroupID"] = GroupID.ToString();
449 457
450 XmlRpcCall(requestID, "groups.removeAgentFromGroup", param); 458 XmlRpcCall(requestingAgentID, "groups.removeAgentFromGroup", param);
451 } 459 }
452 460
453 public void AddAgentToGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) 461 public void AddAgentToGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
454 { 462 {
455 Hashtable param = new Hashtable(); 463 Hashtable param = new Hashtable();
456 param["AgentID"] = AgentID.ToString(); 464 param["AgentID"] = AgentID.ToString();
457 param["GroupID"] = GroupID.ToString(); 465 param["GroupID"] = GroupID.ToString();
458 param["RoleID"] = RoleID.ToString(); 466 param["RoleID"] = RoleID.ToString();
459 467
460 XmlRpcCall(requestID, "groups.addAgentToGroupRole", param); 468 XmlRpcCall(requestingAgentID, "groups.addAgentToGroupRole", param);
461 } 469 }
462 470
463 public void RemoveAgentFromGroupRole(GroupRequestID requestID, UUID AgentID, UUID GroupID, UUID RoleID) 471 public void RemoveAgentFromGroupRole(UUID requestingAgentID, UUID AgentID, UUID GroupID, UUID RoleID)
464 { 472 {
465 Hashtable param = new Hashtable(); 473 Hashtable param = new Hashtable();
466 param["AgentID"] = AgentID.ToString(); 474 param["AgentID"] = AgentID.ToString();
467 param["GroupID"] = GroupID.ToString(); 475 param["GroupID"] = GroupID.ToString();
468 param["RoleID"] = RoleID.ToString(); 476 param["RoleID"] = RoleID.ToString();
469 477
470 XmlRpcCall(requestID, "groups.removeAgentFromGroupRole", param); 478 XmlRpcCall(requestingAgentID, "groups.removeAgentFromGroupRole", param);
471 } 479 }
472 480
473 481 public List<DirGroupsReplyData> FindGroups(UUID requestingAgentID, string search)
474 public List<DirGroupsReplyData> FindGroups(GroupRequestID requestID, string search)
475 { 482 {
476 Hashtable param = new Hashtable(); 483 Hashtable param = new Hashtable();
477 param["Search"] = search; 484 param["Search"] = search;
478 485
479 Hashtable respData = XmlRpcCall(requestID, "groups.findGroups", param); 486 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.findGroups", param);
480 487
481 List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>(); 488 List<DirGroupsReplyData> findings = new List<DirGroupsReplyData>();
482 489
@@ -498,13 +505,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
498 return findings; 505 return findings;
499 } 506 }
500 507
501 public GroupMembershipData GetAgentGroupMembership(GroupRequestID requestID, UUID AgentID, UUID GroupID) 508 public GroupMembershipData GetAgentGroupMembership(UUID requestingAgentID, UUID AgentID, UUID GroupID)
502 { 509 {
503 Hashtable param = new Hashtable(); 510 Hashtable param = new Hashtable();
504 param["AgentID"] = AgentID.ToString(); 511 param["AgentID"] = AgentID.ToString();
505 param["GroupID"] = GroupID.ToString(); 512 param["GroupID"] = GroupID.ToString();
506 513
507 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMembership", param); 514 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentGroupMembership", param);
508 515
509 if (respData.Contains("error")) 516 if (respData.Contains("error"))
510 { 517 {
@@ -516,12 +523,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
516 return data; 523 return data;
517 } 524 }
518 525
519 public GroupMembershipData GetAgentActiveMembership(GroupRequestID requestID, UUID AgentID) 526 public GroupMembershipData GetAgentActiveMembership(UUID requestingAgentID, UUID AgentID)
520 { 527 {
521 Hashtable param = new Hashtable(); 528 Hashtable param = new Hashtable();
522 param["AgentID"] = AgentID.ToString(); 529 param["AgentID"] = AgentID.ToString();
523 530
524 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentActiveMembership", param); 531 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentActiveMembership", param);
525 532
526 if (respData.Contains("error")) 533 if (respData.Contains("error"))
527 { 534 {
@@ -531,13 +538,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
531 return HashTableToGroupMembershipData(respData); 538 return HashTableToGroupMembershipData(respData);
532 } 539 }
533 540
534 541 public List<GroupMembershipData> GetAgentGroupMemberships(UUID requestingAgentID, UUID AgentID)
535 public List<GroupMembershipData> GetAgentGroupMemberships(GroupRequestID requestID, UUID AgentID)
536 { 542 {
537 Hashtable param = new Hashtable(); 543 Hashtable param = new Hashtable();
538 param["AgentID"] = AgentID.ToString(); 544 param["AgentID"] = AgentID.ToString();
539 545
540 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentGroupMemberships", param); 546 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentGroupMemberships", param);
541 547
542 List<GroupMembershipData> memberships = new List<GroupMembershipData>(); 548 List<GroupMembershipData> memberships = new List<GroupMembershipData>();
543 549
@@ -552,13 +558,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
552 return memberships; 558 return memberships;
553 } 559 }
554 560
555 public List<GroupRolesData> GetAgentGroupRoles(GroupRequestID requestID, UUID AgentID, UUID GroupID) 561 public List<GroupRolesData> GetAgentGroupRoles(UUID requestingAgentID, UUID AgentID, UUID GroupID)
556 { 562 {
557 Hashtable param = new Hashtable(); 563 Hashtable param = new Hashtable();
558 param["AgentID"] = AgentID.ToString(); 564 param["AgentID"] = AgentID.ToString();
559 param["GroupID"] = GroupID.ToString(); 565 param["GroupID"] = GroupID.ToString();
560 566
561 Hashtable respData = XmlRpcCall(requestID, "groups.getAgentRoles", param); 567 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getAgentRoles", param);
562 568
563 List<GroupRolesData> Roles = new List<GroupRolesData>(); 569 List<GroupRolesData> Roles = new List<GroupRolesData>();
564 570
@@ -584,12 +590,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
584 590
585 } 591 }
586 592
587 public List<GroupRolesData> GetGroupRoles(GroupRequestID requestID, UUID GroupID) 593 public List<GroupRolesData> GetGroupRoles(UUID requestingAgentID, UUID GroupID)
588 { 594 {
589 Hashtable param = new Hashtable(); 595 Hashtable param = new Hashtable();
590 param["GroupID"] = GroupID.ToString(); 596 param["GroupID"] = GroupID.ToString();
591 597
592 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoles", param); 598 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupRoles", param);
593 599
594 List<GroupRolesData> Roles = new List<GroupRolesData>(); 600 List<GroupRolesData> Roles = new List<GroupRolesData>();
595 601
@@ -617,12 +623,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
617 623
618 624
619 625
620 public List<GroupMembersData> GetGroupMembers(GroupRequestID requestID, UUID GroupID) 626 public List<GroupMembersData> GetGroupMembers(UUID requestingAgentID, UUID GroupID)
621 { 627 {
622 Hashtable param = new Hashtable(); 628 Hashtable param = new Hashtable();
623 param["GroupID"] = GroupID.ToString(); 629 param["GroupID"] = GroupID.ToString();
624 630
625 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupMembers", param); 631 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupMembers", param);
626 632
627 List<GroupMembersData> members = new List<GroupMembersData>(); 633 List<GroupMembersData> members = new List<GroupMembersData>();
628 634
@@ -650,12 +656,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
650 656
651 } 657 }
652 658
653 public List<GroupRoleMembersData> GetGroupRoleMembers(GroupRequestID requestID, UUID GroupID) 659 public List<GroupRoleMembersData> GetGroupRoleMembers(UUID requestingAgentID, UUID GroupID)
654 { 660 {
655 Hashtable param = new Hashtable(); 661 Hashtable param = new Hashtable();
656 param["GroupID"] = GroupID.ToString(); 662 param["GroupID"] = GroupID.ToString();
657 663
658 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupRoleMembers", param); 664 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupRoleMembers", param);
659 665
660 List<GroupRoleMembersData> members = new List<GroupRoleMembersData>(); 666 List<GroupRoleMembersData> members = new List<GroupRoleMembersData>();
661 667
@@ -674,12 +680,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
674 return members; 680 return members;
675 } 681 }
676 682
677 public List<GroupNoticeData> GetGroupNotices(GroupRequestID requestID, UUID GroupID) 683 public List<GroupNoticeData> GetGroupNotices(UUID requestingAgentID, UUID GroupID)
678 { 684 {
679 Hashtable param = new Hashtable(); 685 Hashtable param = new Hashtable();
680 param["GroupID"] = GroupID.ToString(); 686 param["GroupID"] = GroupID.ToString();
681 687
682 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotices", param); 688 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupNotices", param);
683 689
684 List<GroupNoticeData> values = new List<GroupNoticeData>(); 690 List<GroupNoticeData> values = new List<GroupNoticeData>();
685 691
@@ -701,12 +707,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
701 return values; 707 return values;
702 708
703 } 709 }
704 public GroupNoticeInfo GetGroupNotice(GroupRequestID requestID, UUID noticeID) 710 public GroupNoticeInfo GetGroupNotice(UUID requestingAgentID, UUID noticeID)
705 { 711 {
706 Hashtable param = new Hashtable(); 712 Hashtable param = new Hashtable();
707 param["NoticeID"] = noticeID.ToString(); 713 param["NoticeID"] = noticeID.ToString();
708 714
709 Hashtable respData = XmlRpcCall(requestID, "groups.getGroupNotice", param); 715 Hashtable respData = XmlRpcCall(requestingAgentID, "groups.getGroupNotice", param);
710 716
711 717
712 if (respData.Contains("error")) 718 if (respData.Contains("error"))
@@ -732,7 +738,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
732 738
733 return data; 739 return data;
734 } 740 }
735 public void AddGroupNotice(GroupRequestID requestID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket) 741 public void AddGroupNotice(UUID requestingAgentID, UUID groupID, UUID noticeID, string fromName, string subject, string message, byte[] binaryBucket)
736 { 742 {
737 string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, ""); 743 string binBucket = OpenMetaverse.Utils.BytesToHexString(binaryBucket, "");
738 744
@@ -745,7 +751,70 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
745 param["BinaryBucket"] = binBucket; 751 param["BinaryBucket"] = binBucket;
746 param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString(); 752 param["TimeStamp"] = ((uint)Util.UnixTimeSinceEpoch()).ToString();
747 753
748 XmlRpcCall(requestID, "groups.addGroupNotice", param); 754 XmlRpcCall(requestingAgentID, "groups.addGroupNotice", param);
755 }
756
757
758
759 #endregion
760
761 #region GroupSessionTracking
762
763 public void ResetAgentGroupChatSessions(UUID agentID)
764 {
765 foreach (List<UUID> agentList in m_groupsAgentsDroppedFromChatSession.Values)
766 {
767 agentList.Remove(agentID);
768 }
769 }
770
771 public bool hasAgentBeenInvitedToGroupChatSession(UUID agentID, UUID groupID)
772 {
773 // If we're tracking this group, and we can find them in the tracking, then they've been invited
774 return m_groupsAgentsInvitedToChatSession.ContainsKey(groupID)
775 && m_groupsAgentsInvitedToChatSession[groupID].Contains(agentID);
776 }
777
778 public bool hasAgentDroppedGroupChatSession(UUID agentID, UUID groupID)
779 {
780 // If we're tracking drops for this group,
781 // and we find them, well... then they've dropped
782 return m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID)
783 && m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID);
784 }
785
786 public void AgentDroppedFromGroupChatSession(UUID agentID, UUID groupID)
787 {
788 if (m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID))
789 {
790 // If not in dropped list, add
791 if (!m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID))
792 {
793 m_groupsAgentsDroppedFromChatSession[groupID].Add(agentID);
794 }
795 }
796 }
797
798 public void AgentInvitedToGroupChatSession(UUID agentID, UUID groupID)
799 {
800 // Add Session Status if it doesn't exist for this session
801 CreateGroupChatSessionTracking(groupID);
802
803 // If nessesary, remove from dropped list
804 if (m_groupsAgentsDroppedFromChatSession[groupID].Contains(agentID))
805 {
806 m_groupsAgentsDroppedFromChatSession[groupID].Remove(agentID);
807 }
808 }
809
810 private void CreateGroupChatSessionTracking(UUID groupID)
811 {
812 if (!m_groupsAgentsDroppedFromChatSession.ContainsKey(groupID))
813 {
814 m_groupsAgentsDroppedFromChatSession.Add(groupID, new List<UUID>());
815 m_groupsAgentsInvitedToChatSession.Add(groupID, new List<UUID>());
816 }
817
749 } 818 }
750 #endregion 819 #endregion
751 820
@@ -778,7 +847,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
778 847
779 private GroupRecord GroupProfileHashtableToGroupRecord(Hashtable groupProfile) 848 private GroupRecord GroupProfileHashtableToGroupRecord(Hashtable groupProfile)
780 { 849 {
781
782 GroupRecord group = new GroupRecord(); 850 GroupRecord group = new GroupRecord();
783 group.GroupID = UUID.Parse((string)groupProfile["GroupID"]); 851 group.GroupID = UUID.Parse((string)groupProfile["GroupID"]);
784 group.GroupName = groupProfile["Name"].ToString(); 852 group.GroupName = groupProfile["Name"].ToString();
@@ -797,6 +865,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
797 865
798 return group; 866 return group;
799 } 867 }
868
800 private static GroupMembershipData HashTableToGroupMembershipData(Hashtable respData) 869 private static GroupMembershipData HashTableToGroupMembershipData(Hashtable respData)
801 { 870 {
802 GroupMembershipData data = new GroupMembershipData(); 871 GroupMembershipData data = new GroupMembershipData();
@@ -829,6 +898,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
829 data.MembershipFee = int.Parse((string)respData["MembershipFee"]); 898 data.MembershipFee = int.Parse((string)respData["MembershipFee"]);
830 data.OpenEnrollment = ((string)respData["OpenEnrollment"] == "1"); 899 data.OpenEnrollment = ((string)respData["OpenEnrollment"] == "1");
831 data.ShowInList = ((string)respData["ShowInList"] == "1"); 900 data.ShowInList = ((string)respData["ShowInList"] == "1");
901
832 return data; 902 return data;
833 } 903 }
834 904
@@ -837,15 +907,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
837 /// <summary> 907 /// <summary>
838 /// Encapsulate the XmlRpc call to standardize security and error handling. 908 /// Encapsulate the XmlRpc call to standardize security and error handling.
839 /// </summary> 909 /// </summary>
840 private Hashtable XmlRpcCall(GroupRequestID requestID, string function, Hashtable param) 910 private Hashtable XmlRpcCall(UUID requestingAgentID, string function, Hashtable param)
841 { 911 {
842 if (requestID == null) 912 string UserService;
843 { 913 UUID SessionID;
844 requestID = new GroupRequestID(); 914 GetClientGroupRequestID(requestingAgentID, out UserService, out SessionID);
845 } 915 param.Add("requestingAgentID", requestingAgentID.ToString());
846 param.Add("RequestingAgentID", requestID.AgentID.ToString()); 916 param.Add("RequestingAgentUserService", UserService);
847 param.Add("RequestingAgentUserService", requestID.UserServiceURL); 917 param.Add("RequestingSessionID", SessionID.ToString());
848 param.Add("RequestingSessionID", requestID.SessionID.ToString());
849 918
850 919
851 param.Add("ReadKey", m_groupReadKey); 920 param.Add("ReadKey", m_groupReadKey);
@@ -862,7 +931,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
862 931
863 try 932 try
864 { 933 {
865 resp = req.Send(m_serviceURL, 10000); 934 resp = req.Send(m_groupsServerURI, 10000);
866 } 935 }
867 catch (Exception e) 936 catch (Exception e)
868 { 937 {
@@ -936,15 +1005,49 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
936 } 1005 }
937 } 1006 }
938 1007
1008
1009 /// <summary>
1010 /// Group Request Tokens are an attempt to allow the groups service to authenticate
1011 /// requests.
1012 /// TODO: This broke after the big grid refactor, either find a better way, or discard this
1013 /// </summary>
1014 /// <param name="client"></param>
1015 /// <returns></returns>
1016 private void GetClientGroupRequestID(UUID AgentID, out string UserServiceURL, out UUID SessionID)
1017 {
1018 UserServiceURL = "";
1019 SessionID = UUID.Zero;
939 1020
940 }
941 1021
942 public class GroupNoticeInfo 1022 // Need to rework this based on changes to User Services
943 { 1023 /*
944 public GroupNoticeData noticeData = new GroupNoticeData(); 1024 UserAccount userAccount = m_accountService.GetUserAccount(UUID.Zero,AgentID);
945 public UUID GroupID = UUID.Zero; 1025 if (userAccount == null)
946 public string Message = string.Empty; 1026 {
947 public byte[] BinaryBucket = new byte[0]; 1027 // This should be impossible. If I've been passed a reference to a client
1028 // that client should be registered with the UserService. So something
1029 // is horribly wrong somewhere.
1030
1031 m_log.WarnFormat("[GROUPS]: Could not find a UserServiceURL for {0}", AgentID);
1032
1033 }
1034 else if (userProfile is ForeignUserProfileData)
1035 {
1036 // They aren't from around here
1037 ForeignUserProfileData fupd = (ForeignUserProfileData)userProfile;
1038 UserServiceURL = fupd.UserServerURI;
1039 SessionID = fupd.CurrentAgent.SessionID;
1040
1041 }
1042 else
1043 {
1044 // They're a local user, use this:
1045 UserServiceURL = m_commManager.NetworkServersInfo.UserURL;
1046 SessionID = userProfile.CurrentAgent.SessionID;
1047 }
1048 */
1049 }
1050
948 } 1051 }
949} 1052}
950 1053