Added whole word matches for room mention

This commit is contained in:
James Booth
2016-04-07 01:01:27 +01:00
parent 6edf3b3f94
commit f243e333fc
14 changed files with 263 additions and 217 deletions

View File

@@ -1550,6 +1550,16 @@ cons_notify_setting(void)
else
cons_show("Room mention (/notify room) : OFF");
if (prefs_get_boolean(PREF_NOTIFY_MENTION_CASE_SENSITIVE))
cons_show("Room mention case (/notify room) : Case sensitive");
else
cons_show("Room mention case (/notify room) : Case insensitive");
if (prefs_get_boolean(PREF_NOTIFY_MENTION_WHOLE_WORD))
cons_show("Room mention word (/notify room) : Whole word only");
else
cons_show("Room mention word (/notify room) : Part of word");
if (prefs_get_boolean(PREF_NOTIFY_ROOM_TRIGGER))
cons_show("Room trigger (/notify room) : ON");
else

View File

@@ -359,33 +359,30 @@ mucwin_history(ProfMucWin *mucwin, const char *const nick, GDateTime *timestamp,
}
static void
_mucwin_print_mention(ProfWin *window, const char *const message, const char *const my_nick)
_mucwin_print_mention(ProfWin *window, const char *const message, const char *const nick, GSList *mentions)
{
char *mynick_lower = g_utf8_strdown(my_nick, -1);
char *message_lower = g_utf8_strdown(message, -1);
char message_section[strlen(message) + 1];
int last_pos = 0;
int pos = 0;
GSList *curr = mentions;
while (curr) {
pos = GPOINTER_TO_INT(curr->data);
int i = 0;
while(!g_str_has_prefix(&message_lower[i], mynick_lower) && i < strlen(message)) {
message_section[i] = message[i];
i++;
char *before_str = g_strndup(message + last_pos, pos - last_pos);
win_print(window, '-', 0, NULL, NO_DATE | NO_ME | NO_EOL, THEME_ROOMMENTION, "", before_str);
g_free(before_str);
char *nick_str = g_strndup(message + pos, strlen(nick));
win_print(window, '-', 0, NULL, NO_DATE | NO_ME | NO_EOL, THEME_ROOMMENTION_TERM, "", nick_str);
g_free(nick_str);
last_pos = pos + strlen(nick);
curr = g_slist_next(curr);
}
message_section[i] = '\0';
char *mention_section = strndup(&message[i], strlen(my_nick));
int used = strlen(message_section) + strlen(mention_section);
win_print(window, '-', 0, NULL, NO_DATE | NO_ME | NO_EOL, THEME_ROOMMENTION, "", message_section);
if (strlen(message) > used) {
win_print(window, '-', 0, NULL, NO_DATE | NO_ME | NO_EOL, THEME_ROOMMENTION_TERM, "", mention_section);
_mucwin_print_mention(window, &message[used], my_nick);
if (last_pos < strlen(message)) {
win_print(window, '-', 0, NULL, NO_DATE | NO_ME, THEME_ROOMMENTION, "", &message[last_pos]);
} else {
win_print(window, '-', 0, NULL, NO_DATE | NO_ME, THEME_ROOMMENTION_TERM, "", mention_section);
win_print(window, '-', 0, NULL, NO_DATE | NO_ME, THEME_ROOMMENTION, "", "");
}
free(mention_section);
g_free(mynick_lower);
g_free(message_lower);
}
gint
@@ -472,17 +469,17 @@ _mucwin_print_triggers(ProfWin *window, const char *const message, GList *trigge
}
void
mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const message, gboolean mention, GList *triggers)
mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *const message, GSList *mentions, GList *triggers)
{
assert(mucwin != NULL);
ProfWin *window = (ProfWin*)mucwin;
char *my_nick = muc_nick(mucwin->roomjid);
char *mynick = muc_nick(mucwin->roomjid);
if (g_strcmp0(nick, my_nick) != 0) {
if (mention) {
if (g_strcmp0(nick, mynick) != 0) {
if (g_slist_length(mentions) > 0) {
win_print(window, '-', 0, NULL, NO_ME | NO_EOL, THEME_ROOMMENTION, nick, "");
_mucwin_print_mention(window, message, my_nick);
_mucwin_print_mention(window, message, mynick, mentions);
} else if (triggers) {
win_print(window, '-', 0, NULL, NO_ME | NO_EOL, THEME_ROOMTRIGGER, nick, "");
_mucwin_print_triggers(window, message, triggers);

View File

@@ -157,7 +157,7 @@ void mucwin_occupant_role_and_affiliation_change(ProfMucWin *mucwin, const char
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_message(ProfMucWin *mucwin, const char *const nick, const char *const message, gboolean mention, GList *triggers);
void mucwin_message(ProfMucWin *mucwin, const char *const nick, const char *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);