aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
authorTeravus Ovares2008-06-02 16:16:07 +0000
committerTeravus Ovares2008-06-02 16:16:07 +0000
commit3991908db5b50e764112d30e5750447db67795b5 (patch)
treebc5c47d6c26b87dd04c550ed24d5597e686e7663 /OpenSim
parentFixed half completed comment in OpenSim.ini.example. (diff)
downloadopensim-SC_OLD-3991908db5b50e764112d30e5750447db67795b5.zip
opensim-SC_OLD-3991908db5b50e764112d30e5750447db67795b5.tar.gz
opensim-SC_OLD-3991908db5b50e764112d30e5750447db67795b5.tar.bz2
opensim-SC_OLD-3991908db5b50e764112d30e5750447db67795b5.tar.xz
* This update enables grid wide presence updates.
* You'll need to start-up the MessageingServer and set it up. It sets up like any of the other grid servers. * All user presence data is kept in memory for speed, while the agent is online. That means if you shutdown the messaging server or the messaging server crashes, it forgets who's online/offline. * Occasionally the region-cache will get stale if regions move around a lot. if it gets stale, run clear-cache on the messaging server console to clear the region cache.
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Framework/MessageServerConfig.cs9
-rw-r--r--OpenSim/Framework/UserConfig.cs4
-rw-r--r--OpenSim/Grid/MessagingServer/Main.cs22
-rw-r--r--OpenSim/Grid/MessagingServer/MessageService.cs155
-rw-r--r--OpenSim/Grid/MessagingServer/PresenceInformer.cs81
-rw-r--r--OpenSim/Grid/MessagingServer/UserPresenceData.cs1
-rw-r--r--OpenSim/Grid/UserServer/MessageServersConnector.cs6
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1GridServices.cs8
-rw-r--r--OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs132
9 files changed, 374 insertions, 44 deletions
diff --git a/OpenSim/Framework/MessageServerConfig.cs b/OpenSim/Framework/MessageServerConfig.cs
index c378d27..7a50c91 100644
--- a/OpenSim/Framework/MessageServerConfig.cs
+++ b/OpenSim/Framework/MessageServerConfig.cs
@@ -38,6 +38,7 @@ namespace OpenSim.Framework
38 public static bool DefaultHttpSSL = false; 38 public static bool DefaultHttpSSL = false;
39 private ConfigurationMember configMember; 39 private ConfigurationMember configMember;
40 public string DatabaseProvider = String.Empty; 40 public string DatabaseProvider = String.Empty;
41 public string DatabaseConnect = String.Empty;
41 public string DefaultStartupMsg = String.Empty; 42 public string DefaultStartupMsg = String.Empty;
42 public string GridCommsProvider = String.Empty; 43 public string GridCommsProvider = String.Empty;
43 public string GridRecvKey = String.Empty; 44 public string GridRecvKey = String.Empty;
@@ -76,6 +77,11 @@ namespace OpenSim.Framework
76 configMember.addConfigurationOption("grid_recv_key", ConfigurationOption.ConfigurationTypes.TYPE_STRING, 77 configMember.addConfigurationOption("grid_recv_key", ConfigurationOption.ConfigurationTypes.TYPE_STRING,
77 "Key to expect from user server", "null", false); 78 "Key to expect from user server", "null", false);
78 79
80
81 configMember.addConfigurationOption("database_connect", ConfigurationOption.ConfigurationTypes.TYPE_STRING,
82 "Connection String for Database", "", false);
83
84
79 configMember.addConfigurationOption("database_provider", ConfigurationOption.ConfigurationTypes.TYPE_STRING, 85 configMember.addConfigurationOption("database_provider", ConfigurationOption.ConfigurationTypes.TYPE_STRING,
80 "DLL for database provider", "OpenSim.Data.MySQL.dll", false); 86 "DLL for database provider", "OpenSim.Data.MySQL.dll", false);
81 87
@@ -115,6 +121,9 @@ namespace OpenSim.Framework
115 case "database_provider": 121 case "database_provider":
116 DatabaseProvider = (string) configuration_result; 122 DatabaseProvider = (string) configuration_result;
117 break; 123 break;
124 case "database_connect":
125 DatabaseConnect = (string)configuration_result;
126 break;
118 case "http_port": 127 case "http_port":
119 HttpPort = (uint) configuration_result; 128 HttpPort = (uint) configuration_result;
120 break; 129 break;
diff --git a/OpenSim/Framework/UserConfig.cs b/OpenSim/Framework/UserConfig.cs
index 3c0bdfa..3cb0503 100644
--- a/OpenSim/Framework/UserConfig.cs
+++ b/OpenSim/Framework/UserConfig.cs
@@ -49,6 +49,10 @@ namespace OpenSim.Framework
49 public bool HttpSSL = DefaultHttpSSL; 49 public bool HttpSSL = DefaultHttpSSL;
50 public string InventoryUrl = String.Empty; 50 public string InventoryUrl = String.Empty;
51 51
52 public UserConfig()
53 {
54 // weird, but UserManagerBase needs this.
55 }
52 public UserConfig(string description, string filename) 56 public UserConfig(string description, string filename)
53 { 57 {
54 configMember = 58 configMember =
diff --git a/OpenSim/Grid/MessagingServer/Main.cs b/OpenSim/Grid/MessagingServer/Main.cs
index d2fa659..91f2101 100644
--- a/OpenSim/Grid/MessagingServer/Main.cs
+++ b/OpenSim/Grid/MessagingServer/Main.cs
@@ -31,7 +31,9 @@ using System.Reflection;
31using libsecondlife; 31using libsecondlife;
32using log4net; 32using log4net;
33using log4net.Config; 33using log4net.Config;
34
34using OpenSim.Framework; 35using OpenSim.Framework;
36using OpenSim.Framework.Communications.Cache;
35using OpenSim.Framework.Console; 37using OpenSim.Framework.Console;
36using OpenSim.Framework.Servers; 38using OpenSim.Framework.Servers;
37 39
@@ -88,6 +90,8 @@ namespace OpenSim.Grid.MessagingServer
88 m_log.Info("[REGION]: Starting HTTP process"); 90 m_log.Info("[REGION]: Starting HTTP process");
89 m_httpServer = new BaseHttpServer(Cfg.HttpPort); 91 m_httpServer = new BaseHttpServer(Cfg.HttpPort);
90 92
93
94
91 msgsvc = new MessageService(Cfg); 95 msgsvc = new MessageService(Cfg);
92 96
93 if (msgsvc.registerWithUserServer()) 97 if (msgsvc.registerWithUserServer())
@@ -144,6 +148,24 @@ namespace OpenSim.Grid.MessagingServer
144 } 148 }
145 } 149 }
146 150
151 public override void RunCmd(string cmd, string[] cmdparams)
152 {
153 base.RunCmd(cmd, cmdparams);
154
155 switch (cmd)
156 {
157 case "help":
158 m_console.Notice("clear-cache - Clears region cache. Should be done when regions change position. The region cache gets stale after a while.");
159 break;
160 case "clear-cache":
161 int entries = msgsvc.ClearRegionCache();
162 m_console.Notice("Region cache cleared! Cleared " + entries.ToString() + " entries");
163 break;
164 }
165
166
167 }
168
147 public override void Shutdown() 169 public override void Shutdown()
148 { 170 {
149 msgsvc.deregisterWithUserServer(); 171 msgsvc.deregisterWithUserServer();
diff --git a/OpenSim/Grid/MessagingServer/MessageService.cs b/OpenSim/Grid/MessagingServer/MessageService.cs
index e1beef1..59fef7e 100644
--- a/OpenSim/Grid/MessagingServer/MessageService.cs
+++ b/OpenSim/Grid/MessagingServer/MessageService.cs
@@ -46,6 +46,7 @@ namespace OpenSim.Grid.MessagingServer
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47 47
48 private MessageServerConfig m_cfg; 48 private MessageServerConfig m_cfg;
49 private UserManager m_userManager;
49 50
50 //A hashtable of all current presences this server knows about 51 //A hashtable of all current presences this server knows about
51 private Hashtable m_presences = new Hashtable(); 52 private Hashtable m_presences = new Hashtable();
@@ -62,11 +63,16 @@ namespace OpenSim.Grid.MessagingServer
62 public MessageService(MessageServerConfig cfg) 63 public MessageService(MessageServerConfig cfg)
63 { 64 {
64 m_cfg = cfg; 65 m_cfg = cfg;
66 m_userManager = new UserManager();
67 UserConfig uc = new UserConfig();
68 uc.DatabaseConnect = cfg.DatabaseConnect;
69 uc.DatabaseProvider = cfg.DatabaseProvider;
70
71 m_userManager._config = uc;
72 m_userManager.AddPlugin(cfg.DatabaseProvider, cfg.DatabaseConnect);
65 } 73 }
66 74
67 #region RegionComms Methods 75
68
69 #endregion
70 76
71 #region FriendList Methods 77 #region FriendList Methods
72 78
@@ -123,11 +129,27 @@ namespace OpenSim.Grid.MessagingServer
123 { 129 {
124 // we need to send out online status update, but the user is already subscribed 130 // we need to send out online status update, but the user is already subscribed
125 } 131 }
126 PresenceInformer friendlistupdater = new PresenceInformer(); 132 UserAgentData p2Handle = m_userManager.GetUserAgentData(userpresence.agentData.AgentID);
127 friendlistupdater.presence1 = friendpresence; 133 if (p2Handle != null)
128 friendlistupdater.presence2 = userpresence; 134 {
129 WaitCallback cb = new WaitCallback(friendlistupdater.go); 135
130 ThreadPool.QueueUserWorkItem(cb); 136 userpresence.regionData.regionHandle = p2Handle.Handle;
137 PresenceInformer friendlistupdater = new PresenceInformer();
138 friendlistupdater.presence1 = friendpresence;
139 //friendlistupdater.gridserverurl = m_cfg.GridServerURL;
140 //friendlistupdater.gridserversendkey = m_cfg.GridSendKey;
141 //friendlistupdater.gridserverrecvkey = m_cfg.GridRecvKey;
142 friendlistupdater.presence2 = userpresence;
143 friendlistupdater.OnGetRegionData += GetRegionInfo;
144 friendlistupdater.OnDone += PresenceUpdateDone;
145 WaitCallback cb = new WaitCallback(friendlistupdater.go);
146 ThreadPool.QueueUserWorkItem(cb);
147
148 }
149 else
150 {
151 // Skip because we can't find any data on the user
152 }
131 153
132 //SendRegionPresenceUpdate(friendpresence, userpresence); 154 //SendRegionPresenceUpdate(friendpresence, userpresence);
133 } 155 }
@@ -143,12 +165,30 @@ namespace OpenSim.Grid.MessagingServer
143 { 165 {
144 // we need to send out online status update, but the user is already subscribed 166 // we need to send out online status update, but the user is already subscribed
145 } 167 }
146 PresenceInformer friendlistupdater = new PresenceInformer(); 168
147 friendlistupdater.presence1 = userpresence; 169 UserAgentData p2Handle = m_userManager.GetUserAgentData(friendpresence.agentData.AgentID);
148 friendlistupdater.presence2 = friendpresence;
149 170
150 WaitCallback cb2 = new WaitCallback(friendlistupdater.go); 171 if (p2Handle != null)
151 ThreadPool.QueueUserWorkItem(cb2); 172 {
173
174 friendpresence.regionData.regionHandle = p2Handle.Handle;
175 PresenceInformer friendlistupdater = new PresenceInformer();
176 friendlistupdater.presence1 = userpresence;
177 friendlistupdater.presence2 = friendpresence;
178 //friendlistupdater.gridserverurl = m_cfg.GridServerURL;
179 //friendlistupdater.gridserversendkey = m_cfg.GridSendKey;
180 //friendlistupdater.gridserverrecvkey = m_cfg.GridRecvKey;
181 friendlistupdater.OnGetRegionData += GetRegionInfo;
182 friendlistupdater.OnDone += PresenceUpdateDone;
183 WaitCallback cb2 = new WaitCallback(friendlistupdater.go);
184 ThreadPool.QueueUserWorkItem(cb2);
185 }
186 else
187 {
188 // skip, agent doesn't appear to exist anymore
189 }
190
191
152 192
153 //SendRegionPresenceUpdate(userpresence, friendpresence); 193 //SendRegionPresenceUpdate(userpresence, friendpresence);
154 } 194 }
@@ -209,6 +249,7 @@ namespace OpenSim.Grid.MessagingServer
209 /// <param name="AgentID"></param> 249 /// <param name="AgentID"></param>
210 private void ProcessLogOff(LLUUID AgentID) 250 private void ProcessLogOff(LLUUID AgentID)
211 { 251 {
252 m_log.Info("[LOGOFF]: Processing Logoff");
212 UserPresenceData AgentData = null; 253 UserPresenceData AgentData = null;
213 List<LLUUID> AgentsNeedingNotification = new List<LLUUID>(); 254 List<LLUUID> AgentsNeedingNotification = new List<LLUUID>();
214 UserPresenceData friendd = null; 255 UserPresenceData friendd = null;
@@ -223,6 +264,7 @@ namespace OpenSim.Grid.MessagingServer
223 if (AgentData != null) 264 if (AgentData != null)
224 { 265 {
225 AgentsNeedingNotification = AgentData.subscriptionData; 266 AgentsNeedingNotification = AgentData.subscriptionData;
267 AgentData.OnlineYN = false;
226 //lock (m_presence_BackReferences) 268 //lock (m_presence_BackReferences)
227 //{ 269 //{
228 //if (m_presence_BackReferences.Contains(AgentID)) 270 //if (m_presence_BackReferences.Contains(AgentID))
@@ -262,13 +304,33 @@ namespace OpenSim.Grid.MessagingServer
262 m_presences[AgentsNeedingNotification[i]] = friendd; 304 m_presences[AgentsNeedingNotification[i]] = friendd;
263 } 305 }
264 306
265 PresenceInformer friendlistupdater = new PresenceInformer(); 307 UserAgentData p2Handle = m_userManager.GetUserAgentData(friendd.agentData.AgentID);
266 friendlistupdater.presence1 = AgentData; 308 if (p2Handle != null)
267 friendlistupdater.presence2 = friendd; 309 {
310
311
312 friendd.regionData.regionHandle = p2Handle.Handle;
313 PresenceInformer friendlistupdater = new PresenceInformer();
314 friendlistupdater.presence1 = AgentData;
315 friendlistupdater.presence2 = friendd;
316
317 //friendlistupdater.gridserverurl = m_cfg.GridServerURL;
318 //friendlistupdater.gridserversendkey = m_cfg.GridSendKey;
319 //friendlistupdater.gridserverrecvkey = m_cfg.GridRecvKey;
320
321 friendlistupdater.OnGetRegionData += GetRegionInfo;
322 friendlistupdater.OnDone += PresenceUpdateDone;
323
324 WaitCallback cb3 = new WaitCallback(friendlistupdater.go);
325 ThreadPool.QueueUserWorkItem(cb3);
268 326
269 WaitCallback cb3 = new WaitCallback(friendlistupdater.go); 327
270 ThreadPool.QueueUserWorkItem(cb3);
271 328
329 }
330 else
331 {
332 // skip, agent can't be found
333 }
272 //SendRegionPresenceUpdate(AgentData, friendd); 334 //SendRegionPresenceUpdate(AgentData, friendd);
273 335
274 //removeBackReference(AgentID, AgentsNeedingNotification[i]); 336 //removeBackReference(AgentID, AgentsNeedingNotification[i]);
@@ -279,6 +341,12 @@ namespace OpenSim.Grid.MessagingServer
279 341
280 #endregion 342 #endregion
281 343
344 public void PresenceUpdateDone(PresenceInformer obj)
345 {
346 obj.OnGetRegionData -= GetRegionInfo;
347 obj.OnDone -= PresenceUpdateDone;
348 }
349
282 #region UserServer Comms 350 #region UserServer Comms
283 351
284 /// <summary> 352 /// <summary>
@@ -393,7 +461,7 @@ namespace OpenSim.Grid.MessagingServer
393 up.friendData = flData; 461 up.friendData = flData;
394 RegionProfileData riData = GetRegionInfo(regionHandle); 462 RegionProfileData riData = GetRegionInfo(regionHandle);
395 up.regionData = riData; 463 up.regionData = riData;
396 464 up.OnlineYN = true;
397 ProcessFriendListSubscriptions(up); 465 ProcessFriendListSubscriptions(up);
398 466
399 return new XmlRpcResponse(); 467 return new XmlRpcResponse();
@@ -407,6 +475,7 @@ namespace OpenSim.Grid.MessagingServer
407 /// <returns></returns> 475 /// <returns></returns>
408 public XmlRpcResponse UserLoggedOff(XmlRpcRequest request) 476 public XmlRpcResponse UserLoggedOff(XmlRpcRequest request)
409 { 477 {
478 m_log.Info("[USERLOGOFF]: User logged off called");
410 Hashtable requestData = (Hashtable)request.Params[0]; 479 Hashtable requestData = (Hashtable)request.Params[0];
411 480
412 LLUUID AgentID = new LLUUID((string)requestData["agentid"]); 481 LLUUID AgentID = new LLUUID((string)requestData["agentid"]);
@@ -423,23 +492,64 @@ namespace OpenSim.Grid.MessagingServer
423 /// <summary> 492 /// <summary>
424 /// Gets and caches a RegionInfo object from the gridserver based on regionhandle 493 /// Gets and caches a RegionInfo object from the gridserver based on regionhandle
425 /// if the regionhandle is already cached, use the cached values 494 /// if the regionhandle is already cached, use the cached values
495 /// Gets called by lots of threads!!!!!
426 /// </summary> 496 /// </summary>
427 /// <param name="regionhandle">handle to the XY of the region we're looking for</param> 497 /// <param name="regionhandle">handle to the XY of the region we're looking for</param>
428 /// <returns>A RegionInfo object to stick in the presence info</returns> 498 /// <returns>A RegionInfo object to stick in the presence info</returns>
429 public RegionProfileData GetRegionInfo(ulong regionhandle) 499 public RegionProfileData GetRegionInfo(ulong regionhandle)
430 { 500 {
431 RegionProfileData regionInfo = null; 501 RegionProfileData regionInfo = null;
432 if (m_regionInfoCache.Contains(regionhandle)) 502 bool lookup = false;
503
504 lock (m_regionInfoCache)
433 { 505 {
434 regionInfo = (RegionProfileData)m_regionInfoCache[regionhandle]; 506 if (m_regionInfoCache.Contains(regionhandle))
507 {
508 regionInfo = (RegionProfileData)m_regionInfoCache[regionhandle];
509 }
510 else
511 {
512 // Don't lock the cache while we're looking up the region!
513 lookup = true;
514 }
435 } 515 }
436 else 516
517 if (lookup)
437 { 518 {
438 regionInfo = RequestRegionInfo(regionhandle); 519 regionInfo = RequestRegionInfo(regionhandle);
520
521 if (regionInfo != null)
522 {
523 lock (m_regionInfoCache)
524 {
525 if (m_regionInfoCache.Contains(regionhandle))
526 {
527 m_regionInfoCache[regionhandle] = regionInfo;
528 }
529 else
530 {
531 m_regionInfoCache.Add(regionhandle, regionInfo);
532 }
533 }
534 }
439 } 535 }
536
440 return regionInfo; 537 return regionInfo;
441 } 538 }
442 539
540 public int ClearRegionCache()
541 {
542 int cachecount = 0;
543
544 lock (m_regionInfoCache)
545 {
546 cachecount = m_regionInfoCache.Count;
547 m_regionInfoCache.Clear();
548 }
549
550 return cachecount;
551 }
552
443 /// <summary> 553 /// <summary>
444 /// Get RegionProfileData from the GridServer 554 /// Get RegionProfileData from the GridServer
445 /// We'll Cache this information and use it for presence updates 555 /// We'll Cache this information and use it for presence updates
@@ -541,6 +651,7 @@ namespace OpenSim.Grid.MessagingServer
541 // Process Response 651 // Process Response
542 if (GridRespData.ContainsKey("responsestring")) 652 if (GridRespData.ContainsKey("responsestring"))
543 { 653 {
654
544 return true; 655 return true;
545 } 656 }
546 else 657 else
diff --git a/OpenSim/Grid/MessagingServer/PresenceInformer.cs b/OpenSim/Grid/MessagingServer/PresenceInformer.cs
index 59d0e13..050d88a 100644
--- a/OpenSim/Grid/MessagingServer/PresenceInformer.cs
+++ b/OpenSim/Grid/MessagingServer/PresenceInformer.cs
@@ -27,16 +27,31 @@
27 27
28using System.Collections; 28using System.Collections;
29using System.Reflection; 29using System.Reflection;
30using System.Net;
30using log4net; 31using log4net;
31using Nwc.XmlRpc; 32using Nwc.XmlRpc;
32using OpenSim.Data; 33using OpenSim.Data;
33 34
34namespace OpenSim.Grid.MessagingServer 35namespace OpenSim.Grid.MessagingServer
35{ 36{
37 public delegate RegionProfileData GetRegionData(ulong region_handle);
38 public delegate void Done(PresenceInformer obj);
39
40
36 public class PresenceInformer 41 public class PresenceInformer
37 { 42 {
43 public event GetRegionData OnGetRegionData;
44 public event Done OnDone;
45
46 private GetRegionData handlerGetRegionData = null;
47 private Done handlerDone = null;
48
38 public UserPresenceData presence1 = null; 49 public UserPresenceData presence1 = null;
39 public UserPresenceData presence2 = null; 50 public UserPresenceData presence2 = null;
51 public string gridserverurl, gridserversendkey, gridserverrecvkey;
52 public bool lookupRegion = true;
53 //public methodGroup
54
40 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 55 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
41 56
42 public PresenceInformer() 57 public PresenceInformer()
@@ -60,18 +75,68 @@ namespace OpenSim.Grid.MessagingServer
60 public void SendRegionPresenceUpdate(UserPresenceData TalkingAbout, UserPresenceData UserToUpdate) 75 public void SendRegionPresenceUpdate(UserPresenceData TalkingAbout, UserPresenceData UserToUpdate)
61 { 76 {
62 // TODO: Fill in pertenant Presence Data from 'TalkingAbout' 77 // TODO: Fill in pertenant Presence Data from 'TalkingAbout'
78 RegionProfileData whichRegion = new RegionProfileData();
79 if (lookupRegion)
80 {
81 handlerGetRegionData = OnGetRegionData;
82 if (handlerGetRegionData != null)
83 {
84 whichRegion = handlerGetRegionData(UserToUpdate.regionData.regionHandle);
85 }
86 //RegionProfileData rp = RegionProfileData.RequestSimProfileData(UserToUpdate.regionData.regionHandle, gridserverurl, gridserversendkey, gridserverrecvkey);
63 87
64 RegionProfileData whichRegion = UserToUpdate.regionData; 88 //whichRegion = rp;
89 }
90 else
91 {
92 whichRegion = UserToUpdate.regionData;
93 }
65 //whichRegion.httpServerURI 94 //whichRegion.httpServerURI
66 95
67 Hashtable PresenceParams = new Hashtable(); 96 if (whichRegion != null)
68 ArrayList SendParams = new ArrayList(); 97 {
69 SendParams.Add(PresenceParams); 98
99
100 Hashtable PresenceParams = new Hashtable();
101 PresenceParams.Add("agent_id",TalkingAbout.agentData.AgentID.ToString());
102 PresenceParams.Add("notify_id",UserToUpdate.agentData.AgentID.ToString());
103 if (TalkingAbout.OnlineYN)
104 PresenceParams.Add("status","TRUE");
105 else
106 PresenceParams.Add("status","FALSE");
107
108
109
110
111 ArrayList SendParams = new ArrayList();
112 SendParams.Add(PresenceParams);
113
114
115 m_log.Info("[PRESENCE]: Informing " + whichRegion.regionName + " at " + whichRegion.httpServerURI);
116 // Send
117 XmlRpcRequest RegionReq = new XmlRpcRequest("presence_update", SendParams);
118 try
119 {
120
121 XmlRpcResponse RegionResp = RegionReq.Send(whichRegion.httpServerURI, 6000);
122 }
123 catch (WebException)
124 {
125 m_log.WarnFormat("[INFORM]: failed notifying region {0} containing user {1} about {2}", whichRegion.regionName, UserToUpdate.agentData.firstname + " " + UserToUpdate.agentData.lastname, TalkingAbout.agentData.firstname + " " + TalkingAbout.agentData.lastname);
126 }
127 }
128 else
129 {
130 m_log.Info("[PRESENCEUPDATER]: Region data was null skipping");
131
132 }
133
134 handlerDone = OnDone;
135 if (handlerDone != null)
136 {
137 handlerDone(this);
138 }
70 139
71 m_log.Info("[PRESENCE]: Informing " + whichRegion.regionName + " at " + whichRegion.httpServerURI);
72 // Send
73 XmlRpcRequest RegionReq = new XmlRpcRequest("presence_update", SendParams);
74 XmlRpcResponse RegionResp = RegionReq.Send(whichRegion.httpServerURI, 6000);
75 } 140 }
76 } 141 }
77} 142}
diff --git a/OpenSim/Grid/MessagingServer/UserPresenceData.cs b/OpenSim/Grid/MessagingServer/UserPresenceData.cs
index 7188201..74a6032 100644
--- a/OpenSim/Grid/MessagingServer/UserPresenceData.cs
+++ b/OpenSim/Grid/MessagingServer/UserPresenceData.cs
@@ -40,6 +40,7 @@ namespace OpenSim.Grid.MessagingServer
40 public string httpURI = String.Empty; 40 public string httpURI = String.Empty;
41 public List<FriendListItem> friendData = new List<FriendListItem> (); 41 public List<FriendListItem> friendData = new List<FriendListItem> ();
42 public List<LLUUID> subscriptionData = new List<LLUUID>(); 42 public List<LLUUID> subscriptionData = new List<LLUUID>();
43 public bool OnlineYN = false;
43 44
44 public UserPresenceData() 45 public UserPresenceData()
45 { 46 {
diff --git a/OpenSim/Grid/UserServer/MessageServersConnector.cs b/OpenSim/Grid/UserServer/MessageServersConnector.cs
index 529c089..208131e 100644
--- a/OpenSim/Grid/UserServer/MessageServersConnector.cs
+++ b/OpenSim/Grid/UserServer/MessageServersConnector.cs
@@ -185,12 +185,12 @@ namespace OpenSim.Grid.UserServer
185 { 185 {
186 if (MessageServers.Count > 0) 186 if (MessageServers.Count > 0)
187 { 187 {
188 m_log.Info("[MSGCONNECTOR]: Sending login notice to registered message servers"); 188 m_log.Info("[MSGCONNECTOR]: Sending logoff notice to registered message servers");
189 } 189 }
190 else 190 else
191// { 191 {
192// m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring"); 192// m_log.Debug("[MSGCONNECTOR]: No Message Servers registered, ignoring");
193// } 193 }
194 foreach (MessageServerInfo serv in MessageServers.Values) 194 foreach (MessageServerInfo serv in MessageServers.Values)
195 { 195 {
196 NotifyMessageServerAboutUserLogoff(serv,agentID); 196 NotifyMessageServerAboutUserLogoff(serv,agentID);
diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
index 2e892c2..0daabc5 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs
@@ -382,7 +382,13 @@ namespace OpenSim.Region.Communications.OGS1
382 regionInfo.RegionID = new LLUUID((string) responseData["region_UUID"]); 382 regionInfo.RegionID = new LLUUID((string) responseData["region_UUID"]);
383 regionInfo.RegionName = (string) responseData["region_name"]; 383 regionInfo.RegionName = (string) responseData["region_name"];
384 384
385 m_remoteRegionInfoCache.Add(regionHandle, regionInfo); 385 lock (m_remoteRegionInfoCache)
386 {
387 if (!m_remoteRegionInfoCache.ContainsKey(regionHandle))
388 {
389 m_remoteRegionInfoCache.Add(regionHandle, regionInfo);
390 }
391 }
386 } 392 }
387 catch (WebException) 393 catch (WebException)
388 { 394 {
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
index c82f88d..92c808b 100644
--- a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
@@ -25,6 +25,7 @@
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */ 26 */
27using System; 27using System;
28using System.Collections;
28using System.Collections.Generic; 29using System.Collections.Generic;
29using System.Reflection; 30using System.Reflection;
30using libsecondlife; 31using libsecondlife;
@@ -45,6 +46,8 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
45 private Dictionary<LLUUID, List<FriendListItem>> FriendLists = new Dictionary<LLUUID, List<FriendListItem>>(); 46 private Dictionary<LLUUID, List<FriendListItem>> FriendLists = new Dictionary<LLUUID, List<FriendListItem>>();
46 private Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>(); 47 private Dictionary<LLUUID, LLUUID> m_pendingFriendRequests = new Dictionary<LLUUID, LLUUID>();
47 private Dictionary<LLUUID, ulong> m_rootAgents = new Dictionary<LLUUID, ulong>(); 48 private Dictionary<LLUUID, ulong> m_rootAgents = new Dictionary<LLUUID, ulong>();
49 private Dictionary<LLUUID, List<StoredFriendListUpdate>> StoredFriendListUpdates = new Dictionary<LLUUID, List<StoredFriendListUpdate>>();
50
48 private List<Scene> m_scene = new List<Scene>(); 51 private List<Scene> m_scene = new List<Scene>();
49 52
50 #region IRegionModule Members 53 #region IRegionModule Members
@@ -91,6 +94,73 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
91 public XmlRpcResponse processPresenceUpdate(XmlRpcRequest req) 94 public XmlRpcResponse processPresenceUpdate(XmlRpcRequest req)
92 { 95 {
93 m_log.Info("[FRIENDS]: Got Notification about a user! OMG"); 96 m_log.Info("[FRIENDS]: Got Notification about a user! OMG");
97 Hashtable requestData = (Hashtable)req.Params[0];
98 if (requestData.ContainsKey("agent_id") && requestData.ContainsKey("notify_id") && requestData.ContainsKey("status"))
99 {
100 LLUUID notifyAgentId = LLUUID.Zero;
101 LLUUID notifyAboutAgentId = LLUUID.Zero;
102 bool notifyOnlineStatus = false;
103
104 if ((string)requestData["status"] == "TRUE")
105 notifyOnlineStatus = true;
106
107 Helpers.TryParse((string)requestData["notify_id"], out notifyAgentId);
108
109 Helpers.TryParse((string)requestData["agent_id"], out notifyAboutAgentId);
110
111 ScenePresence avatar = GetPresenceFromAgentID(notifyAgentId);
112 if (avatar != null)
113 {
114 if (avatar.IsChildAgent)
115 {
116 StoredFriendListUpdate sob = new StoredFriendListUpdate();
117 sob.OnlineYN = notifyOnlineStatus;
118 sob.storedAbout = notifyAboutAgentId;
119 sob.storedFor = notifyAgentId;
120 lock (StoredFriendListUpdates)
121 {
122 if (StoredFriendListUpdates.ContainsKey(notifyAgentId))
123 {
124 StoredFriendListUpdates[notifyAgentId].Add(sob);
125 }
126 else
127 {
128 List<StoredFriendListUpdate> newitem = new List<StoredFriendListUpdate>();
129 newitem.Add(sob);
130 StoredFriendListUpdates.Add(notifyAgentId, newitem);
131 }
132 }
133 }
134 else
135 {
136 if (notifyOnlineStatus)
137 doFriendListUpdateOnline(notifyAboutAgentId);
138 else
139 ClientLoggedOut(notifyAboutAgentId);
140 }
141 }
142 else
143 {
144 StoredFriendListUpdate sob = new StoredFriendListUpdate();
145 sob.OnlineYN = notifyOnlineStatus;
146 sob.storedAbout = notifyAboutAgentId;
147 sob.storedFor = notifyAgentId;
148 lock (StoredFriendListUpdates)
149 {
150 if (StoredFriendListUpdates.ContainsKey(notifyAgentId))
151 {
152 StoredFriendListUpdates[notifyAgentId].Add(sob);
153 }
154 else
155 {
156 List<StoredFriendListUpdate> newitem = new List<StoredFriendListUpdate>();
157 newitem.Add(sob);
158 StoredFriendListUpdates.Add(notifyAgentId, newitem);
159 }
160 }
161 }
162
163 }
94 return new XmlRpcResponse(); 164 return new XmlRpcResponse();
95 } 165 }
96 166
@@ -110,24 +180,30 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
110 client.OnDenyFriendRequest += OnDenyFriendRequest; 180 client.OnDenyFriendRequest += OnDenyFriendRequest;
111 client.OnTerminateFriendship += OnTerminateFriendship; 181 client.OnTerminateFriendship += OnTerminateFriendship;
112 182
183 doFriendListUpdateOnline(client.AgentId);
184
185 }
186
187 private void doFriendListUpdateOnline(LLUUID AgentId)
188 {
113 List<FriendListItem> fl = new List<FriendListItem>(); 189 List<FriendListItem> fl = new List<FriendListItem>();
114 190
115 //bool addFLback = false; 191 //bool addFLback = false;
116 192
117 lock (FriendLists) 193 lock (FriendLists)
118 { 194 {
119 if (FriendLists.ContainsKey(client.AgentId)) 195 if (FriendLists.ContainsKey(AgentId))
120 { 196 {
121 fl = FriendLists[client.AgentId]; 197 fl = FriendLists[AgentId];
122 } 198 }
123 else 199 else
124 { 200 {
125 fl = m_scene[0].GetFriendList(client.AgentId); 201 fl = m_scene[0].GetFriendList(AgentId);
126 202
127 //lock (FriendLists) 203 //lock (FriendLists)
128 //{ 204 //{
129 if (!FriendLists.ContainsKey(client.AgentId)) 205 if (!FriendLists.ContainsKey(AgentId))
130 FriendLists.Add(client.AgentId, fl); 206 FriendLists.Add(AgentId, fl);
131 //} 207 //}
132 } 208 }
133 } 209 }
@@ -161,11 +237,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
161 { 237 {
162 foreach (FriendListItem fli in usrfl) 238 foreach (FriendListItem fli in usrfl)
163 { 239 {
164 if (fli.Friend == client.AgentId) 240 if (fli.Friend == AgentId)
165 { 241 {
166 fli.onlinestatus = true; 242 fli.onlinestatus = true;
167 LLUUID[] Agents = new LLUUID[1]; 243 LLUUID[] Agents = new LLUUID[1];
168 Agents[0] = client.AgentId; 244 Agents[0] = AgentId;
169 av.ControllingClient.SendAgentOnline(Agents); 245 av.ControllingClient.SendAgentOnline(Agents);
170 246
171 } 247 }
@@ -176,8 +252,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
176 252
177 if (UpdateUsers.Count > 0) 253 if (UpdateUsers.Count > 0)
178 { 254 {
179 255 ScenePresence avatar = GetPresenceFromAgentID(AgentId);
180 client.SendAgentOnline(UpdateUsers.ToArray()); 256 if (avatar != null)
257 {
258 avatar.ControllingClient.SendAgentOnline(UpdateUsers.ToArray());
259 }
181 260
182 } 261 }
183 } 262 }
@@ -302,6 +381,27 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
302 { 381 {
303 m_rootAgents.Add(avatar.UUID, avatar.RegionHandle); 382 m_rootAgents.Add(avatar.UUID, avatar.RegionHandle);
304 m_log.Info("[FRIEND]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + "."); 383 m_log.Info("[FRIEND]: Claiming " + avatar.Firstname + " " + avatar.Lastname + " in region:" + avatar.RegionHandle + ".");
384
385 List<StoredFriendListUpdate> updateme = new List<StoredFriendListUpdate>();
386 lock (StoredFriendListUpdates)
387 {
388 if (StoredFriendListUpdates.ContainsKey(avatar.UUID))
389 {
390 updateme = StoredFriendListUpdates[avatar.UUID];
391 StoredFriendListUpdates.Remove(avatar.UUID);
392 }
393 }
394
395 if (updateme.Count > 0)
396 {
397 foreach (StoredFriendListUpdate u in updateme)
398 {
399 if (u.OnlineYN)
400 doFriendListUpdateOnline(u.storedAbout);
401 else
402 ClientLoggedOut(u.storedAbout);
403 }
404 }
305 } 405 }
306 } 406 }
307 //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString()); 407 //m_log.Info("[FRIEND]: " + avatar.Name + " status:" + (!avatar.IsChildAgent).ToString());
@@ -441,8 +541,13 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
441 541
442 SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); 542 SceneAgentIn.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule);
443 SceneAgentIn.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint) 1); 543 SceneAgentIn.StoreAddFriendship(m_pendingFriendRequests[transactionID], agentID, (uint) 1);
444 m_pendingFriendRequests.Remove(transactionID); 544
545
546 //LLUUID[] Agents = new LLUUID[1];
547 //Agents[0] = msg.toAgentID;
548 //av.ControllingClient.SendAgentOnline(Agents);
445 549
550 m_pendingFriendRequests.Remove(transactionID);
446 // TODO: Inform agent that the friend is online 551 // TODO: Inform agent that the friend is online
447 } 552 }
448 } 553 }
@@ -498,4 +603,11 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
498 603
499 #endregion 604 #endregion
500 } 605 }
606
607 public struct StoredFriendListUpdate
608 {
609 public LLUUID storedFor;
610 public LLUUID storedAbout;
611 public bool OnlineYN;
612 }
501} 613}