From 42ec116e271a0f12ef5ce863dd3575da987ec567 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 26 Jan 2023 12:07:59 +0000 Subject: [PATCH] try to improve profiles online indication. This ofc just fais on HG --- .../Avatar/UserProfiles/UserProfileModule.cs | 144 ++++-------------- 1 file changed, 30 insertions(+), 114 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index 10f88a4225..b234f31596 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs @@ -169,11 +169,12 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles m_profilesCache.AddOrUpdate(props.UserId, uce, PROFILECACHEEXPIRE); } - // if on same region force online - if (p != null && !p.IsDeleted) - flags |= 0x10; + if (IsFriendOnline(req.client.AgentId, req.agent)) + flags |= (uint)ProfileFlags.Online; + else + flags &= (uint)~ProfileFlags.Online; - if(clients == null) + if (clients == null) { client.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType, props.FirstLifeText, flags, props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); @@ -1502,9 +1503,11 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles { props = uce.props; uint cflags = uce.flags; - // if on same region force online - if(p != null && !p.IsDeleted) - cflags |= 0x10; + + if (IsFriendOnline(remoteClient.AgentId, avatarID)) + cflags = (uint)ProfileFlags.Online; + else + cflags &= (uint)~ProfileFlags.Online; remoteClient.SendAvatarProperties(props.UserId, props.AboutText, uce.born, uce.membershipType , props.FirstLifeText, cflags, @@ -1552,113 +1555,6 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles } Monitor.Exit(m_asyncRequestsLock); } - - /* - string serverURI = string.Empty; - bool foreign = GetUserProfileServerURI(avatarID, out serverURI); - - UserAccount account = null; - Dictionary userInfo; - - if (!foreign) - { - account = Scene.UserAccountService.GetUserAccount(Scene.RegionInfo.ScopeID, avatarID); - } - else - { - userInfo = new Dictionary(); - } - - Byte[] membershipType = new Byte[1]; - string born = string.Empty; - uint flags = 0x00; - - if (null != account) - { - if (account.UserTitle.Length == 0) - membershipType[0] = (Byte)((account.UserFlags & 0xf00) >> 8); - else - membershipType = Utils.StringToBytes(account.UserTitle); - - born = Util.ToDateTime(account.Created).ToString( - "M/d/yyyy", CultureInfo.InvariantCulture); - flags = (uint)(account.UserFlags & 0xff); - } - else - { - if (GetUserAccountData(avatarID, out userInfo) == true) - { - if ((string)userInfo["user_title"].Length == 0) - membershipType[0] = (Byte)(((Byte)userInfo["user_flags"] & 0xf00) >> 8); - else - membershipType = Utils.StringToBytes((string)userInfo["user_title"]); - - int val_born = (int)userInfo["user_created"]; - if(val_born != 0) - born = Util.ToDateTime(val_born).ToString( - "M/d/yyyy", CultureInfo.InvariantCulture); - - // picky, picky - int val_flags = (int)userInfo["user_flags"]; - flags = (uint)(val_flags & 0xff); - } - } - - props = new UserProfileProperties(); - props.UserId = avatarID; - - string result = string.Empty; - if(!GetProfileData(ref props, foreign, serverURI, out result)) - { - props.AboutText ="Profile not available at this time. User may still be unknown to this grid"; - } - - if(!m_allowUserProfileWebURLs) - props.WebUrl =""; - - HashSet clients; - lock(m_profilesCache) - { - if(!m_profilesCache.TryGetValue(props.UserId, out uce) || uce == null) - uce = new UserProfileCacheEntry(); - uce.props = props; - uce.born = born; - uce.membershipType = membershipType; - uce.flags = flags; - clients = uce.ClientsWaitingProps; - uce.ClientsWaitingProps = null; - m_profilesCache.AddOrUpdate(props.UserId, uce, PROFILECACHEEXPIRE); - } - - // if on same region force online - if(p != null && !p.IsDeleted) - flags |= 0x10; - - if(clients == null) - { - remoteClient.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType , props.FirstLifeText, flags, - props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); - - remoteClient.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, props.WantToText, - (uint)props.SkillsMask, props.SkillsText, props.Language); - } - else - { - if(!clients.Contains(remoteClient)) - clients.Add(remoteClient); - foreach(IClientAPI cli in clients) - { - if(!cli.IsActive) - continue; - cli.SendAvatarProperties(props.UserId, props.AboutText, born, membershipType , props.FirstLifeText, flags, - props.FirstLifeImageId, props.ImageId, props.WebUrl, props.PartnerId); - - cli.SendAvatarInterestsReply(props.UserId, (uint)props.WantToMask, props.WantToText, - (uint)props.SkillsMask, props.SkillsText, props.Language); - - } - } - */ } /// @@ -1881,6 +1777,26 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles return null; } + + public virtual bool IsFriendOnline(UUID client, UUID agent) + { + // if on same region force online + ScenePresence p = Scene.GetScenePresence(agent); + if (p != null && !p.IsDeleted) + return true; + + IFriendsModule friendsModule = Scene.RequestModuleInterface(); + if (friendsModule != null) + { + int friendPerms = friendsModule.GetRightsGrantedByFriend(client, agent); + if((friendPerms & (int) FriendRights.CanSeeOnline) != 0); + { + Services.Interfaces.PresenceInfo[] pi = Scene.PresenceService?.GetAgents(new string[] { agent.ToString() }); + return pi != null && pi.Length > 0; + } + } + return false; + } #endregion Util #region Web Util