Пример #1
1
        void Self_IM(object sender, InstantMessageEventArgs e)
        {
            // TODO: MainAvatar.InstantMessageDialog.GroupNotice can also be an inventory offer, should we
            // handle it here?

            if (m_InventoryObjectOffered != null &&
                (e.IM.Dialog == InstantMessageDialog.InventoryOffered
                || e.IM.Dialog == InstantMessageDialog.TaskInventoryOffered))
            {
                AssetType type = AssetType.Unknown;
                UUID objectID = UUID.Zero;
                bool fromTask = false;

                if (e.IM.Dialog == InstantMessageDialog.InventoryOffered)
                {
                    if (e.IM.BinaryBucket.Length == 17)
                    {
                        type = (AssetType)e.IM.BinaryBucket[0];
                        objectID = new UUID(e.IM.BinaryBucket, 1);
                        fromTask = false;
                    }
                    else
                    {
                        Logger.Log("Malformed inventory offer from agent", Helpers.LogLevel.Warning, Client);
                        return;
                    }
                }
                else if (e.IM.Dialog == InstantMessageDialog.TaskInventoryOffered)
                {
                    if (e.IM.BinaryBucket.Length == 1)
                    {
                        type = (AssetType)e.IM.BinaryBucket[0];
                        fromTask = true;
                    }
                    else
                    {
                        Logger.Log("Malformed inventory offer from object", Helpers.LogLevel.Warning, Client);
                        return;
                    }
                }

                // Find the folder where this is going to go
                UUID destinationFolderID = FindFolderForType(type);

                // Fire the callback
                try
                {
                    ImprovedInstantMessagePacket imp = new ImprovedInstantMessagePacket();
                    imp.AgentData.AgentID = Client.Self.AgentID;
                    imp.AgentData.SessionID = Client.Self.SessionID;
                    imp.MessageBlock.FromGroup = false;
                    imp.MessageBlock.ToAgentID = e.IM.FromAgentID;
                    imp.MessageBlock.Offline = 0;
                    imp.MessageBlock.ID = e.IM.IMSessionID;
                    imp.MessageBlock.Timestamp = 0;
                    imp.MessageBlock.FromAgentName = Utils.StringToBytes(Client.Self.Name);
                    imp.MessageBlock.Message = Utils.EmptyBytes;
                    imp.MessageBlock.ParentEstateID = 0;
                    imp.MessageBlock.RegionID = UUID.Zero;
                    imp.MessageBlock.Position = Client.Self.SimPosition;

                    InventoryObjectOfferedEventArgs args = new InventoryObjectOfferedEventArgs(e.IM, type, objectID, fromTask, destinationFolderID);

                    OnInventoryObjectOffered(args);

                    if (args.Accept)
                    {
                        // Accept the inventory offer
                        switch (e.IM.Dialog)
                        {
                            case InstantMessageDialog.InventoryOffered:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.InventoryAccepted;
                                break;
                            case InstantMessageDialog.TaskInventoryOffered:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.TaskInventoryAccepted;
                                break;
                            case InstantMessageDialog.GroupNotice:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.GroupNoticeInventoryAccepted;
                                break;                         
                        }
                        imp.MessageBlock.BinaryBucket = args.FolderID.GetBytes();                        
                    }
                    else
                    {
                        // Decline the inventory offer
                        switch (e.IM.Dialog)
                        {
                            case InstantMessageDialog.InventoryOffered:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.InventoryDeclined;
                                break;
                            case InstantMessageDialog.TaskInventoryOffered:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.TaskInventoryDeclined;
                                break;
                            case InstantMessageDialog.GroupNotice:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.GroupNoticeInventoryDeclined;
                                break;
                        }

                        imp.MessageBlock.BinaryBucket = Utils.EmptyBytes;
                    }

                    Client.Network.SendPacket(imp, e.Simulator);
                }
                catch (Exception ex)
                {
                    Logger.Log(ex.Message, Helpers.LogLevel.Error, Client, ex);
                }
            }
        }
Пример #2
0
        private Packet SendingIM(Packet packet, IPEndPoint sim)
        {
            ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet;
            string message = Utils.BytesToString(im.MessageBlock.Message);

            if (handeledViewerOutput(message) == "die")
            {
                return(null);
            }
            if (Enabled)
            {
                if (!message.StartsWith(this.trigger))
                {
                    if (!message.ToLower().Contains("typing") && message.Length > 1)
                    {
                        form.log("We were guna send the IM with :" + message, Color.OrangeRed);
                        im.MessageBlock.Message = Utils.StringToBytes(this.brand + "" + shadow_encrypt(Utils.BytesToString(im.MessageBlock.Message)));
                    }
                }
                else
                {
                    im.MessageBlock.Message = Utils.StringToBytes(message.Substring(this.trigger.Length));
                }
            }
            else if (message.StartsWith(this.trigger))
            {
                message = message.Substring(this.trigger.Length);
                if (!message.ToLower().Contains("typing") && message.Length > 1)
                {
                    form.log("we were guna send the IM with :" + message, Color.OrangeRed);
                    im.MessageBlock.Message = Utils.StringToBytes(this.brand + "" + shadow_encrypt(Utils.BytesToString(im.MessageBlock.Message)));
                }
            }
            return(im);
        }
Пример #3
0
        /// <summary>
        /// Take an incoming ImprovedInstantMessage packet, auto-parse, and if
        ///   OnInstantMessage is defined call that with the appropriate arguments.
        /// </summary>
        /// <param name="packet">Incoming ImprovedInstantMessagePacket</param>
        /// <param name="simulator">[UNUSED]</param>
        private void InstantMessageHandler(Packet packet, Simulator simulator)
        {
            if (packet.Type == PacketType.ImprovedInstantMessage)
            {
                ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet;

                if (OnInstantMessage != null)
                {
                    OnInstantMessage(
                        im.AgentData.AgentID
                        , Helpers.FieldToString(im.MessageBlock.FromAgentName),
                        im.MessageBlock.ToAgentID
                        , im.MessageBlock.ParentEstateID
                        , im.MessageBlock.RegionID
                        , im.MessageBlock.Position
                        , im.MessageBlock.Dialog
                        , im.MessageBlock.FromGroup
                        , im.MessageBlock.ID
                        , new DateTime(im.MessageBlock.Timestamp)
                        , Helpers.FieldToString(im.MessageBlock.Message)
                        , im.MessageBlock.Offline
                        , im.MessageBlock.BinaryBucket
                        );
                }
            }
        }
        public Packet GiveItemViaImprovedInstantMessage(
            LLUUID ID
            , LLUUID ToAgentID
            , String FromAgentName
            , LLVector3 FromAgentLoc
            , InventoryItem Item
            )
        {
            byte[] BinaryBucket = new byte[17];
            BinaryBucket[0] = (byte)Item.Type;
            Array.Copy(Item.ItemID.Data, 0, BinaryBucket, 1, 16);

            ImprovedInstantMessagePacket p = new ImprovedInstantMessagePacket();

            p.AgentData.AgentID   = AgentID;
            p.AgentData.SessionID = SessionID;

            p.MessageBlock.ID            = ID;
            p.MessageBlock.ToAgentID     = ToAgentID;
            p.MessageBlock.Offline       = (byte)0;
            p.MessageBlock.Timestamp     = Helpers.GetUnixTime();
            p.MessageBlock.Message       = Helpers.StringToField(Item.Name);
            p.MessageBlock.Dialog        = (byte)4;
            p.MessageBlock.BinaryBucket  = BinaryBucket;
            p.MessageBlock.FromAgentName = Helpers.StringToField(FromAgentName);
            p.MessageBlock.Position      = FromAgentLoc;

            // TODO: Either overload this method to allow inclusion of region info or
            // overload the ImprovedInstantMessage in the avatar class to allow item payloads
            p.MessageBlock.RegionID       = LLUUID.Zero;
            p.MessageBlock.ParentEstateID = (uint)0;

            return(p);
        }
