This should make offline IMs work again. It should work for incoming foreign IMs where the local recipient is offline. I can't test any of this, because I don't run an offline IM server.

bulletsim
Diva Canto 2011-06-06 17:46:34 -07:00
parent 6861606b6d
commit e77ca65e57
3 changed files with 70 additions and 9 deletions

View File

@ -213,6 +213,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
} }
} }
} }
if (!success && !foreigner)
HandleUndeliveredMessage(im, result);
else
result(success); result(success);
}); });

View File

@ -67,6 +67,10 @@ namespace OpenSim.Services.HypergridService
protected static Dictionary<UUID, object> m_UserLocationMap = new Dictionary<UUID, object>(); protected static Dictionary<UUID, object> m_UserLocationMap = new Dictionary<UUID, object>();
private static ExpiringCache<UUID, GridRegion> m_RegionCache; private static ExpiringCache<UUID, GridRegion> m_RegionCache;
private static string m_RestURL;
private static bool m_ForwardOfflineGroupMessages;
private static bool m_InGatekeeper;
public HGInstantMessageService(IConfigSource config) public HGInstantMessageService(IConfigSource config)
: this(config, null) : this(config, null)
{ {
@ -81,8 +85,6 @@ namespace OpenSim.Services.HypergridService
{ {
m_Initialized = true; m_Initialized = true;
m_log.DebugFormat("[HG IM SERVICE]: Starting...");
IConfig serverConfig = config.Configs["HGInstantMessageService"]; IConfig serverConfig = config.Configs["HGInstantMessageService"];
if (serverConfig == null) if (serverConfig == null)
throw new Exception(String.Format("No section HGInstantMessageService in config file")); throw new Exception(String.Format("No section HGInstantMessageService in config file"));
@ -90,6 +92,9 @@ namespace OpenSim.Services.HypergridService
string gridService = serverConfig.GetString("GridService", String.Empty); string gridService = serverConfig.GetString("GridService", String.Empty);
string presenceService = serverConfig.GetString("PresenceService", String.Empty); string presenceService = serverConfig.GetString("PresenceService", String.Empty);
string userAgentService = serverConfig.GetString("UserAgentService", String.Empty); string userAgentService = serverConfig.GetString("UserAgentService", String.Empty);
m_InGatekeeper = serverConfig.GetBoolean("InGatekeeper", false);
m_log.DebugFormat("[HG IM SERVICE]: Starting... InRobust? {0}", m_InGatekeeper);
if (gridService == string.Empty || presenceService == string.Empty) if (gridService == string.Empty || presenceService == string.Empty)
throw new Exception(String.Format("Incomplete specifications, InstantMessage Service cannot function.")); throw new Exception(String.Format("Incomplete specifications, InstantMessage Service cannot function."));
@ -101,6 +106,21 @@ namespace OpenSim.Services.HypergridService
m_RegionCache = new ExpiringCache<UUID, GridRegion>(); m_RegionCache = new ExpiringCache<UUID, GridRegion>();
IConfig cnf = config.Configs["Messaging"];
if (cnf == null)
{
return;
}
m_RestURL = cnf.GetString("OfflineMessageURL", string.Empty);
if (m_RestURL == string.Empty)
{
m_log.Error("[HG IM SERVICE]: Offline IMs enabled, but no URL is given");
return;
}
m_ForwardOfflineGroupMessages = cnf.GetBoolean("ForwardOfflineGroupMessages", false);
} }
} }
@ -109,13 +129,21 @@ namespace OpenSim.Services.HypergridService
m_log.DebugFormat("[HG IM SERVICE]: Received message from {0} to {1}", im.fromAgentID, im.toAgentID); m_log.DebugFormat("[HG IM SERVICE]: Received message from {0} to {1}", im.fromAgentID, im.toAgentID);
UUID toAgentID = new UUID(im.toAgentID); UUID toAgentID = new UUID(im.toAgentID);
bool success = false;
if (m_IMSimConnector != null) if (m_IMSimConnector != null)
{ {
//m_log.DebugFormat("[XXX] SendIMToRegion local im connector"); //m_log.DebugFormat("[XXX] SendIMToRegion local im connector");
return m_IMSimConnector.SendInstantMessage(im); success = m_IMSimConnector.SendInstantMessage(im);
} }
else else
return TrySendInstantMessage(im, "", true, false); {
success = TrySendInstantMessage(im, "", true, false);
}
if (!success && m_InGatekeeper) // we do this only in the Gatekeeper IM service
UndeliveredMessage(im);
return success;
} }
public bool OutgoingInstantMessage(GridInstantMessage im, string url, bool foreigner) public bool OutgoingInstantMessage(GridInstantMessage im, string url, bool foreigner)
@ -129,6 +157,7 @@ namespace OpenSim.Services.HypergridService
upd.RegionID = UUID.Zero; upd.RegionID = UUID.Zero;
return TrySendInstantMessage(im, upd, true, foreigner); return TrySendInstantMessage(im, upd, true, foreigner);
} }
} }
protected bool TrySendInstantMessage(GridInstantMessage im, object previousLocation, bool firstTime, bool foreigner) protected bool TrySendInstantMessage(GridInstantMessage im, object previousLocation, bool firstTime, bool foreigner)
@ -313,5 +342,19 @@ namespace OpenSim.Services.HypergridService
} }
} }
private bool UndeliveredMessage(GridInstantMessage im)
{
if (m_RestURL != string.Empty && (im.offline != 0)
&& (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages)))
{
return SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>(
"POST", m_RestURL + "/SaveMessage/", im);
}
else
return false;
}
} }
} }

View File

@ -360,4 +360,19 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003
GridService = "OpenSim.Services.GridService.dll:GridService" GridService = "OpenSim.Services.GridService.dll:GridService"
PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService" PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService"
UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService" UserAgentService = "OpenSim.Services.HypergridService.dll:UserAgentService"
; This should always be true in the Robust config
InGatekeeper = True
[Messaging]
; If you have an Offline IM server, set the vars in this section, so that
; incomming IMs to local users from foreign grids can be saved
;
;# {OfflineMessageURL} {OfflineMessageModule:OfflineMessageModule} {URL of offline messaging service} {}
;; URL of web service for offline message storage
; OfflineMessageURL = http://yourserver/Offline.php
;; Control whether group messages are forwarded to offline users.
;; Default is true.
;; This applies to the core groups module (Flotsam) only.
; ForwardOfflineGroupMessages = true