/// <summary>
        /// Fire off packet for Linden/Mainland sim data request.
        /// </summary>
        public void AddLindenSims()
        {
            MapBlockRequestPacket request = new MapBlockRequestPacket();

            request.AgentData.AgentID   = Client.Network.AgentID;
            request.AgentData.SessionID = Client.Network.SessionID;
            request.AgentData.EstateID  = 0;
            request.AgentData.Flags     = 0;
            request.PositionData.MaxX   = 65535;
            request.PositionData.MaxY   = 65535;
            request.PositionData.MinX   = 0;
            request.PositionData.MinY   = 0;

            Client.Network.SendPacket(request);
        }
Exemple #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="layer"></param>
        /// <param name="minX"></param>
        /// <param name="minY"></param>
        /// <param name="maxX"></param>
        /// <param name="maxY"></param>
        /// <param name="returnNonExistent"></param>
        public void RequestMapBlocks(GridLayerType layer, ushort minX, ushort minY, ushort maxX, ushort maxY,
                                     bool returnNonExistent)
        {
            MapBlockRequestPacket request = new MapBlockRequestPacket();

            request.AgentData.AgentID   = Client.Self.AgentID;
            request.AgentData.SessionID = Client.Self.SessionID;
            request.AgentData.Flags     = (uint)layer;
            request.AgentData.Flags    |= (uint)(returnNonExistent ? 0x10000 : 0);
            request.AgentData.EstateID  = 0;     // Filled in at the simulator
            request.AgentData.Godlike   = false; // Filled in at the simulator

            request.PositionData.MinX = minX;
            request.PositionData.MinY = minY;
            request.PositionData.MaxX = maxX;
            request.PositionData.MaxY = maxY;

            Client.Network.SendPacket(request);
        }
Exemple #3
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="layer"></param>
        /// <param name="minX"></param>
        /// <param name="minY"></param>
        /// <param name="maxX"></param>
        /// <param name="maxY"></param>
        /// <param name="returnNonExistent"></param>
        public void RequestMapBlocks(GridLayerType layer, ushort minX, ushort minY, ushort maxX, ushort maxY, 
            bool returnNonExistent)
        {
            MapBlockRequestPacket request = new MapBlockRequestPacket();

            request.AgentData.AgentID = Client.Self.AgentID;
            request.AgentData.SessionID = Client.Self.SessionID;
            request.AgentData.Flags = (uint)layer;
            request.AgentData.Flags |= (uint)(returnNonExistent ? 0x10000 : 0);
            request.AgentData.EstateID = 0; // Filled in at the simulator
            request.AgentData.Godlike = false; // Filled in at the simulator

            request.PositionData.MinX = minX;
            request.PositionData.MinY = minY;
            request.PositionData.MaxX = maxX;
            request.PositionData.MaxY = maxY;

            Client.Network.SendPacket(request);
        }
Exemple #4
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);
        }
        /// <summary>
        /// Fire off packet for Linden/Mainland sim data request.
        /// </summary>
        public void AddLindenSims()
        {
            MapBlockRequestPacket request = new MapBlockRequestPacket();

            request.AgentData.AgentID = Client.Network.AgentID;
            request.AgentData.SessionID = Client.Network.SessionID;
            request.AgentData.EstateID = 0;
            request.AgentData.Flags = 0;
            request.PositionData.MaxX = 65535;
            request.PositionData.MaxY = 65535;
            request.PositionData.MinX = 0;
            request.PositionData.MinY = 0;

            Client.Network.SendPacket(request);
        }
Exemple #6
0
        private void RefreshDownloadsTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (frame.proxy.KnownCaps.Count > 2)
            {
                if (form.autoupdate())
                {
                    //buiding req
                    if (setData)
                    {
                        if (!regionNames.ContainsKey(shared.RegionHandle))
                        {
                            ulong  handle = shared.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)
                            {
                                MapBlockReplyPacket reply = (MapBlockReplyPacket)np;
                                foreach (MapBlockReplyPacket.DataBlock block in reply.Data)
                                {
                                    if ((block.X == MapX) && (block.Y == MapY))
                                    {
                                        string regionName    = Utils.BytesToString(block.Name);
                                        ushort regionglobalx = MapX;
                                        ushort regionglobaly = MapY;
                                        if (!regionNames.ContainsKey(shared.RegionHandle))
                                        {
                                            regionNames.Add(shared.RegionHandle, regionName);
                                        }
                                        form.updateWeb(form.getBase() + "secondlife://" + regionName.Replace(" ", "%20") + "/" + shared.CameraPosition.X.ToString() + "/" + shared.CameraPosition.Y.ToString() + "/" + shared.CameraPosition.Z.ToString());
                                    }
                                }
                                return(null);
                            };

                            System.Timers.ElapsedEventHandler timerCallback = delegate(object asender, System.Timers.ElapsedEventArgs ee)
                            {
                                proxy.RemoveDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback);
                                myTimer2.Stop();
                            };

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



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

                        else
                        {
                            form.updateWeb(form.getBase() + "secondlife://" + this.regionNames[this.shared.RegionHandle].Replace(" ", "%20") + "/" + shared.CameraPosition.X.ToString() + "/" + shared.CameraPosition.Y.ToString() + "/" + shared.CameraPosition.Z.ToString());
                        }
                    }
                    else
                    {
                        getProfile();
                    }
                }
            }
        }
Exemple #7
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;
        }