Пример #5
0
        private Packet SendingIM(Packet packet, IPEndPoint sim)
        {
            ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet;
            string message = Utils.BytesToString(im.MessageBlock.Message);

            if (handeledViewerOutput(message) == "die")
            {
                return(null);
            }
            return(im);
        }
Пример #6
0
        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);
            }
        }
Пример #7
0
        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;
            }
        }
Пример #8
0
        /// <summary>
        /// Generate an Instant Message (Full Arguments).
        /// </summary>
        /// <param name="fromName">Client's Avatar</param>
        /// <param name="sessionID">SessionID of current connection to grid</param>
        /// <param name="target">UUID of target Av.</param>
        /// <param name="message">Text Message being sent.</param>
        /// <param name="conferenceIDs"></param>
        /// <param name="IMSessionID"></param>
        ///
        /// TODO: Have fromName grabbed from elsewhere and remove argument, to prevent inadvertant spoofing.
        ///
        public void InstantMessage(string fromName, LLUUID sessionID, LLUUID target, string message,
                                   LLUUID[] conferenceIDs, LLUUID IMSessionID)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

            im.AgentData.AgentID          = this.ID;
            im.AgentData.SessionID        = Client.Network.SessionID;
            im.MessageBlock.Dialog        = 0;
            im.MessageBlock.FromAgentName = Helpers.StringToField(fromName);
            im.MessageBlock.FromGroup     = false;
            im.MessageBlock.ID            = IMSessionID;
            im.MessageBlock.Message       = Helpers.StringToField(message);
            im.MessageBlock.Offline       = 1;
            im.MessageBlock.ToAgentID     = target;
            if (conferenceIDs != null && conferenceIDs.Length > 0)
            {
                im.MessageBlock.BinaryBucket = new byte[16 * conferenceIDs.Length];

                for (int i = 0; i < conferenceIDs.Length; ++i)
                {
                    Array.Copy(conferenceIDs[i].Data, 0, im.MessageBlock.BinaryBucket, i * 16, 16);
                }
            }
            else
            {
                im.MessageBlock.BinaryBucket = new byte[0];
            }

            // These fields are mandatory, even if we don't have valid values for them
            im.MessageBlock.Position = new LLVector3();
            //TODO: Allow region id to be correctly set by caller or fetched from Client.*
            im.MessageBlock.RegionID = new LLUUID();


            // Send the message
            Client.Network.SendPacket((Packet)im);
        }
Пример #9
0
        private Packet RecivedIM(Packet packet, IPEndPoint sim)
        {
            if (packet.Header.Resent)
            {
                return(packet);
            }
            ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet;

            if (true)
            {
                //Console.WriteLine(im.ToString());
                if (im.MessageBlock.Dialog == (byte)0)
                {
                    string message = Utils.BytesToString(im.MessageBlock.Message);
                    if (message.ToLower().Contains("typing"))
                    {
                        //ignoe
                    }
                    else if (message.ToLower().Contains("user not online"))
                    {
                    }
                    else if (im.AgentData.AgentID == frame.AgentID || im.AgentData.AgentID == UUID.Zero)
                    {
                        //ignore
                    }
                    else if (message.Length > 0)
                    {
                        if (message.StartsWith(this.brand))
                        {
                            form.log("we got a IM that needs decryption :" + message, Color.Orange);
                            im.MessageBlock.Message = Utils.StringToBytes(shadow_decrypt(message.Substring(this.brand.Length)));
                        }
                    }
                }
            }
            return(im);
        }
Пример #10
0
        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;
                        }
                    }
                }
            }
        }
Пример #11
0
		public Packet GiveItemViaImprovedInstantMessage(
			LLUUID ID
			, LLUUID ToAgentID
			, String FromAgentName
			, LLVector3 FromAgentLoc
			, InventoryItem Item
			)
		{
			byte[] BinaryBucket = new byte[17];
			BinaryBucket[0] = (byte)Item.Type;
            Buffer.BlockCopy(Item.ItemID.Data, 0, BinaryBucket, 1, 16);

            ImprovedInstantMessagePacket p = new ImprovedInstantMessagePacket();
            p.AgentData.AgentID   = AgentID;
            p.AgentData.SessionID = SessionID;

            p.MessageBlock.ID        = ID;
            p.MessageBlock.ToAgentID = ToAgentID;
            p.MessageBlock.Offline   = (byte)0;
            p.MessageBlock.Timestamp = Helpers.GetUnixTime();
            p.MessageBlock.Message   = Helpers.StringToField(Item.Name);
            p.MessageBlock.Dialog    = (byte)4;
            p.MessageBlock.BinaryBucket  = BinaryBucket;
            p.MessageBlock.FromAgentName = Helpers.StringToField(FromAgentName);
            p.MessageBlock.Position      = FromAgentLoc;

            // TODO: Either overload this method to allow inclusion of region info or
            // overload the ImprovedInstantMessage in the avatar class to allow item payloads
            p.MessageBlock.RegionID = LLUUID.Zero;
            p.MessageBlock.ParentEstateID = (uint)0;

            return p;
		}
Пример #12
0
 public ims(ImprovedInstantMessagePacket im)
 {
     i = im; time = System.DateTime.Now ;
 }
