offline IM support
This commit is contained in:
parent
eb1f45f330
commit
b8c482e5a9
3 changed files with 59 additions and 31 deletions
|
|
@ -39,6 +39,7 @@ using OpenMetaverse.Interfaces;
|
||||||
using OpenMetaverse.Messages.Linden;
|
using OpenMetaverse.Messages.Linden;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
namespace OpenMetaverse
|
namespace OpenMetaverse
|
||||||
{
|
{
|
||||||
|
|
@ -3976,44 +3977,61 @@ namespace OpenMetaverse
|
||||||
if (m_InstantMessage == null) { return; } // don't bother if we don't have any listeners
|
if (m_InstantMessage == null) { return; } // don't bother if we don't have any listeners
|
||||||
|
|
||||||
OSD result = OSDParser.Deserialize(data);
|
OSD result = OSDParser.Deserialize(data);
|
||||||
if (!(result is OSDMap respMap) || respMap.Count == 0 || respMap.ContainsKey("messages"))
|
if (result == null)
|
||||||
{
|
{
|
||||||
Logger.Log("Failed to retrieve offline messages because the capability returned invalid shiz.",
|
Logger.Log("Failed to decode offline messages from data, trying legacy method (Null reply)",
|
||||||
Helpers.LogLevel.Warning);
|
Helpers.LogLevel.Warning);
|
||||||
RetrieveInstantMessagesLegacy();
|
RetrieveInstantMessagesLegacy();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if(result.Type != OSDType.Array)
|
||||||
if (respMap["messages"] is OSDArray msgArray)
|
|
||||||
{
|
{
|
||||||
foreach (var osd in msgArray)
|
Logger.Log("Failed to decode offline messages from data trying legacy method (Wrong unpack type expected array)",
|
||||||
|
Helpers.LogLevel.Warning);
|
||||||
|
RetrieveInstantMessagesLegacy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
{
|
||||||
|
OSDArray respMap = (OSDArray)result;
|
||||||
|
ArrayList listEntrys = respMap.ToArrayList();
|
||||||
|
foreach(OSDArray listEntry in listEntrys)
|
||||||
{
|
{
|
||||||
var msg = (OSDMap)osd;
|
foreach(OSDMap msg in listEntry)
|
||||||
|
{
|
||||||
|
|
||||||
InstantMessage message;
|
InstantMessage message;
|
||||||
message.FromAgentID = msg["from_agent_id"].AsUUID();
|
message.FromAgentID = msg["from_agent_id"].AsUUID();
|
||||||
message.FromAgentName = msg["from_agent_name"].AsString();
|
message.FromAgentName = msg["from_agent_name"].AsString();
|
||||||
message.ToAgentID = msg["to_agent_id"].AsUUID();
|
message.ToAgentID = msg["to_agent_id"].AsUUID();
|
||||||
message.RegionID = msg["region_id"].AsUUID();
|
message.RegionID = msg["region_id"].AsUUID();
|
||||||
message.Dialog = (InstantMessageDialog)msg["dialog"].AsInteger();
|
message.Dialog = (InstantMessageDialog)msg["dialog"].AsInteger();
|
||||||
message.IMSessionID = msg["transaction-id"].AsUUID();
|
message.IMSessionID = msg["transaction-id"].AsUUID();
|
||||||
message.Timestamp = new DateTime(msg["timestamp"].AsInteger());
|
message.Timestamp = new DateTime(msg["timestamp"].AsInteger());
|
||||||
message.Message = msg["message"].AsString();
|
message.Message = msg["message"].AsString();
|
||||||
message.Offline = msg.ContainsKey("offline")
|
message.Offline = msg.ContainsKey("offline")
|
||||||
? (InstantMessageOnline)msg["offline"].AsInteger()
|
? (InstantMessageOnline)msg["offline"].AsInteger()
|
||||||
: InstantMessageOnline.Offline;
|
: InstantMessageOnline.Offline;
|
||||||
message.ParentEstateID = msg.ContainsKey("parent_estate_id")
|
message.ParentEstateID = msg.ContainsKey("parent_estate_id")
|
||||||
? msg["parent_estate_id"].AsUInteger() : 1;
|
? msg["parent_estate_id"].AsUInteger() : 1;
|
||||||
message.Position = msg.ContainsKey("position")
|
message.Position = msg.ContainsKey("position")
|
||||||
? msg["position"].AsVector3()
|
? msg["position"].AsVector3()
|
||||||
: new Vector3(msg["local_x"], msg["local_y"], msg["local_z"]);
|
: new Vector3(msg["local_x"], msg["local_y"], msg["local_z"]);
|
||||||
message.BinaryBucket = msg.ContainsKey("binary_bucket")
|
message.BinaryBucket = msg.ContainsKey("binary_bucket")
|
||||||
? msg["binary_bucket"].AsBinary() : new byte[] { 0 };
|
? msg["binary_bucket"].AsBinary() : new byte[] { 0 };
|
||||||
message.GroupIM = msg.ContainsKey("from_group") && msg["from_group"].AsBoolean();
|
message.GroupIM = msg.ContainsKey("from_group") && msg["from_group"].AsBoolean();
|
||||||
|
|
||||||
OnInstantMessage(new InstantMessageEventArgs(message, null));
|
OnInstantMessage(new InstantMessageEventArgs(message, null));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Logger.Log("Failed to decode offline messages from data trying legacy method (Switch from OSD to OSDMap failed)",
|
||||||
|
Helpers.LogLevel.Warning);
|
||||||
|
RetrieveInstantMessagesLegacy();
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
|
|
@ -175,6 +175,7 @@ namespace SecondBotEvents.Services
|
||||||
client.Network.SimDisconnected += BotSimDisconnected;
|
client.Network.SimDisconnected += BotSimDisconnected;
|
||||||
client.Network.LoginProgress += BotLoginStatus;
|
client.Network.LoginProgress += BotLoginStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Login()
|
public void Login()
|
||||||
{
|
{
|
||||||
ResetClient();
|
ResetClient();
|
||||||
|
|
|
||||||
|
|
@ -884,6 +884,7 @@ namespace SecondBotEvents.Services
|
||||||
GetClient().Groups.GroupRoleDataReply += GroupRoles;
|
GetClient().Groups.GroupRoleDataReply += GroupRoles;
|
||||||
GetClient().Estate.EstateBansReply += EstateBans;
|
GetClient().Estate.EstateBansReply += EstateBans;
|
||||||
GetClient().Groups.RequestCurrentGroups();
|
GetClient().Groups.RequestCurrentGroups();
|
||||||
|
GetClient().Self.RetrieveInstantMessages();
|
||||||
}
|
}
|
||||||
readonly string[] hard_blocked_agents = new[] { "secondlife", "second life" };
|
readonly string[] hard_blocked_agents = new[] { "secondlife", "second life" };
|
||||||
protected void ChatFromSim(object o, ChatEventArgs e)
|
protected void ChatFromSim(object o, ChatEventArgs e)
|
||||||
|
|
@ -1015,6 +1016,7 @@ namespace SecondBotEvents.Services
|
||||||
|
|
||||||
protected void ImEvent(object o, InstantMessageEventArgs e)
|
protected void ImEvent(object o, InstantMessageEventArgs e)
|
||||||
{
|
{
|
||||||
|
|
||||||
switch(e.IM.Dialog)
|
switch(e.IM.Dialog)
|
||||||
{
|
{
|
||||||
case InstantMessageDialog.GroupNotice:
|
case InstantMessageDialog.GroupNotice:
|
||||||
|
|
@ -1030,6 +1032,7 @@ namespace SecondBotEvents.Services
|
||||||
case InstantMessageDialog.SessionSend:
|
case InstantMessageDialog.SessionSend:
|
||||||
case InstantMessageDialog.MessageFromAgent:
|
case InstantMessageDialog.MessageFromAgent:
|
||||||
{
|
{
|
||||||
|
AddAvatar(e.IM.FromAgentID, e.IM.FromAgentName);
|
||||||
if (groupsKey2Name.ContainsKey(e.IM.IMSessionID) == true)
|
if (groupsKey2Name.ContainsKey(e.IM.IMSessionID) == true)
|
||||||
{
|
{
|
||||||
// group IM
|
// group IM
|
||||||
|
|
@ -1037,11 +1040,17 @@ namespace SecondBotEvents.Services
|
||||||
RecordChat(e.IM.IMSessionID, e.IM.FromAgentName, e.IM.Message);
|
RecordChat(e.IM.IMSessionID, e.IM.FromAgentName, e.IM.Message);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
AddAvatar(e.IM.FromAgentID, e.IM.FromAgentName);
|
UUID SessionID = e.IM.IMSessionID;
|
||||||
OpenChatWindow(false, e.IM.IMSessionID, e.IM.FromAgentID);
|
string message = e.IM.Message;
|
||||||
|
if (e.IM.Offline == InstantMessageOnline.Offline)
|
||||||
|
{
|
||||||
|
SessionID = UUID.Random();
|
||||||
|
message = "{AV offline} " + message;
|
||||||
|
}
|
||||||
|
OpenChatWindow(false, SessionID, e.IM.FromAgentID);
|
||||||
if (e.IM.FromAgentID != GetClient().Self.AgentID)
|
if (e.IM.FromAgentID != GetClient().Self.AgentID)
|
||||||
{
|
{
|
||||||
RecordChat(e.IM.IMSessionID, e.IM.FromAgentName, e.IM.Message);
|
RecordChat(SessionID, e.IM.FromAgentName, e.IM.Message);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue