From 0c58a9e68074f3593920dc9f2356bbed96416497 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 26 May 2011 10:04:48 -0700
Subject: HG IM in grid mode working fairly well. Unknown target user
references looked back in source user's User Agent service.
---
.../InstantMessage/HGMessageTransferModule.cs | 74 ++++++++++++++++++++++
1 file changed, 74 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs
index 9ba4e49..ed02119 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs
@@ -194,6 +194,22 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
Util.FireAndForget(delegate
{
bool success = m_IMService.OutgoingInstantMessage(im, url);
+ if (!success && account == null)
+ {
+ // One last chance
+ string recipientUUI = TryGetRecipientUUI(new UUID(im.fromAgentID), toAgentID);
+ m_log.DebugFormat("[HG MESSAGE TRANSFER]: Got UUI {0}", recipientUUI);
+ if (recipientUUI != string.Empty)
+ {
+ UUID id; string u = string.Empty, first = string.Empty, last = string.Empty, secret = string.Empty;
+ if (Util.ParseUniversalUserIdentifier(recipientUUI, out id, out u, out first, out last, out secret))
+ {
+ success = m_IMService.OutgoingInstantMessage(im, u);
+ if (success)
+ UserManagementModule.AddUser(toAgentID, u + ";" + first + " " + last);
+ }
+ }
+ }
result(success);
});
@@ -254,6 +270,64 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
result(false);
}
+ private string TryGetRecipientUUI(UUID fromAgent, UUID toAgent)
+ {
+ // Let's call back the fromAgent's user agent service
+ // Maybe that service knows about the toAgent
+ IClientAPI client = LocateClientObject(fromAgent);
+ if (client != null)
+ {
+ AgentCircuitData circuit = m_Scenes[0].AuthenticateHandler.GetAgentCircuitData(client.AgentId);
+ if (circuit != null)
+ {
+ if (circuit.ServiceURLs.ContainsKey("HomeURI"))
+ {
+ string uasURL = circuit.ServiceURLs["HomeURI"].ToString();
+ m_log.DebugFormat("[HG MESSAGE TRANSFER]: getting UUI of user {0} from {1}", toAgent, uasURL);
+ UserAgentServiceConnector uasConn = new UserAgentServiceConnector(uasURL);
+ return uasConn.GetUUI(fromAgent, toAgent);
+ }
+ }
+ }
+
+ return string.Empty;
+ }
+
+
+ ///
+ /// Find the scene for an agent
+ ///
+ private Scene GetClientScene(UUID agentId)
+ {
+ lock (m_Scenes)
+ {
+ foreach (Scene scene in m_Scenes)
+ {
+ ScenePresence presence = scene.GetScenePresence(agentId);
+ if (presence != null && !presence.IsChildAgent)
+ return scene;
+ }
+ }
+
+ return null;
+ }
+
+ ///
+ /// Find the client for a ID
+ ///
+ public IClientAPI LocateClientObject(UUID agentID)
+ {
+ Scene scene = GetClientScene(agentID);
+ if (scene != null)
+ {
+ ScenePresence presence = scene.GetScenePresence(agentID);
+ if (presence != null)
+ return presence.ControllingClient;
+ }
+
+ return null;
+ }
+
#region IInstantMessageSimConnector
public bool SendInstantMessage(GridInstantMessage im)
{
--
cgit v1.1