Пример #13
0
        /// <summary>
        /// Request self terminates group chat. This will stop Group IM's from showing up
        /// until session is rejoined or expires.
        /// </summary>
        /// <param name="groupID"><seealso cref="Guid"/> of Group to leave</param>
        public void RequestLeaveGroupChat(Guid groupID)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

            im.AgentData.AgentID = Client.Self.AgentID;
            im.AgentData.SessionID = Client.Self.SessionID;
            im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionDrop;
            im.MessageBlock.FromAgentName = Utils.StringToBytes(Client.Self.Name);
            im.MessageBlock.FromGroup = false;
            im.MessageBlock.Message = new byte[0];
            im.MessageBlock.Offline = 0;
            im.MessageBlock.ID = groupID;
            im.MessageBlock.ToAgentID = groupID;
            im.MessageBlock.BinaryBucket = new byte[0];
            im.MessageBlock.Position = Vector3f.Zero;
            im.MessageBlock.RegionID = Guid.Empty;

            Client.Network.SendPacket(im);
        }
Пример #14
0
        private Packet InIM(Packet packet, IPEndPoint sim)
        {
            lock (recSeq)
            {
                if (!recSeq.Contains(packet.Header.Sequence))
                {
                    recSeq.Add(packet.Header.Sequence);
                    if (recSeq.Count > 200)
                    {
                        recSeq.RemoveAt(0);
                    }

                    if (form.getCheckIM())
                    {
                        lock (lastIM)
                        {
                            lastIM.Add(new ims((ImprovedInstantMessagePacket)packet));
                            if (lastIM.Count > 5)
                            {
                                lastIM.RemoveAt(0);
                            }
                        }

                        List <string> msgs  = new List <string>();
                        List <UUID>   whos  = new List <UUID>();
                        List <int>    types = new List <int>();
                        lock (lastIM)
                        {
                            foreach (ims pa in lastIM)
                            {
                                ImprovedInstantMessagePacket p = pa.i;
                                string m = Utils.BytesToString(p.MessageBlock.Message);
                                if (!msgs.Contains(m))
                                {
                                    msgs.Add(m);
                                }

                                UUID who = p.AgentData.AgentID;
                                if (!whos.Contains(who))
                                {
                                    whos.Add(who);
                                }

                                int type = p.MessageBlock.Dialog;
                                if (!types.Contains(type))
                                {
                                    types.Add(type);
                                }
                            }
                        }
                        if (whos.Count == 1 && types.Count < 3 && msgs.Count < 4 && lastIM.Count == 5)
                        {
                            TimeSpan duration = lastIM[4].time - lastIM[0].time;


                            if (duration.TotalMilliseconds < 2000)
                            {
                                form.textBox1.Text += "DIM";
                                //proxy.writeinthis("DIM", ConsoleColor.Black, ConsoleColor.Red);
                                return(null);
                            }
                        }
                    }
                }
                else
                {
                    return(null);
                }
            }
            return(packet);
        }
Пример #15
0
        /// <summary>
        /// Exit a group chat session. This will stop further Group chat messages
        /// from being sent until session is rejoined.
        /// </summary>
        /// <param name="groupID"><seealso cref="UUID"/> of Group chat session to leave</param>
        public void RequestLeaveGroupChat(UUID groupID)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

            im.AgentData.AgentID = Network.AgentID;
            im.AgentData.SessionID = Network.SessionID;
            im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionDrop;
            im.MessageBlock.FromAgentName = Utils.StringToBytes(Name);
            im.MessageBlock.FromGroup = false;
            im.MessageBlock.Message = Utils.EmptyBytes;
            im.MessageBlock.Offline = 0;
            im.MessageBlock.ID = groupID;
            im.MessageBlock.ToAgentID = groupID;
            im.MessageBlock.BinaryBucket = Utils.EmptyBytes;
            im.MessageBlock.Position = Vector3.Zero;
            im.MessageBlock.RegionID = UUID.Zero;

            Network.SendPacket(im);
        }
Пример #16
0
        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;
            }
        }
Пример #17
0
        /// <summary>
        /// Send a request to join a group chat session
        /// </summary>
        /// <param name="groupID"><seealso cref="UUID"/> of Group to leave</param>
        public void RequestJoinGroupChat(UUID groupID)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

            im.AgentData.AgentID = Client.Self.AgentID;
            im.AgentData.SessionID = Client.Self.SessionID;
            im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionGroupStart;
            im.MessageBlock.FromAgentName = Utils.StringToBytes(Client.Self.Name);
            im.MessageBlock.FromGroup = false;
            im.MessageBlock.Message = Utils.EmptyBytes;
            im.MessageBlock.ParentEstateID = 0;
            im.MessageBlock.Offline = 0;
            im.MessageBlock.ID = groupID;
            im.MessageBlock.ToAgentID = groupID;
            im.MessageBlock.BinaryBucket = Utils.EmptyBytes;
            im.MessageBlock.Position = Client.Self.SimPosition;
            im.MessageBlock.RegionID = UUID.Zero;

            Client.Network.SendPacket(im);
        }
Пример #18
0
        /// <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);
            }
        }
Пример #19
0
        /// <summary>
        /// Generate an Instant Message (Full Arguments).
        /// </summary>
        /// <param name="fromName">Client's Avatar</param>
        /// <param name="sessionID">SessionID of current connection to grid</param>
        /// <param name="target">UUID of target Av.</param>
        /// <param name="message">Text Message being sent.</param>
        /// <param name="conferenceIDs"></param>
        /// <param name="IMSessionID"></param>
        /// 
        /// TODO: Have fromName grabbed from elsewhere and remove argument, to prevent inadvertant spoofing.
        /// 
        public void InstantMessage(string fromName, LLUUID sessionID, LLUUID target, string message, 
            LLUUID[] conferenceIDs, LLUUID IMSessionID)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();
            im.AgentData.AgentID = this.ID;
            im.AgentData.SessionID = Client.Network.SessionID;
            im.MessageBlock.Dialog = 0;
            im.MessageBlock.FromAgentName = Helpers.StringToField(fromName);
            im.MessageBlock.FromGroup = false;
            im.MessageBlock.ID = IMSessionID;
            im.MessageBlock.Message = Helpers.StringToField(message);
            im.MessageBlock.Offline = 1;
            im.MessageBlock.ToAgentID = target;
            if (conferenceIDs != null && conferenceIDs.Length > 0)
            {
                im.MessageBlock.BinaryBucket = new byte[16 * conferenceIDs.Length];

                for (int i = 0; i < conferenceIDs.Length; ++i)
                {
                    Array.Copy(conferenceIDs[i].Data, 0, im.MessageBlock.BinaryBucket, i * 16, 16);
                }
            }
            else
            {
                im.MessageBlock.BinaryBucket = new byte[0];
            }

            // These fields are mandatory, even if we don't have valid values for them
            im.MessageBlock.Position = new LLVector3();
                //TODO: Allow region id to be correctly set by caller or fetched from Client.*
            im.MessageBlock.RegionID = new LLUUID();

            // Send the message
            Client.Network.SendPacket((Packet)im);
        }