Exemple #8
0
        public void OnFileRequested(HttpRequest request, IDirectory directory)
        {
            //request.Response.SetHeader("Content-Type", "text/plain; charset=utf-8");
            request.Response.ResponseContent = new MemoryStream();
            StreamWriter textwriter = new StreamWriter(request.Response.ResponseContent);
            GridClient client;
            AvatarTracker avatars;
            Events events;
            StreamReader reader = new StreamReader(request.PostData);
            string qstring = reader.ReadToEnd();
            reader.Dispose();
            Dictionary<string,string> POST = deviMobile.PostDecode(qstring);
            // Pull out the session.
            if (!POST.ContainsKey("sid"))
            {
                textwriter.WriteLine("Need an SID.");
                textwriter.Flush();
                return;
            }
            Guid guid = new Guid(POST["sid"]);
            User user = new User();
            lock (this.users)
            {
                if (!this.users.ContainsKey(guid))
                {
                    textwriter.WriteLine("Error: invalid SID");
                    textwriter.Flush();
                    return;
                }
                user = this.users[guid];
                client = user.Client;
                avatars = user.Avatars;
                events = user.Events;
                user.LastRequest = DateTime.Now;
            }
            // Get the message type.
            string messagetype = POST["MT"];

            // Check that the message is signed if it should be.
            if (Array.IndexOf(REQUIRED_SIGNATURES, messagetype) > -1)
            {
                if (!VerifySignature(user, qstring))
                {
                    textwriter.WriteLine("ERROR: Received hash and expected hash do not match.");
                    textwriter.Flush();
                    return;
                }
            }

            // Right. This file is fun. It takes information in POST paramaters and sends them to
            // the server in the appropriate format. Some will return data immediately, some will return
            // keys to data that will arrive in the message queue, some return nothing but you get
            // something in the message queue later, and some return nother ever.
            //
            // The joys of dealing with multiple bizarre message types.

            switch (messagetype)
            {
                case "chat":
                    client.Self.Chat(POST["msg"], int.Parse(POST["chan"]), (ChatType)((byte)int.Parse(POST["type"])));
                    break;
                case "im":
                    if (POST.ContainsKey("id")) {
                        client.Self.InstantMessage(new UUID(POST["to"]), POST["msg"], new UUID(POST["id"]));
                    } else {
                        client.Self.InstantMessage(new UUID(POST["to"]), POST["msg"]);
                    }
                    break;
                case "avatarlist":
                    {
                        List<Hashtable> list = new List<Hashtable>();
                        foreach (KeyValuePair<uint, Avatar> pair in avatars.Avatars)
                        {
                            Avatar avatar = pair.Value;
                            Hashtable hash = new Hashtable();
                            hash.Add("name", avatar.Name);
                            hash.Add("id", avatar.ID);
                            //hash.Add("LocalID", avatar.LocalID);
                            //hash.Add("Position", avatar.Position);
                            //hash.Add("Rotation", avatar.Rotation);
                            //hash.Add("Scale", avatar.Scale);
                            //hash.Add("GroupName", avatar.GroupName);
                            list.Add(hash);
                        }
                        textwriter.Write(MakeJson.FromObject(list));
                    }
                    break;
                case "friends_count":
                    {
                        Hashtable Total = new Hashtable();
                        Total.Add("t", client.Friends.FriendList.Count);
                        textwriter.Write(MakeJson.FromHashtable(Total));
                    }
                    break;
                case "friends":
                    {
                        InternalDictionary<UUID, FriendInfo> friends = client.Friends.FriendList;
                        List<Hashtable> friendlist = new List<Hashtable>();

                        int added = 0; int total = 0;
                        decimal start = Convert.ToDecimal(POST["s"]); // Contiene el inicio de la lista
                        friends.ForEach(delegate(FriendInfo friend)
                        {
                            if (added < 5 && total >= start) // si está en línea
                            {
                                Hashtable friendhash = new Hashtable();
                                friendhash.Add("id", friend.UUID.ToString());
                                friendhash.Add("name", friend.Name.ToString());
                                friendhash.Add("on", friend.IsOnline);
                                friendlist.Add(friendhash);
                                added++;
                            } total++;
                        });

                        textwriter.Write(MakeJson.FromObject(friendlist));
                    }
                    break;
                case "getname":
                    client.Avatars.RequestAvatarName(new UUID(POST["id"]));
                    break;
                case "Teleport":
                    {
                        Hashtable hash = new Hashtable();
                        bool status;
                        if (POST.ContainsKey("Landmark"))
                        {
                            status = client.Self.Teleport(new UUID(POST["Landmark"]));
                        }
                        else
                        {
                            status = client.Self.Teleport(POST["Sim"], new Vector3(float.Parse(POST["X"]), float.Parse(POST["Y"]), float.Parse(POST["Z"])));
                        }
                        if (status)
                        {
                            hash.Add("Success", true);
                            hash.Add("Sim", client.Network.CurrentSim.Name);
                            hash.Add("Position", client.Self.SimPosition);
                        }
                        else
                        {
                            hash.Add("Success", false);
                            hash.Add("Reason", client.Self.TeleportMessage);
                        }
                        textwriter.WriteLine(MakeJson.FromHashtable(hash));
                    }
                    break;
                case "GoHome":
                    client.Self.GoHome();
                    break;
                case "GetPosition":
                    {
                        Hashtable hash = new Hashtable();
                        hash.Add("Sim", client.Network.CurrentSim.Name);
                        hash.Add("Position", client.Self.SimPosition);
                        textwriter.WriteLine(JavaScriptConvert.SerializeObject(hash));
                    }
                    break;
                case "RequestBalance":
                    client.Self.RequestBalance();
                    break;
                case "GetStats":
                    {
                        Hashtable hash = new Hashtable();
                        hash.Add("FPS", client.Network.CurrentSim.Stats.FPS);
                        hash.Add("TimeDilation", client.Network.CurrentSim.Stats.Dilation);
                        hash.Add("Objects", client.Network.CurrentSim.Stats.Objects);
                        hash.Add("ActiveScripts", client.Network.CurrentSim.Stats.ActiveScripts);
                        hash.Add("Agents", client.Network.CurrentSim.Stats.Agents);
                        hash.Add("ChildAgents", client.Network.CurrentSim.Stats.ChildAgents);
                        hash.Add("deviMobileSessions", users.Count);
                        hash.Add("PingSim", client.Network.CurrentSim.Stats.LastLag);
                        hash.Add("IncomingBPS", client.Network.CurrentSim.Stats.IncomingBPS);
                        hash.Add("OutgoingBPS", client.Network.CurrentSim.Stats.OutgoingBPS);
                        hash.Add("DroppedPackets", client.Network.CurrentSim.Stats.ReceivedResends + client.Network.CurrentSim.Stats.ResentPackets);
                        textwriter.WriteLine(MakeJson.FromHashtable(hash));
                    }
                    break;
                case "TeleportLureRespond":
                    client.Self.TeleportLureRespond(new UUID(POST["RequesterID"]), bool.Parse(POST["Accept"]));
                    break;
                case "GodlikeTeleportLureRespond":
                    {
                        UUID lurer = new UUID(POST["RequesterID"]);
                        UUID session = new UUID(POST["SessionID"]);
                        client.Self.InstantMessage(client.Self.Name, lurer, "", UUID.Random(), InstantMessageDialog.AcceptTeleport, InstantMessageOnline.Offline, client.Self.SimPosition, UUID.Zero, new byte[0]);
                        TeleportLureRequestPacket lure = new TeleportLureRequestPacket();
                        lure.Info.AgentID = client.Self.AgentID;
                        lure.Info.SessionID = client.Self.SessionID;
                        lure.Info.LureID = session;
                        lure.Info.TeleportFlags = (uint)TeleportFlags.ViaGodlikeLure;
                        client.Network.SendPacket(lure);
                    }
                    break;
                case "FindPeople":
                    {
                        Hashtable hash = new Hashtable();
                        hash.Add("QueryID", client.Directory.StartPeopleSearch(POST["Search"], int.Parse(POST["Start"])));
                        textwriter.WriteLine(MakeJson.FromHashtable(hash));
                    }
                    break;
                case "FindGroups":
                    {
                        Hashtable hash = new Hashtable();
                        hash.Add("QueryID", client.Directory.StartGroupSearch(POST["Search"], int.Parse(POST["Start"])));
                        textwriter.WriteLine(MakeJson.FromHashtable(hash));
                    }
                    break;
                case "GetAgentData":
                    client.Avatars.RequestAvatarProperties(new UUID(POST["AgentID"]));
                    break;
                case "StartAnimation":
                    client.Self.AnimationStart(new UUID(POST["Animation"]), false);
                    break;
                case "StopAnimation":
                    client.Self.AnimationStop(new UUID(POST["Animation"]), true);
                    break;
                case "SendAppearance":
                    client.Appearance.RequestSetAppearance();
                    break;
                case "GetMapItems":
                    {
                        MapItemRequestPacket req = new MapItemRequestPacket();
                        req.AgentData.AgentID = client.Self.AgentID;
                        req.AgentData.SessionID = client.Self.SessionID;
                        GridRegion region;
                        client.Grid.GetGridRegion(POST["Region"], GridLayerType.Objects, out region);
                        req.RequestData.RegionHandle = region.RegionHandle;
                        req.RequestData.ItemType = uint.Parse(POST["ItemType"]);
                        client.Network.SendPacket((Packet)req);
                    }
                    break;
                case "GetMapBlocks":
                    {
                        MapBlockRequestPacket req = new MapBlockRequestPacket();
                        req.AgentData.AgentID = client.Self.AgentID;
                        req.AgentData.SessionID = client.Self.SessionID;
                        req.PositionData.MinX = ushort.Parse(POST["MinX"]);
                        req.PositionData.MinY = ushort.Parse(POST["MinY"]);
                        req.PositionData.MaxX = ushort.Parse(POST["MaxX"]);
                        req.PositionData.MaxY = ushort.Parse(POST["MaxY"]);
                        client.Network.SendPacket((Packet)req);
                    }
                    break;
                case "FindRegion":
                    {
                        OpenMetaverse.Packets.MapNameRequestPacket packet = new OpenMetaverse.Packets.MapNameRequestPacket();
                        packet.NameData = new MapNameRequestPacket.NameDataBlock();
                        packet.NameData.Name = Utils.StringToBytes(POST["Name"]);
                        packet.AgentData.AgentID = client.Self.AgentID;
                        packet.AgentData.SessionID = client.Self.SessionID;
                        client.Network.SendPacket((Packet)packet);
                    }
                    break;
                case "GetOfflineMessages":
                    {
                        RetrieveInstantMessagesPacket req = new RetrieveInstantMessagesPacket();
                        req.AgentData.AgentID = client.Self.AgentID;
                        req.AgentData.SessionID = client.Self.SessionID;
                        client.Network.SendPacket((Packet)req);
                    }
                    break;
                case "ChangeRights":
                    {
                        UUID uuid = new UUID(POST["Friend"]);
                        client.Friends.GrantRights(uuid, (FriendRights)int.Parse(POST["Rights"]));
                    }
                    break;
                case "RequestLocation":
                    client.Friends.MapFriend(new UUID(POST["Friend"]));
                    break;
                case "RequestTexture":
                    {
                        // This one's confusing, so it gets some comments.
                        // First, we get the image's UUID.
                        UUID image = new UUID(POST["ID"]);
                        // We prepare a query to ask if S3 has it. HEAD only to avoid wasting
                        // GET requests and bandwidth.
                        bool exists = false;
                        // If we already know we have it, note this.
                        if (deviMobile.CachedTextures.Contains(image))
                        {
                            exists = true;
                        }
                        else
                        {
                            // If we're using S3, check the S3 bucket
                            if (deviMobile.USE_S3)
                            {
                                // Otherwise, make that HEAD request and find out.
                                HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(deviMobile.TEXTURE_ROOT + image + ".png");
                                webrequest.Method = "HEAD";
                                webrequest.KeepAlive = false;
                                webrequest.ReadWriteTimeout = 1000;
                                webrequest.Timeout = 2500;
                                HttpWebResponse response = null;
                                try
                                {
                                    response = (HttpWebResponse)webrequest.GetResponse();
                                    if(response.StatusCode == HttpStatusCode.OK)
                                    {
                                        exists = true;
                                    }
                                }
                                catch(WebException e)
                                {
                                    deviMobile.Debug("SendMessage", "WebException (" + e.Status.ToString() + "): " + e.Message);
                                }
                                finally
                                {
                                    request.Dispose();
                                    if(response != null)
                                    {
                                        response.Close();
                                    }
                                }
                            }
                            // If we aren't using S3, just check the texture cache.
                            else
                            {
                                exists = File.Exists(deviMobile.TEXTURE_CACHE + image.ToString() + ".png");
                            }
                        }
                        // If it exists, reply with Ready = true and the URL to find it at.
                        if (exists)
                        {
                            textwriter.Write("{Ready: true, URL: \"" + deviMobile.TEXTURE_ROOT + image + ".png\"}");
                        }
                        // If it doesn't, request the image from SL and note its lack of readiness.
                        // Notification will arrive later in the message queue.
                        else
                        {
                            client.Assets.RequestImage(image, new TextureDownloadCallback(events.Assets_TextureDownloadCallback));
                            textwriter.Write("{Ready: false}");
                        }
                    }
                    break;
                case "AcceptFriendship":
                    client.Friends.AcceptFriendship(client.Self.AgentID, new UUID(POST["IMSessionID"]));
                    break;
                case "DeclineFriendship":
                    client.Friends.DeclineFriendship(client.Self.AgentID, new UUID(POST["IMSessionID"]));
                    break;
                case "OfferFriendship":
                    client.Friends.OfferFriendship(new UUID(POST["Target"]));
                    break;
                case "TerminateFriendship":
                    client.Friends.TerminateFriendship(new UUID(POST["Target"]));
                    break;
                case "SendAgentMoney":
                    client.Self.GiveAvatarMoney(new UUID(POST["Target"]), int.Parse(POST["Amount"]));
                    break;
                case "LoadInventoryFolder":
                    client.Inventory.RequestFolderContents(new UUID(POST["UUID"]), client.Self.AgentID, true, true, InventorySortOrder.ByDate | InventorySortOrder.SystemFoldersToTop);
                    break;
                case "RequestAsset":
                    {
                        try
                        {
                            UUID inventoryID = new UUID(POST["InventoryID"]);
                            client.Assets.RequestInventoryAsset(new UUID(POST["AssetID"]), inventoryID,
                                UUID.Zero, new UUID(POST["OwnerID"]), (AssetType)int.Parse(POST["AssetType"]), false,
                                delegate(AssetDownload transfer, OpenMetaverse.Assets.Asset asset) {
                                    events.Assets_OnAssetReceived(transfer, asset, inventoryID);
                                }
                            );
                        }
                        catch // Try catching the error that sometimes gets thrown... but sometimes doesn't.
                        {

                        }
                    }
                    break;
                case "SendTeleportLure":
                    client.Self.SendTeleportLure(new UUID(POST["Target"]), POST["Message"]);
                    break;
                case "ScriptPermissionResponse":
                    client.Self.ScriptQuestionReply(client.Network.CurrentSim, new UUID(POST["ItemID"]), new UUID(POST["TaskID"]), (ScriptPermission)int.Parse(POST["Permissions"]));
                    break;
                case "ScriptDialogReply":
                    {
                        ScriptDialogReplyPacket packet = new ScriptDialogReplyPacket();
                        packet.AgentData.AgentID = client.Self.AgentID;
                        packet.AgentData.SessionID = client.Self.SessionID;
                        packet.Data.ButtonIndex = int.Parse(POST["ButtonIndex"]);
                        packet.Data.ButtonLabel = Utils.StringToBytes(POST["ButtonLabel"]);
                        packet.Data.ChatChannel = int.Parse(POST["ChatChannel"]);
                        packet.Data.ObjectID = new UUID(POST["ObjectID"]);
                        client.Network.SendPacket((Packet)packet);
                    }
                    break;
                case "SaveNotecard":
                    client.Inventory.RequestUploadNotecardAsset(Utils.StringToBytes(POST["AssetData"]), new UUID(POST["ItemID"]), new InventoryManager.InventoryUploadedAssetCallback(events.Inventory_OnNoteUploaded));
                    break;
                case "CreateInventory":
                    client.Inventory.RequestCreateItem(new UUID(POST["Folder"]), POST["Name"], POST["Description"], (AssetType)int.Parse(POST["AssetType"]), UUID.Random(), (InventoryType)int.Parse(POST["InventoryType"]), PermissionMask.All, new InventoryManager.ItemCreatedCallback(events.Inventory_OnItemCreated));
                    break;
                case "CreateFolder":
                    {
                        UUID folder = client.Inventory.CreateFolder(new UUID(POST["Parent"]), POST["Name"]);
                        textwriter.Write("{FolderID: \"" + folder + "\"}");
                    }
                    break;
                case "EmptyTrash":
                    client.Inventory.EmptyTrash();
                    break;
                case "MoveItem":
                    client.Inventory.MoveItem(new UUID(POST["Item"]), new UUID(POST["TargetFolder"]), POST["NewName"]);
                    break;
                case "MoveFolder":
                    client.Inventory.MoveFolder(new UUID(POST["Folder"]), new UUID(POST["NewParent"]));
                    break;
                case "MoveItems":
                case "MoveFolders":
                    {
                        Dictionary<UUID, UUID> dict = new Dictionary<UUID, UUID>();
                        string[] moves = POST["ToMove"].Split(',');
                        for (int i = 0; i < moves.Length; ++i)
                        {
                            string[] move = moves[i].Split(' ');
                            dict.Add(new UUID(move[0]), new UUID(move[1]));
                        }
                        if (messagetype == "MoveItems")
                        {
                            client.Inventory.MoveItems(dict);
                        }
                        else if (messagetype == "MoveFolders")
                        {
                            client.Inventory.MoveFolders(dict);
                        }
                    }
                    break;
                case "DeleteItem":
                    client.Inventory.RemoveItem(new UUID(POST["Item"]));
                    break;
                case "DeleteFolder":
                    client.Inventory.RemoveFolder(new UUID(POST["Folder"]));
                    break;
                case "DeleteMultiple":
                    {
                        string[] items = POST["Items"].Split(',');
                        List<UUID> itemlist = new List<UUID>();
                        for (int i = 0; i < items.Length; ++i)
                        {
                            itemlist.Add(new UUID(items[i]));
                        }
                        string[] folders = POST["Folders"].Split(',');
                        List<UUID> folderlist = new List<UUID>();
                        for (int i = 0; i < items.Length; ++i)
                        {
                            folderlist.Add(new UUID(folders[i]));
                        }
                        client.Inventory.Remove(itemlist, folderlist);
                    }
                    break;
                case "GiveInventory":
                    {
                        client.Inventory.GiveItem(new UUID(POST["ItemID"]), POST["ItemName"], (AssetType)int.Parse(POST["AssetType"]), new UUID(POST["Recipient"]), true);
                    }
                    break;
                case "UpdateItem":
                    {
                        InventoryItem item = client.Inventory.FetchItem(new UUID(POST["ItemID"]), new UUID(POST["OwnerID"]), 1000);
                        if (POST.ContainsKey("Name")) item.Name = POST["Name"];
                        if (POST.ContainsKey("Description")) item.Description = POST["Description"];
                        if (POST.ContainsKey("NextOwnerMask")) item.Permissions.NextOwnerMask = (PermissionMask)uint.Parse(POST["NextOwnerMask"]);
                        if (POST.ContainsKey("SalePrice")) item.SalePrice = int.Parse(POST["SalePrice"]);
                        if (POST.ContainsKey("SaleType")) item.SaleType = (SaleType)int.Parse(POST["SaleType"]); // This should be byte.Parse, but this upsets mono's compiler (CS1002)
                        client.Inventory.RequestUpdateItem(item);
                    }
                    break;
                case "UpdateFolder":
                    {
                        UpdateInventoryFolderPacket packet = new UpdateInventoryFolderPacket();
                        packet.AgentData.AgentID = client.Self.AgentID;
                        packet.AgentData.SessionID = client.Self.SessionID;
                        packet.FolderData = new UpdateInventoryFolderPacket.FolderDataBlock[1];
                        packet.FolderData[0] = new UpdateInventoryFolderPacket.FolderDataBlock();
                        packet.FolderData[0].FolderID = new UUID(POST["FolderID"]);
                        packet.FolderData[0].ParentID = new UUID(POST["ParentID"]);
                        packet.FolderData[0].Type = sbyte.Parse(POST["Type"]);
                        packet.FolderData[0].Name = Utils.StringToBytes(POST["Name"]);
                        client.Network.SendPacket((Packet)packet);
                    }
                    break;
                case "FetchItem":
                    client.Inventory.FetchItem(new UUID(POST["Item"]), new UUID(POST["Owner"]), 5000);
                    break;
                case "ReRotate":
                    user.Rotation = -Math.PI;
                    break;
                case "StartGroupIM":
                    deviMobile.Debug("SendMessage", "RequestJoinGroupChat(" + POST["Group"] + ")");
                    client.Self.RequestJoinGroupChat(new UUID(POST["Group"]));
                    break;
                case "GroupInstantMessage":
                    client.Self.InstantMessageGroup(new UUID(POST["Group"]), POST["Message"]);
                    break;
                case "RequestGroupProfile":
                    client.Groups.RequestGroupProfile(new UUID(POST["Group"]));
                    break;
                case "RequestGroupMembers":
                    client.Groups.RequestGroupMembers(new UUID(POST["Group"]));
                    break;
                case "RequestGroupName":
                    client.Groups.RequestGroupName(new UUID(POST["ID"]));
                    break;
                case "JoinGroup":
                    client.Groups.RequestJoinGroup(new UUID(POST["Group"]));
                    break;
                case "LeaveGroup":
                    client.Groups.LeaveGroup(new UUID(POST["Group"]));
                    break;
                case "RequestCurrentGroups":
                    client.Groups.RequestCurrentGroups();
                    break;
                case "GetParcelID":
                    textwriter.Write("{LocalID: "+client.Parcels.GetParcelLocalID(client.Network.CurrentSim, new Vector3(float.Parse(POST["X"]), float.Parse(POST["Y"]), float.Parse(POST["Z"])))+"}");
                    break;
                case "RequestParcelProperties":
                    client.Parcels.RequestParcelProperties(client.Network.CurrentSim, int.Parse(POST["LocalID"]), int.Parse(POST["SequenceID"]));
                    break;
            }
            textwriter.Flush();
        }
