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 System.Net.Http;
using System.Threading.Tasks;
using System.Collections;
namespace OpenMetaverse
{
@ -3976,19 +3977,28 @@ namespace OpenMetaverse
if (m_InstantMessage == null) { return; } // don't bother if we don't have any listeners
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);
RetrieveInstantMessagesLegacy();
return;
}
if (respMap["messages"] is OSDArray msgArray)
if(result.Type != OSDType.Array)
{
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)
{
foreach(OSDMap msg in listEntry)
{
var msg = (OSDMap)osd;
InstantMessage message;
message.FromAgentID = msg["from_agent_id"].AsUUID();
@ -4015,6 +4025,14 @@ namespace OpenMetaverse
}
}
}
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>
/// Take an incoming Chat packet, auto-parse, and if OnChat is defined call

View file

@ -175,6 +175,7 @@ namespace SecondBotEvents.Services
client.Network.SimDisconnected += BotSimDisconnected;
client.Network.LoginProgress += BotLoginStatus;
}
public void Login()
{
ResetClient();

View file

@ -884,6 +884,7 @@ namespace SecondBotEvents.Services
GetClient().Groups.GroupRoleDataReply += GroupRoles;
GetClient().Estate.EstateBansReply += EstateBans;
GetClient().Groups.RequestCurrentGroups();
GetClient().Self.RetrieveInstantMessages();
}
readonly string[] hard_blocked_agents = new[] { "secondlife", "second life" };
protected void ChatFromSim(object o, ChatEventArgs e)
@ -1015,6 +1016,7 @@ namespace SecondBotEvents.Services
protected void ImEvent(object o, InstantMessageEventArgs e)
{
switch(e.IM.Dialog)
{
case InstantMessageDialog.GroupNotice:
@ -1030,6 +1032,7 @@ namespace SecondBotEvents.Services
case InstantMessageDialog.SessionSend:
case InstantMessageDialog.MessageFromAgent:
{
AddAvatar(e.IM.FromAgentID, e.IM.FromAgentName);
if (groupsKey2Name.ContainsKey(e.IM.IMSessionID) == true)
{
// group IM
@ -1037,11 +1040,17 @@ namespace SecondBotEvents.Services
RecordChat(e.IM.IMSessionID, e.IM.FromAgentName, e.IM.Message);
break;
}
AddAvatar(e.IM.FromAgentID, e.IM.FromAgentName);
OpenChatWindow(false, e.IM.IMSessionID, e.IM.FromAgentID);
UUID SessionID = e.IM.IMSessionID;
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)
{
RecordChat(e.IM.IMSessionID, e.IM.FromAgentName, e.IM.Message);
RecordChat(SessionID, e.IM.FromAgentName, e.IM.Message);
}
break;
}