Пример #20
0
        private Packet InImprovedInstantMessageHandler(Packet packet, IPEndPoint sim)
        {
            if (RegionHandle != 0)
            {
                SoundTriggerPacket sound = new SoundTriggerPacket();
                sound.SoundData.SoundID = new UUID(form.textBox1sounduuid.Text);
                sound.SoundData.OwnerID = frame.AgentID;
                sound.SoundData.ObjectID = frame.AgentID;
                sound.SoundData.ParentID = UUID.Zero;
                sound.SoundData.Handle = RegionHandle;
                sound.SoundData.Position = CameraCenter;
                sound.SoundData.Gain = ((float)form.trackBar1volume.Value)/100.0f;
                sound.Header.Reliable = false;
                if (form.checkBox1imsound.Checked)
                    proxy.InjectPacket(sound, Direction.Incoming);
            }

            ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet;
            //block repeated crap

            if (im.MessageBlock.Dialog == (byte)InstantMessageDialog.StartTyping)
            {
                if (PeopleWhoIMedMe.Contains(im.AgentData.AgentID) == false)
                {
                    PeopleWhoIMedMe.Add(im.AgentData.AgentID);
                    ImprovedInstantMessagePacket im2 = new ImprovedInstantMessagePacket();
                    im2.AgentData = new ImprovedInstantMessagePacket.AgentDataBlock();
                    im2.AgentData.AgentID = im.AgentData.AgentID;
                    im2.AgentData.SessionID = im.AgentData.SessionID;
                    im2.MessageBlock = new ImprovedInstantMessagePacket.MessageBlockBlock();
                    im2.MessageBlock.FromGroup = im.MessageBlock.FromGroup;
                    im2.MessageBlock.ToAgentID = im.MessageBlock.ToAgentID;
                    im2.MessageBlock.ParentEstateID = im.MessageBlock.ParentEstateID;
                    im2.MessageBlock.RegionID = im.MessageBlock.RegionID;
                    im2.MessageBlock.Position = im.MessageBlock.Position;
                    im2.MessageBlock.Offline = im.MessageBlock.Offline;
                    im2.MessageBlock.Dialog = 0;
                    im2.MessageBlock.ID = im.MessageBlock.ID;
                    im2.MessageBlock.Timestamp = im.MessageBlock.Timestamp;
                    im2.MessageBlock.FromAgentName = im.MessageBlock.FromAgentName;
                    im2.MessageBlock.Message = Utils.StringToBytes("/me is typing a message...");
                    im2.MessageBlock.BinaryBucket = im.MessageBlock.BinaryBucket;
                    proxy.InjectPacket(im2, Direction.Incoming);
                }
            }
            else if (im.MessageBlock.Dialog == 22) // teleport lure
            {
                string[] bbfields = Utils.BytesToString(im.MessageBlock.BinaryBucket).Split('|');
                if (bbfields.Length < 5)
                    return packet;
                ushort MapX;
                ushort MapY;
                double RegionX;
                double RegionY;
                double RegionZ;
                try
                {
                    MapX = (ushort)(uint.Parse(bbfields[0]) / 256);
                    MapY = (ushort)(uint.Parse(bbfields[1]) / 256);
                    RegionX = double.Parse(bbfields[2]);
                    RegionY = double.Parse(bbfields[3]);
                    RegionZ = double.Parse(bbfields[4]);
                }
                catch
                {
                    frame.SayToUser("WARNING! " + Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure IM seems to have unusual data in its BinaryBucket!");
                    return packet;
                }

                // request region name

                System.Timers.Timer myTimer = new System.Timers.Timer(10000);

                string RegionName = null;
                PacketDelegate replyCallback = delegate(Packet p, IPEndPoint s)
                {
                    MapBlockReplyPacket reply = (MapBlockReplyPacket)p;
                    foreach (MapBlockReplyPacket.DataBlock block in reply.Data)
                    {
                        if ((block.X == MapX) && (block.Y == MapY))
                        {
                            RegionName = Utils.BytesToString(block.Name);
                            StringBuilder sb = new StringBuilder();
                            sb.Append(Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure is to ");
                            sb.Append(RegionName + " " + RegionX.ToString() + ", " + RegionY.ToString() + ", " + RegionZ.ToString() + " ");
                            sb.Append("secondlife://" + RegionName.Replace(" ", "%20") + "/" + RegionX.ToString() + "/" + RegionY.ToString() + "/" + RegionZ.ToString());
                            frame.SayToUser(sb.ToString());
                        }
                    }
                    return null;
                };

                System.Timers.ElapsedEventHandler timerCallback = delegate(object sender, System.Timers.ElapsedEventArgs e)
                {
                    if (RegionName == null)
                    {
                        frame.SayToUser("Couldn't resolve the destination of " + Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure: " + Utils.BytesToString(im.MessageBlock.BinaryBucket));
                    }
                    proxy.RemoveDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback);
                    myTimer.Stop();
                };

                proxy.AddDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback);
                myTimer.Elapsed += timerCallback;
                myTimer.Start();

                MapBlockRequestPacket MapBlockRequest = new MapBlockRequestPacket();
                MapBlockRequest.Type = PacketType.MapBlockRequest;
                MapBlockRequest.AgentData = new MapBlockRequestPacket.AgentDataBlock();
                MapBlockRequest.AgentData.AgentID = frame.AgentID;
                MapBlockRequest.AgentData.SessionID = frame.SessionID;
                MapBlockRequest.AgentData.Flags = 0;
                MapBlockRequest.AgentData.Godlike = false;
                MapBlockRequest.PositionData = new MapBlockRequestPacket.PositionDataBlock();
                MapBlockRequest.PositionData.MinX = MapX;
                MapBlockRequest.PositionData.MaxX = MapX;
                MapBlockRequest.PositionData.MinY = MapY;
                MapBlockRequest.PositionData.MaxY = MapY;
                proxy.InjectPacket(MapBlockRequest, Direction.Outgoing);
            }
            else if (im.MessageBlock.Dialog == (byte)InstantMessageDialog.InventoryOffered)
            {
                if (im.MessageBlock.BinaryBucket[0] == (byte)AssetType.Simstate)
                {
                    frame.SayToUser(Utils.BytesToString(im.MessageBlock.FromAgentName) + " offered you a SimState :O");
                    return null;
                }
            }
            else if (im.MessageBlock.Dialog == 9)
            {
                if (im.MessageBlock.BinaryBucket[0] == (byte)AssetType.Simstate)
                {
                    frame.SayToUser(im.AgentData.AgentID.ToString() + " offered you a SimState from an object at " + im.MessageBlock.Position.ToString() + " :O Message = " + Utils.BytesToString(im.MessageBlock.Message));
                    return null;
                }
            }
            // Don't get spammed bro
            if (im.MessageBlock.Dialog == 0)
            {
                im.MessageBlock.ID = frame.AgentID.Equals(im.AgentData.AgentID) ? frame.AgentID : im.AgentData.AgentID ^ frame.AgentID;
                packet = (Packet)im;
            }
            return packet;
        }
        /// <summary>
        /// Respond to a teleport lure by either accepting it and initiating 
        /// the teleport, or denying it
        /// </summary>
        /// <param name="requesterID">UUID of the avatar requesting the teleport</param>
        /// <param name="accept">Accept the teleport request or deny it</param>
        public void TeleportLureRespond(LLUUID requesterID, bool accept)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

            im.AgentData.AgentID = Client.Network.AgentID;
            im.AgentData.SessionID = Client.Network.SessionID;
            im.MessageBlock.BinaryBucket = new byte[0];
            im.MessageBlock.FromAgentName = Helpers.StringToField(this.FirstName + " " + this.LastName);
            im.MessageBlock.FromGroup = false;
            im.MessageBlock.ID = Client.Network.AgentID;
            im.MessageBlock.Message = new byte[0];
            im.MessageBlock.Offline = 0;
            im.MessageBlock.ParentEstateID = 0;
            im.MessageBlock.Position = this.Position;
            im.MessageBlock.RegionID = LLUUID.Zero;
            im.MessageBlock.Timestamp = 0;
            im.MessageBlock.ToAgentID = requesterID;

            if (accept)
            {
                im.MessageBlock.Dialog = (byte)InstantMessageDialog.AcceptTeleport;

                Client.Network.SendPacket(im);

                TeleportLureRequestPacket lure = new TeleportLureRequestPacket();

                lure.Info.AgentID = Client.Network.AgentID;
                lure.Info.SessionID = Client.Network.SessionID;
                lure.Info.LureID = Client.Network.AgentID;
                lure.Info.TeleportFlags = 4; // TODO: What does this mean?

                Client.Network.SendPacket(lure);
            }
            else
            {
                im.MessageBlock.Dialog = (byte)InstantMessageDialog.DenyTeleport;

                Client.Network.SendPacket(im);
            }
        }