Exemple #9
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);
    }
Exemple #10
0
        public void OnFileRequested(HttpRequest request, IDirectory directory)
        {
            //request.Response.SetHeader("Content-Type", "text/plain; charset=utf-8");
            request.Response.ResponseContent = new MemoryStream();
            StreamWriter  textwriter = new StreamWriter(request.Response.ResponseContent);
            SecondLife    client;
            AvatarTracker avatars;
            Events        events;
            StreamReader  reader  = new StreamReader(request.PostData);
            string        qstring = reader.ReadToEnd();

            reader.Dispose();
            Dictionary <string, string> POST = AjaxLife.PostDecode(qstring);

            // Pull out the session.
            if (!POST.ContainsKey("sid"))
            {
                textwriter.WriteLine("Need an SID.");
                textwriter.Flush();
                return;
            }
            Guid guid = new Guid(POST["sid"]);
            User user = new User();

            lock (this.users)
            {
                if (!this.users.ContainsKey(guid))
                {
                    textwriter.WriteLine("Error: invalid SID");
                    textwriter.Flush();
                    return;
                }
                user             = this.users[guid];
                client           = user.Client;
                avatars          = user.Avatars;
                events           = user.Events;
                user.LastRequest = DateTime.Now;
            }
            // Get the message type.
            string messagetype = POST["MessageType"];

            // Check that the message is signed if it should be.
            if (Array.IndexOf(REQUIRED_SIGNATURES, messagetype) > -1)
            {
                if (!VerifySignature(user, qstring))
                {
                    textwriter.WriteLine("Error: Received hash and expected hash do not match.");
                    textwriter.Flush();
                    return;
                }
            }

            // Right. This file is fun. It takes information in POST paramaters and sends them to
            // the server in the appropriate format. Some will return data immediately, some will return
            // keys to data that will arrive in the message queue, some return nothing but you get
            // something in the message queue later, and some return nother ever.
            //
            // The joys of dealing with multiple bizarre message types.

            switch (messagetype)
            {
            case "SpatialChat":
                client.Self.Chat(POST["Message"], int.Parse(POST["Channel"]), (ChatType)((byte)int.Parse(POST["Type"])));
                break;

            case "SimpleInstantMessage":
                if (POST.ContainsKey("IMSessionID"))
                {
                    client.Self.InstantMessage(new LLUUID(POST["Target"]), POST["Message"], new LLUUID(POST["IMSessionID"]));
                }
                else
                {
                    client.Self.InstantMessage(new LLUUID(POST["Target"]), POST["Message"]);
                }
                break;

            case "GenericInstantMessage":
                client.Self.InstantMessage(
                    client.Self.FirstName + " " + client.Self.LastName,
                    new LLUUID(POST["Target"]),
                    POST["Message"],
                    new LLUUID(POST["IMSessionID"]),
                    (InstantMessageDialog)((byte)int.Parse(POST["Dialog"])),
                    (InstantMessageOnline)int.Parse(POST["Online"]),
                    client.Self.SimPosition,
                    client.Network.CurrentSim.ID,
                    new byte[0]);
                break;

            case "NameLookup":
                client.Avatars.RequestAvatarName(new LLUUID(POST["ID"]));
                break;

            case "Teleport":
            {
                Hashtable hash = new Hashtable();
                bool      status;
                if (POST.ContainsKey("Landmark"))
                {
                    status = client.Self.Teleport(new LLUUID(POST["Landmark"]));
                }
                else
                {
                    status = client.Self.Teleport(POST["Sim"], new LLVector3(float.Parse(POST["X"]), float.Parse(POST["Y"]), float.Parse(POST["Z"])));
                }
                if (status)
                {
                    hash.Add("Success", true);
                    hash.Add("Sim", client.Network.CurrentSim.Name);
                    hash.Add("Position", client.Self.SimPosition);
                }
                else
                {
                    hash.Add("Success", false);
                    hash.Add("Reason", client.Self.TeleportMessage);
                }
                textwriter.WriteLine(MakeJson.FromHashtable(hash));
            }
            break;

            case "GoHome":
                client.Self.GoHome();
                break;

            case "GetPosition":
            {
                Hashtable hash = new Hashtable();
                hash.Add("Sim", client.Network.CurrentSim.Name);
                hash.Add("Position", client.Self.SimPosition);
                textwriter.WriteLine(JavaScriptConvert.SerializeObject(hash));
            }
            break;

            case "RequestBalance":
                client.Self.RequestBalance();
                break;

            case "GetStats":
            {
                Hashtable hash = new Hashtable();
                hash.Add("FPS", client.Network.CurrentSim.Stats.FPS);
                hash.Add("TimeDilation", client.Network.CurrentSim.Stats.Dilation);
                hash.Add("LSLIPS", client.Network.CurrentSim.Stats.LSLIPS);
                hash.Add("Objects", client.Network.CurrentSim.Stats.Objects);
                hash.Add("ActiveScripts", client.Network.CurrentSim.Stats.ActiveScripts);
                hash.Add("Agents", client.Network.CurrentSim.Stats.Agents);
                hash.Add("ChildAgents", client.Network.CurrentSim.Stats.ChildAgents);
                hash.Add("AjaxLifeSessions", users.Count);
                hash.Add("TextureCacheCount", AjaxLife.TextureCacheCount);
                hash.Add("TextureCacheSize", AjaxLife.TextureCacheSize);
                textwriter.WriteLine(MakeJson.FromHashtable(hash));
            }
            break;

            case "TeleportLureRespond":
                client.Self.TeleportLureRespond(new LLUUID(POST["RequesterID"]), bool.Parse(POST["Accept"]));
                break;

            case "GodlikeTeleportLureRespond":
            {
                LLUUID lurer   = new LLUUID(POST["RequesterID"]);
                LLUUID session = new LLUUID(POST["SessionID"]);
                client.Self.InstantMessage(client.Self.Name, lurer, "", LLUUID.Random(), InstantMessageDialog.AcceptTeleport, InstantMessageOnline.Offline, client.Self.SimPosition, LLUUID.Zero, new byte[0]);
                TeleportLureRequestPacket lure = new TeleportLureRequestPacket();
                lure.Info.AgentID       = client.Self.AgentID;
                lure.Info.SessionID     = client.Self.SessionID;
                lure.Info.LureID        = session;
                lure.Info.TeleportFlags = (uint)AgentManager.TeleportFlags.ViaGodlikeLure;
                client.Network.SendPacket(lure);
            }
            break;

            case "FindPeople":
            {
                Hashtable hash = new Hashtable();
                hash.Add("QueryID", client.Directory.StartPeopleSearch(DirectoryManager.DirFindFlags.People, POST["Search"], int.Parse(POST["Start"])));
                textwriter.WriteLine(MakeJson.FromHashtable(hash));
            }
            break;

            case "FindGroups":
            {
                Hashtable hash = new Hashtable();
                hash.Add("QueryID", client.Directory.StartGroupSearch(DirectoryManager.DirFindFlags.Groups, POST["Search"], int.Parse(POST["Start"])));
                textwriter.WriteLine(MakeJson.FromHashtable(hash));
            }
            break;

            case "GetAgentData":
                client.Avatars.RequestAvatarProperties(new LLUUID(POST["AgentID"]));
                break;

            case "StartAnimation":
                client.Self.AnimationStart(new LLUUID(POST["Animation"]), false);
                break;

            case "StopAnimation":
                client.Self.AnimationStop(new LLUUID(POST["Animation"]), true);
                break;

            case "SendAppearance":
                client.Appearance.SetPreviousAppearance(false);
                break;

            case "GetMapItems":
            {
                MapItemRequestPacket req = new MapItemRequestPacket();
                req.AgentData.AgentID   = client.Self.AgentID;
                req.AgentData.SessionID = client.Self.SessionID;
                GridRegion region;
                client.Grid.GetGridRegion(POST["Region"], GridLayerType.Objects, out region);
                req.RequestData.RegionHandle = region.RegionHandle;
                req.RequestData.ItemType     = uint.Parse(POST["ItemType"]);
                client.Network.SendPacket((Packet)req);
            }
            break;

            case "GetMapBlocks":
            {
                MapBlockRequestPacket req = new MapBlockRequestPacket();
                req.AgentData.AgentID   = client.Self.AgentID;
                req.AgentData.SessionID = client.Self.SessionID;
                req.PositionData.MinX   = 0;
                req.PositionData.MinY   = 0;
                req.PositionData.MaxX   = ushort.MaxValue;
                req.PositionData.MaxY   = ushort.MaxValue;
                client.Network.SendPacket((Packet)req);
            }
            break;

            case "GetMapBlock":
            {
                ushort x = ushort.Parse(POST["X"]);
                ushort y = ushort.Parse(POST["Y"]);
                MapBlockRequestPacket req = new MapBlockRequestPacket();
                req.AgentData.AgentID   = client.Self.AgentID;
                req.AgentData.SessionID = client.Self.SessionID;
                req.PositionData.MinX   = x;
                req.PositionData.MinY   = y;
                req.PositionData.MaxX   = x;
                req.PositionData.MaxY   = y;
                client.Network.SendPacket((Packet)req);
            }
            break;

            case "GetOfflineMessages":
            {
                RetrieveInstantMessagesPacket req = new RetrieveInstantMessagesPacket();
                req.AgentData.AgentID   = client.Self.AgentID;
                req.AgentData.SessionID = client.Self.SessionID;
                client.Network.SendPacket((Packet)req);
            }
            break;

            case "GetFriendList":
            {
                InternalDictionary <LLUUID, FriendInfo> friends = client.Friends.FriendList;
                List <Hashtable> friendlist = new List <Hashtable>();
                friends.ForEach(delegate(FriendInfo friend)
                    {
                        Hashtable friendhash = new Hashtable();
                        friendhash.Add("ID", friend.UUID.ToString());
                        friendhash.Add("Name", friend.Name);
                        friendhash.Add("Online", friend.IsOnline);
                        friendhash.Add("MyRights", friend.MyFriendRights);
                        friendhash.Add("TheirRights", friend.TheirFriendRights);
                        friendlist.Add(friendhash);
                    });
                textwriter.Write(MakeJson.FromObject(friendlist));
            }
            break;

            case "ChangeRights":
            {
                LLUUID uuid = new LLUUID(POST["Friend"]);
                client.Friends.GrantRights(uuid, (FriendRights)int.Parse(POST["Rights"]));
            }
            break;

            case "RequestLocation":
                client.Friends.MapFriend(new LLUUID(POST["Friend"]));
                break;

            case "RequestTexture":
            {
                // This one's confusing, so it gets some comments.
                // First, we get the image's UUID.
                LLUUID image = new LLUUID(POST["ID"]);
                // We prepare a query to ask if S3 has it. HEAD only to avoid wasting
                // GET requests and bandwidth.
                bool exists = false;
                // If we already know we have it, note this.
                if (AjaxLife.CachedTextures.Contains(image))
                {
                    exists = true;
                }
                else
                {
                    // If we're using S3, check the S3 bucket
                    if (AjaxLife.USE_S3)
                    {
                        // Otherwise, make that HEAD request and find out.
                        try
                        {
                            IThreeSharp query = new ThreeSharpQuery(AjaxLife.S3Config);
                            Affirma.ThreeSharp.Model.ObjectGetRequest s3request = new Affirma.ThreeSharp.Model.ObjectGetRequest(AjaxLife.TEXTURE_BUCKET, image.ToString() + ".png");
                            s3request.Method = "HEAD";
                            Affirma.ThreeSharp.Model.ObjectGetResponse s3response = query.ObjectGet(s3request);
                            if (s3response.StatusCode == System.Net.HttpStatusCode.OK)
                            {
                                exists = true;
                            }
                            s3response.DataStream.Close();
                        }
                        catch { }
                    }
                    // If we aren't using S3, just check the texture cache.
                    else
                    {
                        exists = File.Exists(AjaxLife.TEXTURE_CACHE + image.ToString() + ".png");
                    }
                }
                // If it exists, reply with Ready = true and the URL to find it at.
                if (exists)
                {
                    textwriter.Write("{Ready: true, URL: \"" + AjaxLife.TEXTURE_ROOT + image + ".png\"}");
                }
                // If it doesn't, request the image from SL and note its lack of readiness.
                // Notification will arrive later in the message queue.
                else
                {
                    client.Assets.RequestImage(image, ImageType.Normal, 125000.0f, 0);
                    textwriter.Write("{Ready: false}");
                }
            }
            break;

            case "AcceptFriendship":
                client.Friends.AcceptFriendship(client.Self.AgentID, POST["IMSessionID"]);
                break;

            case "DeclineFriendship":
                client.Friends.DeclineFriendship(client.Self.AgentID, POST["IMSessionID"]);
                break;

            case "OfferFriendship":
                client.Friends.OfferFriendship(new LLUUID(POST["Target"]));
                break;

            case "TerminateFriendship":
                client.Friends.TerminateFriendship(new LLUUID(POST["Target"]));
                break;

            case "SendAgentMoney":
                client.Self.GiveAvatarMoney(new LLUUID(POST["Target"]), int.Parse(POST["Amount"]));
                break;

            case "RequestAvatarList":
            {
                List <Hashtable> list = new List <Hashtable>();
                foreach (KeyValuePair <uint, Avatar> pair in avatars.Avatars)
                {
                    Avatar    avatar = pair.Value;
                    Hashtable hash   = new Hashtable();
                    hash.Add("Name", avatar.Name);
                    hash.Add("ID", avatar.ID);
                    hash.Add("LocalID", avatar.LocalID);
                    hash.Add("Position", avatar.Position);
                    //hash.Add("Rotation", avatar.Rotation);
                    hash.Add("Scale", avatar.Scale);
                    hash.Add("GroupName", avatar.GroupName);
                    list.Add(hash);
                }
                textwriter.Write(MakeJson.FromObject(list));
            }
            break;

            case "LoadInventoryFolder":
                client.Inventory.RequestFolderContents(new LLUUID(POST["UUID"]), client.Self.AgentID, true, true, InventorySortOrder.ByDate | InventorySortOrder.SystemFoldersToTop);
                break;

            case "RequestAsset":
            {
                try
                {
                    LLUUID transferid = client.Assets.RequestInventoryAsset(new LLUUID(POST["AssetID"]), new LLUUID(POST["InventoryID"]),
                                                                            LLUUID.Zero, new LLUUID(POST["OwnerID"]), (AssetType)int.Parse(POST["AssetType"]), false);
                    textwriter.Write("{TransferID: \"" + transferid + "\"}");
                }
                catch         // Try catching the error that sometimes gets thrown... but sometimes doesn't.
                {
                }
            }
            break;

            case "SendTeleportLure":
                client.Self.SendTeleportLure(new LLUUID(POST["Target"]), POST["Message"]);
                break;

            case "ScriptPermissionResponse":
                client.Self.ScriptQuestionReply(client.Network.CurrentSim, new LLUUID(POST["ItemID"]), new LLUUID(POST["TaskID"]), (ScriptPermission)int.Parse(POST["Permissions"]));
                break;

            case "ScriptDialogReply":
            {
                ScriptDialogReplyPacket packet = new ScriptDialogReplyPacket();
                packet.AgentData.AgentID   = client.Self.AgentID;
                packet.AgentData.SessionID = client.Self.SessionID;
                packet.Data.ButtonIndex    = int.Parse(POST["ButtonIndex"]);
                packet.Data.ButtonLabel    = Helpers.StringToField(POST["ButtonLabel"]);
                packet.Data.ChatChannel    = int.Parse(POST["ChatChannel"]);
                packet.Data.ObjectID       = new LLUUID(POST["ObjectID"]);
                client.Network.SendPacket((Packet)packet);
            }
            break;

            case "SaveNotecard":
                client.Inventory.RequestUploadNotecardAsset(Helpers.StringToField(POST["AssetData"]), new LLUUID(POST["ItemID"]), new InventoryManager.NotecardUploadedAssetCallback(events.Inventory_OnNoteUploaded));
                break;

            case "CreateInventory":
                client.Inventory.RequestCreateItem(new LLUUID(POST["Folder"]), POST["Name"], POST["Description"], (AssetType)int.Parse(POST["AssetType"]), LLUUID.Random(), (InventoryType)int.Parse(POST["InventoryType"]), PermissionMask.All, new InventoryManager.ItemCreatedCallback(events.Inventory_OnItemCreated));
                break;

            case "CreateFolder":
            {
                LLUUID folder = client.Inventory.CreateFolder(new LLUUID(POST["Parent"]), POST["Name"]);
                textwriter.Write("{FolderID: \"" + folder + "\"}");
            }
            break;

            case "EmptyTrash":
                client.Inventory.EmptyTrash();
                break;

            case "MoveItem":
                client.Inventory.MoveItem(new LLUUID(POST["Item"]), new LLUUID(POST["TargetFolder"]), POST["NewName"]);
                break;

            case "MoveFolder":
                client.Inventory.MoveFolder(new LLUUID(POST["Folder"]), new LLUUID(POST["NewParent"]));
                break;

            case "MoveItems":
            case "MoveFolders":
            {
                Dictionary <LLUUID, LLUUID> dict = new Dictionary <LLUUID, LLUUID>();
                string[] moves = POST["ToMove"].Split(',');
                for (int i = 0; i < moves.Length; ++i)
                {
                    string[] move = moves[i].Split(' ');
                    dict.Add(new LLUUID(move[0]), new LLUUID(move[1]));
                }
                if (messagetype == "MoveItems")
                {
                    client.Inventory.MoveItems(dict);
                }
                else if (messagetype == "MoveFolders")
                {
                    client.Inventory.MoveFolders(dict);
                }
            }
            break;

            case "DeleteItem":
                client.Inventory.RemoveItem(new LLUUID(POST["Item"]));
                break;

            case "DeleteFolder":
                client.Inventory.RemoveFolder(new LLUUID(POST["Folder"]));
                break;

            case "DeleteMultiple":
            {
                string[]      items    = POST["Items"].Split(',');
                List <LLUUID> itemlist = new List <LLUUID>();
                for (int i = 0; i < items.Length; ++i)
                {
                    itemlist.Add(new LLUUID(items[i]));
                }
                string[]      folders    = POST["Folders"].Split(',');
                List <LLUUID> folderlist = new List <LLUUID>();
                for (int i = 0; i < items.Length; ++i)
                {
                    folderlist.Add(new LLUUID(folders[i]));
                }
                client.Inventory.Remove(itemlist, folderlist);
            }
            break;

            case "GiveInventory":
            {
                client.Inventory.GiveItem(new LLUUID(POST["ItemID"]), POST["ItemName"], (AssetType)int.Parse(POST["AssetType"]), new LLUUID(POST["Recipient"]), true);
            }
            break;

            case "UpdateItem":
            {
                InventoryItem item = client.Inventory.FetchItem(new LLUUID(POST["ItemID"]), new LLUUID(POST["OwnerID"]), 1000);
                if (POST.ContainsKey("Name"))
                {
                    item.Name = POST["Name"];
                }
                if (POST.ContainsKey("Description"))
                {
                    item.Description = POST["Description"];
                }
                if (POST.ContainsKey("NextOwnerMask"))
                {
                    item.Permissions.NextOwnerMask = (PermissionMask)uint.Parse(POST["NextOwnerMask"]);
                }
                if (POST.ContainsKey("SalePrice"))
                {
                    item.SalePrice = int.Parse(POST["SalePrice"]);
                }
                if (POST.ContainsKey("SaleType"))
                {
                    item.SaleType = (SaleType)int.Parse(POST["SaleType"]);                                       // This should be byte.Parse, but this upsets mono's compiler (CS1002)
                }
                client.Inventory.RequestUpdateItem(item);
            }
            break;

            case "UpdateFolder":
            {
                UpdateInventoryFolderPacket packet = new UpdateInventoryFolderPacket();
                packet.AgentData.AgentID      = client.Self.AgentID;
                packet.AgentData.SessionID    = client.Self.SessionID;
                packet.FolderData             = new UpdateInventoryFolderPacket.FolderDataBlock[1];
                packet.FolderData[0]          = new UpdateInventoryFolderPacket.FolderDataBlock();
                packet.FolderData[0].FolderID = new LLUUID(POST["FolderID"]);
                packet.FolderData[0].ParentID = new LLUUID(POST["ParentID"]);
                packet.FolderData[0].Type     = sbyte.Parse(POST["Type"]);
                packet.FolderData[0].Name     = Helpers.StringToField(POST["Name"]);
                client.Network.SendPacket((Packet)packet);
            }
            break;

            case "FetchItem":
                client.Inventory.FetchItem(new LLUUID(POST["Item"]), new LLUUID(POST["Owner"]), 5000);
                break;

            case "ReRotate":
                user.Rotation = -Math.PI;
                break;

            case "StartGroupIM":
                AjaxLife.Debug("SendMessage", "RequestJoinGroupChat(" + POST["Group"] + ")");
                client.Self.RequestJoinGroupChat(new LLUUID(POST["Group"]));
                break;

            case "GroupInstantMessage":
                client.Self.InstantMessageGroup(new LLUUID(POST["Group"]), POST["Message"]);
                break;

            case "RequestGroupProfile":
                client.Groups.RequestGroupProfile(new LLUUID(POST["Group"]));
                break;

            case "RequestGroupMembers":
                client.Groups.RequestGroupMembers(new LLUUID(POST["Group"]));
                break;

            case "RequestGroupName":
                client.Groups.RequestGroupName(new LLUUID(POST["ID"]));
                break;

            case "JoinGroup":
                client.Groups.RequestJoinGroup(new LLUUID(POST["Group"]));
                break;

            case "LeaveGroup":
                client.Groups.LeaveGroup(new LLUUID(POST["Group"]));
                break;

            case "RequestCurrentGroups":
                client.Groups.RequestCurrentGroups();
                break;

            case "GetParcelID":
                textwriter.Write("{LocalID: " + client.Parcels.GetParcelLocalID(client.Network.CurrentSim, new LLVector3(float.Parse(POST["X"]), float.Parse(POST["Y"]), float.Parse(POST["Z"]))) + "}");
                break;

            case "RequestParcelProperties":
                client.Parcels.PropertiesRequest(client.Network.CurrentSim, int.Parse(POST["LocalID"]), int.Parse(POST["SequenceID"]));
                break;
            }
            textwriter.Flush();
        }
