diff options
Diffstat (limited to 'OpenSim/Region/Environment/Modules/GroupsModule.cs')
-rw-r--r-- | OpenSim/Region/Environment/Modules/GroupsModule.cs | 223 |
1 files changed, 220 insertions, 3 deletions
diff --git a/OpenSim/Region/Environment/Modules/GroupsModule.cs b/OpenSim/Region/Environment/Modules/GroupsModule.cs index 50e9a39..6eb3cda 100644 --- a/OpenSim/Region/Environment/Modules/GroupsModule.cs +++ b/OpenSim/Region/Environment/Modules/GroupsModule.cs | |||
@@ -27,18 +27,182 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | using Nini.Config; | 29 | using Nini.Config; |
30 | using System; | ||
31 | using System.Collections; | ||
32 | using System.Collections.Generic; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Framework.Console; | ||
30 | using OpenSim.Region.Environment.Interfaces; | 35 | using OpenSim.Region.Environment.Interfaces; |
31 | using OpenSim.Region.Environment.Scenes; | 36 | using OpenSim.Region.Environment.Scenes; |
37 | using libsecondlife; | ||
32 | 38 | ||
33 | namespace OpenSim.Region.Environment.Modules | 39 | namespace OpenSim.Region.Environment.Modules |
34 | { | 40 | { |
35 | public class GroupsModule : IRegionModule | 41 | public class GroupsModule : IRegionModule |
36 | { | 42 | { |
37 | private Scene m_scene; | 43 | private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
44 | |||
45 | private List<Scene> m_scene = new List<Scene>(); | ||
46 | private Dictionary<LLUUID, IClientAPI> m_iclientmap = new Dictionary<LLUUID, IClientAPI>(); | ||
47 | private Dictionary<LLUUID, GroupData> m_groupmap = new Dictionary<LLUUID, GroupData>(); | ||
48 | private Dictionary<LLUUID, GroupList> m_grouplistmap = new Dictionary<LLUUID, GroupList>(); | ||
38 | 49 | ||
39 | public void Initialise(Scene scene, IConfigSource config) | 50 | public void Initialise(Scene scene, IConfigSource config) |
40 | { | 51 | { |
41 | m_scene = scene; | 52 | lock (m_scene) |
53 | { | ||
54 | m_scene.Add(scene); | ||
55 | } | ||
56 | scene.EventManager.OnNewClient += OnNewClient; | ||
57 | scene.EventManager.OnClientClosed += OnClientClosed; | ||
58 | scene.EventManager.OnGridInstantMessageToGroupsModule += OnGridInstantMessage; | ||
59 | //scene.EventManager. | ||
60 | } | ||
61 | private void OnNewClient(IClientAPI client) | ||
62 | { | ||
63 | // All friends establishment protocol goes over instant message | ||
64 | // There's no way to send a message from the sim | ||
65 | // to a user to 'add a friend' without causing dialog box spam | ||
66 | // | ||
67 | // The base set of friends are added when the user signs on in their XMLRPC response | ||
68 | // Generated by LoginService. The friends are retreived from the database by the UserManager | ||
69 | |||
70 | // Subscribe to instant messages | ||
71 | client.OnInstantMessage += OnInstantMessage; | ||
72 | client.OnAgentDataUpdateRequest += OnAgentDataUpdateRequest; | ||
73 | lock (m_iclientmap) | ||
74 | { | ||
75 | if (!m_iclientmap.ContainsKey(client.AgentId)) | ||
76 | { | ||
77 | m_iclientmap.Add(client.AgentId, client); | ||
78 | } | ||
79 | } | ||
80 | GroupData OpenSimulatorGroup = new GroupData(); | ||
81 | OpenSimulatorGroup.ActiveGroupTitle = "OpenSimulator Tester"; | ||
82 | OpenSimulatorGroup.GroupID = new LLUUID("00000000-68f9-1111-024e-222222111120"); | ||
83 | OpenSimulatorGroup.GroupMembers.Add(client.AgentId); | ||
84 | OpenSimulatorGroup.groupName = "OpenSimulator Testing"; | ||
85 | OpenSimulatorGroup.ActiveGroupPowers = GroupPowers.LandAllowSetHome; | ||
86 | OpenSimulatorGroup.GroupTitles.Add("OpenSimulator Tester"); | ||
87 | lock (m_groupmap) | ||
88 | { | ||
89 | if (!m_groupmap.ContainsKey(client.AgentId)) | ||
90 | { | ||
91 | m_groupmap.Add(client.AgentId, OpenSimulatorGroup); | ||
92 | } | ||
93 | } | ||
94 | GroupList testGroupList = new GroupList(); | ||
95 | testGroupList.m_GroupList.Add(new LLUUID("00000000-68f9-1111-024e-222222111120")); | ||
96 | |||
97 | lock (m_grouplistmap) | ||
98 | { | ||
99 | if (!m_grouplistmap.ContainsKey(client.AgentId)) | ||
100 | { | ||
101 | m_grouplistmap.Add(client.AgentId, testGroupList); | ||
102 | } | ||
103 | } | ||
104 | m_log.Info("[GROUP]: Adding " + client.FirstName + " " + client.LastName + " to OpenSimulator Tester group"); | ||
105 | |||
106 | |||
107 | } | ||
108 | |||
109 | private void OnAgentDataUpdateRequest(IClientAPI remoteClient, LLUUID AgentID, LLUUID SessionID) | ||
110 | { | ||
111 | string firstname = remoteClient.FirstName; | ||
112 | string lastname = remoteClient.LastName; | ||
113 | |||
114 | LLUUID ActiveGroupID = LLUUID.Zero; | ||
115 | uint ActiveGroupPowers = 0; | ||
116 | string ActiveGroupName = ""; | ||
117 | string ActiveGroupTitle = ""; | ||
118 | |||
119 | bool foundUser = false; | ||
120 | |||
121 | lock (m_iclientmap) | ||
122 | { | ||
123 | if (m_iclientmap.ContainsKey(remoteClient.AgentId)) | ||
124 | { | ||
125 | foundUser = true; | ||
126 | } | ||
127 | } | ||
128 | if (foundUser) | ||
129 | { | ||
130 | lock (m_groupmap) | ||
131 | { | ||
132 | if (m_groupmap.ContainsKey(remoteClient.AgentId)) | ||
133 | { | ||
134 | GroupData grp = m_groupmap[remoteClient.AgentId]; | ||
135 | if (grp != null) | ||
136 | { | ||
137 | ActiveGroupID = grp.GroupID; | ||
138 | ActiveGroupName = grp.groupName; | ||
139 | ActiveGroupPowers = grp.groupPowers; | ||
140 | ActiveGroupTitle = grp.ActiveGroupTitle; | ||
141 | } | ||
142 | |||
143 | //remoteClient.SendAgentDataUpdate(AgentID, ActiveGroupID, firstname, lastname, ActiveGroupPowers, ActiveGroupName, ActiveGroupTitle); | ||
144 | |||
145 | } | ||
146 | } | ||
147 | } | ||
148 | |||
149 | } | ||
150 | |||
151 | private void OnInstantMessage(IClientAPI client, LLUUID fromAgentID, | ||
152 | LLUUID fromAgentSession, LLUUID toAgentID, | ||
153 | LLUUID imSessionID, uint timestamp, string fromAgentName, | ||
154 | string message, byte dialog, bool fromGroup, byte offline, | ||
155 | uint ParentEstateID, LLVector3 Position, LLUUID RegionID, | ||
156 | byte[] binaryBucket) | ||
157 | { | ||
158 | |||
159 | } | ||
160 | |||
161 | private void OnGridInstantMessage(GridInstantMessage msg) | ||
162 | { | ||
163 | // Trigger the above event handler | ||
164 | OnInstantMessage(null, new LLUUID(msg.fromAgentID), new LLUUID(msg.fromAgentSession), | ||
165 | new LLUUID(msg.toAgentID), new LLUUID(msg.imSessionID), msg.timestamp, msg.fromAgentName, | ||
166 | msg.message, msg.dialog, msg.fromGroup, msg.offline, msg.ParentEstateID, | ||
167 | new LLVector3(msg.Position.x, msg.Position.y, msg.Position.z), new LLUUID(msg.RegionID), | ||
168 | msg.binaryBucket); | ||
169 | } | ||
170 | |||
171 | private void OnClientClosed(LLUUID agentID) | ||
172 | { | ||
173 | lock (m_iclientmap) | ||
174 | { | ||
175 | if (m_iclientmap.ContainsKey(agentID)) | ||
176 | { | ||
177 | IClientAPI cli = m_iclientmap[agentID]; | ||
178 | if (cli != null) | ||
179 | { | ||
180 | m_log.Info("[GROUP]: Removing all reference to groups for " + cli.FirstName + " " + cli.LastName); | ||
181 | } | ||
182 | else | ||
183 | { | ||
184 | m_log.Info("[GROUP]: Removing all reference to groups for " + agentID.ToString()); | ||
185 | } | ||
186 | m_iclientmap.Remove(agentID); | ||
187 | } | ||
188 | } | ||
189 | |||
190 | lock (m_groupmap) | ||
191 | { | ||
192 | if (m_groupmap.ContainsKey(agentID)) | ||
193 | { | ||
194 | m_groupmap.Remove(agentID); | ||
195 | } | ||
196 | } | ||
197 | |||
198 | lock (m_grouplistmap) | ||
199 | { | ||
200 | if (m_grouplistmap.ContainsKey(agentID)) | ||
201 | { | ||
202 | m_grouplistmap.Remove(agentID); | ||
203 | } | ||
204 | } | ||
205 | GC.Collect(); | ||
42 | } | 206 | } |
43 | 207 | ||
44 | public void PostInitialise() | 208 | public void PostInitialise() |
@@ -47,6 +211,22 @@ namespace OpenSim.Region.Environment.Modules | |||
47 | 211 | ||
48 | public void Close() | 212 | public void Close() |
49 | { | 213 | { |
214 | m_log.Info("[GROUP]: Shutting down group module."); | ||
215 | lock (m_iclientmap) | ||
216 | { | ||
217 | m_iclientmap.Clear(); | ||
218 | } | ||
219 | |||
220 | lock (m_groupmap) | ||
221 | { | ||
222 | m_groupmap.Clear(); | ||
223 | } | ||
224 | |||
225 | lock (m_grouplistmap) | ||
226 | { | ||
227 | m_grouplistmap.Clear(); | ||
228 | } | ||
229 | GC.Collect(); | ||
50 | } | 230 | } |
51 | 231 | ||
52 | public string Name | 232 | public string Name |
@@ -56,7 +236,44 @@ namespace OpenSim.Region.Environment.Modules | |||
56 | 236 | ||
57 | public bool IsSharedModule | 237 | public bool IsSharedModule |
58 | { | 238 | { |
59 | get { return false; } | 239 | get { return true; } |
240 | } | ||
241 | |||
242 | } | ||
243 | public class GroupData | ||
244 | { | ||
245 | public LLUUID GroupID; | ||
246 | public string groupName; | ||
247 | public string ActiveGroupTitle; | ||
248 | public List<string> GroupTitles; | ||
249 | public List<LLUUID> GroupMembers; | ||
250 | public uint groupPowers = (uint)(GroupPowers.LandAllowLandmark | GroupPowers.LandAllowSetHome); | ||
251 | |||
252 | public GroupPowers ActiveGroupPowers | ||
253 | { | ||
254 | set | ||
255 | { | ||
256 | groupPowers = (uint) value; | ||
257 | } | ||
258 | get | ||
259 | { | ||
260 | return (GroupPowers)groupPowers; | ||
261 | } | ||
262 | } | ||
263 | |||
264 | public GroupData() | ||
265 | { | ||
266 | GroupTitles = new List<string>(); | ||
267 | GroupMembers = new List<LLUUID>(); | ||
268 | } | ||
269 | |||
270 | } | ||
271 | public class GroupList | ||
272 | { | ||
273 | public List<LLUUID> m_GroupList; | ||
274 | public GroupList() | ||
275 | { | ||
276 | m_GroupList = new List<LLUUID>(); | ||
60 | } | 277 | } |
61 | } | 278 | } |
62 | } \ No newline at end of file | 279 | } \ No newline at end of file |