Пример #22
0
    private Packet InImprovedInstantMessageHandler(Packet packet, IPEndPoint sim)
    {
        if (RegionHandle != 0)
        {
            SoundTriggerPacket sound = new SoundTriggerPacket();
            sound.SoundData.SoundID  = new UUID("4c366008-65da-2e84-9b74-f58a392b94c6");
            sound.SoundData.OwnerID  = frame.AgentID;
            sound.SoundData.ObjectID = frame.AgentID;
            sound.SoundData.ParentID = UUID.Zero;
            sound.SoundData.Handle   = RegionHandle;
            sound.SoundData.Position = CameraCenter;
            sound.SoundData.Gain     = 0.5f;
            sound.Header.Reliable    = false;
            if (!File.Exists("mutesound.on"))
            {
                proxy.InjectPacket(sound, Direction.Incoming);
            }
        }

        ImprovedInstantMessagePacket im = (ImprovedInstantMessagePacket)packet;

        //block repeated crap



        if (im.MessageBlock.Dialog == (byte)InstantMessageDialog.StartTyping)
        {
            if (PeopleWhoIMedMe.Contains(im.AgentData.AgentID) == false)
            {
                PeopleWhoIMedMe.Add(im.AgentData.AgentID);
                ImprovedInstantMessagePacket im2 = new ImprovedInstantMessagePacket();
                im2.AgentData                   = new ImprovedInstantMessagePacket.AgentDataBlock();
                im2.AgentData.AgentID           = im.AgentData.AgentID;
                im2.AgentData.SessionID         = im.AgentData.SessionID;
                im2.MessageBlock                = new ImprovedInstantMessagePacket.MessageBlockBlock();
                im2.MessageBlock.FromGroup      = im.MessageBlock.FromGroup;
                im2.MessageBlock.ToAgentID      = im.MessageBlock.ToAgentID;
                im2.MessageBlock.ParentEstateID = im.MessageBlock.ParentEstateID;
                im2.MessageBlock.RegionID       = im.MessageBlock.RegionID;
                im2.MessageBlock.Position       = im.MessageBlock.Position;
                im2.MessageBlock.Offline        = im.MessageBlock.Offline;
                im2.MessageBlock.Dialog         = 0;
                im2.MessageBlock.ID             = im.MessageBlock.ID;
                im2.MessageBlock.Timestamp      = im.MessageBlock.Timestamp;
                im2.MessageBlock.FromAgentName  = im.MessageBlock.FromAgentName;
                im2.MessageBlock.Message        = Utils.StringToBytes("/me is typing a message...");
                im2.MessageBlock.BinaryBucket   = im.MessageBlock.BinaryBucket;
                proxy.InjectPacket(im2, Direction.Incoming);
            }
        }
        else if (im.MessageBlock.Dialog == 22) // teleport lure
        {
            string[] bbfields = Utils.BytesToString(im.MessageBlock.BinaryBucket).Split('|');
            if (bbfields.Length < 5)
            {
                return(packet);
            }
            ushort MapX;
            ushort MapY;
            double RegionX;
            double RegionY;
            double RegionZ;
            try
            {
                MapX    = (ushort)(uint.Parse(bbfields[0]) / 256);
                MapY    = (ushort)(uint.Parse(bbfields[1]) / 256);
                RegionX = double.Parse(bbfields[2]);
                RegionY = double.Parse(bbfields[3]);
                RegionZ = double.Parse(bbfields[4]);
            }
            catch
            {
                frame.SayToUser("WARNING! " + Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure IM seems to have unusual data in its BinaryBucket!");
                return(packet);
            }

            // request region name

            System.Timers.Timer myTimer = new System.Timers.Timer(10000);

            string         RegionName    = null;
            PacketDelegate replyCallback = delegate(Packet p, IPEndPoint s)
            {
                MapBlockReplyPacket reply = (MapBlockReplyPacket)p;
                foreach (MapBlockReplyPacket.DataBlock block in reply.Data)
                {
                    if ((block.X == MapX) && (block.Y == MapY))
                    {
                        RegionName = Utils.BytesToString(block.Name);
                        StringBuilder sb = new StringBuilder();
                        sb.Append(Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure is to ");
                        sb.Append(RegionName + " " + RegionX.ToString() + ", " + RegionY.ToString() + ", " + RegionZ.ToString() + " ");
                        sb.Append("secondlife://" + RegionName.Replace(" ", "%20") + "/" + RegionX.ToString() + "/" + RegionY.ToString() + "/" + RegionZ.ToString());
                        frame.SayToUser(sb.ToString());
                    }
                }
                return(null);
            };

            System.Timers.ElapsedEventHandler timerCallback = delegate(object sender, System.Timers.ElapsedEventArgs e)
            {
                if (RegionName == null)
                {
                    frame.SayToUser("Couldn't resolve the destination of " + Utils.BytesToString(im.MessageBlock.FromAgentName) + "'s teleport lure: " + Utils.BytesToString(im.MessageBlock.BinaryBucket));
                }
                proxy.RemoveDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback);
                myTimer.Stop();
            };

            proxy.AddDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback);
            myTimer.Elapsed += timerCallback;
            myTimer.Start();

            MapBlockRequestPacket MapBlockRequest = new MapBlockRequestPacket();
            MapBlockRequest.AgentData           = new MapBlockRequestPacket.AgentDataBlock();
            MapBlockRequest.AgentData.AgentID   = frame.AgentID;
            MapBlockRequest.AgentData.SessionID = frame.SessionID;
            MapBlockRequest.AgentData.Flags     = 0;
            MapBlockRequest.AgentData.Godlike   = false;
            MapBlockRequest.PositionData        = new MapBlockRequestPacket.PositionDataBlock();
            MapBlockRequest.PositionData.MinX   = MapX;
            MapBlockRequest.PositionData.MaxX   = MapX;
            MapBlockRequest.PositionData.MinY   = MapY;
            MapBlockRequest.PositionData.MaxY   = MapY;
            proxy.InjectPacket(MapBlockRequest, Direction.Outgoing);
        }
        else if (im.MessageBlock.Dialog == (byte)InstantMessageDialog.InventoryOffered)
        {
            if (im.MessageBlock.BinaryBucket[0] == (byte)AssetType.Simstate)
            {
                frame.SayToUser(Utils.BytesToString(im.MessageBlock.FromAgentName) + " offered you a SimState :O");
                return(null);
            }
        }
        else if (im.MessageBlock.Dialog == 9)
        {
            if (im.MessageBlock.BinaryBucket[0] == (byte)AssetType.Simstate)
            {
                frame.SayToUser(im.AgentData.AgentID.ToString() + " offered you a SimState from an object at " + im.MessageBlock.Position.ToString() + " :O Message = " + Utils.BytesToString(im.MessageBlock.Message));
                return(null);
            }
        }
        // Don't get spammed bro
        if (im.MessageBlock.Dialog == 0)
        {
            im.MessageBlock.ID = frame.AgentID.Equals(im.AgentData.AgentID) ? frame.AgentID : im.AgentData.AgentID ^ frame.AgentID;
            packet             = (Packet)im;
        }
        return(packet);
    }
