diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index b224f878c2..6d08b7bcf6 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -268,11 +268,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends friends = new HashSet(); m_OnlineFriendsCache[userID] = friends; } - foreach (UUID friendID in friendsOnline) + if (online) { - if (online) + foreach (UUID friendID in friendsOnline) friends.Add(friendID); - else + } + else + { + foreach (UUID friendID in friendsOnline) friends.Remove(friendID); } } @@ -374,6 +377,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends lock (m_Friends) { + foreach(HashSet friends in m_OnlineFriendsCache.Values) + friends.Remove(agentID); m_OnlineFriendsCache.Remove(agentID); if (m_Friends.TryGetValue(agentID, out UserFriendData friendsData)) { diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index 6510824868..4e95a456ab 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs @@ -238,10 +238,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends // FIXME: also query the presence status of friends in other grids (like in HGStatusNotifier.Notify()) PresenceInfo[] presence = PresenceService.GetAgents(fList.ToArray()); + if (presence.Length == 0) + return; + + if (!m_OnlineFriendsCache.TryGetValue(userID, out HashSet friends)) + { + friends = new HashSet(); + m_OnlineFriendsCache[userID] = friends; + } + foreach (PresenceInfo pi in presence) { if (UUID.TryParse(pi.UserID, out UUID presenceID)) + { online.Add(presenceID); + friends.Add(presenceID); + } } //m_log.DebugFormat("[HGFRIENDS MODULE]: Exiting GetOnlineFriends for {0}", userID); diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index d12525e659..09156d71f2 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -1842,7 +1842,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles if(client.SceneAgent is ScenePresence sp && sp.IsViewerUIGod) { Services.Interfaces.PresenceInfo[] pi = Scene.PresenceService?.GetAgents(new string[] { agent.ToString() }); - return pi != null && pi.Length > 0; + return pi is not null && pi.Length > 0; } return false; }