about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/command/cmd_ac.c22
-rw-r--r--src/command/cmd_defs.c18
-rw-r--r--src/command/cmd_funcs.c18
-rw-r--r--src/common.c15
-rw-r--r--src/common.h1
-rw-r--r--src/config/preferences.c5
-rw-r--r--src/config/preferences.h1
-rw-r--r--src/event/server_events.c13
-rw-r--r--src/ui/console.c12
-rw-r--r--src/ui/mucwin.c49
-rw-r--r--src/ui/ui.h6
-rw-r--r--src/ui/window.c12
-rw-r--r--src/xmpp/message.c2
-rw-r--r--src/xmpp/xmpp.h2
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);