void Self_OnChat(object sender, ChatEventArgs e) { InstantMessageDialog Dialog = InstantMessageDialog.MessageFromAgent; switch (e.SourceType) { case ChatSourceType.System: break; case ChatSourceType.Agent: break; case ChatSourceType.Object: Dialog = InstantMessageDialog.MessageFromObject; break; } UUID regionID = UUID.Zero; if (e.Simulator != null) { regionID = e.Simulator.RegionID; } Self_OnMessage(e.FromName, e.SourceID, e.OwnerID, e.Message, UUID.Zero, false, regionID, e.Position, Dialog, e.Type, e); ; }
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); }
public frmInvOffered(METAboltInstance instance, InstantMessage e, UUID objectID, AssetType type) { InitializeComponent(); SetExceptionReporter(); Application.ThreadException += new ThreadExceptionHandler().ApplicationThreadException; this.instance = instance; client = this.instance.Client; msg = e; this.objectID = objectID; this.Text += " [" + client.Self.Name + "]"; invtype = type; if (invtype == AssetType.Folder) { instance.State.FolderRcvd = true; } else { instance.State.FolderRcvd = false; } diag = e.Dialog; //if (e.Dialog == InstantMessageDialog.TaskInventoryOffered) //{ // diainv = true; //} string a = "a"; if (type.ToString().ToLower(CultureInfo.CurrentCulture).StartsWith("a", StringComparison.CurrentCultureIgnoreCase) || type.ToString().ToLower(CultureInfo.CurrentCulture).StartsWith("o", StringComparison.CurrentCultureIgnoreCase) || type.ToString().ToLower(CultureInfo.CurrentCulture).StartsWith("u", StringComparison.CurrentCultureIgnoreCase)) { a = "an"; } lblSubheading.Text = "You have received " + a + " " + type.ToString() + " named '" + e.Message + "' from " + e.FromAgentName; if (instance.Config.CurrentConfig.PlayInventoryItemReceived) { SoundPlayer simpleSound = new SoundPlayer(Properties.Resources.Item_received); simpleSound.Play(); simpleSound.Dispose(); } timer1.Interval = instance.DialogTimeOut; timer1.Enabled = true; timer1.Start(); DateTime dte = DateTime.Now.AddMinutes(15.0d); label1.Text = "This item will be auto accepted @ " + dte.ToShortTimeString(); this.Text += " " + "[ " + client.Self.Name + " ]"; }
private void SendReply(InstantMessageDialog dialog, byte[] bucket) { client.Self.InstantMessage(client.Self.Name, msg.FromAgentID, string.Empty, msg.IMSessionID, dialog, InstantMessageOnline.Offline, client.Self.SimPosition, client.Network.CurrentSim.RegionID, bucket); if (dialog == InstantMessageDialog.InventoryAccepted) { client.Inventory.RequestFetchInventory(objectID, client.Self.AgentID); } }
public bool SendInstantMessage(UUID messageID, UUID toAgentID, string fromName, Vector3 fromPosition, UUID fromRegionID, bool fromGroup, InstantMessageDialog type, string message, bool allowOffline, DateTime timestamp, byte[] binaryBucket) { // Cap the message length at 1023 + null terminator if (!String.IsNullOrEmpty(message) && message.Length > 1023) { message = message.Substring(0, 1023); } // FIXME: Support IMing to remote agents IScenePresence presence; if (m_scene.TryGetPresence(toAgentID, out presence) && presence is LLAgent) { LLAgent agent = (LLAgent)presence; ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket(); im.AgentData.AgentID = agent.ID; im.MessageBlock.Dialog = (byte)type; im.MessageBlock.FromAgentName = Utils.StringToBytes(fromName); im.MessageBlock.FromGroup = fromGroup; im.MessageBlock.ID = messageID; im.MessageBlock.Message = Utils.StringToBytes(message); im.MessageBlock.Offline = (byte)((allowOffline) ? 1 : 0); im.MessageBlock.ParentEstateID = 0; im.MessageBlock.Position = fromPosition; im.MessageBlock.RegionID = fromRegionID; im.MessageBlock.Timestamp = Utils.DateTimeToUnixTime(timestamp); im.MessageBlock.ToAgentID = agent.ID; im.MessageBlock.BinaryBucket = binaryBucket ?? Utils.EmptyBytes; m_udp.SendPacket(agent, im, ThrottleCategory.Task, false); return(true); } else { m_log.Warn("Dropping instant message from " + fromName + " to " + toAgentID + " that does not exist in the local scene"); return(false); } }
public bool SendInstantMessage(UUID messageID, UUID toAgentID, string fromName, Vector3 fromPosition, UUID fromRegionID, bool fromGroup, InstantMessageDialog type, string message, bool allowOffline, DateTime timestamp, byte[] binaryBucket) { // Cap the message length at 1023 + null terminator if (!String.IsNullOrEmpty(message) && message.Length > 1023) message = message.Substring(0, 1023); // FIXME: Support IMing to remote agents IScenePresence presence; if (m_scene.TryGetPresence(toAgentID, out presence) && presence is LLAgent) { LLAgent agent = (LLAgent)presence; ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket(); im.AgentData.AgentID = agent.ID; im.MessageBlock.Dialog = (byte)type; im.MessageBlock.FromAgentName = Utils.StringToBytes(fromName); im.MessageBlock.FromGroup = fromGroup; im.MessageBlock.ID = messageID; im.MessageBlock.Message = Utils.StringToBytes(message); im.MessageBlock.Offline = (byte)((allowOffline) ? 1 : 0); im.MessageBlock.ParentEstateID = 0; im.MessageBlock.Position = fromPosition; im.MessageBlock.RegionID = fromRegionID; im.MessageBlock.Timestamp = Utils.DateTimeToUnixTime(timestamp); im.MessageBlock.ToAgentID = agent.ID; im.MessageBlock.BinaryBucket = binaryBucket ?? Utils.EmptyBytes; m_udp.SendPacket(agent, im, ThrottleCategory.Task, false); return true; } else { m_log.Warn("Dropping instant message from " + fromName + " to " + toAgentID + " that does not exist in the local scene"); return false; } }
void ImprovedInstantMessageHandler(Packet packet, Agent agent) { ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet; InstantMessageDialog dialog = (InstantMessageDialog)im.MessageBlock.Dialog; if (dialog == InstantMessageDialog.MessageFromAgent) { lock (server.Agents) { foreach (Agent recipient in server.Agents.Values) { if (recipient.AgentID == im.MessageBlock.ToAgentID) { ImprovedInstantMessagePacket sendIM = new ImprovedInstantMessagePacket(); sendIM.MessageBlock.RegionID = UUID.Random(); //FIXME sendIM.MessageBlock.ParentEstateID = 1; sendIM.MessageBlock.FromGroup = false; sendIM.MessageBlock.FromAgentName = Utils.StringToBytes(agent.Avatar.Name); sendIM.MessageBlock.ToAgentID = im.MessageBlock.ToAgentID; sendIM.MessageBlock.Dialog = im.MessageBlock.Dialog; sendIM.MessageBlock.Offline = (byte)InstantMessageOnline.Online; sendIM.MessageBlock.ID = agent.AgentID; sendIM.MessageBlock.Message = im.MessageBlock.Message; sendIM.MessageBlock.BinaryBucket = new byte[0]; sendIM.MessageBlock.Timestamp = 0; sendIM.MessageBlock.Position = agent.Avatar.Position; sendIM.AgentData.AgentID = agent.AgentID; server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); break; } } } } }
private void Self_OnMessage(string FromAgentName, UUID FromAgentID, UUID ToAgentID, string Message, UUID IMSessionID, bool GroupIM, UUID RegionID, Vector3 Position, InstantMessageDialog Dialog, ChatType Type, EventArgs origin) { if (Dialog == InstantMessageDialog.GroupNotice) { GroupIM = true; } BotPermissions perms = GetSecurityLevel(FromAgentID, FromAgentName); // Received an IM from someone that is authenticated if (Type == ChatType.OwnerSay) { perms |= BotPermissions.Owner; } bool displayedMessage = false; if (origin is ChatEventArgs && Message.Length > 0 && Dialog == InstantMessageDialog.MessageFromAgent) { WriteLine(String.Format("{0} says, \"{1}\".", FromAgentName, Message)); PosterBoard["/posterboard/onchat"] = Message; if (FromAgentName == Self.Name) { PosterBoard["/posterboard/onchat-said"] = Message; } else { PosterBoard["/posterboard/onchat-heard"] = Message; } } bool groupIM = GroupIM && GroupMembers != null && GroupMembers.ContainsKey(FromAgentID) ? true : false; switch (Dialog) { case InstantMessageDialog.MessageBox: break; case InstantMessageDialog.GroupInvitation: if ((perms & BotPermissions.AcceptGroupAndFriendRequests) != 0) { string groupName = Message; int found = groupName.IndexOf("Group:"); if (found > 0) { groupName = groupName.Substring(found + 6); } Self.InstantMessage(Self.Name, FromAgentID, string.Empty, IMSessionID, InstantMessageDialog.GroupInvitationAccept, InstantMessageOnline.Offline, Self.SimPosition, UUID.Zero, new byte[0]); found = groupName.IndexOf(":"); if (found > 0) { groupName = groupName.Substring(0, found).Trim(); ExecuteCommand("joingroup " + groupName, CMDFLAGS.NoResult); } } break; case InstantMessageDialog.InventoryOffered: break; case InstantMessageDialog.InventoryAccepted: break; case InstantMessageDialog.InventoryDeclined: break; case InstantMessageDialog.GroupVote: break; case InstantMessageDialog.TaskInventoryOffered: break; case InstantMessageDialog.TaskInventoryAccepted: break; case InstantMessageDialog.TaskInventoryDeclined: break; case InstantMessageDialog.NewUserDefault: break; case InstantMessageDialog.SessionAdd: break; case InstantMessageDialog.SessionOfflineAdd: break; case InstantMessageDialog.SessionGroupStart: break; case InstantMessageDialog.SessionCardlessStart: break; case InstantMessageDialog.SessionSend: break; case InstantMessageDialog.SessionDrop: break; case InstantMessageDialog.BusyAutoResponse: break; case InstantMessageDialog.ConsoleAndChatHistory: break; case InstantMessageDialog.Lure911: case InstantMessageDialog.RequestTeleport: if ((perms & BotPermissions.AcceptTeleport) != 0) { TheSimAvatar.StopMoving(); if (RegionID != UUID.Zero) { if (!displayedMessage) { DisplayNotificationInChat("TP to Lure from " + FromAgentName); displayedMessage = true; } SimRegion R = SimRegion.GetRegion(RegionID, gridClient); if (R != null) { Self.Teleport(R.RegionHandle, Position); return; } } DisplayNotificationInChat("Accepting TP Lure from " + FromAgentName); displayedMessage = true; Self.TeleportLureRespond(FromAgentID, IMSessionID, true); } break; case InstantMessageDialog.AcceptTeleport: break; case InstantMessageDialog.DenyTeleport: break; case InstantMessageDialog.GodLikeRequestTeleport: break; // case InstantMessageDialog.CurrentlyUnused: // break; case InstantMessageDialog.GotoUrl: break; case InstantMessageDialog.Session911Start: break; case InstantMessageDialog.FromTaskAsAlert: break; case InstantMessageDialog.GroupNotice: break; case InstantMessageDialog.GroupNoticeInventoryAccepted: break; case InstantMessageDialog.GroupNoticeInventoryDeclined: break; case InstantMessageDialog.GroupInvitationAccept: break; case InstantMessageDialog.GroupInvitationDecline: break; case InstantMessageDialog.GroupNoticeRequested: break; case InstantMessageDialog.FriendshipOffered: if ((perms & BotPermissions.AcceptGroupAndFriendRequests) != 0) { DisplayNotificationInChat("Accepting Friendship from " + FromAgentName); Friends.AcceptFriendship(FromAgentID, IMSessionID); displayedMessage = true; } break; case InstantMessageDialog.FriendshipAccepted: break; case InstantMessageDialog.FriendshipDeclined: break; case InstantMessageDialog.StartTyping: break; case InstantMessageDialog.StopTyping: break; case InstantMessageDialog.MessageFromObject: case InstantMessageDialog.MessageFromAgent: // message from self if (FromAgentName == GetName()) { return; } // message from system if (FromAgentName == "System") { return; } // message from others CommandInstance ci; if (Commands.TryGetValue("im", out ci)) { var whisper = ci.WithBotClient as Cogbot.Actions.Communication.ImCommand; if (whisper != null) { whisper.currentAvatar = FromAgentID; whisper.currentSession = IMSessionID; } } var cea = origin as ChatEventArgs; if ((perms & BotPermissions.ExecuteCommands) != 0) { OutputDelegate WriteLine; if (origin is InstantMessageEventArgs) { WriteLine = new OutputDelegate( (string text, object[] ps) => { string reply0 = DLRConsole.SafeFormat(text, ps); InstantMessage(FromAgentID, reply0, IMSessionID); }); } else { WriteLine = new OutputDelegate( (string text, object[] ps) => { string reply0 = DLRConsole.SafeFormat(text, ps); Talk(reply0, 0, Type); }); } string cmd = Message; CMDFLAGS needResult = CMDFLAGS.Console; if (cmd.StartsWith("cmcmd ")) { cmd = cmd.Substring(6); WriteLine(""); WriteLine(string.Format("invokecm='{0}'", cmd)); ClientManager.DoCommandAll(cmd, FromAgentID, WriteLine); } else if (cmd.StartsWith("cmd ")) { cmd = cmd.Substring(4); WriteLine(string.Format("invoke='{0}'", cmd)); var res = ExecuteCommand(cmd, FromAgentID, WriteLine, needResult); WriteLine("iresult='" + res + "'"); } else if (cmd.StartsWith("/") || cmd.StartsWith("@")) { cmd = cmd.Substring(1); WriteLine(""); WriteLine(string.Format("invoke='{0}'", cmd)); var res = ExecuteCommand(cmd, FromAgentID, WriteLine, needResult); WriteLine("iresult='" + res + "'"); } } if (cea != null && cea.AudibleLevel == ChatAudibleLevel.Barely) { return; } break; default: break; } //if (Dialog != InstantMessageDialog.MessageFromAgent && Dialog != InstantMessageDialog.MessageFromObject) { string debug = String.Format("{0} {1} {2} {3} {4} {5}: {6}", groupIM ? "GroupIM" : "IM", Dialog, Type, perms, FromAgentID, FromAgentName, Helpers.StructToString(origin)); if (!displayedMessage) { DisplayNotificationInChat(debug); displayedMessage = true; } } }
/// <summary> /// Displayed on Instant Message /// FIXME - ditch objectNotAgent /// </summary> public static void InstantMessage(uint sessionNum, InstantMessageDialog dialog, string fromName, string message) { string type = ""; type = " (" + dialog.ToString() + ")"; if (dialog == InstantMessageDialog.MessageFromObject) SetColor(ConsoleColor.DarkCyan); else SetColor(ConsoleColor.Cyan); Console.WriteLine("({0}) {1}{2}: {3}", sessionNum, fromName, type, message); SetColor(ConsoleColor.Gray); }
/// <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; } }
private void SendReply(InstantMessageDialog dialog, byte[] bucket) { client.Self.InstantMessage(client.Self.Name, msg.FromAgentID, string.Empty, msg.IMSessionID, dialog, InstantMessageOnline.Offline, client.Self.SimPosition, client.Network.CurrentSim.RegionID, bucket); }
private void Self_OnMessage(string FromAgentName, UUID FromAgentID, UUID ToAgentID, string Message, UUID IMSessionID, bool GroupIM, UUID RegionID, Vector3 Position, InstantMessageDialog Dialog, ChatType Type, EventArgs origin) { if (Dialog == InstantMessageDialog.GroupNotice) { GroupIM = true; } BotPermissions perms = GetSecurityLevel(FromAgentID, FromAgentName); // Received an IM from someone that is authenticated if (Type == ChatType.OwnerSay) { perms |= BotPermissions.Owner; } bool displayedMessage = false; if (origin is ChatEventArgs && Message.Length > 0 && Dialog == InstantMessageDialog.MessageFromAgent) { WriteLine(String.Format("{0} says, \"{1}\".", FromAgentName, Message)); PosterBoard["/posterboard/onchat"] = Message; if (FromAgentName == Self.Name) { PosterBoard["/posterboard/onchat-said"] = Message; } else { PosterBoard["/posterboard/onchat-heard"] = Message; } } bool groupIM = GroupIM && GroupMembers != null && GroupMembers.ContainsKey(FromAgentID) ? true : false; switch (Dialog) { case InstantMessageDialog.MessageBox: break; case InstantMessageDialog.GroupInvitation: if ((perms & BotPermissions.AcceptGroupAndFriendRequests) != 0) { string groupName = Message; int found = groupName.IndexOf("Group:"); if (found > 0) groupName = groupName.Substring(found + 6); Self.InstantMessage(Self.Name, FromAgentID, string.Empty, IMSessionID, InstantMessageDialog.GroupInvitationAccept, InstantMessageOnline.Offline, Self.SimPosition, UUID.Zero, new byte[0]); found = groupName.IndexOf(":"); if (found > 0) { groupName = groupName.Substring(0, found).Trim(); ExecuteCommand("joingroup " + groupName, CMDFLAGS.NoResult); } } break; case InstantMessageDialog.InventoryOffered: break; case InstantMessageDialog.InventoryAccepted: break; case InstantMessageDialog.InventoryDeclined: break; case InstantMessageDialog.GroupVote: break; case InstantMessageDialog.TaskInventoryOffered: break; case InstantMessageDialog.TaskInventoryAccepted: break; case InstantMessageDialog.TaskInventoryDeclined: break; case InstantMessageDialog.NewUserDefault: break; case InstantMessageDialog.SessionAdd: break; case InstantMessageDialog.SessionOfflineAdd: break; case InstantMessageDialog.SessionGroupStart: break; case InstantMessageDialog.SessionCardlessStart: break; case InstantMessageDialog.SessionSend: break; case InstantMessageDialog.SessionDrop: break; case InstantMessageDialog.BusyAutoResponse: break; case InstantMessageDialog.ConsoleAndChatHistory: break; case InstantMessageDialog.Lure911: case InstantMessageDialog.RequestTeleport: if ((perms & BotPermissions.AcceptTeleport) != 0) { TheSimAvatar.StopMoving(); if (RegionID != UUID.Zero) { if (!displayedMessage) { DisplayNotificationInChat("TP to Lure from " + FromAgentName); displayedMessage = true; } SimRegion R = SimRegion.GetRegion(RegionID, gridClient); if (R != null) { Self.Teleport(R.RegionHandle, Position); return; } } DisplayNotificationInChat("Accepting TP Lure from " + FromAgentName); displayedMessage = true; Self.TeleportLureRespond(FromAgentID, IMSessionID, true); } break; case InstantMessageDialog.AcceptTeleport: break; case InstantMessageDialog.DenyTeleport: break; case InstantMessageDialog.GodLikeRequestTeleport: break; // case InstantMessageDialog.CurrentlyUnused: // break; case InstantMessageDialog.GotoUrl: break; case InstantMessageDialog.Session911Start: break; case InstantMessageDialog.FromTaskAsAlert: break; case InstantMessageDialog.GroupNotice: break; case InstantMessageDialog.GroupNoticeInventoryAccepted: break; case InstantMessageDialog.GroupNoticeInventoryDeclined: break; case InstantMessageDialog.GroupInvitationAccept: break; case InstantMessageDialog.GroupInvitationDecline: break; case InstantMessageDialog.GroupNoticeRequested: break; case InstantMessageDialog.FriendshipOffered: if ((perms & BotPermissions.AcceptGroupAndFriendRequests) != 0) { DisplayNotificationInChat("Accepting Friendship from " + FromAgentName); Friends.AcceptFriendship(FromAgentID, IMSessionID); displayedMessage = true; } break; case InstantMessageDialog.FriendshipAccepted: break; case InstantMessageDialog.FriendshipDeclined: break; case InstantMessageDialog.StartTyping: break; case InstantMessageDialog.StopTyping: break; case InstantMessageDialog.MessageFromObject: case InstantMessageDialog.MessageFromAgent: // message from self if (FromAgentName == GetName()) return; // message from system if (FromAgentName == "System") return; // message from others CommandInstance ci; if (Commands.TryGetValue("im", out ci)) { var whisper = ci.WithBotClient as Cogbot.Actions.Communication.ImCommand; if (whisper != null) { whisper.currentAvatar = FromAgentID; whisper.currentSession = IMSessionID; } } var cea = origin as ChatEventArgs; if ((perms & BotPermissions.ExecuteCommands) != 0) { OutputDelegate WriteLine; if (origin is InstantMessageEventArgs) { WriteLine = new OutputDelegate( (string text, object[] ps) => { string reply0 = DLRConsole.SafeFormat(text, ps); InstantMessage(FromAgentID, reply0, IMSessionID); }); } else { WriteLine = new OutputDelegate( (string text, object[] ps) => { string reply0 = DLRConsole.SafeFormat(text, ps); Talk(reply0, 0, Type); }); } string cmd = Message; CMDFLAGS needResult = CMDFLAGS.Console; if (cmd.StartsWith("cmcmd ")) { cmd = cmd.Substring(6); WriteLine(""); WriteLine(string.Format("invokecm='{0}'", cmd)); ClientManager.DoCommandAll(cmd, FromAgentID, WriteLine); } else if (cmd.StartsWith("cmd ")) { cmd = cmd.Substring(4); WriteLine(string.Format("invoke='{0}'", cmd)); var res = ExecuteCommand(cmd, FromAgentID, WriteLine, needResult); WriteLine("iresult='" + res + "'"); } else if (cmd.StartsWith("/") || cmd.StartsWith("@")) { cmd = cmd.Substring(1); WriteLine(""); WriteLine(string.Format("invoke='{0}'", cmd)); var res = ExecuteCommand(cmd, FromAgentID, WriteLine, needResult); WriteLine("iresult='" + res + "'"); } } if (cea != null && cea.AudibleLevel == ChatAudibleLevel.Barely) return; break; default: break; } //if (Dialog != InstantMessageDialog.MessageFromAgent && Dialog != InstantMessageDialog.MessageFromObject) { string debug = String.Format("{0} {1} {2} {3} {4} {5}: {6}", groupIM ? "GroupIM" : "IM", Dialog, Type, perms, FromAgentID, FromAgentName, Helpers.StructToString(origin)); if (!displayedMessage) { DisplayNotificationInChat(debug); displayedMessage = true; } } }
private void ImprovedInstantMessageHandler(Packet packet, LLAgent agent) { ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet; // The following fields are unused since we already have this information, plus the // client could forge it: // - im.MessageBlock.FromAgentName // - im.MessageBlock.FromGroup; // - im.MessageBlock.RegionID // - im.MessageBlock.Position // - im.MessageBlock.Timestamp // - im.MessageBlock.ParentEstateID InstantMessageDialog type = (InstantMessageDialog)im.MessageBlock.Dialog; string message = Utils.BytesToString(im.MessageBlock.Message); bool allowOffline = (im.MessageBlock.Offline != 0); switch (type) { case InstantMessageDialog.MessageFromAgent: case InstantMessageDialog.StartTyping: case InstantMessageDialog.StopTyping: SendInstantMessage(im.MessageBlock.ID, im.MessageBlock.ToAgentID, agent.Name, agent.ScenePosition, agent.Scene.ID, false, type, message, allowOffline, DateTime.UtcNow, im.MessageBlock.BinaryBucket); break; case InstantMessageDialog.RequestTeleport: case InstantMessageDialog.GodLikeRequestTeleport: case InstantMessageDialog.Lure911: case InstantMessageDialog.AcceptTeleport: case InstantMessageDialog.DenyTeleport: case InstantMessageDialog.BusyAutoResponse: break; case InstantMessageDialog.FriendshipOffered: case InstantMessageDialog.FriendshipAccepted: case InstantMessageDialog.FriendshipDeclined: break; case InstantMessageDialog.GroupInvitation: case InstantMessageDialog.GroupInvitationAccept: case InstantMessageDialog.GroupInvitationDecline: break; case InstantMessageDialog.GroupNotice: case InstantMessageDialog.GroupNoticeRequested: case InstantMessageDialog.GroupNoticeInventoryAccepted: case InstantMessageDialog.GroupNoticeInventoryDeclined: case InstantMessageDialog.GroupVote: break; case InstantMessageDialog.InventoryOffered: case InstantMessageDialog.InventoryAccepted: case InstantMessageDialog.InventoryDeclined: break; case InstantMessageDialog.TaskInventoryOffered: case InstantMessageDialog.TaskInventoryAccepted: case InstantMessageDialog.TaskInventoryDeclined: break; case InstantMessageDialog.SessionAdd: case InstantMessageDialog.SessionOfflineAdd: case InstantMessageDialog.SessionCardlessStart: case InstantMessageDialog.Session911Start: case InstantMessageDialog.SessionDrop: case InstantMessageDialog.SessionGroupStart: case InstantMessageDialog.SessionSend: break; //case InstantMessageDialog.MessageFromObject: //case InstantMessageDialog.FromTaskAsAlert: //case InstantMessageDialog.MessageBox: //case InstantMessageDialog.GotoUrl: //case InstantMessageDialog.ConsoleAndChatHistory: //case InstantMessageDialog.NewUserDefault: default: m_log.Warn("Received an IM with unhandled type " + type + " from " + agent.Name); return; } }
public override void Self_OnInstantMessage(object sender, InstantMessageEventArgs e) { var im = e.IM; if (im.FromAgentID != UUID.Zero) { AddName2Key(im.FromAgentName, im.FromAgentID); if (im.RegionID != UUID.Zero) { AvatarRegion[im.FromAgentID] = im.RegionID; Debug("Avatar region " + im.FromAgentName + " " + im.RegionID); } } bool Conference = false; bool GroupIM = im.GroupIM || client.Groups.GroupName2KeyCache.ContainsKey(im.IMSessionID); if (GroupIM) { DeclareGroup(im.IMSessionID); } if (im.Dialog == InstantMessageDialog.SessionSend) { if (!GroupIM) { Conference = true; } } PCode pcode = PCode.None; object s = im.FromAgentName; if (string.IsNullOrEmpty(im.FromAgentName) || im.FromAgentName == "Object" || !im.FromAgentName.Contains(" ")) { s = im.FromAgentID; pcode = PCode.Prim; } else { pcode = PCode.Avatar; } InstantMessageDialog d = im.Dialog; if (d == InstantMessageDialog.StartTyping || d == InstantMessageDialog.StopTyping) { pcode = PCode.Avatar; } if (!Conference && GroupIM) { //"recipientOfInfo-Intended"; } SimObject source = AsObject(im.FromAgentName, im.FromAgentID, pcode); if (source != null) { s = source; } object location = AsLocation(im.RegionID, im.Position); EventQueue.Enqueue(() => client.SendPersonalEvent(SimEventType.SOCIAL, "InstantMessageDialog-" + im.Dialog.ToString() + (GroupIM ? "-Group" : ""), ToParameter("senderOfInfo", s), ToParameter("infoTransferred-NLString", im.Message), ToParameter("recipientOfInfo-Intended", im.ToAgentID), im.Offline, im.IMSessionID, ToParameter("eventPrimarilyOccursAt", location), //(im.GroupIM ? "GroupIM" : ""), //im.Dialog, im.ParentEstateID)); }
/// <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); }
/// <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); } }
void ImprovedInstantMessageHandler(Packet packet, Agent agent) { ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet; InstantMessageDialog dialog = (InstantMessageDialog)im.MessageBlock.Dialog; if (dialog == InstantMessageDialog.FriendshipOffered || dialog == InstantMessageDialog.FriendshipAccepted || dialog == InstantMessageDialog.FriendshipDeclined) { lock (server.Agents) { foreach (Agent recipient in server.Agents.Values) { if (recipient.AgentID == im.MessageBlock.ToAgentID) { ImprovedInstantMessagePacket sendIM = new ImprovedInstantMessagePacket(); sendIM.MessageBlock.RegionID = UUID.Random(); //FIXME sendIM.MessageBlock.ParentEstateID = 1; sendIM.MessageBlock.FromGroup = false; sendIM.MessageBlock.FromAgentName = Utils.StringToBytes(agent.Avatar.Name); sendIM.MessageBlock.ToAgentID = im.MessageBlock.ToAgentID; sendIM.MessageBlock.Dialog = im.MessageBlock.Dialog; sendIM.MessageBlock.Offline = (byte)InstantMessageOnline.Online; sendIM.MessageBlock.ID = agent.AgentID; sendIM.MessageBlock.Message = im.MessageBlock.Message; sendIM.MessageBlock.BinaryBucket = new byte[0]; sendIM.MessageBlock.Timestamp = 0; sendIM.MessageBlock.Position = agent.Avatar.Position; sendIM.AgentData.AgentID = agent.AgentID; server.UDP.SendPacket(recipient.AgentID, sendIM, PacketCategory.Transaction); if (dialog == InstantMessageDialog.FriendshipAccepted) { bool receiverOnline = server.Agents.ContainsKey(agent.AgentID); bool senderOnline = server.Agents.ContainsKey(recipient.AgentID); if (receiverOnline) { if (senderOnline) { OnlineNotificationPacket notify = new OnlineNotificationPacket(); notify.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock(); notify.AgentBlock[0].AgentID = agent.AgentID; server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State); } else { OfflineNotificationPacket notify = new OfflineNotificationPacket(); notify.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock(); notify.AgentBlock[0].AgentID = agent.AgentID; server.UDP.SendPacket(recipient.AgentID, notify, PacketCategory.State); } } if (senderOnline) { if (receiverOnline) { OnlineNotificationPacket notify = new OnlineNotificationPacket(); notify.AgentBlock = new OnlineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OnlineNotificationPacket.AgentBlockBlock(); notify.AgentBlock[0].AgentID = recipient.AgentID; server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State); } else { OfflineNotificationPacket notify = new OfflineNotificationPacket(); notify.AgentBlock = new OfflineNotificationPacket.AgentBlockBlock[0]; notify.AgentBlock[0] = new OfflineNotificationPacket.AgentBlockBlock(); notify.AgentBlock[0].AgentID = recipient.AgentID; server.UDP.SendPacket(agent.AgentID, notify, PacketCategory.State); } } } break; } } } } }