示例#1
0
        public void DownloadAvatar(Jid userId, string avatarId, string avatarType, RequestAvatarCallback finished)
        {
            PubSubIq dataiq = new PubSubIq(IqType.get, userId, Program.Jabber.conn.MyJID);

            dataiq.PubSub.Items = new Items("urn:xmpp:avatar:data");
            dataiq.PubSub.Items.AddItem(new Item(avatarId));
            Program.Jabber.conn.IqGrabber.SendIq(dataiq, (IqCB)((object sender_3, IQ result2, object unused_4) => {
                if (result2.Type != IqType.result)
                {
                    finished(false, null); return;
                }

                Element data = result2.SelectSingleElement("data", true);

                byte[] imageBytes = Convert.FromBase64String(data.Value);

                Image img;
                switch (avatarType)
                {
                case "image/webp":
                    var dec = new Imazen.WebP.SimpleDecoder();
                    img = dec.DecodeFromBytes(imageBytes, imageBytes.Length);
                    break;

                default:
                    img = Image.FromStream(new MemoryStream(imageBytes));
                    break;
                }
                string fileName = GetAvatarFilename(userId);

                img.Save(fileName, ImageFormat.Png);
                finished(true, fileName);
            }));
        }
示例#2
0
        public void RequestAvatar(Jid userId, RequestAvatarCallback finished)
        {
            if (dontRequestIds.Contains(userId.ToString()))
            {
                return;
            }

            dontRequestIds.Add(userId.ToString());
            PubSubIq metaiq = new PubSubIq(IqType.get, userId, Program.Jabber.conn.MyJID);

            metaiq.PubSub.Items = new Items("urn:xmpp:avatar:metadata");
            Program.Jabber.conn.IqGrabber.SendIq(metaiq, (IqCB)((object unused_1, IQ result, object unused_2) => {
                if (result.Type != IqType.result)
                {
                    finished(false, null); return;
                }
                Element info = result.SelectSingleElement("info", true);
                if (info == null || !info.HasAttribute("id") || !info.HasAttribute("type"))
                {
                    finished(false, null); return;
                }

                this.DownloadAvatar(userId, info.GetAttribute("id"), info.GetAttribute("type"), finished);
            }));
        }
示例#3
0
        public void TestBuildPubSubIq2()
        {
            var pIq = new PubSubIq
            {
                Type = Matrix.Xmpp.IqType.Set,
                From = "[email protected]/elsinore",
                To   = "pubsub.shakespeare.lit",
                Id   = "create2"
            };

            pIq.PubSub.Create    = new Matrix.Xmpp.PubSub.Create();
            pIq.PubSub.Configure = new Matrix.Xmpp.PubSub.Configure();

            pIq.ShouldBe(Resource.Get("Xmpp.PubSub.publish_iq2.xml"));
        }
示例#4
0
        public void TestBuildPubSubIq1()
        {
            PubSubIq pIq = new PubSubIq
            {
                Type   = Matrix.Xmpp.IqType.Result,
                From   = "pubsub.shakespeare.lit",
                To     = "[email protected]/elsinore",
                Id     = "create2",
                PubSub = { Create   = new Matrix.Xmpp.PubSub.Create {
                               Node = "25e3d37dabbab9541f7523321421edc5bfeb2dae"
                           } }
            };


            pIq.ShouldBe(Resource.Get("Xmpp.PubSub.publish_iq1.xml"));
        }
        public static Iq CreatePublishNicknameStanza(string nickname)
        {
            var pIq = new PubSubIq {
                Type = IqType.Set
            };

            var publish = new Publish {
                Node = Namespaces.Nick
            };

            var item = new Item();

            item.Add(new Nick(nickname));

            publish.AddItem(item);
            pIq.PubSub.Publish = publish;

            return(pIq);
        }
示例#6
0
        public static Iq CreateRequestAvatarStanza(Jid to, string id)
        {
            var pIq = new PubSubIq
            {
                To   = to,
                Type = IqType.Get
            };

            var items = new Items
            {
                Node = Namespaces.AvatarData
            };

            items.AddItem(new Item {
                Id = id
            });

            pIq.PubSub.Items = items;

            return(pIq);
        }
