diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 6134416..df0be97 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | |||
@@ -43,11 +43,20 @@ using OpenSim.Services.Interfaces; | |||
43 | using OpenSim.Server.Base; | 43 | using OpenSim.Server.Base; |
44 | using OpenSim.Framework.Servers.HttpServer; | 44 | using OpenSim.Framework.Servers.HttpServer; |
45 | using log4net; | 45 | using log4net; |
46 | using FriendInfo = OpenSim.Services.Interfaces.FriendInfo; | ||
46 | 47 | ||
47 | namespace OpenSim.Region.CoreModules.Avatar.Friends | 48 | namespace OpenSim.Region.CoreModules.Avatar.Friends |
48 | { | 49 | { |
49 | public class FriendsModule : BaseStreamHandler, ISharedRegionModule, IFriendsModule | 50 | public class FriendsModule : BaseStreamHandler, ISharedRegionModule, IFriendsModule |
50 | { | 51 | { |
52 | protected class UserFriendData | ||
53 | { | ||
54 | public UUID PrincipalID; | ||
55 | public FriendInfo[] Friends; | ||
56 | public int Refcount; | ||
57 | public UUID RegionID; | ||
58 | } | ||
59 | |||
51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 60 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
52 | 61 | ||
53 | protected int m_Port = 0; | 62 | protected int m_Port = 0; |
@@ -56,6 +65,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
56 | 65 | ||
57 | protected IPresenceService m_PresenceService = null; | 66 | protected IPresenceService m_PresenceService = null; |
58 | protected IFriendsService m_FriendsService = null; | 67 | protected IFriendsService m_FriendsService = null; |
68 | protected Dictionary<UUID, UserFriendData> m_Friends = | ||
69 | new Dictionary<UUID, UserFriendData>(); | ||
59 | 70 | ||
60 | protected IPresenceService PresenceService | 71 | protected IPresenceService PresenceService |
61 | { | 72 | { |
@@ -113,6 +124,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
113 | { | 124 | { |
114 | m_Scenes.Add(scene); | 125 | m_Scenes.Add(scene); |
115 | scene.RegisterModuleInterface<IFriendsModule>(this); | 126 | scene.RegisterModuleInterface<IFriendsModule>(this); |
127 | |||
128 | scene.EventManager.OnNewClient += OnNewClient; | ||
129 | scene.EventManager.OnClientClosed += OnClientClosed; | ||
130 | scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; | ||
131 | scene.EventManager.OnMakeChildAgent += OnMakeChildAgent; | ||
116 | } | 132 | } |
117 | 133 | ||
118 | public void RegionLoaded(Scene scene) | 134 | public void RegionLoaded(Scene scene) |
@@ -220,5 +236,70 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
220 | 236 | ||
221 | return ms.ToArray(); | 237 | return ms.ToArray(); |
222 | } | 238 | } |
239 | |||
240 | private void OnNewClient(IClientAPI client) | ||
241 | { | ||
242 | client.OnLogout += OnLogout; | ||
243 | |||
244 | if (m_Friends.ContainsKey(client.AgentId)) | ||
245 | { | ||
246 | m_Friends[client.AgentId].Refcount++; | ||
247 | return; | ||
248 | } | ||
249 | |||
250 | UserFriendData newFriends = new UserFriendData(); | ||
251 | |||
252 | newFriends.PrincipalID = client.AgentId; | ||
253 | newFriends.Friends = m_FriendsService.GetFriends(client.AgentId); | ||
254 | newFriends.Refcount = 1; | ||
255 | newFriends.RegionID = UUID.Zero; | ||
256 | |||
257 | m_Friends.Add(client.AgentId, newFriends); | ||
258 | } | ||
259 | |||
260 | private void OnClientClosed(UUID agentID, Scene scene) | ||
261 | { | ||
262 | if (m_Friends.ContainsKey(agentID)) | ||
263 | { | ||
264 | if (m_Friends[agentID].Refcount == 1) | ||
265 | m_Friends.Remove(agentID); | ||
266 | else | ||
267 | m_Friends[agentID].Refcount--; | ||
268 | } | ||
269 | } | ||
270 | |||
271 | private void OnLogout(IClientAPI client) | ||
272 | { | ||
273 | m_Friends.Remove(client.AgentId); | ||
274 | } | ||
275 | |||
276 | private void OnMakeRootAgent(ScenePresence sp) | ||
277 | { | ||
278 | UUID agentID = sp.ControllingClient.AgentId; | ||
279 | |||
280 | if (m_Friends.ContainsKey(agentID)) | ||
281 | { | ||
282 | if (m_Friends[agentID].RegionID == UUID.Zero) | ||
283 | { | ||
284 | m_Friends[agentID].Friends = | ||
285 | m_FriendsService.GetFriends(agentID); | ||
286 | } | ||
287 | m_Friends[agentID].RegionID = | ||
288 | sp.ControllingClient.Scene.RegionInfo.RegionID; | ||
289 | } | ||
290 | } | ||
291 | |||
292 | |||
293 | private void OnMakeChildAgent(ScenePresence sp) | ||
294 | { | ||
295 | UUID agentID = sp.ControllingClient.AgentId; | ||
296 | |||
297 | if (m_Friends.ContainsKey(agentID)) | ||
298 | { | ||
299 | if (m_Friends[agentID].RegionID == sp.ControllingClient.Scene.RegionInfo.RegionID) | ||
300 | m_Friends[agentID].RegionID = UUID.Zero; | ||
301 | } | ||
302 | } | ||
303 | |||
223 | } | 304 | } |
224 | } | 305 | } |