public void Self_OnInstantMessage(InstantMessage im, Simulator simulator) { LLUUID fromAgentID = im.FromAgentID; string fromAgentName = im.FromAgentName; //LLUUID toAgentID = im.ToAgentID; LLUUID regionID = im.RegionID; LLVector3 position = im.Position; InstantMessageDialog dialog = im.Dialog; bool groupIM = im.GroupIM; LLUUID imSessionID = im.IMSessionID; DateTime timestamp = im.Timestamp; string message = im.Message; InstantMessageOnline offline = im.Offline; byte[] binaryBucket = im.BinaryBucket; uint parentEstateID = im.ParentEstateID; Hashtable item = new Hashtable(); item.Add("MessageType", "InstantMessage"); item.Add("FromAgentID", fromAgentID); item.Add("FromAgentName", fromAgentName); item.Add("ParentEstateID", parentEstateID.ToString()); item.Add("RegionID", regionID); item.Add("Position", position); item.Add("Dialog", dialog); item.Add("GroupIM", groupIM); item.Add("IMSessionID", imSessionID); item.Add("Timestamp", timestamp); item.Add("Message", message); item.Add("Offline", offline); item.Add("BinaryBucket", binaryBucket); enqueue(item); }
/// <summary> /// Send an Instant Message /// </summary> /// <param name="fromName">The name this IM will show up as being from</param> /// <param name="target">Key of Avatar</param> /// <param name="message">Text message being sent</param> /// <param name="imSessionID">IM session ID (to differentiate between IM windows)</param> /// <param name="dialog">Type of instant message to send</param> /// <param name="offline">Whether to IM offline avatars as well</param> /// <param name="position">Senders Position</param> /// <param name="regionID">RegionID Sender is In</param> /// <param name="binaryBucket">Packed binary data that is specific to /// the dialog type</param> public void InstantMessage(string fromName, UUID target, string message, UUID imSessionID, InstantMessageDialog dialog, InstantMessageOnline offline, Vector3 position, UUID regionID, byte[] binaryBucket) { if (target != UUID.Zero) { ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket(); if (imSessionID.Equals(UUID.Zero) || imSessionID.Equals(AgentID)) imSessionID = AgentID.Equals(target) ? AgentID : target ^ AgentID; im.AgentData.AgentID = Client.Self.AgentID; im.AgentData.SessionID = Client.Self.SessionID; im.MessageBlock.Dialog = (byte)dialog; im.MessageBlock.FromAgentName = Utils.StringToBytes(fromName); im.MessageBlock.FromGroup = false; im.MessageBlock.ID = imSessionID; im.MessageBlock.Message = Utils.StringToBytes(message); im.MessageBlock.Offline = (byte)offline; im.MessageBlock.ToAgentID = target; if (binaryBucket != null) im.MessageBlock.BinaryBucket = binaryBucket; else im.MessageBlock.BinaryBucket = Utils.EmptyBytes; // These fields are mandatory, even if we don't have valid values for them im.MessageBlock.Position = Vector3.Zero; //TODO: Allow region id to be correctly set by caller or fetched from Client.* im.MessageBlock.RegionID = regionID; // Send the message Client.Network.SendPacket(im); } else { Logger.Log(String.Format("Suppressing instant message \"{0}\" to UUID.Zero", message), Helpers.LogLevel.Error, Client); } }
/// <summary> /// Deserialize the message /// </summary> /// <param name="map">An <see cref="OSDMap"/> containing the data</param> public void Deserialize(OSDMap map) { if (map.ContainsKey("voice")) { FromAgentID = map["from_id"].AsUUID(); FromAgentName = map["from_name"].AsString(); IMSessionID = map["session_id"].AsUUID(); BinaryBucket = Utils.StringToBytes(map["session_name"].AsString()); Voice = true; } else { OSDMap im = (OSDMap)map["instantmessage"]; OSDMap msg = (OSDMap)im["message_params"]; OSDMap msgdata = (OSDMap)msg["data"]; FromAgentID = msg["from_id"].AsUUID(); FromAgentName = msg["from_name"].AsString(); ToAgentID = msg["to_id"].AsUUID(); ParentEstateID = (uint)msg["parent_estate_id"].AsInteger(); RegionID = msg["region_id"].AsUUID(); Position = msg["position"].AsVector3(); GroupIM = msg["from_group"].AsBoolean(); IMSessionID = msg["id"].AsUUID(); Message = msg["message"].AsString(); Offline = (InstantMessageOnline)msg["offline"].AsInteger(); Dialog = (InstantMessageDialog)msgdata["type"].AsInteger(); BinaryBucket = msgdata["binary_bucket"].AsBinary(); Timestamp = msgdata["timestamp"].AsDate(); Voice = false; } }
/// <summary> /// Send an Instant Message /// </summary> /// <param name="fromName">The name this IM will show up as being from</param> /// <param name="target">Key of Avatar</param> /// <param name="message">Text message being sent</param> /// <param name="imSessionID">IM session ID (to differentiate between IM windows)</param> /// <param name="dialog">Type of instant message to send</param> /// <param name="offline">Whether to IM offline avatars as well</param> /// <param name="position"></param> /// <param name="regionID"></param> /// <param name="binaryBucket">Packed binary data that is specific to /// the dialog type</param> public void InstantMessage(string fromName, LLUUID target, string message, LLUUID imSessionID, InstantMessageDialog dialog, InstantMessageOnline offline, LLVector3 position, LLUUID regionID, byte[] binaryBucket) { ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket(); im.AgentData.AgentID = Client.Self.AgentID; im.AgentData.SessionID = Client.Self.SessionID; im.MessageBlock.Dialog = (byte)dialog; im.MessageBlock.FromAgentName = Helpers.StringToField(fromName); im.MessageBlock.FromGroup = false; im.MessageBlock.ID = imSessionID; im.MessageBlock.Message = Helpers.StringToField(message); im.MessageBlock.Offline = (byte)offline; im.MessageBlock.ToAgentID = target; if (binaryBucket != null) im.MessageBlock.BinaryBucket = binaryBucket; else im.MessageBlock.BinaryBucket = new byte[0]; // These fields are mandatory, even if we don't have valid values for them im.MessageBlock.Position = LLVector3.Zero; //TODO: Allow region id to be correctly set by caller or fetched from Client.* im.MessageBlock.RegionID = regionID; // Send the message Client.Network.SendPacket(im); }