Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to disable avatar publishing #1843

Merged
merged 1 commit into from
May 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions src/command/cmd_ac.c
Original file line number Diff line number Diff line change
Expand Up @@ -1102,6 +1102,7 @@ cmd_ac_init(void)

avatar_ac = autocomplete_new();
autocomplete_add(avatar_ac, "set");
autocomplete_add(avatar_ac, "disable");
autocomplete_add(avatar_ac, "get");
autocomplete_add(avatar_ac, "open");

Expand Down
12 changes: 8 additions & 4 deletions src/command/cmd_defs.c
Original file line number Diff line number Diff line change
Expand Up @@ -2418,25 +2418,29 @@ static const struct cmd_t command_defs[] = {
},

{ CMD_PREAMBLE("/avatar",
parse_args, 2, 2, NULL)
parse_args, 1, 2, NULL)
CMD_MAINFUNC(cmd_avatar)
CMD_TAGS(
CMD_TAG_CHAT)
CMD_SYN(
"/avatar set <path>",
"/avatar disable",
"/avatar get <barejid>",
"/avatar open <barejid>")
CMD_DESC(
"Upload avatar for oneself (XEP-0084). "
"Download avatar (XEP-0084) for a certain contact. "
"If nothing happens after using this command the user either doesn't have an avatar set at all "
"Upload an avatar for yourself, "
"disable your avatar, "
"or download a contact's avatar (XEP-0084). "
"If nothing happens after using this command, the user either doesn't have an avatar set "
"or doesn't use XEP-0084 to publish it.")
CMD_ARGS(
{ "set <path>", "Set avatar to the image at <path>." },
{ "disable", "Disable avatar publishing; your avatar will not display to others." },
{ "get <barejid>", "Download the avatar. barejid is the JID to download avatar from." },
{ "open <barejid>", "Download avatar and open it with command." })
CMD_EXAMPLES(
"/avatar set ~/images/avatar.png",
"/avatar disable",
"/avatar get thor@valhalla.edda",
"/avatar open freyja@vanaheimr.edda") },

Expand Down
41 changes: 25 additions & 16 deletions src/command/cmd_funcs.c
Original file line number Diff line number Diff line change
Expand Up @@ -9287,25 +9287,34 @@ gboolean
cmd_avatar(ProfWin* window, const char* const command, gchar** args)
{
if (args[1] == NULL) {
cons_bad_cmd_usage(command);
return TRUE;
}

if (g_strcmp0(args[0], "set") == 0) {
#ifdef HAVE_PIXBUF
if (avatar_set(args[1])) {
cons_show("Avatar updated successfully");
if (g_strcmp0(args[0], "disable") == 0) {
if (avatar_publishing_disable()) {
cons_show("Avatar publishing disabled. To enable avatar publishing, use '/avatar set <path>'.");
} else {
cons_show("Failed to disable avatar publishing.");
}
} else {
cons_bad_cmd_usage(command);
}
} else {
if (g_strcmp0(args[0], "set") == 0) {
#ifdef HAVE_PIXBUF
if (avatar_set(args[1])) {
cons_show("Avatar updated successfully");
}
#else
cons_show("Profanity has not been built with GDK Pixbuf support enabled which is needed to scale the avatar when uploading.");
cons_show("Profanity has not been built with GDK Pixbuf support enabled which is needed to scale the avatar when uploading.");
#endif
} else if (g_strcmp0(args[0], "get") == 0) {
avatar_get_by_nick(args[1], false);
} else if (g_strcmp0(args[0], "open") == 0) {
avatar_get_by_nick(args[1], true);
} else if (g_strcmp0(args[0], "cmd") == 0) {
prefs_set_string(PREF_AVATAR_CMD, args[1]);
cons_show("Avatar cmd set to: %s", args[1]);
} else if (g_strcmp0(args[0], "get") == 0) {
avatar_get_by_nick(args[1], false);
} else if (g_strcmp0(args[0], "open") == 0) {
avatar_get_by_nick(args[1], true);
} else if (g_strcmp0(args[0], "cmd") == 0) {
prefs_set_string(PREF_AVATAR_CMD, args[1]);
cons_show("Avatar cmd set to: %s", args[1]);
} else {
cons_bad_cmd_usage(command);
}
}

return TRUE;
Expand Down
14 changes: 14 additions & 0 deletions src/xmpp/avatar.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,17 @@ avatar_set(const char* path)
}
#endif

gboolean
avatar_publishing_disable()
{
xmpp_ctx_t* const ctx = connection_get_ctx();
xmpp_stanza_t* iq = stanza_disable_avatar_publish_iq(ctx);
iq_send_stanza(iq);
xmpp_stanza_release(iq);

return TRUE;
}

gboolean
avatar_get_by_nick(const char* nick, gboolean open)
{
Expand Down Expand Up @@ -224,6 +235,9 @@ _avatar_metadata_handler(xmpp_stanza_t* const stanza, void* const userdata)
_avatar_request_item_by_id(from, data);
}
}
} else {
cons_show("We couldn't get the user's avatar, possibly because they haven't set one or have disabled avatar publishing. "
"During this Profanity session, you will receive future changes to this user's avatar.");
}
}
}
Expand Down
1 change: 1 addition & 0 deletions src/xmpp/avatar.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,4 @@ gboolean avatar_set(const char* path);
#endif

#endif
gboolean avatar_publishing_disable();
36 changes: 36 additions & 0 deletions src/xmpp/stanza.c
Original file line number Diff line number Diff line change
Expand Up @@ -2697,6 +2697,42 @@ stanza_create_avatar_metadata_publish_iq(xmpp_ctx_t* ctx, const char* img_data,
return iq;
}

xmpp_stanza_t*
stanza_disable_avatar_publish_iq(xmpp_ctx_t* ctx)
{
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_METADATA);

xmpp_stanza_t* item = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(item, STANZA_NAME_ITEM);

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_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(metadata);
xmpp_stanza_release(item);
xmpp_stanza_release(publish);
xmpp_stanza_release(pubsub);

return iq;
}

xmpp_stanza_t*
stanza_create_vcard_request_iq(xmpp_ctx_t* ctx, const char* const jid, const char* const stanza_id)
{
Expand Down
1 change: 1 addition & 0 deletions src/xmpp/stanza.h
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,7 @@ void stanza_free_caps(XMPPCaps* caps);
xmpp_stanza_t* stanza_create_avatar_retrieve_data_request(xmpp_ctx_t* ctx, const char* stanza_id, const char* const item_id, const char* const jid);
xmpp_stanza_t* stanza_create_avatar_data_publish_iq(xmpp_ctx_t* ctx, const char* img_data, gsize len);
xmpp_stanza_t* stanza_create_avatar_metadata_publish_iq(xmpp_ctx_t* ctx, const char* img_data, gsize len, int height, int width);
xmpp_stanza_t* stanza_disable_avatar_publish_iq(xmpp_ctx_t* ctx);
xmpp_stanza_t* stanza_create_vcard_request_iq(xmpp_ctx_t* ctx, const char* const jid, const char* const stanza_id);
xmpp_stanza_t* stanza_create_mam_iq(xmpp_ctx_t* ctx, const char* const jid, const char* const startdate, const char* const enddate, const char* const firstid, const char* const lastid);
xmpp_stanza_t* stanza_change_password(xmpp_ctx_t* ctx, const char* const user, const char* const password);
Expand Down
6 changes: 6 additions & 0 deletions tests/unittests/xmpp/stub_avatar.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,9 @@ avatar_set(const char* path)
{
return TRUE;
}

gboolean
avatar_publishing_disable()
{
return TRUE;
}