aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs43
1 files changed, 23 insertions, 20 deletions
diff --git a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
index e4ed9fa..f8f66d6 100644
--- a/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/Environment/Modules/Avatar/Friends/FriendsModule.cs
@@ -755,17 +755,18 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
755 // TODO: If we ever switch to .NET >= 3, replace those Lists with HashSets. 755 // TODO: If we ever switch to .NET >= 3, replace those Lists with HashSets.
756 // I can't believe that we have Dictionaries, but no Sets, considering Java introduced them years ago... 756 // I can't believe that we have Dictionaries, but no Sets, considering Java introduced them years ago...
757 List<UUID> friendIDsToSendTo = new List<UUID>(); 757 List<UUID> friendIDsToSendTo = new List<UUID>();
758 List<UUID> friendIDsToReceiveFromOffline = new List<UUID>(); 758 List<UUID> candidateFriendIDsToReceive = new List<UUID>();
759 List<UUID> friendIDsToReceiveFromOnline = new List<UUID>(); 759
760 foreach (FriendListItem item in friendList) 760 foreach (FriendListItem item in friendList)
761 { 761 {
762 if (((item.FriendListOwnerPerms | item.FriendPerms) & (uint)FriendRights.CanSeeOnline) != 0) 762 if (((item.FriendListOwnerPerms | item.FriendPerms) & (uint)FriendRights.CanSeeOnline) != 0)
763 { 763 {
764 // friend is allowed to see my presence => add 764 // friend is allowed to see my presence => add
765 if ((item.FriendListOwnerPerms & (uint)FriendRights.CanSeeOnline) != 0) friendIDsToSendTo.Add(item.Friend); 765 if ((item.FriendListOwnerPerms & (uint)FriendRights.CanSeeOnline) != 0)
766 friendIDsToSendTo.Add(item.Friend);
766 767
767 // I'm allowed to see friend's presence => add as offline, we might reconsider in a momnet... 768 if ((item.FriendPerms & (uint)FriendRights.CanSeeOnline) != 0)
768 if ((item.FriendPerms & (uint)FriendRights.CanSeeOnline) != 0) friendIDsToReceiveFromOffline.Add(item.Friend); 769 candidateFriendIDsToReceive.Add(item.Friend);
769 } 770 }
770 } 771 }
771 772
@@ -780,19 +781,21 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
780 { 781 {
781 // build a list of friends to look up region-information and on-/offline-state for 782 // build a list of friends to look up region-information and on-/offline-state for
782 List<UUID> friendIDsToLookup = new List<UUID>(friendIDsToSendTo); 783 List<UUID> friendIDsToLookup = new List<UUID>(friendIDsToSendTo);
783 foreach (UUID uuid in friendIDsToReceiveFromOffline) 784 foreach (UUID uuid in candidateFriendIDsToReceive)
784 { 785 {
785 if (!friendIDsToLookup.Contains(uuid)) friendIDsToLookup.Add(uuid); 786 if (!friendIDsToLookup.Contains(uuid)) friendIDsToLookup.Add(uuid);
786 } 787 }
787 788
788 m_log.DebugFormat("[FRIEND]: {0} to lookup, {1} to send to, {2} to receive from for agent {3}", 789 m_log.DebugFormat(
789 friendIDsToLookup.Count, friendIDsToSendTo.Count, friendIDsToReceiveFromOffline.Count, client.Name); 790 "[FRIEND]: {0} to lookup, {1} to send to, {2} candidates to receive from for agent {3}",
791 friendIDsToLookup.Count, friendIDsToSendTo.Count, candidateFriendIDsToReceive.Count, client.Name);
790 792
791 // we have to fetch FriendRegionInfos, as the (cached) FriendListItems don't 793 // we have to fetch FriendRegionInfos, as the (cached) FriendListItems don't
792 // necessarily contain the correct online state... 794 // necessarily contain the correct online state...
793 Dictionary<UUID, FriendRegionInfo> friendRegions = m_initialScene.GetFriendRegionInfos(friendIDsToLookup); 795 Dictionary<UUID, FriendRegionInfo> friendRegions = m_initialScene.GetFriendRegionInfos(friendIDsToLookup);
794 m_log.DebugFormat("[FRIEND]: Found {0} regionInfos for {1} friends of {2}", 796 m_log.DebugFormat(
795 friendRegions.Count, friendIDsToLookup.Count, client.Name); 797 "[FRIEND]: Found {0} regionInfos for {1} friends of {2}",
798 friendRegions.Count, friendIDsToLookup.Count, client.Name);
796 799
797 // argument for SendAgentOn/Offline; we shouldn't generate that repeatedly within loops. 800 // argument for SendAgentOn/Offline; we shouldn't generate that repeatedly within loops.
798 UUID[] agentArr = new UUID[] { client.AgentId }; 801 UUID[] agentArr = new UUID[] { client.AgentId };
@@ -800,26 +803,26 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Friends
800 // first, send to friend presence state to me, if I'm online... 803 // first, send to friend presence state to me, if I'm online...
801 if (iAmOnline) 804 if (iAmOnline)
802 { 805 {
803 for (int i = friendIDsToReceiveFromOffline.Count - 1; i >= 0; --i) 806 List<UUID> friendIDsToReceive = new List<UUID>();
807
808 for (int i = candidateFriendIDsToReceive.Count - 1; i >= 0; --i)
804 { 809 {
805 UUID uuid = friendIDsToReceiveFromOffline[i]; 810 UUID uuid = candidateFriendIDsToReceive[i];
806 FriendRegionInfo info; 811 FriendRegionInfo info;
807 if (friendRegions.TryGetValue(uuid, out info) && info != null && info.isOnline) 812 if (friendRegions.TryGetValue(uuid, out info) && info != null && info.isOnline)
808 { 813 {
809 friendIDsToReceiveFromOffline.RemoveAt(i); 814 friendIDsToReceive.Add(uuid);
810 friendIDsToReceiveFromOnline.Add(uuid);
811 } 815 }
812 } 816 }
813 817
814 m_log.DebugFormat("[FRIEND]: Sending {0} offline and {1} online friends to {2}", 818 m_log.DebugFormat(
815 friendIDsToReceiveFromOffline.Count, friendIDsToReceiveFromOnline.Count, client.Name); 819 "[FRIEND]: Sending {0} online friends to {1}", friendIDsToReceive.Count, client.Name);
816 820
817 if (friendIDsToReceiveFromOffline.Count > 0) client.SendAgentOffline(friendIDsToReceiveFromOffline.ToArray()); 821 if (friendIDsToReceive.Count > 0)
818 if (friendIDsToReceiveFromOnline.Count > 0) client.SendAgentOnline(friendIDsToReceiveFromOnline.ToArray()); 822 client.SendAgentOnline(friendIDsToReceive.ToArray());
819 823
820 // clear them for a possible second iteration; we don't have to repeat this 824 // clear them for a possible second iteration; we don't have to repeat this
821 friendIDsToReceiveFromOffline.Clear(); 825 candidateFriendIDsToReceive.Clear();
822 friendIDsToReceiveFromOnline.Clear();
823 } 826 }
824 827
825 // now, send my presence state to my friends 828 // now, send my presence state to my friends