mirror of
https://github.com/opensim/opensim.git
synced 2026-08-01 06:06:06 +08:00
Finish the offline IM module (still needs a server). Add rudimentary
support for the mute list (no functionality yet, but allows the RetrieveInstantMessages event to fire now).
This commit is contained in:
@@ -24,12 +24,15 @@
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Client;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
@@ -40,21 +43,36 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private bool enabled = false;
|
||||
private bool enabled = true;
|
||||
private List<Scene> m_SceneList = new List<Scene>();
|
||||
private string m_RestURL = String.Empty;
|
||||
|
||||
public void Initialise(Scene scene, IConfigSource config)
|
||||
{
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
IConfig cnf = config.Configs["Messaging"];
|
||||
if (cnf != null && cnf.GetString(
|
||||
"OfflineMessageModule", "None") !=
|
||||
"OfflineMessageModule")
|
||||
{
|
||||
enabled = false;
|
||||
return;
|
||||
|
||||
enabled = true;
|
||||
}
|
||||
|
||||
lock (m_SceneList)
|
||||
{
|
||||
if (m_SceneList.Count == 0)
|
||||
{
|
||||
m_RestURL = cnf.GetString("OfflineMessageURL", "");
|
||||
if (m_RestURL == "")
|
||||
{
|
||||
m_log.Error("[OFFLINE MESSAGING] Module was enabled, but no URL is given, disabling");
|
||||
enabled = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!m_SceneList.Contains(scene))
|
||||
m_SceneList.Add(scene);
|
||||
|
||||
@@ -64,6 +82,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
|
||||
public void PostInitialise()
|
||||
{
|
||||
if (!enabled)
|
||||
return;
|
||||
|
||||
if (m_SceneList.Count == 0)
|
||||
return;
|
||||
|
||||
@@ -80,6 +101,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
m_SceneList.Clear();
|
||||
}
|
||||
|
||||
m_log.Error("[OFFLINE MESSAGING] No message transfer module is enabled. Diabling offline messages");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -107,7 +129,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
foreach (Scene s in m_SceneList)
|
||||
{
|
||||
ScenePresence presence = s.GetScenePresence(agentID);
|
||||
if (!presence.IsChildAgent)
|
||||
if (presence != null && !presence.IsChildAgent)
|
||||
return presence.ControllingClient;
|
||||
}
|
||||
return null;
|
||||
@@ -116,18 +138,49 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
private void OnNewClient(IClientAPI client)
|
||||
{
|
||||
client.OnRetrieveInstantMessages += RetrieveInstantMessages;
|
||||
// TODO:: Remove when mute lists are supported
|
||||
//
|
||||
//client.OnEconomyDataRequest += OnEconomyDataRequest;
|
||||
}
|
||||
|
||||
// TODO: Remove method when mute lists are supported
|
||||
//
|
||||
//private void OnEconomyDataRequest(UUID agentID)
|
||||
//{
|
||||
// IClientAPI client = FindClient(agentID);
|
||||
// if (client == null)
|
||||
// {
|
||||
// m_log.ErrorFormat("[OFFLINE MESSAGING] Can't find client {0}", agentID.ToString());
|
||||
// return;
|
||||
// }
|
||||
// RetrieveInstantMessages(client);
|
||||
//}
|
||||
|
||||
private void RetrieveInstantMessages(IClientAPI client)
|
||||
{
|
||||
m_log.Debug("[OFFLINE MESSAGING] RetrieveInstantMessages called");
|
||||
m_log.DebugFormat("[OFFLINE MESSAGING] Retrieving stored messages for {0}", client.AgentId);
|
||||
|
||||
List<GridInstantMessage>msglist = SynchronousRestObjectPoster.BeginPostObject<UUID, List<GridInstantMessage>>(
|
||||
"POST", m_RestURL+"/RetrieveMessages/", client.AgentId);
|
||||
|
||||
foreach (GridInstantMessage im in msglist)
|
||||
{
|
||||
DateTime saved = Util.ToDateTime((uint)im.timestamp);
|
||||
|
||||
client.SendInstantMessage(new UUID(im.toAgentID),
|
||||
"(saved " + saved.ToString() + ") " + im.message,
|
||||
new UUID(im.fromAgentID), im.fromAgentName,
|
||||
(byte)im.dialog,
|
||||
(uint)im.timestamp);
|
||||
}
|
||||
}
|
||||
|
||||
private void UndeliveredMessage(GridInstantMessage im)
|
||||
{
|
||||
if (im.offline != 0)
|
||||
{
|
||||
// TODO: Actually save it
|
||||
bool success = SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>(
|
||||
"POST", m_RestURL+"/SaveMessage/", im);
|
||||
|
||||
if(im.dialog == (byte)InstantMessageDialog.MessageFromAgent)
|
||||
{
|
||||
@@ -137,9 +190,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||
|
||||
client.SendInstantMessage(new UUID(im.fromAgentID),
|
||||
"User is not logged in. "+
|
||||
"Message saved.",
|
||||
(success ? "Message saved." : "Message not saved"),
|
||||
new UUID(im.toAgentID), "System",
|
||||
(byte)InstantMessageDialog.BusyAutoResponse,
|
||||
(byte)InstantMessageDialog.MessageFromAgent,
|
||||
(uint)Util.UnixTimeSinceEpoch());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user