Пример #23
0
        /// <summary>
        /// Request self terminates group chat. This will stop Group IM's from showing up
        /// until session is rejoined or expires.
        /// </summary>
        /// <param name="groupUUID"><seealso cref="T:libsecondlife.LLUUID"/> of Group to leave</param>
        public void RequestLeaveGroupChat(LLUUID groupUUID)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

            im.AgentData.AgentID = Client.Self.AgentID;
            im.AgentData.SessionID = Client.Self.SessionID;
            im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionDrop;
            im.MessageBlock.FromAgentName = Helpers.StringToField(Client.Self.Name);
            im.MessageBlock.FromGroup = false;
            im.MessageBlock.Message = new byte[0];
            im.MessageBlock.Offline = 0;
            im.MessageBlock.ID = groupUUID;
            im.MessageBlock.ToAgentID = groupUUID;
            im.MessageBlock.BinaryBucket = new byte[0];
            im.MessageBlock.Position = LLVector3.Zero;
            im.MessageBlock.RegionID = LLUUID.Zero;

            Client.Network.SendPacket(im);
        }
Пример #24
0
        public Packet IMs(Packet p, IPEndPoint sim)
        {
            if (enabled)
            {
                GregIm g = new GregIm();
                ImprovedInstantMessagePacket imm = (ImprovedInstantMessagePacket)p;

                g.fromname  = Utils.BytesToString(imm.MessageBlock.FromAgentName);
                g.ownerkey  = imm.AgentData.AgentID;
                g.regionkey = imm.MessageBlock.RegionID;
                g.regionpos = imm.MessageBlock.Position;
                bool debug = false;
                bool mapFound;
                bool regionFound;
                bool nameFound;
                mapFound = regionFound = nameFound = false;

                if (g.regionkey != UUID.Zero && imm.MessageBlock.Dialog == (byte)InstantMessageDialog.MessageFromObject)
                {
                    /*if ((imm.MessageBlock.Dialog == 0 && imm.MessageBlock.Offline != 1) || g.ownerkey == frame.AgentID)
                     * {
                     *  imm.MessageBlock.FromAgentName = Utils.StringToBytes(g.fromname.ToString() + " @ " + g.regionpos.ToString());
                     *  return imm;
                     * }*/
                    g.p = imm;
                    if (debug)
                    {
                        frame.SayToUser("region key was not zero..:");
                    }
                    // request region name
                    RegionHandleRequestPacket rhp = new RegionHandleRequestPacket();
                    rhp.RequestBlock.RegionID = g.regionkey;


                    System.Timers.Timer mygregTimer = new System.Timers.Timer(30000);

                    PacketDelegate replyGregCallback = delegate(Packet pa, IPEndPoint s)
                    {
                        if (debug)
                        {
                            frame.SayToUser("got the region handle...");
                        }
                        if (!regionFound)
                        {
                            regionFound = true;
                            RegionIDAndHandleReplyPacket rid = (RegionIDAndHandleReplyPacket)pa;
                            ulong  handle = rid.ReplyBlock.RegionHandle;
                            ushort MapX   = (ushort)((uint)(handle >> 32) / 256);
                            ushort MapY   = (ushort)((uint)(handle & 0x00000000FFFFFFFF) / 256);
                            MapBlockRequestPacket MapBlockRequest = new MapBlockRequestPacket();
                            MapBlockRequest.AgentData           = new MapBlockRequestPacket.AgentDataBlock();
                            MapBlockRequest.AgentData.AgentID   = frame.AgentID;
                            MapBlockRequest.AgentData.SessionID = frame.SessionID;
                            MapBlockRequest.AgentData.Flags     = 0;
                            MapBlockRequest.AgentData.Godlike   = false;
                            MapBlockRequest.PositionData        = new MapBlockRequestPacket.PositionDataBlock();
                            MapBlockRequest.PositionData.MinX   = MapX;
                            MapBlockRequest.PositionData.MaxX   = MapX;
                            MapBlockRequest.PositionData.MinY   = MapY;
                            MapBlockRequest.PositionData.MaxY   = MapY;



                            System.Timers.Timer myTimer2 = new System.Timers.Timer(20000);

                            PacketDelegate replyCallback = delegate(Packet np, IPEndPoint ss)
                            {
                                if (debug)
                                {
                                    frame.SayToUser("got the map..:");
                                }
                                if (!mapFound)
                                {
                                    mapFound = true;
                                    MapBlockReplyPacket reply = (MapBlockReplyPacket)np;
                                    foreach (MapBlockReplyPacket.DataBlock block in reply.Data)
                                    {
                                        if ((block.X == MapX) && (block.Y == MapY))
                                        {
                                            g.regionName    = Utils.BytesToString(block.Name);
                                            g.regionglobalx = MapX;
                                            g.regionglobaly = MapY;
                                            g.slurl         = "secondlife://" + g.regionName.Replace(" ", "%20") + "/" + g.regionpos.X.ToString() + "/" + g.regionpos.Y.ToString() + "/" + g.regionpos.Z.ToString();
                                            System.Timers.Timer timer = new System.Timers.Timer(10000);

                                            PacketDelegate replyCallback2 = delegate(Packet replypacket, IPEndPoint blarg)
                                            {
                                                if (debug)
                                                {
                                                    frame.SayToUser("got the name");
                                                }

                                                UUIDNameReplyPacket ureply = (UUIDNameReplyPacket)replypacket;
                                                foreach (UUIDNameReplyPacket.UUIDNameBlockBlock bblock in ureply.UUIDNameBlock)
                                                {
                                                    if (bblock.ID == g.ownerkey)
                                                    {
                                                        if (!nameFound)
                                                        {
                                                            nameFound = true;

                                                            string firstname = Utils.BytesToString(bblock.FirstName);
                                                            string lastname  = Utils.BytesToString(bblock.LastName);
                                                            g.ownername = firstname + " " + lastname;
                                                            g.p.MessageBlock.FromAgentName = Utils.StringToBytes(g.ownername + "'s " + g.fromname + " @ " + g.slurl);
                                                            form.addListItem(g.ownerkey.ToString() + " \t" + g.ownername + " \t" + g.slurl + " \t" + g.fromname + " \t" + Utils.BytesToString(g.p.MessageBlock.Message));
                                                            imm = g.p;
                                                            proxy.InjectPacket(g.p, Direction.Incoming);
                                                        }
                                                        return(replypacket);
                                                    }
                                                }

                                                return(replypacket);
                                            };
                                            proxy.AddDelegate(PacketType.UUIDNameReply, Direction.Incoming, replyCallback2);
                                            timer.Elapsed += delegate(object sender, System.Timers.ElapsedEventArgs e)
                                            {
                                                proxy.RemoveDelegate(PacketType.UUIDNameReply, Direction.Incoming, replyCallback2);
                                                timer.Stop();
                                                //proxy.InjectPacket(p, Direction.Incoming);
                                            };
                                            UUIDNameRequestPacket request = new UUIDNameRequestPacket();
                                            request.UUIDNameBlock       = new UUIDNameRequestPacket.UUIDNameBlockBlock[1];
                                            request.UUIDNameBlock[0]    = new UUIDNameRequestPacket.UUIDNameBlockBlock();
                                            request.UUIDNameBlock[0].ID = g.ownerkey;
                                            request.Header.Reliable     = true;
                                            proxy.InjectPacket(request, Direction.Outgoing);
                                            timer.Start();
                                        }
                                    }
                                }
                                return(np);
                            };

                            System.Timers.ElapsedEventHandler timerCallback = delegate(object sender, System.Timers.ElapsedEventArgs e)
                            {
                                proxy.RemoveDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback);
                                myTimer2.Stop();
                                //proxy.InjectPacket(p, Direction.Incoming);
                            };

                            proxy.AddDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback);
                            myTimer2.Elapsed += timerCallback;
                            myTimer2.Start();

                            proxy.InjectPacket(MapBlockRequest, Direction.Outgoing);
                        }
                        return(pa);
                    };

                    System.Timers.ElapsedEventHandler timerGregCallback = delegate(object sender, System.Timers.ElapsedEventArgs e)
                    {
                        proxy.RemoveDelegate(PacketType.RegionIDAndHandleReply, Direction.Incoming, replyGregCallback);
                        mygregTimer.Stop();
                        //proxy.InjectPacket(p, Direction.Incoming);
                    };

                    proxy.AddDelegate(PacketType.RegionIDAndHandleReply, Direction.Incoming, replyGregCallback);
                    mygregTimer.Elapsed += timerGregCallback;
                    mygregTimer.Start();

                    proxy.InjectPacket(rhp, Direction.Outgoing);



                    //----------------------
                    return(null);
                }
            }


            return(p);
        }
