diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/command/cmd_ac.c | 22 | ||||
-rw-r--r-- | src/command/cmd_defs.c | 18 | ||||
-rw-r--r-- | src/command/cmd_funcs.c | 18 | ||||
-rw-r--r-- | src/common.c | 15 | ||||
-rw-r--r-- | src/common.h | 1 | ||||
-rw-r--r-- | src/config/preferences.c | 5 | ||||
-rw-r--r-- | src/config/preferences.h | 1 | ||||
-rw-r--r-- | src/event/server_events.c | 13 | ||||
-rw-r--r-- | src/ui/console.c | 12 | ||||
-rw-r--r-- | src/ui/mucwin.c | 49 | ||||
-rw-r--r-- | src/ui/ui.h | 6 | ||||
-rw-r--r-- | src/ui/window.c | 12 | ||||
-rw-r--r-- | src/xmpp/message.c | 2 | ||||
-rw-r--r-- | src/xmpp/xmpp.h | 2 |
14 files changed, 123 insertions, 53 deletions
diff --git a/src/command/cmd_ac.c b/src/command/cmd_ac.c index 4d6c1d90..c80c058d 100644 --- a/src/command/cmd_ac.c +++ b/src/command/cmd_ac.c @@ -238,6 +238,8 @@ static Autocomplete invite_ac; static Autocomplete status_ac; static Autocomplete status_state_ac; static Autocomplete logging_ac; +static Autocomplete logging_group_ac; +static Autocomplete logging_group_color_ac; static Autocomplete color_ac; static Autocomplete correction_ac; @@ -944,6 +946,15 @@ cmd_ac_init(void) autocomplete_add(logging_ac, "chat"); autocomplete_add(logging_ac, "group"); + logging_group_ac = autocomplete_new(); + autocomplete_add(logging_group_ac, "on"); + autocomplete_add(logging_group_ac, "off"); + autocomplete_add(logging_group_ac, "color"); + + logging_group_color_ac = autocomplete_new(); + autocomplete_add(logging_group_color_ac, "unanimous"); + autocomplete_add(logging_group_color_ac, "regular"); + color_ac = autocomplete_new(); autocomplete_add(color_ac, "on"); autocomplete_add(color_ac, "off"); @@ -1261,6 +1272,8 @@ cmd_ac_reset(ProfWin *window) autocomplete_reset(status_ac); autocomplete_reset(status_state_ac); autocomplete_reset(logging_ac); + autocomplete_reset(logging_group_ac); + autocomplete_reset(logging_group_color_ac); autocomplete_reset(color_ac); autocomplete_reset(correction_ac); @@ -1412,6 +1425,8 @@ cmd_ac_uninit(void) autocomplete_free(status_ac); autocomplete_free(status_state_ac); autocomplete_free(logging_ac); + autocomplete_free(logging_group_ac); + autocomplete_free(logging_group_color_ac); autocomplete_free(color_ac); autocomplete_free(correction_ac); } @@ -3727,7 +3742,12 @@ _logging_autocomplete(ProfWin *window, const char *const input, gboolean previou return result; } - result = autocomplete_param_with_func(input, "/logging group", prefs_autocomplete_boolean_choice, previous, NULL); + result = autocomplete_param_with_ac(input, "/logging group", logging_group_ac, TRUE, previous); + if (result) { + return result; + } + + result = autocomplete_param_with_ac(input, "/logging group color", logging_group_color_ac, TRUE, previous); if (result) { return result; } diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c index f105fcd6..2de11c4d 100644 --- a/src/command/cmd_defs.c +++ b/src/command/cmd_defs.c @@ -1607,24 +1607,28 @@ static struct cmd_t command_defs[] = }, { "/logging", - parse_args, 2, 2, &cons_logging_setting, + parse_args, 2, 3, &cons_logging_setting, CMD_NOSUBFUNCS CMD_MAINFUNC(cmd_logging) CMD_TAGS( CMD_TAG_CHAT) CMD_SYN( - "/logging chat|group on|off") + "/logging chat|group on|off", + "/logging group color unanimous|regular") CMD_DESC( + "Configure chat logging. " "Switch logging on or off. " "Chat logging will be enabled if /history is set to on. " - "When disabling this option, /history will also be disabled. ") + "When disabling this option, /history will also be disabled. " + "Color MUC history unanimously or like regular MUC messages.") CMD_ARGS( - { "chat", "Regular chat logging" }, - { "group", "Groupchat (room) logging" }, - { "on|off", "Enable or disable logging." }) + { "chat on|off", "Enable/Disable regular chat logging" }, + { "group on|off", "Enable/Disable groupchat (room) logging" }, + { "group color unanimous|regular", "Color MUC history unanimous or like regular MUC messages." }) CMD_EXAMPLES( "/logging chat on", - "/logging group off" ) + "/logging group off", + "/logging group color regular" ) }, { "/states", diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 4f617ffe..c65bf10a 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -6721,12 +6721,22 @@ cmd_logging(ProfWin *window, const char *const command, gchar **args) if (strcmp(args[1], "off") == 0) { prefs_set_boolean(PREF_HISTORY, FALSE); } - } else if (strcmp(args[0], "group") == 0) { - _cmd_set_boolean_preference(args[1], command, "Groupchat logging", PREF_GRLOG); - } else { - cons_bad_cmd_usage(command); + + return TRUE; + } else if (g_strcmp0(args[0], "group") == 0) { + if (g_strcmp0(args[1], "on") == 0 || g_strcmp0(args[1], "off") == 0) { + _cmd_set_boolean_preference(args[1], command, "Groupchat logging", PREF_GRLOG); + return TRUE; + } else if (strcmp(args[1], "color") == 0 && args[2] != NULL) { + if (g_strcmp0(args[2], "unanimous") == 0 || g_strcmp0(args[2], "regular") == 0) { + prefs_set_string(PREF_HISTORY_COLOR_MUC, args[2]); + cons_show("Groupchat logging color set to: %s", args[2]); + return TRUE; + } + } } + cons_bad_cmd_usage(command); return TRUE; } diff --git a/src/common.c b/src/common.c index 050fc2b7..c056d167 100644 --- a/src/common.c +++ b/src/common.c @@ -510,3 +510,18 @@ get_random_string(int length) return rand; } + +GSList* +get_mentions(gboolean whole_word, gboolean case_sensitive, const char *const message, const char *const nick) +{ + GSList *mentions = NULL; + char *message_search = case_sensitive ? strdup(message) : g_utf8_strdown(message, -1); + char *mynick_search = case_sensitive ? strdup(nick) : g_utf8_strdown(nick, -1); + + mentions = prof_occurrences(mynick_search, message_search, 0, whole_word, &mentions); + + g_free(message_search); + g_free(mynick_search); + + return mentions; +} diff --git a/src/common.h b/src/common.h index 1681d4ab..6924d935 100644 --- a/src/common.h +++ b/src/common.h @@ -99,6 +99,7 @@ gboolean is_notify_enabled(void); GSList* prof_occurrences(const char *const needle, const char *const haystack, int offset, gboolean whole_word, GSList **result); +GSList* get_mentions(gboolean whole_word, gboolean case_sensitive, const char *const message, const char *const nick); int is_regular_file(const char *path); int is_dir(const char *path); diff --git a/src/config/preferences.c b/src/config/preferences.c index 52ce5ca9..4b5635a1 100644 --- a/src/config/preferences.c +++ b/src/config/preferences.c @@ -1746,6 +1746,7 @@ _get_group(preference_t pref) case PREF_STATUSBAR_CHAT: case PREF_STATUSBAR_ROOM: case PREF_TITLEBAR_MUC_TITLE: + case PREF_HISTORY_COLOR_MUC: return PREF_GROUP_UI; case PREF_STATES: case PREF_OUTTYPE: @@ -2048,6 +2049,8 @@ _get_key(preference_t pref) return "sendfile"; case PREF_CORRECTION_ALLOW: return "correction.allow"; + case PREF_HISTORY_COLOR_MUC: + return "history.muc.color"; default: return NULL; } @@ -2177,6 +2180,8 @@ _get_default_string(preference_t pref) return "automatic"; case PREF_COLOR_NICK: return "false"; + case PREF_HISTORY_COLOR_MUC: + return "unanimous"; default: return NULL; } diff --git a/src/config/preferences.h b/src/config/preferences.h index 4d04fd7d..7eda87db 100644 --- a/src/config/preferences.h +++ b/src/config/preferences.h @@ -165,6 +165,7 @@ typedef enum { PREF_OMEMO_SENDFILE, PREF_OCCUPANTS_WRAP, PREF_CORRECTION_ALLOW, + PREF_HISTORY_COLOR_MUC, } preference_t; typedef struct prof_alias_t { diff --git a/src/event/server_events.c b/src/event/server_events.c index d42629e5..2272016c 100644 --- a/src/event/server_events.c +++ b/src/event/server_events.c @@ -286,7 +286,7 @@ sv_ev_room_history(ProfMessage *message) gboolean younger = g_date_time_compare(mucwin->last_msg_timestamp, message->timestamp) < 0 ? TRUE : FALSE; if (ev_is_first_connect() || younger ) { - mucwin_history(mucwin, message->jid->resourcepart, message->timestamp, message->plain); + mucwin_history(mucwin, message); } } } @@ -319,17 +319,8 @@ sv_ev_room_message(ProfMessage *message) char *old_plain = message->plain; message->plain = plugins_pre_room_message_display(message->jid->barejid, message->jid->resourcepart, message->plain); - gboolean whole_word = prefs_get_boolean(PREF_NOTIFY_MENTION_WHOLE_WORD); - gboolean case_sensitive = prefs_get_boolean(PREF_NOTIFY_MENTION_CASE_SENSITIVE); - char *message_search = case_sensitive ? strdup(message->plain) : g_utf8_strdown(message->plain, -1); - char *mynick_search = case_sensitive ? strdup(mynick) : g_utf8_strdown(mynick, -1); - - GSList *mentions = NULL; - mentions = prof_occurrences(mynick_search, message_search, 0, whole_word, &mentions); + GSList *mentions = get_mentions(prefs_get_boolean(PREF_NOTIFY_MENTION_WHOLE_WORD), prefs_get_boolean(PREF_NOTIFY_MENTION_CASE_SENSITIVE), message->plain, mynick); gboolean mention = g_slist_length(mentions) > 0; - g_free(message_search); - g_free(mynick_search); - GList *triggers = prefs_message_get_triggers(message->plain); _clean_incoming_message(message); diff --git a/src/ui/console.c b/src/ui/console.c index c0abbc36..b60dd75e 100644 --- a/src/ui/console.c +++ b/src/ui/console.c @@ -1854,14 +1854,18 @@ void cons_logging_setting(void) { if (prefs_get_boolean(PREF_CHLOG)) - cons_show("Chat logging (/logging chat) : ON"); + cons_show("Chat logging (/logging chat) : ON"); else - cons_show("Chat logging (/logging chat) : OFF"); + cons_show("Chat logging (/logging chat) : OFF"); if (prefs_get_boolean(PREF_GRLOG)) - cons_show("Groupchat logging (/logging group) : ON"); + cons_show("Groupchat logging (/logging group) : ON"); else - cons_show("Groupchat logging (/logging group) : OFF"); + cons_show("Groupchat logging (/logging group) : OFF"); + + char *pref = prefs_get_string(PREF_HISTORY_COLOR_MUC); + cons_show("MUC history color (/logging group color) : %s", pref); + prefs_free_string(pref); } void diff --git a/src/ui/mucwin.c b/src/ui/mucwin.c index f1370c88..2005ce28 100644 --- a/src/ui/mucwin.c +++ b/src/ui/mucwin.c @@ -361,28 +361,47 @@ mucwin_nick_change(ProfMucWin *mucwin, const char *const nick) } void -mucwin_history(ProfMucWin *mucwin, const char *const nick, GDateTime *timestamp, const char *const message) +mucwin_history(ProfMucWin *mucwin, const ProfMessage *const message) { assert(mucwin != NULL); ProfWin *window = (ProfWin*)mucwin; - GString *line = g_string_new(""); + char *nick = message->jid->resourcepart; - if (strncmp(message, "/me ", 4) == 0) { - g_string_append(line, "*"); - g_string_append(line, nick); - g_string_append(line, " "); - g_string_append(line, message + 4); + // 'unanimous' all in one color (like always was) + // 'regular' colored like new messages too + char *muc_history_color = prefs_get_string(PREF_HISTORY_COLOR_MUC); + + if (g_strcmp0(muc_history_color, "unanimous") == 0) { + GString *line = g_string_new(""); + + if (strncmp(message->plain, "/me ", 4) == 0) { + g_string_append(line, "*"); + g_string_append(line, nick); + g_string_append(line, " "); + g_string_append(line, message->plain + 4); + } else { + g_string_append(line, nick); + g_string_append(line, ": "); + g_string_append(line, message->plain); + } + + win_print_history(window, message->timestamp, line->str); + + g_string_free(line, TRUE); } else { - g_string_append(line, nick); - g_string_append(line, ": "); - g_string_append(line, message); - } + char *mynick = muc_nick(mucwin->roomjid); + GSList *mentions = get_mentions(prefs_get_boolean(PREF_NOTIFY_MENTION_WHOLE_WORD), prefs_get_boolean(PREF_NOTIFY_MENTION_CASE_SENSITIVE), message->plain, mynick); + GList *triggers = prefs_message_get_triggers(message->plain); - win_print_history(window, timestamp, line->str); - g_string_free(line, TRUE); + mucwin_incoming_msg(mucwin, message, mentions, triggers); + + g_slist_free(mentions); + g_list_free_full(triggers, free); + } - plugins_on_room_history_message(mucwin->roomjid, nick, message, timestamp); + g_free(muc_history_color); + plugins_on_room_history_message(mucwin->roomjid, nick, message->plain, message->timestamp); } static void @@ -530,7 +549,7 @@ mucwin_outgoing_msg(ProfMucWin *mucwin, const char *const message, const char *c } void -mucwin_incoming_msg(ProfMucWin *mucwin, ProfMessage *message, GSList *mentions, GList *triggers) +mucwin_incoming_msg(ProfMucWin *mucwin, const ProfMessage *const message, GSList *mentions, GList *triggers) { assert(mucwin != NULL); int flags = 0; diff --git a/src/ui/ui.h b/src/ui/ui.h index 77bdc1d5..8790e464 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -3,6 +3,7 @@ * vim: expandtab:ts=4:sts=4:sw=4 * * Copyright (C) 2012 - 2019 James Booth <boothj5@gmail.com> + * Copyright (C) 2019 - 2020 Michael Vetter <jubalh@iodoru.org> * * This file is part of Profanity. * @@ -56,7 +57,6 @@ #define NO_COLOUR_DATE 16 #define UNTRUSTED 32 - // core UI void ui_init(void); void ui_load_colours(void); @@ -157,9 +157,9 @@ void mucwin_occupant_affiliation_change(ProfMucWin *mucwin, const char *const ni void mucwin_occupant_role_and_affiliation_change(ProfMucWin *mucwin, const char *const nick, const char *const role, const char *const affiliation, const char *const actor, const char *const reason); void mucwin_roster(ProfMucWin *mucwin, GList *occupants, const char *const presence); -void mucwin_history(ProfMucWin *mucwin, const char *const nick, GDateTime *timestamp, const char *const message); +void mucwin_history(ProfMucWin *mucwin, const ProfMessage *const message); void mucwin_outgoing_msg(ProfMucWin *mucwin, const char *const message, const char *const id, prof_enc_t enc_mode, const char *const replace_id); -void mucwin_incoming_msg(ProfMucWin *mucwin, ProfMessage *message, GSList *mentions, GList *triggers); +void mucwin_incoming_msg(ProfMucWin *mucwin, const ProfMessage *const message, GSList *mentions, GList *triggers); void mucwin_subject(ProfMucWin *mucwin, const char *const nick, const char *const subject); void mucwin_requires_config(ProfMucWin *mucwin); void mucwin_info(ProfMucWin *mucwin); diff --git a/src/ui/window.c b/src/ui/window.c index 8b948dbd..815e6e93 100644 --- a/src/ui/window.c +++ b/src/ui/window.c @@ -1436,12 +1436,12 @@ static void _win_print_internal(ProfWin *window, const char show_char, int pad_indent, GDateTime *time, int flags, theme_item_t theme_item, const char *const from, const char *const message, DeliveryReceipt *receipt) { - // flags : 1st bit = 0/1 - me/not me - // 2nd bit = 0/1 - date/no date - // 3rd bit = 0/1 - eol/no eol - // 4th bit = 0/1 - color from/no color from - // 5th bit = 0/1 - color date/no date - // 6th bit = 0/1 - trusted/untrusted + // flags : 1st bit = 0/1 - me/not me. define: NO_ME + // 2nd bit = 0/1 - date/no date. define: NO_DATE + // 3rd bit = 0/1 - eol/no eol. define: NO_EOL + // 4th bit = 0/1 - color from/no color from. define: NO_COLOUR_FROM + // 5th bit = 0/1 - color date/no date. define: NO_COLOUR_DATE + // 6th bit = 0/1 - trusted/untrusted. define: UNTRUSTED gboolean me_message = FALSE; int offset = 0; int colour = theme_attrs(THEME_ME); diff --git a/src/xmpp/message.c b/src/xmpp/message.c index 0caef0f6..a5c6c33f 100644 --- a/src/xmpp/message.c +++ b/src/xmpp/message.c @@ -1256,7 +1256,7 @@ _send_message_stanza(xmpp_stanza_t *const stanza) * checkOID = false: check regular id */ bool -message_is_sent_by_us(ProfMessage *message, bool checkOID) { +message_is_sent_by_us(const ProfMessage *const message, bool checkOID) { bool ret = FALSE; // we check the </origin-id> for this we calculate a hash into it so we can detect diff --git a/src/xmpp/xmpp.h b/src/xmpp/xmpp.h index 0563948a..85c49e03 100644 --- a/src/xmpp/xmpp.h +++ b/src/xmpp/xmpp.h @@ -184,7 +184,7 @@ void message_send_paused(const char *const jid); void message_send_gone(const char *const jid); void message_send_invite(const char *const room, const char *const contact, const char *const reason); -bool message_is_sent_by_us(ProfMessage *message, bool checkOID); +bool message_is_sent_by_us(const ProfMessage *const message, bool checkOID); void presence_subscription(const char *const jid, const jabber_subscr_t action); GList* presence_get_subscription_requests(void); |