aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs')
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs2102
1 files changed, 1051 insertions, 1051 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs
index 6a3aa06..a6f9ea1 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsModule.cs
@@ -1,1051 +1,1051 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright 7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright 9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSim Project nor the 12 * * Neither the name of the OpenSim Project nor the
13 * names of its contributors may be used to endorse or promote products 13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission. 14 * derived from this software without specific prior written permission.
15 * 15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY 16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY 19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 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 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 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 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. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Reflection; 30using System.Reflection;
31 31
32using System.Collections; 32using System.Collections;
33//using Nwc.XmlRpc; 33//using Nwc.XmlRpc;
34 34
35using log4net; 35using log4net;
36using Nini.Config; 36using Nini.Config;
37 37
38using OpenMetaverse; 38using OpenMetaverse;
39using OpenMetaverse.StructuredData; 39using OpenMetaverse.StructuredData;
40 40
41using OpenSim.Framework; 41using OpenSim.Framework;
42using OpenSim.Region.CoreModules.Framework.EventQueue; 42using OpenSim.Region.CoreModules.Framework.EventQueue;
43using OpenSim.Region.Framework.Interfaces; 43using OpenSim.Region.Framework.Interfaces;
44using OpenSim.Region.Framework.Scenes; 44using OpenSim.Region.Framework.Scenes;
45 45
46using Caps = OpenSim.Framework.Communications.Capabilities.Caps; 46using Caps = OpenSim.Framework.Communications.Capabilities.Caps;
47using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags; 47using DirFindFlags = OpenMetaverse.DirectoryManager.DirFindFlags;
48 48
49 49
50 50
51namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups 51namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
52{ 52{
53 public class XmlRpcGroupsModule : INonSharedRegionModule, IGroupsModule 53 public class XmlRpcGroupsModule : INonSharedRegionModule, IGroupsModule
54 { 54 {
55 /// <summary> 55 /// <summary>
56 /// To use this module, you must specify the following in your OpenSim.ini 56 /// To use this module, you must specify the following in your OpenSim.ini
57 /// [GROUPS] 57 /// [GROUPS]
58 /// Enabled = true 58 /// Enabled = true
59 /// Module = XmlRpcGroups 59 /// Module = XmlRpcGroups
60 /// XmlRpcMessagingEnabled = true 60 /// XmlRpcMessagingEnabled = true
61 /// XmlRpcNoticesEnabled = true 61 /// XmlRpcNoticesEnabled = true
62 /// XmlRpcDebugEnabled = true 62 /// XmlRpcDebugEnabled = true
63 /// 63 ///
64 /// </summary> 64 /// </summary>
65 65
66 private static readonly ILog m_log = 66 private static readonly ILog m_log =
67 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 67 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
68 68
69 private List<Scene> m_SceneList = new List<Scene>(); 69 private List<Scene> m_SceneList = new List<Scene>();
70 70
71 // This only works when running as non-Shared, in shared, there may be multiple IClientAPIs for a single client 71 // This only works when running as non-Shared, in shared, there may be multiple IClientAPIs for a single client
72 private Dictionary<UUID, IClientAPI> m_ActiveClients = new Dictionary<UUID, IClientAPI>(); 72 private Dictionary<UUID, IClientAPI> m_ActiveClients = new Dictionary<UUID, IClientAPI>();
73 73
74 private IMessageTransferModule m_MsgTransferModule = null; 74 private IMessageTransferModule m_MsgTransferModule = null;
75 75
76 private IGroupDataProvider m_groupData = null; 76 private IGroupDataProvider m_groupData = null;
77 77
78 // Configuration settings 78 // Configuration settings
79 private const string m_defaultXmlRpcServiceURL = "http://osflotsam.org/xmlrpc.php"; 79 private const string m_defaultXmlRpcServiceURL = "http://osflotsam.org/xmlrpc.php";
80 private bool m_GroupsEnabled = false; 80 private bool m_GroupsEnabled = false;
81 private bool m_GroupNoticesEnabled = true; 81 private bool m_GroupNoticesEnabled = true;
82 private bool m_debugEnabled = true; 82 private bool m_debugEnabled = true;
83 83
84 #region IRegionModule Members 84 #region IRegionModule Members
85 85
86 public void Initialise(IConfigSource config) 86 public void Initialise(IConfigSource config)
87 { 87 {
88 IConfig groupsConfig = config.Configs["Groups"]; 88 IConfig groupsConfig = config.Configs["Groups"];
89 89
90 m_log.Info("[GROUPS]: Initializing XmlRpcGroups"); 90 m_log.Info("[GROUPS]: Initializing XmlRpcGroups");
91 91
92 if (groupsConfig == null) 92 if (groupsConfig == null)
93 { 93 {
94 // Do not run this module by default. 94 // Do not run this module by default.
95 m_log.Info("[GROUPS]: No config found in OpenSim.ini -- not enabling XmlRpcGroups"); 95 m_log.Info("[GROUPS]: No config found in OpenSim.ini -- not enabling XmlRpcGroups");
96 return; 96 return;
97 } 97 }
98 else 98 else
99 { 99 {
100 m_GroupsEnabled = groupsConfig.GetBoolean("Enabled", false); 100 m_GroupsEnabled = groupsConfig.GetBoolean("Enabled", false);
101 if (!m_GroupsEnabled) 101 if (!m_GroupsEnabled)
102 { 102 {
103 m_log.Info("[GROUPS]: Groups disabled in configuration"); 103 m_log.Info("[GROUPS]: Groups disabled in configuration");
104 return; 104 return;
105 } 105 }
106 106
107 if (groupsConfig.GetString("Module", "Default") != "XmlRpcGroups") 107 if (groupsConfig.GetString("Module", "Default") != "XmlRpcGroups")
108 { 108 {
109 m_log.Info("[GROUPS]: Config Groups Module not set to XmlRpcGroups"); 109 m_log.Info("[GROUPS]: Config Groups Module not set to XmlRpcGroups");
110 m_GroupsEnabled = false; 110 m_GroupsEnabled = false;
111 111
112 return; 112 return;
113 } 113 }
114 114
115 string ServiceURL = groupsConfig.GetString("XmlRpcServiceURL", m_defaultXmlRpcServiceURL); 115 string ServiceURL = groupsConfig.GetString("XmlRpcServiceURL", m_defaultXmlRpcServiceURL);
116 m_groupData = new XmlRpcGroupDataProvider(ServiceURL); 116 m_groupData = new XmlRpcGroupDataProvider(ServiceURL);
117 m_log.InfoFormat("[GROUPS]: XmlRpc Service URL set to: {0}", ServiceURL); 117 m_log.InfoFormat("[GROUPS]: XmlRpc Service URL set to: {0}", ServiceURL);
118 118
119 m_GroupNoticesEnabled = groupsConfig.GetBoolean("XmlRpcNoticesEnabled", true); 119 m_GroupNoticesEnabled = groupsConfig.GetBoolean("XmlRpcNoticesEnabled", true);
120 m_debugEnabled = groupsConfig.GetBoolean("XmlRpcDebugEnabled", true); 120 m_debugEnabled = groupsConfig.GetBoolean("XmlRpcDebugEnabled", true);
121 121
122 } 122 }
123 } 123 }
124 124
125 public void AddRegion(Scene scene) 125 public void AddRegion(Scene scene)
126 { 126 {
127 if (m_GroupsEnabled) 127 if (m_GroupsEnabled)
128 scene.RegisterModuleInterface<IGroupsModule>(this); 128 scene.RegisterModuleInterface<IGroupsModule>(this);
129 } 129 }
130 130
131 public void RegionLoaded(Scene scene) 131 public void RegionLoaded(Scene scene)
132 { 132 {
133 if (!m_GroupsEnabled) 133 if (!m_GroupsEnabled)
134 return; 134 return;
135 135
136 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 136 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
137 137
138 m_MsgTransferModule = scene.RequestModuleInterface<IMessageTransferModule>(); 138 m_MsgTransferModule = scene.RequestModuleInterface<IMessageTransferModule>();
139 139
140 // No message transfer module, no notices, group invites, rejects, ejects, etc 140 // No message transfer module, no notices, group invites, rejects, ejects, etc
141 if (m_MsgTransferModule == null) 141 if (m_MsgTransferModule == null)
142 { 142 {
143 m_GroupsEnabled = false; 143 m_GroupsEnabled = false;
144 m_log.Info("[GROUPS]: Could not get MessageTransferModule"); 144 m_log.Info("[GROUPS]: Could not get MessageTransferModule");
145 Close(); 145 Close();
146 return; 146 return;
147 } 147 }
148 148
149 149
150 m_SceneList.Add(scene); 150 m_SceneList.Add(scene);
151 151
152 scene.EventManager.OnNewClient += OnNewClient; 152 scene.EventManager.OnNewClient += OnNewClient;
153 scene.EventManager.OnClientClosed += OnClientClosed; 153 scene.EventManager.OnClientClosed += OnClientClosed;
154 scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage; 154 scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
155 155
156 } 156 }
157 157
158 public void RemoveRegion(Scene scene) 158 public void RemoveRegion(Scene scene)
159 { 159 {
160 if (!m_GroupsEnabled) 160 if (!m_GroupsEnabled)
161 return; 161 return;
162 162
163 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 163 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
164 164
165 m_SceneList.Remove(scene); 165 m_SceneList.Remove(scene);
166 } 166 }
167 167
168 public void Close() 168 public void Close()
169 { 169 {
170 if (!m_GroupsEnabled) 170 if (!m_GroupsEnabled)
171 return; 171 return;
172 m_log.Debug("[GROUPS]: Shutting down XmlRpcGroups module."); 172 m_log.Debug("[GROUPS]: Shutting down XmlRpcGroups module.");
173 } 173 }
174 174
175 public string Name 175 public string Name
176 { 176 {
177 get { return "XmlRpcGroupsModule"; } 177 get { return "XmlRpcGroupsModule"; }
178 } 178 }
179 179
180 #endregion 180 #endregion
181 181
182 private void UpdateAllClientsWithGroupInfo() 182 private void UpdateAllClientsWithGroupInfo()
183 { 183 {
184 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 184 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
185 foreach (IClientAPI client in m_ActiveClients.Values) 185 foreach (IClientAPI client in m_ActiveClients.Values)
186 { 186 {
187 UpdateClientWithGroupInfo(client); 187 UpdateClientWithGroupInfo(client);
188 } 188 }
189 } 189 }
190 190
191 private void UpdateClientWithGroupInfo(IClientAPI client) 191 private void UpdateClientWithGroupInfo(IClientAPI client)
192 { 192 {
193 m_log.InfoFormat("[GROUPS] {0} called for {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, client.Name); 193 m_log.InfoFormat("[GROUPS] {0} called for {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, client.Name);
194 OnAgentDataUpdateRequest(client, client.AgentId, UUID.Zero); 194 OnAgentDataUpdateRequest(client, client.AgentId, UUID.Zero);
195 195
196 196
197 // Need to send a group membership update to the client 197 // Need to send a group membership update to the client
198 // UDP version doesn't seem to behave nicely 198 // UDP version doesn't seem to behave nicely
199 // client.SendGroupMembership(GetMembershipData(client.AgentId)); 199 // client.SendGroupMembership(GetMembershipData(client.AgentId));
200 200
201 GroupMembershipData[] membershipData = m_groupData.GetAgentGroupMemberships(client.AgentId).ToArray(); 201 GroupMembershipData[] membershipData = m_groupData.GetAgentGroupMemberships(client.AgentId).ToArray();
202 202
203 SendGroupMembershipInfoViaCaps(client, membershipData); 203 SendGroupMembershipInfoViaCaps(client, membershipData);
204 client.SendAvatarGroupsReply(client.AgentId, membershipData); 204 client.SendAvatarGroupsReply(client.AgentId, membershipData);
205 205
206 } 206 }
207 207
208 #region EventHandlers 208 #region EventHandlers
209 private void OnNewClient(IClientAPI client) 209 private void OnNewClient(IClientAPI client)
210 { 210 {
211 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 211 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
212 212
213 213
214 lock (m_ActiveClients) 214 lock (m_ActiveClients)
215 { 215 {
216 if (!m_ActiveClients.ContainsKey(client.AgentId)) 216 if (!m_ActiveClients.ContainsKey(client.AgentId))
217 { 217 {
218 client.OnUUIDGroupNameRequest += HandleUUIDGroupNameRequest; 218 client.OnUUIDGroupNameRequest += HandleUUIDGroupNameRequest;
219 client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest; 219 client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest;
220 client.OnDirFindQuery += OnDirFindQuery; 220 client.OnDirFindQuery += OnDirFindQuery;
221 client.OnInstantMessage += OnInstantMessage; 221 client.OnInstantMessage += OnInstantMessage;
222 222
223 m_ActiveClients.Add(client.AgentId, client); 223 m_ActiveClients.Add(client.AgentId, client);
224 } 224 }
225 } 225 }
226 226
227 UpdateClientWithGroupInfo(client); 227 UpdateClientWithGroupInfo(client);
228 } 228 }
229 private void OnClientClosed(UUID AgentId) 229 private void OnClientClosed(UUID AgentId)
230 { 230 {
231 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 231 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
232 232
233 lock (m_ActiveClients) 233 lock (m_ActiveClients)
234 { 234 {
235 if (m_ActiveClients.ContainsKey(AgentId)) 235 if (m_ActiveClients.ContainsKey(AgentId))
236 { 236 {
237 IClientAPI client = m_ActiveClients[AgentId]; 237 IClientAPI client = m_ActiveClients[AgentId];
238 client.OnUUIDGroupNameRequest -= HandleUUIDGroupNameRequest; 238 client.OnUUIDGroupNameRequest -= HandleUUIDGroupNameRequest;
239 client.OnAgentDataUpdateRequest -= OnAgentDataUpdateRequest; 239 client.OnAgentDataUpdateRequest -= OnAgentDataUpdateRequest;
240 client.OnDirFindQuery -= OnDirFindQuery; 240 client.OnDirFindQuery -= OnDirFindQuery;
241 client.OnInstantMessage -= OnInstantMessage; 241 client.OnInstantMessage -= OnInstantMessage;
242 242
243 m_ActiveClients.Remove(AgentId); 243 m_ActiveClients.Remove(AgentId);
244 } 244 }
245 else 245 else
246 { 246 {
247 m_log.InfoFormat("[GROUPS] Client closed that wasn't registered here."); 247 m_log.InfoFormat("[GROUPS] Client closed that wasn't registered here.");
248 } 248 }
249 249
250 250
251 } 251 }
252 252
253 } 253 }
254 254
255 255
256 void OnDirFindQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, int queryStart) 256 void OnDirFindQuery(IClientAPI remoteClient, UUID queryID, string queryText, uint queryFlags, int queryStart)
257 { 257 {
258 if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups) 258 if (((DirFindFlags)queryFlags & DirFindFlags.Groups) == DirFindFlags.Groups)
259 { 259 {
260 m_log.InfoFormat("[GROUPS] {0} called with queryText({1}) queryFlags({2}) queryStart({3})", System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart); 260 m_log.InfoFormat("[GROUPS] {0} called with queryText({1}) queryFlags({2}) queryStart({3})", System.Reflection.MethodBase.GetCurrentMethod().Name, queryText, (DirFindFlags)queryFlags, queryStart);
261 261
262 remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(queryText).ToArray()); 262 remoteClient.SendDirGroupsReply(queryID, m_groupData.FindGroups(queryText).ToArray());
263 } 263 }
264 264
265 } 265 }
266 266
267 private void OnAgentDataUpdateRequest(IClientAPI remoteClient, 267 private void OnAgentDataUpdateRequest(IClientAPI remoteClient,
268 UUID AgentID, UUID SessionID) 268 UUID AgentID, UUID SessionID)
269 { 269 {
270 m_log.InfoFormat("[GROUPS] {0} called with SessionID :: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, SessionID); 270 m_log.InfoFormat("[GROUPS] {0} called with SessionID :: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, SessionID);
271 271
272 272
273 UUID ActiveGroupID = UUID.Zero; 273 UUID ActiveGroupID = UUID.Zero;
274 string ActiveGroupTitle = string.Empty; 274 string ActiveGroupTitle = string.Empty;
275 string ActiveGroupName = string.Empty; 275 string ActiveGroupName = string.Empty;
276 ulong ActiveGroupPowers = (ulong)GroupPowers.None; 276 ulong ActiveGroupPowers = (ulong)GroupPowers.None;
277 277
278 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(AgentID); 278 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(AgentID);
279 if (membership != null) 279 if (membership != null)
280 { 280 {
281 ActiveGroupID = membership.GroupID; 281 ActiveGroupID = membership.GroupID;
282 ActiveGroupTitle = membership.GroupTitle; 282 ActiveGroupTitle = membership.GroupTitle;
283 ActiveGroupPowers = membership.GroupPowers; 283 ActiveGroupPowers = membership.GroupPowers;
284 } 284 }
285 285
286 string firstname, lastname; 286 string firstname, lastname;
287 IClientAPI agent; 287 IClientAPI agent;
288 if( m_ActiveClients.TryGetValue(AgentID, out agent) ) 288 if( m_ActiveClients.TryGetValue(AgentID, out agent) )
289 { 289 {
290 firstname = agent.FirstName; 290 firstname = agent.FirstName;
291 lastname = agent.LastName; 291 lastname = agent.LastName;
292 } else { 292 } else {
293 firstname = "Unknown"; 293 firstname = "Unknown";
294 lastname = "Unknown"; 294 lastname = "Unknown";
295 } 295 }
296 296
297 UpdateScenePresenceWithTitle(AgentID, ActiveGroupTitle); 297 UpdateScenePresenceWithTitle(AgentID, ActiveGroupTitle);
298 298
299 remoteClient.SendAgentDataUpdate(AgentID, ActiveGroupID, firstname, 299 remoteClient.SendAgentDataUpdate(AgentID, ActiveGroupID, firstname,
300 lastname, ActiveGroupPowers, ActiveGroupName, 300 lastname, ActiveGroupPowers, ActiveGroupName,
301 ActiveGroupTitle); 301 ActiveGroupTitle);
302 } 302 }
303 303
304 private void HandleUUIDGroupNameRequest(UUID GroupID,IClientAPI remote_client) 304 private void HandleUUIDGroupNameRequest(UUID GroupID,IClientAPI remote_client)
305 { 305 {
306 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 306 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
307 307
308 string GroupName; 308 string GroupName;
309 309
310 GroupRecord group = m_groupData.GetGroupRecord(GroupID, null); 310 GroupRecord group = m_groupData.GetGroupRecord(GroupID, null);
311 if (group != null) 311 if (group != null)
312 { 312 {
313 GroupName = group.GroupName; 313 GroupName = group.GroupName;
314 } 314 }
315 else 315 else
316 { 316 {
317 GroupName = "Unknown"; 317 GroupName = "Unknown";
318 } 318 }
319 319
320 320
321 remote_client.SendGroupNameReply(GroupID, GroupName); 321 remote_client.SendGroupNameReply(GroupID, GroupName);
322 } 322 }
323 323
324 324
325 private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im) 325 private void OnInstantMessage(IClientAPI remoteClient, GridInstantMessage im)
326 { 326 {
327 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 327 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
328 328
329 329
330 // Group invitations 330 // Group invitations
331 if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)) 331 if ((im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) || (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline))
332 { 332 {
333 m_log.WarnFormat("[GROUPS] Received an IIM for {0}.", ((InstantMessageDialog)im.dialog).ToString()); 333 m_log.WarnFormat("[GROUPS] Received an IIM for {0}.", ((InstantMessageDialog)im.dialog).ToString());
334 334
335 335
336 UUID inviteID = new UUID(im.imSessionID); 336 UUID inviteID = new UUID(im.imSessionID);
337 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(inviteID); 337 GroupInviteInfo inviteInfo = m_groupData.GetAgentToGroupInvite(inviteID);
338 338
339 m_log.WarnFormat("[GROUPS] Invite is for Agent {0} to Group {1}.", inviteInfo.AgentID, inviteInfo.GroupID); 339 m_log.WarnFormat("[GROUPS] Invite is for Agent {0} to Group {1}.", inviteInfo.AgentID, inviteInfo.GroupID);
340 340
341 UUID fromAgentID = new UUID(im.fromAgentID); 341 UUID fromAgentID = new UUID(im.fromAgentID);
342 if ((inviteInfo != null) && (fromAgentID == inviteInfo.AgentID)) 342 if ((inviteInfo != null) && (fromAgentID == inviteInfo.AgentID))
343 { 343 {
344 344
345 // Accept 345 // Accept
346 if (im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept) 346 if (im.dialog == (byte)InstantMessageDialog.GroupInvitationAccept)
347 { 347 {
348 m_log.WarnFormat("[GROUPS] Received an accept invite notice."); 348 m_log.WarnFormat("[GROUPS] Received an accept invite notice.");
349 349
350 // and the sessionid is the role 350 // and the sessionid is the role
351 m_groupData.AddAgentToGroup(inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID); 351 m_groupData.AddAgentToGroup(inviteInfo.AgentID, inviteInfo.GroupID, inviteInfo.RoleID);
352 352
353 if (m_MsgTransferModule != null) 353 if (m_MsgTransferModule != null)
354 { 354 {
355 GridInstantMessage msg = new GridInstantMessage(); 355 GridInstantMessage msg = new GridInstantMessage();
356 msg.imSessionID = UUID.Zero.Guid; 356 msg.imSessionID = UUID.Zero.Guid;
357 msg.fromAgentID = UUID.Zero.Guid; 357 msg.fromAgentID = UUID.Zero.Guid;
358 msg.toAgentID = inviteInfo.AgentID.Guid; 358 msg.toAgentID = inviteInfo.AgentID.Guid;
359 msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 359 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
360 msg.fromAgentName = "Groups"; 360 msg.fromAgentName = "Groups";
361 msg.message = string.Format("You have been added to the group."); 361 msg.message = string.Format("You have been added to the group.");
362 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageBox; 362 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageBox;
363 msg.fromGroup = false; 363 msg.fromGroup = false;
364 msg.offline = (byte)0; 364 msg.offline = (byte)0;
365 msg.ParentEstateID = 0; 365 msg.ParentEstateID = 0;
366 msg.Position = Vector3.Zero; 366 msg.Position = Vector3.Zero;
367 msg.RegionID = UUID.Zero.Guid; 367 msg.RegionID = UUID.Zero.Guid;
368 msg.binaryBucket = new byte[0]; 368 msg.binaryBucket = new byte[0];
369 369
370 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { }); 370 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
371 } 371 }
372 372
373 UpdateAllClientsWithGroupInfo(); 373 UpdateAllClientsWithGroupInfo();
374 374
375 m_groupData.RemoveAgentToGroupInvite(inviteID); 375 m_groupData.RemoveAgentToGroupInvite(inviteID);
376 } 376 }
377 377
378 // Reject 378 // Reject
379 if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline) 379 if (im.dialog == (byte)InstantMessageDialog.GroupInvitationDecline)
380 { 380 {
381 m_log.WarnFormat("[GROUPS] Received a reject invite notice."); 381 m_log.WarnFormat("[GROUPS] Received a reject invite notice.");
382 m_groupData.RemoveAgentToGroupInvite(inviteID); 382 m_groupData.RemoveAgentToGroupInvite(inviteID);
383 383
384 } 384 }
385 385
386 386
387 } 387 }
388 } 388 }
389 389
390 // Group notices 390 // Group notices
391 if ((im.dialog == (byte)InstantMessageDialog.GroupNotice)) 391 if ((im.dialog == (byte)InstantMessageDialog.GroupNotice))
392 { 392 {
393 if (!m_GroupNoticesEnabled) 393 if (!m_GroupNoticesEnabled)
394 { 394 {
395 return; 395 return;
396 } 396 }
397 397
398 UUID GroupID = new UUID(im.toAgentID); 398 UUID GroupID = new UUID(im.toAgentID);
399 if( m_groupData.GetGroupRecord(GroupID, null) != null) 399 if( m_groupData.GetGroupRecord(GroupID, null) != null)
400 { 400 {
401 UUID NoticeID = UUID.Random(); 401 UUID NoticeID = UUID.Random();
402 string Subject = im.message.Substring(0, im.message.IndexOf('|')); 402 string Subject = im.message.Substring(0, im.message.IndexOf('|'));
403 string Message = im.message.Substring(Subject.Length + 1); 403 string Message = im.message.Substring(Subject.Length + 1);
404 404
405 byte[] bucket; 405 byte[] bucket;
406 406
407 if ((im.binaryBucket.Length == 1) && (im.binaryBucket[0] == 0)) 407 if ((im.binaryBucket.Length == 1) && (im.binaryBucket[0] == 0))
408 { 408 {
409 bucket = new byte[19]; 409 bucket = new byte[19];
410 bucket[0] = 0; //dunno 410 bucket[0] = 0; //dunno
411 bucket[1] = 0; //dunno 411 bucket[1] = 0; //dunno
412 GroupID.ToBytes(bucket, 2); 412 GroupID.ToBytes(bucket, 2);
413 bucket[18] = 0; //dunno 413 bucket[18] = 0; //dunno
414 } 414 }
415 else 415 else
416 { 416 {
417 string binBucket = OpenMetaverse.Utils.BytesToString(im.binaryBucket); 417 string binBucket = OpenMetaverse.Utils.BytesToString(im.binaryBucket);
418 binBucket = binBucket.Remove(0, 14).Trim(); 418 binBucket = binBucket.Remove(0, 14).Trim();
419 m_log.WarnFormat("I don't understand a group notice binary bucket of: {0}", binBucket); 419 m_log.WarnFormat("I don't understand a group notice binary bucket of: {0}", binBucket);
420 420
421 OSDMap binBucketOSD = (OSDMap)OSDParser.DeserializeLLSDXml(binBucket); 421 OSDMap binBucketOSD = (OSDMap)OSDParser.DeserializeLLSDXml(binBucket);
422 422
423 foreach (string key in binBucketOSD.Keys) 423 foreach (string key in binBucketOSD.Keys)
424 { 424 {
425 m_log.WarnFormat("{0}: {1}", key, binBucketOSD[key].ToString()); 425 m_log.WarnFormat("{0}: {1}", key, binBucketOSD[key].ToString());
426 } 426 }
427 427
428 // treat as if no attachment 428 // treat as if no attachment
429 bucket = new byte[19]; 429 bucket = new byte[19];
430 bucket[0] = 0; //dunno 430 bucket[0] = 0; //dunno
431 bucket[1] = 0; //dunno 431 bucket[1] = 0; //dunno
432 GroupID.ToBytes(bucket, 2); 432 GroupID.ToBytes(bucket, 2);
433 bucket[18] = 0; //dunno 433 bucket[18] = 0; //dunno
434 } 434 }
435 435
436 436
437 m_groupData.AddGroupNotice(GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket); 437 m_groupData.AddGroupNotice(GroupID, NoticeID, im.fromAgentName, Subject, Message, bucket);
438 if (OnNewGroupNotice != null) 438 if (OnNewGroupNotice != null)
439 { 439 {
440 OnNewGroupNotice(GroupID, NoticeID); 440 OnNewGroupNotice(GroupID, NoticeID);
441 } 441 }
442 442
443 // Build notice IIM 443 // Build notice IIM
444 GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice); 444 GridInstantMessage msg = CreateGroupNoticeIM(UUID.Zero, NoticeID, (byte)OpenMetaverse.InstantMessageDialog.GroupNotice);
445 445
446 // Send notice out to everyone that wants notices 446 // Send notice out to everyone that wants notices
447 foreach( GroupMembersData member in m_groupData.GetGroupMembers(GroupID) ) 447 foreach( GroupMembersData member in m_groupData.GetGroupMembers(GroupID) )
448 { 448 {
449 if( member.AcceptNotices ) 449 if( member.AcceptNotices )
450 { 450 {
451 msg.toAgentID = member.AgentID.Guid; 451 msg.toAgentID = member.AgentID.Guid;
452 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { }); 452 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
453 453
454 } 454 }
455 } 455 }
456 456
457 457
458 458
459 } 459 }
460 } 460 }
461 461
462 // Interop, received special 210 code for ejecting a group member 462 // Interop, received special 210 code for ejecting a group member
463 // this only works within the comms servers domain, and won't work hypergrid 463 // this only works within the comms servers domain, and won't work hypergrid
464 // TODO:FIXME: Use a presense server of some kind to find out where the 464 // TODO:FIXME: Use a presense server of some kind to find out where the
465 // client actually is, and try contacting that region directly to notify them, 465 // client actually is, and try contacting that region directly to notify them,
466 // or provide the notification via xmlrpc update queue 466 // or provide the notification via xmlrpc update queue
467 if ((im.dialog == 210)) 467 if ((im.dialog == 210))
468 { 468 {
469 // This is sent from the region that the ejectee was ejected from 469 // This is sent from the region that the ejectee was ejected from
470 // if it's being delivered here, then the ejectee is here 470 // if it's being delivered here, then the ejectee is here
471 // so we need to send local updates to the agent. 471 // so we need to send local updates to the agent.
472 472
473 473
474 if (m_MsgTransferModule != null) 474 if (m_MsgTransferModule != null)
475 { 475 {
476 im.dialog = (byte)InstantMessageDialog.MessageFromAgent; 476 im.dialog = (byte)InstantMessageDialog.MessageFromAgent;
477 m_MsgTransferModule.SendInstantMessage(im, delegate(bool success) { }); 477 m_MsgTransferModule.SendInstantMessage(im, delegate(bool success) { });
478 } 478 }
479 479
480 UUID ejecteeID = new UUID(im.toAgentID); 480 UUID ejecteeID = new UUID(im.toAgentID);
481 UUID groupID = new UUID(im.toAgentID); 481 UUID groupID = new UUID(im.toAgentID);
482 if (m_ActiveClients.ContainsKey(ejecteeID)) 482 if (m_ActiveClients.ContainsKey(ejecteeID))
483 { 483 {
484 m_ActiveClients[ejecteeID].SendAgentDropGroup(groupID); 484 m_ActiveClients[ejecteeID].SendAgentDropGroup(groupID);
485 } 485 }
486 486
487 } 487 }
488 488
489 489
490 490
491 } 491 }
492 492
493 private void OnGridInstantMessage(GridInstantMessage msg) 493 private void OnGridInstantMessage(GridInstantMessage msg)
494 { 494 {
495 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 495 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
496 496
497 // Trigger the above event handler 497 // Trigger the above event handler
498 OnInstantMessage(null, msg); 498 OnInstantMessage(null, msg);
499 } 499 }
500 500
501 501
502 #endregion 502 #endregion
503 503
504 504
505 private void UpdateScenePresenceWithTitle(UUID AgentID, string Title) 505 private void UpdateScenePresenceWithTitle(UUID AgentID, string Title)
506 { 506 {
507 m_log.DebugFormat("[GROUPS] Updating scene title for {0} with title: {1}", AgentID, Title); 507 m_log.DebugFormat("[GROUPS] Updating scene title for {0} with title: {1}", AgentID, Title);
508 ScenePresence presence = null; 508 ScenePresence presence = null;
509 lock (m_SceneList) 509 lock (m_SceneList)
510 { 510 {
511 foreach (Scene scene in m_SceneList) 511 foreach (Scene scene in m_SceneList)
512 { 512 {
513 presence = scene.GetScenePresence(AgentID); 513 presence = scene.GetScenePresence(AgentID);
514 if (presence != null) 514 if (presence != null)
515 { 515 {
516 presence.Grouptitle = Title; 516 presence.Grouptitle = Title;
517 517
518 // FixMe: Ter suggests a "Schedule" method that I can't find. 518 // FixMe: Ter suggests a "Schedule" method that I can't find.
519 presence.SendFullUpdateToAllClients(); 519 presence.SendFullUpdateToAllClients();
520 } 520 }
521 } 521 }
522 } 522 }
523 } 523 }
524 524
525 525
526 #region IGroupsModule Members 526 #region IGroupsModule Members
527 527
528 public event NewGroupNotice OnNewGroupNotice; 528 public event NewGroupNotice OnNewGroupNotice;
529 529
530 public GroupRecord GetGroupRecord(UUID GroupID) 530 public GroupRecord GetGroupRecord(UUID GroupID)
531 { 531 {
532 return m_groupData.GetGroupRecord(GroupID, null); 532 return m_groupData.GetGroupRecord(GroupID, null);
533 } 533 }
534 534
535 public void ActivateGroup(IClientAPI remoteClient, UUID groupID) 535 public void ActivateGroup(IClientAPI remoteClient, UUID groupID)
536 { 536 {
537 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 537 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
538 538
539 m_groupData.SetAgentActiveGroup(remoteClient.AgentId, groupID); 539 m_groupData.SetAgentActiveGroup(remoteClient.AgentId, groupID);
540 540
541 // UpdateClientWithGroupInfo(remoteClient); 541 // UpdateClientWithGroupInfo(remoteClient);
542 UpdateAllClientsWithGroupInfo(); 542 UpdateAllClientsWithGroupInfo();
543 } 543 }
544 544
545 /// <summary> 545 /// <summary>
546 /// Get the Role Titles for an Agent, for a specific group 546 /// Get the Role Titles for an Agent, for a specific group
547 /// </summary> 547 /// </summary>
548 public List<GroupTitlesData> GroupTitlesRequest(IClientAPI remoteClient, UUID groupID) 548 public List<GroupTitlesData> GroupTitlesRequest(IClientAPI remoteClient, UUID groupID)
549 { 549 {
550 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 550 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
551 551
552 List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(remoteClient.AgentId, groupID); 552 List<GroupRolesData> agentRoles = m_groupData.GetAgentGroupRoles(remoteClient.AgentId, groupID);
553 GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(remoteClient.AgentId, groupID); 553 GroupMembershipData agentMembership = m_groupData.GetAgentGroupMembership(remoteClient.AgentId, groupID);
554 554
555 List<GroupTitlesData> titles = new List<GroupTitlesData>(); 555 List<GroupTitlesData> titles = new List<GroupTitlesData>();
556 foreach (GroupRolesData role in agentRoles) 556 foreach (GroupRolesData role in agentRoles)
557 { 557 {
558 GroupTitlesData title = new GroupTitlesData(); 558 GroupTitlesData title = new GroupTitlesData();
559 title.Name = role.Name; 559 title.Name = role.Name;
560 if (agentMembership != null) 560 if (agentMembership != null)
561 { 561 {
562 title.Selected = agentMembership.ActiveRole == role.RoleID; 562 title.Selected = agentMembership.ActiveRole == role.RoleID;
563 } 563 }
564 title.UUID = role.RoleID; 564 title.UUID = role.RoleID;
565 565
566 titles.Add(title); 566 titles.Add(title);
567 } 567 }
568 568
569 return titles; 569 return titles;
570 } 570 }
571 571
572 public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID) 572 public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID)
573 { 573 {
574 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 574 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
575 575
576 List<GroupMembersData> data = m_groupData.GetGroupMembers(groupID); 576 List<GroupMembersData> data = m_groupData.GetGroupMembers(groupID);
577 577
578 foreach (GroupMembersData member in data) 578 foreach (GroupMembersData member in data)
579 { 579 {
580 m_log.InfoFormat("[GROUPS] {0} {1}", member.AgentID, member.Title); 580 m_log.InfoFormat("[GROUPS] {0} {1}", member.AgentID, member.Title);
581 } 581 }
582 582
583 return data; 583 return data;
584 584
585 } 585 }
586 586
587 public List<GroupRolesData> GroupRoleDataRequest(IClientAPI remoteClient, UUID groupID) 587 public List<GroupRolesData> GroupRoleDataRequest(IClientAPI remoteClient, UUID groupID)
588 { 588 {
589 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 589 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
590 590
591 List<GroupRolesData> data = m_groupData.GetGroupRoles(groupID); 591 List<GroupRolesData> data = m_groupData.GetGroupRoles(groupID);
592 592
593 foreach (GroupRolesData member in data) 593 foreach (GroupRolesData member in data)
594 { 594 {
595 m_log.InfoFormat("[GROUPS] {0} {1}", member.Title, member.Members); 595 m_log.InfoFormat("[GROUPS] {0} {1}", member.Title, member.Members);
596 } 596 }
597 597
598 return data; 598 return data;
599 599
600 } 600 }
601 601
602 public List<GroupRoleMembersData> GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID) 602 public List<GroupRoleMembersData> GroupRoleMembersRequest(IClientAPI remoteClient, UUID groupID)
603 { 603 {
604 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 604 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
605 605
606 List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(groupID); 606 List<GroupRoleMembersData> data = m_groupData.GetGroupRoleMembers(groupID);
607 607
608 foreach (GroupRoleMembersData member in data) 608 foreach (GroupRoleMembersData member in data)
609 { 609 {
610 m_log.InfoFormat("[GROUPS] Av: {0} Role: {1}", member.MemberID, member.RoleID); 610 m_log.InfoFormat("[GROUPS] Av: {0} Role: {1}", member.MemberID, member.RoleID);
611 } 611 }
612 612
613 return data; 613 return data;
614 614
615 615
616 } 616 }
617 617
618 public GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID) 618 public GroupProfileData GroupProfileRequest(IClientAPI remoteClient, UUID groupID)
619 { 619 {
620 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 620 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
621 621
622 GroupProfileData profile = new GroupProfileData(); 622 GroupProfileData profile = new GroupProfileData();
623 623
624 GroupRecord groupInfo = m_groupData.GetGroupRecord(groupID, null); 624 GroupRecord groupInfo = m_groupData.GetGroupRecord(groupID, null);
625 if (groupInfo != null) 625 if (groupInfo != null)
626 { 626 {
627 profile.AllowPublish = groupInfo.AllowPublish; 627 profile.AllowPublish = groupInfo.AllowPublish;
628 profile.Charter = groupInfo.Charter; 628 profile.Charter = groupInfo.Charter;
629 profile.FounderID = groupInfo.FounderID; 629 profile.FounderID = groupInfo.FounderID;
630 profile.GroupID = groupID; 630 profile.GroupID = groupID;
631 profile.GroupMembershipCount = m_groupData.GetGroupMembers(groupID).Count; 631 profile.GroupMembershipCount = m_groupData.GetGroupMembers(groupID).Count;
632 profile.GroupRolesCount = m_groupData.GetGroupRoles(groupID).Count; 632 profile.GroupRolesCount = m_groupData.GetGroupRoles(groupID).Count;
633 profile.InsigniaID = groupInfo.GroupPicture; 633 profile.InsigniaID = groupInfo.GroupPicture;
634 profile.MaturePublish = groupInfo.MaturePublish; 634 profile.MaturePublish = groupInfo.MaturePublish;
635 profile.MembershipFee = groupInfo.MembershipFee; 635 profile.MembershipFee = groupInfo.MembershipFee;
636 profile.Money = 0; // TODO: Get this from the currency server? 636 profile.Money = 0; // TODO: Get this from the currency server?
637 profile.Name = groupInfo.GroupName; 637 profile.Name = groupInfo.GroupName;
638 profile.OpenEnrollment = groupInfo.OpenEnrollment; 638 profile.OpenEnrollment = groupInfo.OpenEnrollment;
639 profile.OwnerRole = groupInfo.OwnerRoleID; 639 profile.OwnerRole = groupInfo.OwnerRoleID;
640 profile.ShowInList = groupInfo.ShowInList; 640 profile.ShowInList = groupInfo.ShowInList;
641 } 641 }
642 642
643 GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(remoteClient.AgentId, groupID); 643 GroupMembershipData memberInfo = m_groupData.GetAgentGroupMembership(remoteClient.AgentId, groupID);
644 if (memberInfo != null) 644 if (memberInfo != null)
645 { 645 {
646 profile.MemberTitle = memberInfo.GroupTitle; 646 profile.MemberTitle = memberInfo.GroupTitle;
647 profile.PowersMask = memberInfo.GroupPowers; 647 profile.PowersMask = memberInfo.GroupPowers;
648 } 648 }
649 649
650 return profile; 650 return profile;
651 } 651 }
652 652
653 public GroupMembershipData[] GetMembershipData(UUID UserID) 653 public GroupMembershipData[] GetMembershipData(UUID UserID)
654 { 654 {
655 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 655 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
656 656
657 return m_groupData.GetAgentGroupMemberships(UserID).ToArray(); 657 return m_groupData.GetAgentGroupMemberships(UserID).ToArray();
658 } 658 }
659 659
660 public GroupMembershipData GetMembershipData(UUID GroupID, UUID UserID) 660 public GroupMembershipData GetMembershipData(UUID GroupID, UUID UserID)
661 { 661 {
662 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 662 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
663 663
664 return m_groupData.GetAgentGroupMembership(UserID, GroupID); 664 return m_groupData.GetAgentGroupMembership(UserID, GroupID);
665 } 665 }
666 666
667 public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) 667 public void UpdateGroupInfo(IClientAPI remoteClient, UUID groupID, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
668 { 668 {
669 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 669 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
670 670
671 // TODO: Security Check? 671 // TODO: Security Check?
672 672
673 m_groupData.UpdateGroup(groupID, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish); 673 m_groupData.UpdateGroup(groupID, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish);
674 } 674 }
675 675
676 public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile) 676 public void SetGroupAcceptNotices(IClientAPI remoteClient, UUID groupID, bool acceptNotices, bool listInProfile)
677 { 677 {
678 // TODO: Security Check? 678 // TODO: Security Check?
679 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 679 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
680 680
681 m_groupData.SetAgentGroupInfo(remoteClient.AgentId, groupID, acceptNotices, listInProfile); 681 m_groupData.SetAgentGroupInfo(remoteClient.AgentId, groupID, acceptNotices, listInProfile);
682 } 682 }
683 683
684 public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish) 684 public UUID CreateGroup(IClientAPI remoteClient, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment, bool allowPublish, bool maturePublish)
685 { 685 {
686 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 686 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
687 687
688 if( m_groupData.GetGroupRecord(UUID.Zero, name) != null ) 688 if( m_groupData.GetGroupRecord(UUID.Zero, name) != null )
689 { 689 {
690 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists."); 690 remoteClient.SendCreateGroupReply(UUID.Zero, false, "A group with the same name already exists.");
691 return UUID.Zero; 691 return UUID.Zero;
692 } 692 }
693 693
694 UUID GroupID = m_groupData.CreateGroup(name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, remoteClient.AgentId); 694 UUID GroupID = m_groupData.CreateGroup(name, charter, showInList, insigniaID, membershipFee, openEnrollment, allowPublish, maturePublish, remoteClient.AgentId);
695 695
696 remoteClient.SendCreateGroupReply(GroupID, true, "Group created successfullly"); 696 remoteClient.SendCreateGroupReply(GroupID, true, "Group created successfullly");
697 697
698 UpdateClientWithGroupInfo(remoteClient); 698 UpdateClientWithGroupInfo(remoteClient);
699 699
700 return GroupID; 700 return GroupID;
701 } 701 }
702 702
703 public GroupNoticeData[] GroupNoticesListRequest(IClientAPI remoteClient, UUID GroupID) 703 public GroupNoticeData[] GroupNoticesListRequest(IClientAPI remoteClient, UUID GroupID)
704 { 704 {
705 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 705 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
706 706
707 // ToDo: check if agent is a member of group and is allowed to see notices? 707 // ToDo: check if agent is a member of group and is allowed to see notices?
708 708
709 return m_groupData.GetGroupNotices(GroupID).ToArray(); 709 return m_groupData.GetGroupNotices(GroupID).ToArray();
710 } 710 }
711 711
712 /// <summary> 712 /// <summary>
713 /// Get the title of the agent's current role. 713 /// Get the title of the agent's current role.
714 /// </summary> 714 /// </summary>
715 public string GetGroupTitle(UUID avatarID) 715 public string GetGroupTitle(UUID avatarID)
716 { 716 {
717 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 717 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
718 718
719 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(avatarID); 719 GroupMembershipData membership = m_groupData.GetAgentActiveMembership(avatarID);
720 if (membership != null) 720 if (membership != null)
721 { 721 {
722 return membership.GroupTitle; 722 return membership.GroupTitle;
723 } 723 }
724 return string.Empty; 724 return string.Empty;
725 } 725 }
726 726
727 /// <summary> 727 /// <summary>
728 /// Change the current Active Group Role for Agent 728 /// Change the current Active Group Role for Agent
729 /// </summary> 729 /// </summary>
730 public void GroupTitleUpdate(IClientAPI remoteClient, UUID GroupID, UUID TitleRoleID) 730 public void GroupTitleUpdate(IClientAPI remoteClient, UUID GroupID, UUID TitleRoleID)
731 { 731 {
732 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 732 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
733 733
734 m_groupData.SetAgentActiveGroupRole(remoteClient.AgentId, GroupID, TitleRoleID); 734 m_groupData.SetAgentActiveGroupRole(remoteClient.AgentId, GroupID, TitleRoleID);
735 735
736 UpdateAllClientsWithGroupInfo(); 736 UpdateAllClientsWithGroupInfo();
737 } 737 }
738 738
739 739
740 public void GroupRoleUpdate(IClientAPI remoteClient, UUID groupID, UUID roleID, string name, string description, string title, ulong powers, byte updateType) 740 public void GroupRoleUpdate(IClientAPI remoteClient, UUID groupID, UUID roleID, string name, string description, string title, ulong powers, byte updateType)
741 { 741 {
742 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 742 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
743 743
744 // TODO: Security Checks? 744 // TODO: Security Checks?
745 745
746 switch ((OpenMetaverse.GroupRoleUpdate)updateType) 746 switch ((OpenMetaverse.GroupRoleUpdate)updateType)
747 { 747 {
748 case OpenMetaverse.GroupRoleUpdate.Create: 748 case OpenMetaverse.GroupRoleUpdate.Create:
749 m_groupData.AddGroupRole(groupID, UUID.Random(), name, description, title, powers); 749 m_groupData.AddGroupRole(groupID, UUID.Random(), name, description, title, powers);
750 break; 750 break;
751 751
752 case OpenMetaverse.GroupRoleUpdate.Delete: 752 case OpenMetaverse.GroupRoleUpdate.Delete:
753 m_groupData.RemoveGroupRole(groupID, roleID); 753 m_groupData.RemoveGroupRole(groupID, roleID);
754 break; 754 break;
755 755
756 case OpenMetaverse.GroupRoleUpdate.UpdateAll: 756 case OpenMetaverse.GroupRoleUpdate.UpdateAll:
757 case OpenMetaverse.GroupRoleUpdate.UpdateData: 757 case OpenMetaverse.GroupRoleUpdate.UpdateData:
758 case OpenMetaverse.GroupRoleUpdate.UpdatePowers: 758 case OpenMetaverse.GroupRoleUpdate.UpdatePowers:
759 m_groupData.UpdateGroupRole(groupID, roleID, name, description, title, powers); 759 m_groupData.UpdateGroupRole(groupID, roleID, name, description, title, powers);
760 break; 760 break;
761 761
762 case OpenMetaverse.GroupRoleUpdate.NoUpdate: 762 case OpenMetaverse.GroupRoleUpdate.NoUpdate:
763 default: 763 default:
764 // No Op 764 // No Op
765 break; 765 break;
766 766
767 } 767 }
768 768
769 UpdateClientWithGroupInfo(remoteClient); 769 UpdateClientWithGroupInfo(remoteClient);
770 } 770 }
771 771
772 public void GroupRoleChanges(IClientAPI remoteClient, UUID groupID, UUID roleID, UUID memberID, uint changes) 772 public void GroupRoleChanges(IClientAPI remoteClient, UUID groupID, UUID roleID, UUID memberID, uint changes)
773 { 773 {
774 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 774 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
775 // Todo: Security check 775 // Todo: Security check
776 776
777 switch (changes) 777 switch (changes)
778 { 778 {
779 case 0: 779 case 0:
780 // Add 780 // Add
781 m_groupData.AddAgentToGroupRole(memberID, groupID, roleID); 781 m_groupData.AddAgentToGroupRole(memberID, groupID, roleID);
782 782
783 break; 783 break;
784 case 1: 784 case 1:
785 // Remove 785 // Remove
786 m_groupData.RemoveAgentFromGroupRole(memberID, groupID, roleID); 786 m_groupData.RemoveAgentFromGroupRole(memberID, groupID, roleID);
787 787
788 break; 788 break;
789 default: 789 default:
790 m_log.ErrorFormat("[GROUPS] {0} does not understand changes == {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, changes); 790 m_log.ErrorFormat("[GROUPS] {0} does not understand changes == {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, changes);
791 break; 791 break;
792 } 792 }
793 UpdateClientWithGroupInfo(remoteClient); 793 UpdateClientWithGroupInfo(remoteClient);
794 } 794 }
795 795
796 public void GroupNoticeRequest(IClientAPI remoteClient, UUID groupNoticeID) 796 public void GroupNoticeRequest(IClientAPI remoteClient, UUID groupNoticeID)
797 { 797 {
798 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 798 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
799 799
800 800
801 GroupNoticeInfo data = m_groupData.GetGroupNotice(groupNoticeID); 801 GroupNoticeInfo data = m_groupData.GetGroupNotice(groupNoticeID);
802 802
803 if (data != null) 803 if (data != null)
804 { 804 {
805 if (m_MsgTransferModule != null) 805 if (m_MsgTransferModule != null)
806 { 806 {
807 GridInstantMessage msg = new GridInstantMessage(); 807 GridInstantMessage msg = new GridInstantMessage();
808 msg.imSessionID = UUID.Zero.Guid; 808 msg.imSessionID = UUID.Zero.Guid;
809 msg.fromAgentID = data.GroupID.Guid; 809 msg.fromAgentID = data.GroupID.Guid;
810 msg.toAgentID = remoteClient.AgentId.Guid; 810 msg.toAgentID = remoteClient.AgentId.Guid;
811 msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 811 msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
812 msg.fromAgentName = "Group Notice From"; 812 msg.fromAgentName = "Group Notice From";
813 msg.message = data.noticeData.Subject + "|" + data.Message; 813 msg.message = data.noticeData.Subject + "|" + data.Message;
814 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNoticeRequested; 814 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNoticeRequested;
815 msg.fromGroup = true; 815 msg.fromGroup = true;
816 msg.offline = (byte)0; 816 msg.offline = (byte)0;
817 msg.ParentEstateID = 0; 817 msg.ParentEstateID = 0;
818 msg.Position = Vector3.Zero; 818 msg.Position = Vector3.Zero;
819 msg.RegionID = UUID.Zero.Guid; 819 msg.RegionID = UUID.Zero.Guid;
820 msg.binaryBucket = data.BinaryBucket; 820 msg.binaryBucket = data.BinaryBucket;
821 821
822 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { }); 822 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { });
823 } 823 }
824 } 824 }
825 825
826 } 826 }
827 827
828 public GridInstantMessage CreateGroupNoticeIM(UUID agentID, UUID groupNoticeID, byte dialog) 828 public GridInstantMessage CreateGroupNoticeIM(UUID agentID, UUID groupNoticeID, byte dialog)
829 { 829 {
830 m_log.WarnFormat("[GROUPS] {0} is probably not properly implemented", System.Reflection.MethodBase.GetCurrentMethod().Name); 830 m_log.WarnFormat("[GROUPS] {0} is probably not properly implemented", System.Reflection.MethodBase.GetCurrentMethod().Name);
831 831
832 GridInstantMessage msg = new GridInstantMessage(); 832 GridInstantMessage msg = new GridInstantMessage();
833 msg.imSessionID = UUID.Zero.Guid; 833 msg.imSessionID = UUID.Zero.Guid;
834 msg.toAgentID = agentID.Guid; 834 msg.toAgentID = agentID.Guid;
835 msg.dialog = dialog; 835 msg.dialog = dialog;
836 // msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNotice; 836 // msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupNotice;
837 msg.fromGroup = true; 837 msg.fromGroup = true;
838 msg.offline = (byte)0; 838 msg.offline = (byte)0;
839 msg.ParentEstateID = 0; 839 msg.ParentEstateID = 0;
840 msg.Position = Vector3.Zero; 840 msg.Position = Vector3.Zero;
841 msg.RegionID = UUID.Zero.Guid; 841 msg.RegionID = UUID.Zero.Guid;
842 842
843 GroupNoticeInfo info = m_groupData.GetGroupNotice(groupNoticeID); 843 GroupNoticeInfo info = m_groupData.GetGroupNotice(groupNoticeID);
844 if (info != null) 844 if (info != null)
845 { 845 {
846 msg.fromAgentID = info.GroupID.Guid; 846 msg.fromAgentID = info.GroupID.Guid;
847 msg.timestamp = info.noticeData.Timestamp; 847 msg.timestamp = info.noticeData.Timestamp;
848 msg.fromAgentName = info.noticeData.FromName; 848 msg.fromAgentName = info.noticeData.FromName;
849 msg.message = info.noticeData.Subject + "|" + info.Message; 849 msg.message = info.noticeData.Subject + "|" + info.Message;
850 msg.binaryBucket = info.BinaryBucket; 850 msg.binaryBucket = info.BinaryBucket;
851 } 851 }
852 852
853 return msg; 853 return msg;
854 } 854 }
855 855
856 public void SendAgentGroupDataUpdate(IClientAPI remoteClient) 856 public void SendAgentGroupDataUpdate(IClientAPI remoteClient)
857 { 857 {
858 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 858 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
859 859
860 UpdateClientWithGroupInfo(remoteClient); 860 UpdateClientWithGroupInfo(remoteClient);
861 } 861 }
862 862
863 public void JoinGroupRequest(IClientAPI remoteClient, UUID groupID) 863 public void JoinGroupRequest(IClientAPI remoteClient, UUID groupID)
864 { 864 {
865 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 865 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
866 866
867 // Should check to see if OpenEnrollment, or if there's an outstanding invitation 867 // Should check to see if OpenEnrollment, or if there's an outstanding invitation
868 m_groupData.AddAgentToGroup(remoteClient.AgentId, groupID, UUID.Zero); 868 m_groupData.AddAgentToGroup(remoteClient.AgentId, groupID, UUID.Zero);
869 869
870 remoteClient.SendJoinGroupReply(groupID, true); 870 remoteClient.SendJoinGroupReply(groupID, true);
871 871
872 UpdateClientWithGroupInfo(remoteClient); 872 UpdateClientWithGroupInfo(remoteClient);
873 } 873 }
874 874
875 public void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID) 875 public void LeaveGroupRequest(IClientAPI remoteClient, UUID GroupID)
876 { 876 {
877 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 877 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
878 878
879 m_groupData.RemoveAgentFromGroup(remoteClient.AgentId, GroupID); 879 m_groupData.RemoveAgentFromGroup(remoteClient.AgentId, GroupID);
880 880
881 remoteClient.SendLeaveGroupReply(GroupID, true); 881 remoteClient.SendLeaveGroupReply(GroupID, true);
882 882
883 remoteClient.SendAgentDropGroup(GroupID); 883 remoteClient.SendAgentDropGroup(GroupID);
884 884
885 UpdateClientWithGroupInfo(remoteClient); 885 UpdateClientWithGroupInfo(remoteClient);
886 } 886 }
887 887
888 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID) 888 public void EjectGroupMemberRequest(IClientAPI remoteClient, UUID GroupID, UUID EjecteeID)
889 { 889 {
890 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 890 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
891 891
892 // Todo: Security check? 892 // Todo: Security check?
893 m_groupData.RemoveAgentFromGroup(EjecteeID, GroupID); 893 m_groupData.RemoveAgentFromGroup(EjecteeID, GroupID);
894 894
895 remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, GroupID, true); 895 remoteClient.SendEjectGroupMemberReply(remoteClient.AgentId, GroupID, true);
896 896
897 if (m_MsgTransferModule != null) 897 if (m_MsgTransferModule != null)
898 { 898 {
899 GroupRecord groupInfo = m_groupData.GetGroupRecord(GroupID, null); 899 GroupRecord groupInfo = m_groupData.GetGroupRecord(GroupID, null);
900 UserProfileData userProfile = m_SceneList[0].CommsManager.UserService.GetUserProfile(EjecteeID); 900 UserProfileData userProfile = m_SceneList[0].CommsManager.UserService.GetUserProfile(EjecteeID);
901 901
902 if ((groupInfo == null) || (userProfile == null)) 902 if ((groupInfo == null) || (userProfile == null))
903 { 903 {
904 return; 904 return;
905 } 905 }
906 906
907 907
908 // Send Message to Ejectee 908 // Send Message to Ejectee
909 GridInstantMessage msg = new GridInstantMessage(); 909 GridInstantMessage msg = new GridInstantMessage();
910 910
911 msg.imSessionID = UUID.Zero.Guid; 911 msg.imSessionID = UUID.Zero.Guid;
912 msg.fromAgentID = remoteClient.AgentId.Guid; 912 msg.fromAgentID = remoteClient.AgentId.Guid;
913 // msg.fromAgentID = info.GroupID; 913 // msg.fromAgentID = info.GroupID;
914 msg.toAgentID = EjecteeID.Guid; 914 msg.toAgentID = EjecteeID.Guid;
915 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 915 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
916 msg.timestamp = 0; 916 msg.timestamp = 0;
917 msg.fromAgentName = remoteClient.Name; 917 msg.fromAgentName = remoteClient.Name;
918 msg.message = string.Format("You have been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName); 918 msg.message = string.Format("You have been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName);
919 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent; 919 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent;
920 msg.fromGroup = false; 920 msg.fromGroup = false;
921 msg.offline = (byte)0; 921 msg.offline = (byte)0;
922 msg.ParentEstateID = 0; 922 msg.ParentEstateID = 0;
923 msg.Position = Vector3.Zero; 923 msg.Position = Vector3.Zero;
924 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 924 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid;
925 msg.binaryBucket = new byte[0]; 925 msg.binaryBucket = new byte[0];
926 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { m_log.DebugFormat("[GROUPS] Message Sent Success: {0}", success,ToString()); }); 926 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { m_log.DebugFormat("[GROUPS] Message Sent Success: {0}", success,ToString()); });
927 927
928 928
929 // Message to ejector 929 // Message to ejector
930 // Interop, received special 210 code for ejecting a group member 930 // Interop, received special 210 code for ejecting a group member
931 // this only works within the comms servers domain, and won't work hypergrid 931 // this only works within the comms servers domain, and won't work hypergrid
932 // TODO:FIXME: Use a presense server of some kind to find out where the 932 // TODO:FIXME: Use a presense server of some kind to find out where the
933 // client actually is, and try contacting that region directly to notify them, 933 // client actually is, and try contacting that region directly to notify them,
934 // or provide the notification via xmlrpc update queue 934 // or provide the notification via xmlrpc update queue
935 935
936 msg = new GridInstantMessage(); 936 msg = new GridInstantMessage();
937 msg.imSessionID = UUID.Zero.Guid; 937 msg.imSessionID = UUID.Zero.Guid;
938 msg.fromAgentID = remoteClient.AgentId.Guid; 938 msg.fromAgentID = remoteClient.AgentId.Guid;
939 msg.toAgentID = remoteClient.AgentId.Guid; 939 msg.toAgentID = remoteClient.AgentId.Guid;
940 msg.timestamp = 0; 940 msg.timestamp = 0;
941 msg.fromAgentName = remoteClient.Name; 941 msg.fromAgentName = remoteClient.Name;
942 if (userProfile != null) 942 if (userProfile != null)
943 { 943 {
944 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, userProfile.Name); 944 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, userProfile.Name);
945 } 945 }
946 else 946 else
947 { 947 {
948 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, "Unknown member"); 948 msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", remoteClient.Name, groupInfo.GroupName, "Unknown member");
949 } 949 }
950 msg.dialog = (byte)210; //interop 950 msg.dialog = (byte)210; //interop
951 msg.fromGroup = false; 951 msg.fromGroup = false;
952 msg.offline = (byte)0; 952 msg.offline = (byte)0;
953 msg.ParentEstateID = 0; 953 msg.ParentEstateID = 0;
954 msg.Position = Vector3.Zero; 954 msg.Position = Vector3.Zero;
955 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 955 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid;
956 msg.binaryBucket = new byte[0]; 956 msg.binaryBucket = new byte[0];
957 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { m_log.DebugFormat("[GROUPS] Message Sent Success: {0}", success, ToString()); }); 957 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { m_log.DebugFormat("[GROUPS] Message Sent Success: {0}", success, ToString()); });
958 958
959 959
960 960
961 } 961 }
962 962
963 963
964 UpdateAllClientsWithGroupInfo(); 964 UpdateAllClientsWithGroupInfo();
965 } 965 }
966 966
967 public void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InvitedAgentID, UUID RoleID) 967 public void InviteGroupRequest(IClientAPI remoteClient, UUID GroupID, UUID InvitedAgentID, UUID RoleID)
968 { 968 {
969 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 969 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
970 m_log.WarnFormat("[GROUPS] GID {0}, AID {1}, RID {2} ", GroupID, InvitedAgentID, RoleID); 970 m_log.WarnFormat("[GROUPS] GID {0}, AID {1}, RID {2} ", GroupID, InvitedAgentID, RoleID);
971 971
972 // Todo: Security check, probably also want to send some kind of notification 972 // Todo: Security check, probably also want to send some kind of notification
973 UUID InviteID = UUID.Random(); 973 UUID InviteID = UUID.Random();
974 m_log.WarnFormat("[GROUPS] Invite ID: {0}", InviteID); 974 m_log.WarnFormat("[GROUPS] Invite ID: {0}", InviteID);
975 m_groupData.AddAgentToGroupInvite(InviteID, GroupID, RoleID, InvitedAgentID); 975 m_groupData.AddAgentToGroupInvite(InviteID, GroupID, RoleID, InvitedAgentID);
976 976
977 if (m_MsgTransferModule != null) 977 if (m_MsgTransferModule != null)
978 { 978 {
979 Guid inviteUUID = InviteID.Guid; 979 Guid inviteUUID = InviteID.Guid;
980 980
981 GridInstantMessage msg = new GridInstantMessage(); 981 GridInstantMessage msg = new GridInstantMessage();
982 982
983 msg.imSessionID = inviteUUID; 983 msg.imSessionID = inviteUUID;
984 984
985 // msg.fromAgentID = remoteClient.AgentId.Guid; 985 // msg.fromAgentID = remoteClient.AgentId.Guid;
986 msg.fromAgentID = GroupID.Guid; 986 msg.fromAgentID = GroupID.Guid;
987 msg.toAgentID = InvitedAgentID.Guid; 987 msg.toAgentID = InvitedAgentID.Guid;
988 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch(); 988 //msg.timestamp = (uint)Util.UnixTimeSinceEpoch();
989 msg.timestamp = 0; 989 msg.timestamp = 0;
990 msg.fromAgentName = remoteClient.Name; 990 msg.fromAgentName = remoteClient.Name;
991 msg.message = string.Format("{0} has invited you to join a group. There is no cost to join this group.", remoteClient.Name); 991 msg.message = string.Format("{0} has invited you to join a group. There is no cost to join this group.", remoteClient.Name);
992 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupInvitation; 992 msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.GroupInvitation;
993 msg.fromGroup = true; 993 msg.fromGroup = true;
994 msg.offline = (byte)0; 994 msg.offline = (byte)0;
995 msg.ParentEstateID = 0; 995 msg.ParentEstateID = 0;
996 msg.Position = Vector3.Zero; 996 msg.Position = Vector3.Zero;
997 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid; 997 msg.RegionID = remoteClient.Scene.RegionInfo.RegionID.Guid;
998 msg.binaryBucket = new byte[20]; 998 msg.binaryBucket = new byte[20];
999 999
1000 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { m_log.DebugFormat("[GROUPS] Message Sent Success: {0}", success,ToString()); }); 1000 m_MsgTransferModule.SendInstantMessage(msg, delegate(bool success) { m_log.DebugFormat("[GROUPS] Message Sent Success: {0}", success,ToString()); });
1001 } 1001 }
1002 } 1002 }
1003 1003
1004 #endregion 1004 #endregion
1005 1005
1006 void SendGroupMembershipInfoViaCaps(IClientAPI remoteClient, GroupMembershipData[] data) 1006 void SendGroupMembershipInfoViaCaps(IClientAPI remoteClient, GroupMembershipData[] data)
1007 { 1007 {
1008 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name); 1008 if (m_debugEnabled) m_log.InfoFormat("[GROUPS] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
1009 1009
1010 OSDArray AgentData = new OSDArray(1); 1010 OSDArray AgentData = new OSDArray(1);
1011 OSDMap AgentDataMap = new OSDMap(1); 1011 OSDMap AgentDataMap = new OSDMap(1);
1012 AgentDataMap.Add("AgentID", OSD.FromUUID(remoteClient.AgentId)); 1012 AgentDataMap.Add("AgentID", OSD.FromUUID(remoteClient.AgentId));
1013 AgentData.Add(AgentDataMap); 1013 AgentData.Add(AgentDataMap);
1014 1014
1015 1015
1016 OSDArray GroupData = new OSDArray(data.Length); 1016 OSDArray GroupData = new OSDArray(data.Length);
1017 OSDArray NewGroupData = new OSDArray(data.Length); 1017 OSDArray NewGroupData = new OSDArray(data.Length);
1018 1018
1019 foreach (GroupMembershipData membership in data) 1019 foreach (GroupMembershipData membership in data)
1020 { 1020 {
1021 OSDMap GroupDataMap = new OSDMap(6); 1021 OSDMap GroupDataMap = new OSDMap(6);
1022 OSDMap NewGroupDataMap = new OSDMap(1); 1022 OSDMap NewGroupDataMap = new OSDMap(1);
1023 1023
1024 GroupDataMap.Add("GroupID", OSD.FromUUID(membership.GroupID)); 1024 GroupDataMap.Add("GroupID", OSD.FromUUID(membership.GroupID));
1025 GroupDataMap.Add("GroupPowers", OSD.FromBinary(membership.GroupPowers)); 1025 GroupDataMap.Add("GroupPowers", OSD.FromBinary(membership.GroupPowers));
1026 GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(membership.AcceptNotices)); 1026 GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(membership.AcceptNotices));
1027 GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(membership.GroupPicture)); 1027 GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(membership.GroupPicture));
1028 GroupDataMap.Add("Contribution", OSD.FromInteger(membership.Contribution)); 1028 GroupDataMap.Add("Contribution", OSD.FromInteger(membership.Contribution));
1029 GroupDataMap.Add("GroupName", OSD.FromString(membership.GroupName)); 1029 GroupDataMap.Add("GroupName", OSD.FromString(membership.GroupName));
1030 NewGroupDataMap.Add("ListInProfile", OSD.FromBoolean(membership.ListInProfile)); 1030 NewGroupDataMap.Add("ListInProfile", OSD.FromBoolean(membership.ListInProfile));
1031 1031
1032 GroupData.Add(GroupDataMap); 1032 GroupData.Add(GroupDataMap);
1033 NewGroupData.Add(NewGroupDataMap); 1033 NewGroupData.Add(NewGroupDataMap);
1034 } 1034 }
1035 1035
1036 OSDMap llDataStruct = new OSDMap(3); 1036 OSDMap llDataStruct = new OSDMap(3);
1037 llDataStruct.Add("AgentData", AgentData); 1037 llDataStruct.Add("AgentData", AgentData);
1038 llDataStruct.Add("GroupData", GroupData); 1038 llDataStruct.Add("GroupData", GroupData);
1039 llDataStruct.Add("NewGroupData", NewGroupData); 1039 llDataStruct.Add("NewGroupData", NewGroupData);
1040 1040
1041 IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>(); 1041 IEventQueue queue = remoteClient.Scene.RequestModuleInterface<IEventQueue>();
1042 1042
1043 if (queue != null) 1043 if (queue != null)
1044 { 1044 {
1045 queue.Enqueue(EventQueueHelper.buildEvent("AgentGroupDataUpdate", llDataStruct), remoteClient.AgentId); 1045 queue.Enqueue(EventQueueHelper.buildEvent("AgentGroupDataUpdate", llDataStruct), remoteClient.AgentId);
1046 } 1046 }
1047 1047
1048 } 1048 }
1049 } 1049 }
1050 1050
1051} 1051}