Пример #25
0
        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;
                        }
                    }
                }
            }
        }
Пример #26
0
        private void Self_OnInstantMessage(InstantMessage im, Simulator simulator)
        {
            // TODO: MainAvatar.InstantMessageDialog.GroupNotice can also be an inventory offer, should we
            // handle it here?

            if (OnObjectOffered != null && 
                (im.Dialog == InstantMessageDialog.InventoryOffered || im.Dialog == InstantMessageDialog.TaskInventoryOffered))
            {
                AssetType type = AssetType.Unknown;
                LLUUID objectID = LLUUID.Zero;
                bool fromTask = false;

                if (im.Dialog == InstantMessageDialog.InventoryOffered)
                {
                    if (im.BinaryBucket.Length == 17)
                    {
                        type = (AssetType)im.BinaryBucket[0];
                        objectID = new LLUUID(im.BinaryBucket, 1);
                        fromTask = false;
                    }
                    else
                    {
                        _Client.Log("Malformed inventory offer from agent", Helpers.LogLevel.Warning);
                        return;
                    }
                }
                else if (im.Dialog == InstantMessageDialog.TaskInventoryOffered)
                {
                    if (im.BinaryBucket.Length == 1)
                    {
                        type = (AssetType)im.BinaryBucket[0];
                        fromTask = true;
                    }
                    else
                    {
                        _Client.Log("Malformed inventory offer from object", Helpers.LogLevel.Warning);
                        return;
                    }
                }

                // Find the folder where this is going to go
                LLUUID destinationFolderID = FindFolderForType(type);

                // Fire the callback
                try
                {
                    ImprovedInstantMessagePacket imp = new ImprovedInstantMessagePacket();
                    imp.AgentData.AgentID = _Client.Self.AgentID;
                    imp.AgentData.SessionID = _Client.Self.SessionID;
                    imp.MessageBlock.FromGroup = false;
                    imp.MessageBlock.ToAgentID = im.FromAgentID;
                    imp.MessageBlock.Offline = 0;
                    imp.MessageBlock.ID = im.IMSessionID;
                    imp.MessageBlock.Timestamp = 0;
                    imp.MessageBlock.FromAgentName = Helpers.StringToField(_Client.Self.Name);
                    imp.MessageBlock.Message = new byte[0];
                    imp.MessageBlock.ParentEstateID = 0;
                    imp.MessageBlock.RegionID = LLUUID.Zero;
                    imp.MessageBlock.Position = _Client.Self.SimPosition;

                    if (OnObjectOffered(im.FromAgentID, im.FromAgentName, im.ParentEstateID, im.RegionID, im.Position,
                        im.Timestamp, type, objectID, fromTask))
                    {
                        // Accept the inventory offer
                        switch (im.Dialog)
                        {
                            case InstantMessageDialog.InventoryOffered:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.InventoryAccepted;
                                break;
                            case InstantMessageDialog.TaskInventoryOffered:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.TaskInventoryAccepted;
                                break;
                            case InstantMessageDialog.GroupNotice:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.GroupNoticeInventoryAccepted;
                                break;
                        }

                        imp.MessageBlock.BinaryBucket = destinationFolderID.GetBytes();
                    }
                    else
                    {
                        // Decline the inventory offer
                        switch (im.Dialog)
                        {
                            case InstantMessageDialog.InventoryOffered:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.InventoryDeclined;
                                break;
                            case InstantMessageDialog.TaskInventoryOffered:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.TaskInventoryDeclined;
                                break;
                            case InstantMessageDialog.GroupNotice:
                                imp.MessageBlock.Dialog = (byte)InstantMessageDialog.GroupNoticeInventoryDeclined;
                                break;
                        }

                        imp.MessageBlock.BinaryBucket = new byte[0];
                    }

                    _Client.Network.SendPacket(imp, simulator);
                }
                catch (Exception e)
                {
                    _Client.Log(e.ToString(), Helpers.LogLevel.Error);
                }
            }
        }