示例#7
0
        public static Iq PublishItems(Jid to, string node, Item[] items)
        {
            var pIq = new PubSubIq
            {
                To   = to,
                Type = IqType.Set,
            };

            var publish = new Publish {
                Node = node
            };

            foreach (var item in items)
            {
                publish.AddItem(item);
            }

            pIq.PubSub.Publish = publish;

            return(pIq);
        }
示例#8
0
        public static Iq CreatePublishAvatarDataStanza(byte[] avatarBytes)
        {
            /*
             * <iq type='set' from='[email protected]/chamber' id='publish1'>
             * <pubsub xmlns='http://jabber.org/protocol/pubsub'>
             *  <publish node='urn:xmpp:avatar:data'>
             *    <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
             *      <data xmlns='urn:xmpp:avatar:data'>
             *        qANQR1DBwU4DX7jmYZnncm...
             *      </data>
             *    </item>
             *  </publish>
             * </pubsub>
             * </iq>
             *
             */
            var pIq = new PubSubIq {
                Type = IqType.Set
            };

            var publish = new Publish {
                Node = Namespaces.AvatarData
            };

            var item = new Item {
                Id = Hash.Sha1HashHex(avatarBytes)
            };

            item.Add(
                new Data {
                Bytes = avatarBytes
            }
                );

            publish.AddItem(item);
            pIq.PubSub.Publish = publish;

            return(pIq);
        }
示例#9
0
        /// <summary>
        /// Retracts the items stanza.
        /// </summary>
        /// <param name="to">To.</param>
        /// <param name="node">The node.</param>
        /// <param name="itemIds">The item ids.</param>
        /// <returns></returns>
        public static Iq RetractItems(Jid to, string node, string[] itemIds)
        {
            var pIq = new PubSubIq
            {
                To   = to,
                Type = IqType.Set
            };

            var retract = new Retract {
                Node = node
            };

            foreach (var item in itemIds)
            {
                retract.AddItem(new Item {
                    Id = item
                });
            }

            pIq.PubSub.Retract = retract;

            return(pIq);
        }
示例#10
0
        public static Iq CreatePublishAvatarMetadataStanza(byte[] avatarBytes, int height, int width, string contentType)
        {
            /*
             * <iq type='set' from='[email protected]/chamber' id='publish1'>
             * <pubsub xmlns='http://jabber.org/protocol/pubsub'>
             *  <publish node='urn:xmpp:avatar:data'>
             *    <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
             *      <data xmlns='urn:xmpp:avatar:data'>
             *        qANQR1DBwU4DX7jmYZnncm...
             *      </data>
             *    </item>
             *  </publish>
             * </pubsub>
             * </iq>
             *
             * <iq type='set' from='[email protected]/chamber' id='publish2'>
             *    <pubsub xmlns='http://jabber.org/protocol/pubsub'>
             *      <publish node='urn:xmpp:avatar:metadata'>
             *        <item id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'>
             *          <metadata xmlns='urn:xmpp:avatar:metadata'>
             *            <info bytes='12345'
             *                  id='111f4b3c50d7b0df729d299bc6f8e9ef9066971f'
             *                  height='64'
             *                  type='image/png'
             *                  width='64'/>
             *          </metadata>
             *        </item>
             *      </publish>
             *    </pubsub>
             *  </iq>
             */
            var pIq = new PubSubIq {
                Type = IqType.Set
            };

            // publish tag
            var publish = new Publish {
                Node = Namespaces.AvatarMetadata
            };

            // metadata Tag including the info child
            var metaData = new Metadata()
            {
                Info = new Info
                {
                    CountBytes = avatarBytes.Length,
                    Id         = Hash.Sha1HashHex(avatarBytes),
                    Height     = height,
                    Width      = width,
                    Type       = contentType
                }
            };

            var item = new Item {
                Id = metaData.Info.Id
            };

            item.Add(metaData);
            publish.AddItem(item);

            pIq.PubSub.Publish = publish;

            return(pIq);
        }