Exemple #11
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;
        }
Exemple #12
0
        private void RefreshDownloadsTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (frame.proxy.KnownCaps.Count > 2)
            {
                if (form.autoupdate())
                {
                    //buiding req
                    if (setData)
                    {
                        if (!regionNames.ContainsKey(shared.RegionHandle))
                        {
                            ulong handle = shared.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)
                            {
                                MapBlockReplyPacket reply = (MapBlockReplyPacket)np;
                                foreach (MapBlockReplyPacket.DataBlock block in reply.Data)
                                {
                                    if ((block.X == MapX) && (block.Y == MapY))
                                    {

                                        string regionName = Utils.BytesToString(block.Name);
                                        ushort regionglobalx = MapX;
                                        ushort regionglobaly = MapY;
                                        if (!regionNames.ContainsKey(shared.RegionHandle))
                                        {
                                            regionNames.Add(shared.RegionHandle, regionName);
                                        }
                                        form.updateWeb(form.getBase() + "secondlife://" + regionName.Replace(" ", "%20") + "/" + shared.CameraPosition.X.ToString() + "/" + shared.CameraPosition.Y.ToString() + "/" + shared.CameraPosition.Z.ToString());

                                    }
                                }
                                return null;
                            };

                            System.Timers.ElapsedEventHandler timerCallback = delegate(object asender, System.Timers.ElapsedEventArgs ee)
                            {

                                proxy.RemoveDelegate(PacketType.MapBlockReply, Direction.Incoming, replyCallback);
                                myTimer2.Stop();
                            };

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

                            proxy.InjectPacket(MapBlockRequest, Direction.Outgoing);

                        }

                        else
                        {
                            form.updateWeb(form.getBase() + "secondlife://" + this.regionNames[this.shared.RegionHandle].Replace(" ", "%20") + "/" + shared.CameraPosition.X.ToString() + "/" + shared.CameraPosition.Y.ToString() + "/" + shared.CameraPosition.Z.ToString());

                        }
                    }
                    else
                    {
                        getProfile();
                    }
                }
            }
        }