diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 531d189b..d8121d65 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -1079,6 +1079,8 @@ cmd_ac_init(void) mood_ac = autocomplete_new(); autocomplete_add(mood_ac, "set"); autocomplete_add(mood_ac, "clear"); + autocomplete_add(mood_ac, "on"); + autocomplete_add(mood_ac, "off"); mood_type_ac = autocomplete_new(); autocomplete_add(mood_type_ac, "afraid"); autocomplete_add(mood_type_ac, "amazed"); diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index 411de396..2eaec284 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -2714,17 +2714,19 @@ static struct cmd_t command_defs[] = { }, { "/mood", - parse_args, 1, 3, NULL, + parse_args, 1, 3, &cons_mood_setting, CMD_NOSUBFUNCS CMD_MAINFUNC(cmd_mood) CMD_TAGS( CMD_TAG_CHAT) CMD_SYN( + "/mood on|off", "/mood set [text]", "/mood clear") CMD_DESC( "Set your mood (XEP-0107).") CMD_ARGS( + { "on|off", "Enable or disable displaying the mood of other users. On by default."}, { "set [text]", "Set user mood to with an optional [text]. Use /mood set to toggle through predfined moods." }, { "clear", "Clear your user mood." }) CMD_EXAMPLES( diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index bd025886..4edc7c16 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -90,6 +90,7 @@ #include "xmpp/muc.h" #include "xmpp/chat_session.h" #include "xmpp/avatar.h" +#include "xmpp/stanza.h" #ifdef HAVE_LIBOTR #include "otr/otr.h" @@ -9769,7 +9770,13 @@ cmd_register(ProfWin* window, const char* const command, gchar** args) gboolean cmd_mood(ProfWin* window, const char* const command, gchar** args) { - if (g_strcmp0(args[0], "set") == 0) { + if (g_strcmp0(args[0], "on") == 0) { + _cmd_set_boolean_preference(args[0], command, "User mood", PREF_MOOD); + caps_add_feature(STANZA_NS_MOOD_NOTIFY); + } else if (g_strcmp0(args[0], "off") == 0) { + _cmd_set_boolean_preference(args[0], command, "User mood", PREF_MOOD); + caps_remove_feature(STANZA_NS_MOOD_NOTIFY); + } else if (g_strcmp0(args[0], "set") == 0) { if (args[1]) { cons_show("Your mood: %s", args[1]); if (args[2]) { @@ -9782,5 +9789,6 @@ cmd_mood(ProfWin* window, const char* const command, gchar** args) cons_show("Clearing the user mood."); publish_user_mood(NULL, NULL); } + return TRUE; } diff --git a/src/config/preferences.c b/src/config/preferences.c index b2b7f094..c452840d 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -1819,6 +1819,7 @@ _get_group(preference_t pref) case PREF_COMPOSE_EDITOR: case PREF_OUTGOING_STAMP: case PREF_INCOMING_STAMP: + case PREF_MOOD: return PREF_GROUP_UI; case PREF_STATES: case PREF_OUTTYPE: @@ -2157,6 +2158,8 @@ _get_key(preference_t pref) return "stamp.incoming"; case PREF_OX_LOG: return "log"; + case PREF_MOOD: + return "mood"; default: return NULL; } @@ -2208,6 +2211,7 @@ _get_default_boolean(preference_t pref) case PREF_INTYPE: case PREF_INTYPE_CONSOLE: case PREF_NOTIFY_MENTION_WHOLE_WORD: + case PREF_MOOD: return TRUE; default: return FALSE; diff --git a/src/config/preferences.h b/src/config/preferences.h index 1070dace..2ef6204f 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -180,6 +180,7 @@ typedef enum { PREF_INCOMING_STAMP, PREF_NOTIFY_ROOM_OFFLINE, PREF_OX_LOG, + PREF_MOOD, } preference_t; typedef struct prof_alias_t diff --git a/src/ui/console.c b/src/ui/console.c index 6698a503..2c4a8e41 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -1733,6 +1733,7 @@ cons_show_ui_prefs(void) cons_inpblock_setting(); cons_titlebar_setting(); cons_statusbar_setting(); + cons_mood_setting(); cons_alert(NULL); } @@ -2947,3 +2948,13 @@ cons_remove_alert(ProfWin* window) g_list_free_full(item, g_free); free(win_name); } + +void +cons_mood_setting(void) +{ + if (prefs_get_boolean(PREF_MOOD)) { + cons_show("Display user mood (/mood) : ON"); + } else { + cons_show("Display user mood (/mood) : OFF"); + } +} diff --git a/src/ui/ui.h b/src/ui/ui.h index a7886ab3..a3377690 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -334,6 +334,7 @@ void cons_executable_setting(void); void cons_slashguard_setting(void); void cons_mam_setting(void); void cons_silence_setting(void); +void cons_mood_setting(void); void cons_show_contact_online(PContact contact, Resource* resource, GDateTime* last_activity); void cons_show_contact_offline(PContact contact, char* resource, char* status); void cons_theme_properties(void); diff --git a/src/xmpp/session.c b/src/xmpp/session.c index 1dd5bdde..3bec1ab2 100644 --- a/src/xmpp/session.c +++ b/src/xmpp/session.c @@ -286,9 +286,13 @@ session_get_account_name(void) return saved_account.name; } -static int +static gboolean _receive_mood(xmpp_stanza_t* const stanza, void* const userdata) { + if (!prefs_get_boolean(PREF_MOOD)) { + return TRUE; + } + const char* from = xmpp_stanza_get_from(stanza); xmpp_stanza_t* event = xmpp_stanza_get_child_by_name_and_ns(stanza, STANZA_NAME_EVENT, STANZA_NS_PUBSUB_EVENT); if (event) { @@ -362,7 +366,9 @@ session_login_success(gboolean secured) } message_pubsub_event_handler_add(STANZA_NS_MOOD, _receive_mood, NULL, NULL); - caps_add_feature(STANZA_NS_MOOD_NOTIFY); + if (prefs_get_boolean(PREF_MOOD)) { + caps_add_feature(STANZA_NS_MOOD_NOTIFY); + } } void diff --git a/tests/unittests/ui/stub_ui.c b/tests/unittests/ui/stub_ui.c index 37323ba7..ee759bb2 100644 --- a/tests/unittests/ui/stub_ui.c +++ b/tests/unittests/ui/stub_ui.c @@ -1149,6 +1149,11 @@ cons_silence_setting(void) { } +void +cons_mood_setting(void) +{ +} + void cons_show_bookmarks_ignore(gchar** list, gsize len) {