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); })); }
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); })); }