aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDiva Canto2012-03-21 10:35:06 -0700
committerDiva Canto2012-03-21 10:35:06 -0700
commit4a9ca3ca8ff18f4fcf05c3983db5e6b1d49c97ee (patch)
tree6db550ead95b0a8f044f504f33fc2bfc202b1f80
parentHG Friends: pulled sim-bound notification code to HGStatusNotifier, so that w... (diff)
downloadopensim-SC_OLD-4a9ca3ca8ff18f4fcf05c3983db5e6b1d49c97ee.zip
opensim-SC_OLD-4a9ca3ca8ff18f4fcf05c3983db5e6b1d49c97ee.tar.gz
opensim-SC_OLD-4a9ca3ca8ff18f4fcf05c3983db5e6b1d49c97ee.tar.bz2
opensim-SC_OLD-4a9ca3ca8ff18f4fcf05c3983db5e6b1d49c97ee.tar.xz
HG Friends: reroute the status notifications to the HGFriends service, so that they can scale better. They were previously being handled by the UAS; that is still there, but it's now obsolete and will be removed in a future release.
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs31
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs56
-rw-r--r--OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs1
-rw-r--r--OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs52
-rw-r--r--OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs1
-rw-r--r--OpenSim/Services/HypergridService/HGFriendsService.cs107
-rw-r--r--OpenSim/Services/HypergridService/UserAgentService.cs2
-rw-r--r--OpenSim/Services/Interfaces/IHypergridServices.cs4
9 files changed, 248 insertions, 8 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
index f50e52b..e50a84a 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
@@ -51,7 +51,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 52
53 IUserManagement m_uMan; 53 IUserManagement m_uMan;
54 IUserManagement UserManagementModule 54 public IUserManagement UserManagementModule
55 { 55 {
56 get 56 get
57 { 57 {
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs
index 62d54e4..61c6a30 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs
@@ -1,6 +1,7 @@
1using System; 1using System;
2using System.Collections.Generic; 2using System.Collections.Generic;
3using System.Linq; 3using System.Linq;
4using System.Reflection;
4using System.Text; 5using System.Text;
5using OpenSim.Framework; 6using OpenSim.Framework;
6using OpenSim.Region.Framework.Interfaces; 7using OpenSim.Region.Framework.Interfaces;
@@ -10,10 +11,14 @@ using FriendInfo = OpenSim.Services.Interfaces.FriendInfo;
10 11
11using OpenMetaverse; 12using OpenMetaverse;
12 13
14using log4net;
15
13namespace OpenSim.Region.CoreModules.Avatar.Friends 16namespace OpenSim.Region.CoreModules.Avatar.Friends
14{ 17{
15 public class HGStatusNotifier 18 public class HGStatusNotifier
16 { 19 {
20 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
21
17 private HGFriendsModule m_FriendsModule; 22 private HGFriendsModule m_FriendsModule;
18 23
19 public HGStatusNotifier(HGFriendsModule friendsModule) 24 public HGStatusNotifier(HGFriendsModule friendsModule)
@@ -31,14 +36,28 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
31 List<string> ids = new List<string>(); 36 List<string> ids = new List<string>();
32 foreach (FriendInfo f in kvp.Value) 37 foreach (FriendInfo f in kvp.Value)
33 ids.Add(f.Friend); 38 ids.Add(f.Friend);
34 UserAgentServiceConnector uConn = new UserAgentServiceConnector(kvp.Key);
35 List<UUID> friendsOnline = uConn.StatusNotification(ids, userID, online);
36 39
37 if (online && friendsOnline.Count > 0) 40 if (ids.Count == 0)
41 continue; // no one to notify. caller don't do this
42
43 m_log.DebugFormat("[HG STATUS NOTIFIER]: Notifying {0} friends in {1}", ids.Count, kvp.Key);
44 // ASSUMPTION: we assume that all users for one home domain
45 // have exactly the same set of service URLs.
46 // If this is ever not true, we need to change this.
47 UUID friendID = UUID.Zero; String tmp = String.Empty;
48 if (Util.ParseUniversalUserIdentifier(ids[0], out friendID, out tmp, out tmp, out tmp, out tmp))
38 { 49 {
39 IClientAPI client = m_FriendsModule.LocateClientObject(userID); 50 string friendsServerURI = m_FriendsModule.UserManagementModule.GetUserServerURL(friendID, "FriendsServerURI");
40 if (client != null) 51 HGFriendsServicesConnector fConn = new HGFriendsServicesConnector(friendsServerURI);
41 client.SendAgentOnline(friendsOnline.ToArray()); 52
53 List<UUID> friendsOnline = fConn.StatusNotification(ids, userID, online);
54
55 if (online && friendsOnline.Count > 0)
56 {
57 IClientAPI client = m_FriendsModule.LocateClientObject(userID);
58 if (client != null)
59 client.SendAgentOnline(friendsOnline.ToArray());
60 }
42 } 61 }
43 } 62 }
44 } 63 }
diff --git a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs
index e0876cd..8ef03e7 100644
--- a/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/HGFriendsServerPostHandler.cs
@@ -105,6 +105,9 @@ namespace OpenSim.Server.Handlers.Hypergrid
105 105
106 case "validate_friendship_offered": 106 case "validate_friendship_offered":
107 return ValidateFriendshipOffered(request); 107 return ValidateFriendshipOffered(request);
108
109 case "statusnotification":
110 return StatusNotification(request);
108 /* 111 /*
109 case "friendship_approved": 112 case "friendship_approved":
110 return FriendshipApproved(request); 113 return FriendshipApproved(request);
@@ -228,6 +231,59 @@ namespace OpenSim.Server.Handlers.Hypergrid
228 return BoolResult(success); 231 return BoolResult(success);
229 } 232 }
230 233
234 byte[] StatusNotification(Dictionary<string, object> request)
235 {
236 UUID principalID = UUID.Zero;
237 if (request.ContainsKey("userID"))
238 UUID.TryParse(request["userID"].ToString(), out principalID);
239 else
240 {
241 m_log.WarnFormat("[HGFRIENDS HANDLER]: no userID in request to notify");
242 return FailureResult();
243 }
244
245 bool online = true;
246 if (request.ContainsKey("online"))
247 Boolean.TryParse(request["online"].ToString(), out online);
248 else
249 {
250 m_log.WarnFormat("[HGFRIENDS HANDLER]: no online in request to notify");
251 return FailureResult();
252 }
253
254 List<string> friends = new List<string>();
255 int i = 0;
256 foreach (KeyValuePair<string, object> kvp in request)
257 {
258 if (kvp.Key.Equals("friend_" + i.ToString()))
259 {
260 friends.Add(kvp.Value.ToString());
261 i++;
262 }
263 }
264
265 List<UUID> onlineFriends = m_TheService.StatusNotification(friends, principalID, online);
266
267 Dictionary<string, object> result = new Dictionary<string, object>();
268 if ((onlineFriends == null) || ((onlineFriends != null) && (onlineFriends.Count == 0)))
269 result["RESULT"] = "NULL";
270 else
271 {
272 i = 0;
273 foreach (UUID f in onlineFriends)
274 {
275 result["friend_" + i] = f.ToString();
276 i++;
277 }
278 }
279
280 string xmlString = ServerUtils.BuildXmlResponse(result);
281 //m_log.DebugFormat("[GRID HANDLER]: resp string: {0}", xmlString);
282 UTF8Encoding encoding = new UTF8Encoding();
283 return encoding.GetBytes(xmlString);
284
285 }
286
231 287
232 #endregion 288 #endregion
233 289
diff --git a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs
index 9a0e27e..db62aaa 100644
--- a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs
@@ -222,6 +222,7 @@ namespace OpenSim.Server.Handlers.Hypergrid
222 222
223 } 223 }
224 224
225 [Obsolete]
225 public XmlRpcResponse StatusNotification(XmlRpcRequest request, IPEndPoint remoteClient) 226 public XmlRpcResponse StatusNotification(XmlRpcRequest request, IPEndPoint remoteClient)
226 { 227 {
227 Hashtable hash = new Hashtable(); 228 Hashtable hash = new Hashtable();
diff --git a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs
index e3f3260..e984a54 100644
--- a/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/HGFriendsServiceConnector.cs
@@ -255,6 +255,58 @@ namespace OpenSim.Services.Connectors.Hypergrid
255 return false; 255 return false;
256 256
257 } 257 }
258
259 public List<UUID> StatusNotification(List<string> friends, UUID userID, bool online)
260 {
261 Dictionary<string, object> sendData = new Dictionary<string, object>();
262 List<UUID> friendsOnline = new List<UUID>();
263
264 sendData["METHOD"] = "statusnotification";
265 sendData["userID"] = userID.ToString();
266 sendData["online"] = online.ToString();
267 int i = 0;
268 foreach (string s in friends)
269 {
270 sendData["friend_" + i.ToString()] = s;
271 i++;
272 }
273
274 string reply = string.Empty;
275 string uri = m_ServerURI + "/hgfriends";
276 try
277 {
278 reply = SynchronousRestFormsRequester.MakeRequest("POST",
279 uri,
280 ServerUtils.BuildQueryString(sendData));
281 }
282 catch (Exception e)
283 {
284 m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Exception when contacting friends server at {0}: {1}", uri, e.Message);
285 return friendsOnline;
286 }
287
288 if (reply != string.Empty)
289 {
290 Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(reply);
291
292 // Here is the actual response
293 foreach (string key in replyData.Keys)
294 {
295 if (key.StartsWith("friend_") && replyData[key] != null)
296 {
297 UUID uuid;
298 if (UUID.TryParse(replyData[key].ToString(), out uuid))
299 friendsOnline.Add(uuid);
300 }
301 }
302 }
303 else
304 m_log.DebugFormat("[HGFRIENDS CONNECTOR]: Received empty reply from remote StatusNotify");
305
306 return friendsOnline;
307
308 }
309
258 #endregion 310 #endregion
259 } 311 }
260} \ No newline at end of file 312} \ No newline at end of file
diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
index bf86035..2f263ae 100644
--- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
@@ -417,6 +417,7 @@ namespace OpenSim.Services.Connectors.Hypergrid
417 GetBoolResponse(request, out reason); 417 GetBoolResponse(request, out reason);
418 } 418 }
419 419
420 [Obsolete]
420 public List<UUID> StatusNotification(List<string> friends, UUID userID, bool online) 421 public List<UUID> StatusNotification(List<string> friends, UUID userID, bool online)
421 { 422 {
422 Hashtable hash = new Hashtable(); 423 Hashtable hash = new Hashtable();
diff --git a/OpenSim/Services/HypergridService/HGFriendsService.cs b/OpenSim/Services/HypergridService/HGFriendsService.cs
index 19ee3e2..39524ab 100644
--- a/OpenSim/Services/HypergridService/HGFriendsService.cs
+++ b/OpenSim/Services/HypergridService/HGFriendsService.cs
@@ -214,6 +214,91 @@ namespace OpenSim.Services.HypergridService
214 return false; 214 return false;
215 } 215 }
216 216
217 public List<UUID> StatusNotification(List<string> friends, UUID foreignUserID, bool online)
218 {
219 if (m_FriendsService == null || m_PresenceService == null)
220 {
221 m_log.WarnFormat("[HGFRIENDS SERVICE]: Unable to perform status notifications because friends or presence services are missing");
222 return new List<UUID>();
223 }
224
225 // Let's unblock the caller right now, and take it from here async
226
227 List<UUID> localFriendsOnline = new List<UUID>();
228
229 m_log.DebugFormat("[HGFRIENDS SERVICE]: Status notification: foreign user {0} wants to notify {1} local friends of {2} status",
230 foreignUserID, friends.Count, (online ? "online" : "offline"));
231
232 // First, let's double check that the reported friends are, indeed, friends of that user
233 // And let's check that the secret matches
234 List<string> usersToBeNotified = new List<string>();
235 foreach (string uui in friends)
236 {
237 UUID localUserID;
238 string secret = string.Empty, tmp = string.Empty;
239 if (Util.ParseUniversalUserIdentifier(uui, out localUserID, out tmp, out tmp, out tmp, out secret))
240 {
241 FriendInfo[] friendInfos = m_FriendsService.GetFriends(localUserID);
242 foreach (FriendInfo finfo in friendInfos)
243 {
244 if (finfo.Friend.StartsWith(foreignUserID.ToString()) && finfo.Friend.EndsWith(secret))
245 {
246 // great!
247 usersToBeNotified.Add(localUserID.ToString());
248 }
249 }
250 }
251 }
252
253 // Now, let's send the notifications
254 //m_log.DebugFormat("[HGFRIENDS SERVICE]: Status notification: user has {0} local friends", usersToBeNotified.Count);
255
256 // First, let's send notifications to local users who are online in the home grid
257 PresenceInfo[] friendSessions = m_PresenceService.GetAgents(usersToBeNotified.ToArray());
258 if (friendSessions != null && friendSessions.Length > 0)
259 {
260 PresenceInfo friendSession = null;
261 foreach (PresenceInfo pinfo in friendSessions)
262 if (pinfo.RegionID != UUID.Zero) // let's guard against traveling agents
263 {
264 friendSession = pinfo;
265 break;
266 }
267
268 if (friendSession != null)
269 {
270 ForwardStatusNotificationToSim(friendSession.RegionID, foreignUserID, friendSession.UserID, online);
271 usersToBeNotified.Remove(friendSession.UserID.ToString());
272 UUID id;
273 if (UUID.TryParse(friendSession.UserID, out id))
274 localFriendsOnline.Add(id);
275
276 }
277 }
278
279 // Lastly, let's notify the rest who may be online somewhere else
280 foreach (string user in usersToBeNotified)
281 {
282 UUID id = new UUID(user);
283 //m_UserAgentService.LocateUser(id);
284 //etc...
285 //if (m_TravelingAgents.ContainsKey(id) && m_TravelingAgents[id].GridExternalName != m_GridName)
286 //{
287 // string url = m_TravelingAgents[id].GridExternalName;
288 // // forward
289 //}
290 //m_log.WarnFormat("[HGFRIENDS SERVICE]: User {0} is visiting another grid. HG Status notifications still not implemented.", user);
291 }
292
293 // and finally, let's send the online friends
294 if (online)
295 {
296 return localFriendsOnline;
297 }
298 else
299 return new List<UUID>();
300 }
301
217 #endregion IHGFriendsService 302 #endregion IHGFriendsService
218 303
219 #region Aux 304 #region Aux
@@ -296,6 +381,28 @@ namespace OpenSim.Services.HypergridService
296 return false; 381 return false;
297 } 382 }
298 383
384 protected void ForwardStatusNotificationToSim(UUID regionID, UUID foreignUserID, string user, bool online)
385 {
386 UUID userID;
387 if (UUID.TryParse(user, out userID))
388 {
389 if (m_FriendsLocalSimConnector != null)
390 {
391 m_log.DebugFormat("[HGFRIENDS SERVICE]: Local Notify, user {0} is {1}", foreignUserID, (online ? "online" : "offline"));
392 m_FriendsLocalSimConnector.StatusNotify(foreignUserID, userID, online);
393 }
394 else
395 {
396 GridRegion region = m_GridService.GetRegionByUUID(UUID.Zero /* !!! */, regionID);
397 if (region != null)
398 {
399 m_log.DebugFormat("[HGFRIENDS SERVICE]: Remote Notify to region {0}, user {1} is {2}", region.RegionName, foreignUserID, (online ? "online" : "offline"));
400 m_FriendsSimConnector.StatusNotify(region, foreignUserID, userID, online);
401 }
402 }
403 }
404 }
405
299 #endregion Aux 406 #endregion Aux
300 } 407 }
301} 408}
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs
index 5eca801..6a5007f 100644
--- a/OpenSim/Services/HypergridService/UserAgentService.cs
+++ b/OpenSim/Services/HypergridService/UserAgentService.cs
@@ -334,6 +334,7 @@ namespace OpenSim.Services.HypergridService
334 return false; 334 return false;
335 } 335 }
336 336
337 [Obsolete]
337 public List<UUID> StatusNotification(List<string> friends, UUID foreignUserID, bool online) 338 public List<UUID> StatusNotification(List<string> friends, UUID foreignUserID, bool online)
338 { 339 {
339 if (m_FriendsService == null || m_PresenceService == null) 340 if (m_FriendsService == null || m_PresenceService == null)
@@ -414,6 +415,7 @@ namespace OpenSim.Services.HypergridService
414 return new List<UUID>(); 415 return new List<UUID>();
415 } 416 }
416 417
418 [Obsolete]
417 protected void ForwardStatusNotificationToSim(UUID regionID, UUID foreignUserID, string user, bool online) 419 protected void ForwardStatusNotificationToSim(UUID regionID, UUID foreignUserID, string user, bool online)
418 { 420 {
419 UUID userID; 421 UUID userID;
diff --git a/OpenSim/Services/Interfaces/IHypergridServices.cs b/OpenSim/Services/Interfaces/IHypergridServices.cs
index f48b8a9..3dc877a 100644
--- a/OpenSim/Services/Interfaces/IHypergridServices.cs
+++ b/OpenSim/Services/Interfaces/IHypergridServices.cs
@@ -65,8 +65,8 @@ namespace OpenSim.Services.Interfaces
65 UUID GetUUID(String first, String last); 65 UUID GetUUID(String first, String last);
66 66
67 // Returns the local friends online 67 // Returns the local friends online
68 [Obsolete]
68 List<UUID> StatusNotification(List<string> friends, UUID userID, bool online); 69 List<UUID> StatusNotification(List<string> friends, UUID userID, bool online);
69 //List<UUID> GetOnlineFriends(UUID userID, List<string> friends);
70 70
71 bool IsAgentComingHome(UUID sessionID, string thisGridExternalName); 71 bool IsAgentComingHome(UUID sessionID, string thisGridExternalName);
72 bool VerifyAgent(UUID sessionID, string token); 72 bool VerifyAgent(UUID sessionID, string token);
@@ -92,6 +92,8 @@ namespace OpenSim.Services.Interfaces
92 bool DeleteFriendship(FriendInfo finfo, string secret); 92 bool DeleteFriendship(FriendInfo finfo, string secret);
93 bool FriendshipOffered(UUID from, string fromName, UUID to, string message); 93 bool FriendshipOffered(UUID from, string fromName, UUID to, string message);
94 bool ValidateFriendshipOffered(UUID fromID, UUID toID); 94 bool ValidateFriendshipOffered(UUID fromID, UUID toID);
95 // Returns the local friends online
96 List<UUID> StatusNotification(List<string> friends, UUID userID, bool online);
95 } 97 }
96 98
97 public interface IInstantMessageSimConnector 99 public interface IInstantMessageSimConnector