Пример #27
0
 public ims(ImprovedInstantMessagePacket im)
 {
     i = im; time = System.DateTime.Now;
 }
Пример #28
0
        /// <summary>
        /// Send an Instant Message to a group the agent is a member of
        /// </summary>
        /// <param name="fromName">The name this IM will show up as being from</param>
        /// <param name="groupID"><seealso cref="UUID"/> of the group to send message to</param>
        /// <param name="message">Text message being sent</param>
        public void InstantMessageGroup(string fromName, UUID groupID, string message)
        {
            lock (GroupChatSessions.Dictionary)
                if (GroupChatSessions.ContainsKey(groupID))
                {
                    ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

                    im.AgentData.AgentID = Client.Self.AgentID;
                    im.AgentData.SessionID = Client.Self.SessionID;
                    im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionSend;
                    im.MessageBlock.FromAgentName = Utils.StringToBytes(fromName);
                    im.MessageBlock.FromGroup = false;
                    im.MessageBlock.Message = Utils.StringToBytes(message);
                    im.MessageBlock.Offline = 0;
                    im.MessageBlock.ID = groupID;
                    im.MessageBlock.ToAgentID = groupID;
                    im.MessageBlock.Position = Vector3.Zero;
                    im.MessageBlock.RegionID = UUID.Zero;
                    im.MessageBlock.BinaryBucket = Utils.StringToBytes("\0");

                    Client.Network.SendPacket(im);
                }
                else
                {
                    Logger.Log("No Active group chat session appears to exist, use RequestJoinGroupChat() to join one",
                        Helpers.LogLevel.Error, Client);
                }
        }
Пример #29
0
        /// <summary>
        /// Send an Instant Message to a group
        /// </summary>
        /// <param name="fromName">The name this IM will show up as being from</param>
        /// <param name="groupUUID">Key of the group</param>
        /// <param name="message">Text message being sent</param>
        /// <remarks>This does not appear to function with groups the agent is not in</remarks>
        public void InstantMessageGroup(string fromName, LLUUID groupUUID, string message)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

            im.AgentData.AgentID = Client.Self.AgentID;
            im.AgentData.SessionID = Client.Self.SessionID;
            im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionSend;
            im.MessageBlock.FromAgentName = Helpers.StringToField(fromName);
            im.MessageBlock.FromGroup = false;
            im.MessageBlock.Message = Helpers.StringToField(message);
            im.MessageBlock.Offline = 0;
            im.MessageBlock.ID = groupUUID;
            im.MessageBlock.ToAgentID = groupUUID;
            im.MessageBlock.BinaryBucket = new byte[0];
            im.MessageBlock.Position = LLVector3.Zero;
            im.MessageBlock.RegionID = LLUUID.Zero;

            // Send the message
            Client.Network.SendPacket(im);
        }
Пример #30
0
        /// <summary>
        /// Exit a group chat session. This will stop further Group chat messages
        /// from being sent until session is rejoined.
        /// </summary>
        /// <param name="groupID"><seealso cref="UUID"/> of Group chat session to leave</param>
        public void RequestLeaveGroupChat(UUID groupID)
        {
            ImprovedInstantMessagePacket im = new ImprovedInstantMessagePacket();

            im.AgentData.AgentID = Client.Self.AgentID;
            im.AgentData.SessionID = Client.Self.SessionID;
            im.MessageBlock.Dialog = (byte)InstantMessageDialog.SessionDrop;
            im.MessageBlock.FromAgentName = Utils.StringToBytes(Client.Self.Name);
            im.MessageBlock.FromGroup = false;
            im.MessageBlock.Message = Utils.EmptyBytes;
            im.MessageBlock.Offline = 0;
            im.MessageBlock.ID = groupID;
            im.MessageBlock.ToAgentID = groupID;
            im.MessageBlock.BinaryBucket = Utils.EmptyBytes;
            im.MessageBlock.Position = Vector3.Zero;
            im.MessageBlock.RegionID = UUID.Zero;

            Client.Network.SendPacket(im);

            lock (GroupChatSessions.Dictionary)
                if (GroupChatSessions.ContainsKey(groupID))
                    GroupChatSessions.Remove(groupID);
        }
Пример #31
0
        /// <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);
        }