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
This commit is contained in:
MarcoPolo-PasTonMolo
2022-05-26 17:49:34 +03:00
parent b4523d6c42
commit 6a44e18853
8 changed files with 181 additions and 1 deletions

View File

@@ -2586,6 +2586,107 @@ stanza_create_avatar_retrieve_data_request(xmpp_ctx_t* ctx, const char* stanza_i
return iq;
}
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)
{