about summary refs log tree commit diff stats
path: root/src/xmpp/stanza.c
diff options
context:
space:
mode:
authorMarcoPolo-PasTonMolo <marcopolopastonmolo@protonmail.com>2022-05-26 17:49:34 +0300
committerMarcoPolo-PasTonMolo <marcopolopastonmolo@protonmail.com>2022-05-26 17:49:34 +0300
commit6a44e188537ee2d70226ad9dba4ae89c15437e2b (patch)
tree3081b0af49199c6f5b3a8fdc1ff07eac64420476 /src/xmpp/stanza.c
parentb4523d6c42825bda175663730001302adb21b95e (diff)
downloadprofani-tty-6a44e188537ee2d70226ad9dba4ae89c15437e2b.tar.gz
Add `/avatar set` command to publish avatar
Use `/avatar set <path>` where <path> is an image file to upload a new
avatar for the current user. When the avatar is too big it gets scaled
down. Scaling code copied from dino.

Fixes https://github.com/profanity-im/profanity/issues/1687
Diffstat (limited to 'src/xmpp/stanza.c')
-rw-r--r--src/xmpp/stanza.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index bfb782da..8dcad982 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -2587,6 +2587,107 @@ stanza_create_avatar_retrieve_data_request(xmpp_ctx_t* ctx, const char* stanza_i
 }
 
 xmpp_stanza_t*
+stanza_create_avatar_data_publish_iq(xmpp_ctx_t* ctx, const char* img_data, gsize len)
+{
+    char* id = connection_create_stanza_id();
+    xmpp_stanza_t* iq = xmpp_iq_new(ctx, STANZA_TYPE_SET, id);
+    free(id);
+    xmpp_stanza_set_attribute(iq, STANZA_ATTR_FROM, connection_get_fulljid());
+
+    xmpp_stanza_t* pubsub = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(pubsub, STANZA_NAME_PUBSUB);
+    xmpp_stanza_set_ns(pubsub, STANZA_NS_PUBSUB);
+
+    xmpp_stanza_t* publish = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(publish, STANZA_NAME_PUBLISH);
+    xmpp_stanza_set_attribute(publish, STANZA_ATTR_NODE, STANZA_NS_USER_AVATAR_DATA);
+
+    xmpp_stanza_t* item = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
+    char* sha1 = xmpp_sha1(ctx, (guchar*)img_data, len);
+    xmpp_stanza_set_attribute(item, "id", sha1);
+    xmpp_free(ctx, sha1);
+
+    xmpp_stanza_t* data = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(data, STANZA_NAME_DATA);
+    xmpp_stanza_set_ns(data, STANZA_NS_USER_AVATAR_DATA);
+
+    xmpp_stanza_t* text = xmpp_stanza_new(ctx);
+    gchar* base64 = g_base64_encode((guchar*)img_data, len);
+    xmpp_stanza_set_text(text, base64);
+    free(base64);
+
+    xmpp_stanza_add_child(data, text);
+    xmpp_stanza_add_child(item, data);
+    xmpp_stanza_add_child(publish, item);
+    xmpp_stanza_add_child(pubsub, publish);
+    xmpp_stanza_add_child(iq, pubsub);
+
+    xmpp_stanza_release(text);
+    xmpp_stanza_release(data);
+    xmpp_stanza_release(item);
+    xmpp_stanza_release(publish);
+    xmpp_stanza_release(pubsub);
+
+    return iq;
+}
+
+xmpp_stanza_t*
+stanza_create_avatar_metadata_publish_iq(xmpp_ctx_t* ctx, const char* img_data, gsize len, int height, int width)
+{
+    char* id = id = connection_create_stanza_id();
+    xmpp_stanza_t* iq = xmpp_iq_new(ctx, STANZA_TYPE_SET, id);
+    free(id);
+    xmpp_stanza_set_attribute(iq, STANZA_ATTR_FROM, connection_get_fulljid());
+
+    xmpp_stanza_t* pubsub = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(pubsub, STANZA_NAME_PUBSUB);
+    xmpp_stanza_set_ns(pubsub, STANZA_NS_PUBSUB);
+
+    xmpp_stanza_t* publish = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(publish, STANZA_NAME_PUBLISH);
+    xmpp_stanza_set_attribute(publish, STANZA_ATTR_NODE, STANZA_NS_USER_AVATAR_METADATA);
+
+    xmpp_stanza_t* item = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
+    char* sha1 = xmpp_sha1(ctx, (guchar*)img_data, len);
+    xmpp_stanza_set_attribute(item, "id", sha1);
+
+    xmpp_stanza_t* metadata = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(metadata, STANZA_NAME_METADATA);
+    xmpp_stanza_set_ns(metadata, STANZA_NS_USER_AVATAR_METADATA);
+
+    xmpp_stanza_t* info = xmpp_stanza_new(ctx);
+    xmpp_stanza_set_name(info, STANZA_NAME_INFO);
+    xmpp_stanza_set_attribute(info, "id", sha1);
+    xmpp_free(ctx, sha1);
+    char* bytes = g_strdup_printf("%lu", len);
+    char* h = g_strdup_printf("%d", height);
+    char* w = g_strdup_printf("%d", width);
+    xmpp_stanza_set_attribute(info, "bytes", bytes);
+    xmpp_stanza_set_attribute(info, "type", "img/png");
+    xmpp_stanza_set_attribute(info, "height", h);
+    xmpp_stanza_set_attribute(info, "width", w);
+    g_free(bytes);
+    g_free(h);
+    g_free(w);
+
+    xmpp_stanza_add_child(metadata, info);
+    xmpp_stanza_add_child(item, metadata);
+    xmpp_stanza_add_child(publish, item);
+    xmpp_stanza_add_child(pubsub, publish);
+    xmpp_stanza_add_child(iq, pubsub);
+
+    xmpp_stanza_release(info);
+    xmpp_stanza_release(metadata);
+    xmpp_stanza_release(item);
+    xmpp_stanza_release(publish);
+    xmpp_stanza_release(pubsub);
+
+    return iq;
+}
+
+xmpp_stanza_t*
 stanza_attach_correction(xmpp_ctx_t* ctx, xmpp_stanza_t* stanza, const char* const replace_id)
 {
     xmpp_stanza_t* replace_stanza = xmpp_stanza_new(ctx);