offline IM support

This commit is contained in:
Madpeter 2024-06-28 05:30:46 +01:00
parent eb1f45f330
commit b8c482e5a9
3 changed files with 59 additions and 31 deletions

View file

@ -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>

View file

@ -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();

View file

@ -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;
} }