From 557559abd3d38b590e7b847753a701afdd69bac5 Mon Sep 17 00:00:00 2001 From: Homer Horwitz Date: Wed, 26 Nov 2008 19:50:03 +0000 Subject: Added local lookup before we ask the messaging server. Still not tested. May contain bugs. --- .../Avatar/InstantMessage/PresenceModule.cs | 32 ++++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region/Environment/Modules/Avatar/InstantMessage/PresenceModule.cs') diff --git a/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/PresenceModule.cs b/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/PresenceModule.cs index 94032fd..c811833 100644 --- a/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/PresenceModule.cs +++ b/OpenSim/Region/Environment/Modules/Avatar/InstantMessage/PresenceModule.cs @@ -143,12 +143,32 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage PresenceInfo[] result = new PresenceInfo[users.Length]; if (m_Gridmode) { - // TODO process local info first and only do a server lookup if necessary. - Dictionary infos = m_initialScene.GetFriendRegionInfos(new List(users)); - for (int i = 0; i < users.Length; ++i) + // first check the local information + List uuids = new List(); // the uuids to check remotely + List indices = new List(); // just for performance. + lock (m_RootAgents) + { + for (int i = 0; i < uuids.Count; ++i) + { + Scene scene; + if (m_RootAgents.TryGetValue(users[i], out scene)) + { + result[i] = new PresenceInfo(users[i], scene.RegionInfo.RegionID); + } + else + { + uuids.Add(users[i]); + indices.Add(i); + } + } + } + + // now we have filtered out all the local root agents. The rest we have to request info about + Dictionary infos = m_initialScene.GetFriendRegionInfos(uuids); + for (int i = 0; i < uuids.Count; ++i) { FriendRegionInfo info; - if (infos.TryGetValue(users[i], out info) && info.isOnline) + if (infos.TryGetValue(uuids[i], out info) && info.isOnline) { UUID regionID = info.regionID; if (regionID == UUID.Zero) @@ -158,9 +178,9 @@ namespace OpenSim.Region.Environment.Modules.Avatar.InstantMessage RegionInfo regionInfo = m_initialScene.RequestNeighbouringRegionInfo(info.regionHandle); regionID = regionInfo.RegionID; } - result[i] = new PresenceInfo(users[i], regionID); + result[indices[i]] = new PresenceInfo(uuids[i], regionID); } - else result[i] = new PresenceInfo(users[i], UUID.Zero); + else result[indices[i]] = new PresenceInfo(uuids[i], UUID.Zero); } } else -- cgit v1.1