Files
opensim/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs
2026-02-15 13:13:45 +01:00

119 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Services.Interfaces;
using OpenSim.Services.Connectors.Hypergrid;
using FriendInfo = OpenSim.Services.Interfaces.FriendInfo;
using OpenMetaverse;
using log4net;
namespace OpenSim.Region.CoreModules.Avatar.Friends
{
public class HGStatusNotifier
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private HGFriendsModule m_FriendsModule;
public HGStatusNotifier(HGFriendsModule friendsModule)
{
m_FriendsModule = friendsModule;
}
// Currently unused
/*
public void Notify(UUID userID, Dictionary<string, List<FriendInfo>> friendsPerDomain, bool online)
{
if(m_FriendsModule is null)
return;
foreach (KeyValuePair<string, List<FriendInfo>> kvp in friendsPerDomain)
{
if (kvp.Value.Count == 0)
continue; // no one to notify. caller don't do this
// ASSUMPTION: we assume that all users for one home domain
// have exactly the same set of service URLs.
// If this is ever not true, we need to change this.
FriendInfo id0Info = kvp.Value[0];
string id0 = id0Info.Friend; // the hgname of the first friend
if (Util.ParseUniversalUserIdentifier(id0, out UUID firstID))
{
string friendsServerURI = m_FriendsModule.UserManagementModule.GetUserServerURL(firstID, "FriendsServerURI");
if (string.IsNullOrEmpty(friendsServerURI))
continue;
HGFriendsServicesConnector fConn = new(friendsServerURI);
List<string> ids = new(kvp.Value.Count);
foreach (FriendInfo f in kvp.Value)
{
if (Util.ParseUniversalUserIdentifier(f.Friend, out UUID friendID))
ids.Add(friendID.ToString());
}
if (ids.Count == 0)
continue;
// Note: first argument in StatusNotification needs to be
// a List<string> of UUIDs, not a List<string> of hgnames!
List<UUID> friendsOnline = fConn.StatusNotification(ids, userID, online);
if (friendsOnline.Count == 0)
continue;
IClientAPI client = m_FriendsModule.LocateClientObject(userID);
if(client is not null)
{
m_log.DebugFormat("[HG STATUS NOTIFIER]: Notifying {0} friends in {1}", friendsOnline.Count, kvp.Key);
m_FriendsModule.CacheFriendsOnline(userID, friendsOnline, online);
if(online)
client?.SendAgentOnline(friendsOnline.ToArray());
else
client?.SendAgentOffline(friendsOnline.ToArray());
}
}
}
}
*/
public void Notify(UUID userID, List<UUID>friendIds, bool online)
{
if(m_FriendsModule is null)
return;
if (friendIds.Count == 0)
return; // no one to notify. caller don't do this
m_log.DebugFormat("[HG STATUS NOTIFIER]: Notifying {0} foreign friends", friendIds.Count);
foreach (UUID friendID in friendIds)
{
string friendsServerURI = m_FriendsModule.UserManagementModule.GetUserServerURL(friendID, "FriendsServerURI");
if (!string.IsNullOrEmpty(friendsServerURI))
{
HGFriendsServicesConnector fConn = new(friendsServerURI);
List<UUID> friendsOnline = fConn.StatusNotification(new List<string> { friendID.ToString() }, userID, online);
if (friendsOnline.Count > 0)
{
IClientAPI client = m_FriendsModule.LocateClientObject(userID);
if(client is not null)
{
m_FriendsModule.CacheFriendsOnline(userID, friendsOnline, online);
if(online)
client?.SendAgentOnline(friendsOnline.ToArray());
else
client?.SendAgentOffline(friendsOnline.ToArray());
}
}
}
}
}
}
}