From b9a274a81d4020b4a1c5809b150ec869c897f17b Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Mon, 17 Sep 2018 12:26:13 +0200 Subject: [PATCH 1/4] correctly separate ignore flags (no_act, hidden) from level --- src/core/ignore.c | 32 ++++++++--------- src/core/ignore.h | 2 ++ src/fe-common/core/fe-messages.c | 36 ++++++++++---------- src/fe-common/irc/dcc/fe-dcc-chat-messages.c | 24 ++++++------- src/fe-common/irc/fe-irc-messages.c | 16 ++++----- src/fe-common/irc/fe-modes.c | 16 +++++++-- src/perl/common/Ignore.xs | 23 +++++++++++++ 7 files changed, 92 insertions(+), 57 deletions(-) diff --git a/src/core/ignore.c b/src/core/ignore.c index 57c84623..5b89f6f4 100644 --- a/src/core/ignore.c +++ b/src/core/ignore.c @@ -82,17 +82,12 @@ static int ignore_match_pattern(IGNORE_REC *rec, const char *text) * However we also want to allow NO_ACT combined with levels, so mask it out and * match levels if set. */ #define FLAG_MSGLEVELS ( MSGLEVEL_NO_ACT | MSGLEVEL_HIDDEN ) -static int ignore_match_level(IGNORE_REC *rec, int level) +static int ignore_match_level(IGNORE_REC *rec, int level, int flags) { - if (level & FLAG_MSGLEVELS) { - int flaglevel = level & FLAG_MSGLEVELS; - int msglevel = level & ~FLAG_MSGLEVELS; - return (msglevel & rec->level) && (flaglevel & rec->level); - } else if (!(rec->level & FLAG_MSGLEVELS)) { - return (level & rec->level); - } else { - return FALSE; - } + level &= ~FLAG_MSGLEVELS; + flags &= FLAG_MSGLEVELS; + + return ((flags & rec->level) == flags) && ((level & rec->level) != 0); } #define ignore_match_nickmask(rec, nick, nickmask) \ @@ -109,7 +104,7 @@ static int ignore_match_level(IGNORE_REC *rec, int level) ((rec)->channels == NULL || ((channel) != NULL && \ strarray_find((rec)->channels, (channel)) != -1)) -static int ignore_check_replies(CHANNEL_REC *chanrec, const char *text, int level) +static int ignore_check_replies(CHANNEL_REC *chanrec, const char *text, int level, int flags) { GSList *tmp; @@ -121,7 +116,7 @@ static int ignore_check_replies(CHANNEL_REC *chanrec, const char *text, int leve IGNORE_REC *rec = tmp->data; if (rec->mask != NULL && rec->replies && - ignore_match_level(rec, level) && + ignore_match_level(rec, level, flags) && ignore_match_channel(rec, chanrec->name) && ignore_check_replies_rec(rec, chanrec, text)) return TRUE; @@ -130,8 +125,8 @@ static int ignore_check_replies(CHANNEL_REC *chanrec, const char *text, int leve return FALSE; } -int ignore_check(SERVER_REC *server, const char *nick, const char *host, - const char *channel, const char *text, int level) +int ignore_check_flags(SERVER_REC *server, const char *nick, const char *host, + const char *channel, const char *text, int level, int flags) { CHANNEL_REC *chanrec; NICK_REC *nickrec; @@ -167,7 +162,7 @@ int ignore_check(SERVER_REC *server, const char *nick, const char *host, ignore_match_channel(rec, channel) && ignore_match_nickmask(rec, nick, nickmask); if (match && - ignore_match_level(rec, level) && + ignore_match_level(rec, level, flags) && ignore_match_pattern(rec, text)) { len = rec->mask == NULL ? 0 : strlen(rec->mask); if (len > best_mask) { @@ -188,7 +183,12 @@ int ignore_check(SERVER_REC *server, const char *nick, const char *host, if (best_match || (level & MSGLEVEL_PUBLIC) == 0) return best_match; - return ignore_check_replies(chanrec, text, level); + return ignore_check_replies(chanrec, text, level, flags); +} + +int ignore_check(SERVER_REC *server, const char *nick, const char *host, + const char *channel, const char *text, int level) { + return ignore_check_flags(server, nick, host, channel, text, level, 0); } IGNORE_REC *ignore_find_full(const char *servertag, const char *mask, const char *pattern, diff --git a/src/core/ignore.h b/src/core/ignore.h index 958aa801..607ee115 100644 --- a/src/core/ignore.h +++ b/src/core/ignore.h @@ -25,6 +25,8 @@ extern GSList *ignores; int ignore_check(SERVER_REC *server, const char *nick, const char *host, const char *channel, const char *text, int level); +int ignore_check_flags(SERVER_REC *server, const char *nick, const char *host, + const char *channel, const char *text, int level, int flags); enum { IGNORE_FIND_PATTERN = 0x01, /* Match the pattern */ diff --git a/src/fe-common/core/fe-messages.c b/src/fe-common/core/fe-messages.c index 05c64d70..31a2011d 100644 --- a/src/fe-common/core/fe-messages.c +++ b/src/fe-common/core/fe-messages.c @@ -201,10 +201,10 @@ static void sig_message_public(SERVER_REC *server, const char *msg, if (for_me) level |= MSGLEVEL_HILIGHT; - if (ignore_check(server, nick, address, target, msg, level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, nick, address, target, msg, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, nick, address, target, msg, level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, nick, address, target, msg, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; if (settings_get_bool("emphasis")) @@ -263,10 +263,10 @@ static void sig_message_private(SERVER_REC *server, const char *msg, if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); - if (ignore_check(server, nick, address, NULL, msg, level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, nick, address, NULL, msg, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, nick, address, NULL, msg, level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, nick, address, NULL, msg, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; if (own) { @@ -361,10 +361,10 @@ static void sig_message_join(SERVER_REC *server, const char *channel, { int level = MSGLEVEL_JOINS; - if (ignore_check(server, nick, address, channel, NULL, level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, nick, address, channel, NULL, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, nick, address, channel, NULL, level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, nick, address, channel, NULL, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; printformat(server, channel, level, @@ -377,10 +377,10 @@ static void sig_message_part(SERVER_REC *server, const char *channel, { int level = MSGLEVEL_PARTS; - if (ignore_check(server, nick, address, channel, NULL, level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, nick, address, channel, NULL, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, nick, address, channel, NULL, level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, nick, address, channel, NULL, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; printformat(server, channel, level, @@ -399,10 +399,10 @@ static void sig_message_quit(SERVER_REC *server, const char *nick, if (ignore_check(server, nick, address, NULL, reason, MSGLEVEL_QUITS)) return; - if (ignore_check(server, nick, address, NULL, reason, level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, nick, address, NULL, reason, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, nick, address, NULL, reason, level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, nick, address, NULL, reason, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; print_channel = NULL; @@ -424,10 +424,10 @@ static void sig_message_quit(SERVER_REC *server, const char *nick, continue; } - if (ignore_check(server, nick, address, rec->visible_name, reason, MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, nick, address, rec->visible_name, reason, MSGLEVEL_QUITS, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, nick, address, rec->visible_name, reason, MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, nick, address, rec->visible_name, reason, MSGLEVEL_QUITS, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; if (print_channel == NULL || @@ -476,10 +476,10 @@ static void sig_message_kick(SERVER_REC *server, const char *channel, { int level = MSGLEVEL_KICKS; - if (ignore_check(server, kicker, address, channel, reason, level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, kicker, address, channel, reason, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, kicker, address, channel, reason, level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, kicker, address, channel, reason, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; printformat(server, channel, level, @@ -500,10 +500,10 @@ static void print_nick_change_channel(SERVER_REC *server, const char *channel, level = MSGLEVEL_NICKS; if (ownnick) level |= MSGLEVEL_NO_ACT; - if (!(level & MSGLEVEL_NO_ACT) && ignore_check(server, oldnick, address, channel, newnick, level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, oldnick, address, channel, newnick, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (!(level & MSGLEVEL_HIDDEN) && ignore_check(server, oldnick, address, channel, newnick, level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, oldnick, address, channel, newnick, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; printformat(server, channel, level, @@ -582,10 +582,10 @@ static void sig_message_topic(SERVER_REC *server, const char *channel, { int level = MSGLEVEL_TOPICS; - if (ignore_check(server, nick, address, channel, topic, level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(server, nick, address, channel, topic, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, nick, address, channel, topic, level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(server, nick, address, channel, topic, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; printformat(server, channel, level, diff --git a/src/fe-common/irc/dcc/fe-dcc-chat-messages.c b/src/fe-common/irc/dcc/fe-dcc-chat-messages.c index 3a45a36b..9ae88c8e 100644 --- a/src/fe-common/irc/dcc/fe-dcc-chat-messages.c +++ b/src/fe-common/irc/dcc/fe-dcc-chat-messages.c @@ -92,12 +92,12 @@ static void sig_message_dcc(CHAT_DCC_REC *dcc, const char *msg) tag = g_strconcat("=", dcc->id, NULL); query = query_find(NULL, tag); - if (ignore_check(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, - level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, + level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, - level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, + level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; format_create_dest_tag(&dest, dcc->server, dcc->servertag, tag, @@ -118,12 +118,12 @@ static void sig_message_dcc_action(CHAT_DCC_REC *dcc, const char *msg) tag = g_strconcat("=", dcc->id, NULL); query = query_find(NULL, tag); - if (ignore_check(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, - level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, + level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, - level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, + level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; format_create_dest_tag(&dest, dcc->server, dcc->servertag, tag, @@ -143,12 +143,12 @@ static void sig_message_dcc_ctcp(CHAT_DCC_REC *dcc, const char *cmd, tag = g_strconcat("=", dcc->id, NULL); - if (ignore_check(SERVER(dcc->server), tag, dcc->addrstr, NULL, cmd, - level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, cmd, + level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(SERVER(dcc->server), tag, dcc->addrstr, NULL, cmd, - level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, cmd, + level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; format_create_dest_tag(&dest, dcc->server, dcc->servertag, tag, diff --git a/src/fe-common/irc/fe-irc-messages.c b/src/fe-common/irc/fe-irc-messages.c index e8558a17..86e0836c 100644 --- a/src/fe-common/irc/fe-irc-messages.c +++ b/src/fe-common/irc/fe-irc-messages.c @@ -158,12 +158,12 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, if (ignore_check(SERVER(server), nick, address, target, msg, level)) return; - if (ignore_check(SERVER(server), nick, address, target, msg, - level | MSGLEVEL_NO_ACT)) + if (ignore_check_flags(SERVER(server), nick, address, target, msg, + level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(SERVER(server), nick, address, target, msg, - level | MSGLEVEL_HIDDEN)) + if (ignore_check_flags(SERVER(server), nick, address, target, msg, + level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; if (server_ischannel(SERVER(server), target)) { @@ -240,14 +240,14 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg, msg, level)) return; - if (ignore_check(server, nick, address, + if (ignore_check_flags(server, nick, address, server_ischannel(SERVER(server), target) ? target : NULL, - msg, level | MSGLEVEL_NO_ACT)) + msg, level, MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; - if (ignore_check(server, nick, address, + if (ignore_check_flags(server, nick, address, server_ischannel(SERVER(server), target) ? target : NULL, - msg, level | MSGLEVEL_HIDDEN)) + msg, level, MSGLEVEL_HIDDEN)) level |= MSGLEVEL_HIDDEN; if (server_ischannel(SERVER(server), target)) { diff --git a/src/fe-common/irc/fe-modes.c b/src/fe-common/irc/fe-modes.c index 53e56c97..ad829757 100644 --- a/src/fe-common/irc/fe-modes.c +++ b/src/fe-common/irc/fe-modes.c @@ -162,19 +162,29 @@ static void sig_message_mode(IRC_SERVER_REC *server, const char *channel, const char *nick, const char *addr, const char *mode) { + int level = MSGLEVEL_MODES; + if (nick == NULL) nick = server->real_address; if (ignore_check(SERVER(server), nick, addr, channel, mode, MSGLEVEL_MODES)) return; + if (ignore_check_flags(SERVER(server), nick, addr, channel, + mode, MSGLEVEL_MODES, MSGLEVEL_NO_ACT)) + level |= MSGLEVEL_NO_ACT; + + if (ignore_check_flags(SERVER(server), nick, addr, channel, + mode, MSGLEVEL_MODES, MSGLEVEL_HIDDEN)) + level |= MSGLEVEL_HIDDEN; + if (!server_ischannel(SERVER(server), channel)) { /* user mode change */ - printformat(server, NULL, MSGLEVEL_MODES, + printformat(server, NULL, level, IRCTXT_USERMODE_CHANGE, mode, channel); } else if (addr == NULL) { /* channel mode changed by server */ - printformat(server, channel, MSGLEVEL_MODES, + printformat(server, channel, level, IRCTXT_SERVER_CHANMODE_CHANGE, channel, mode, nick); } else { @@ -187,7 +197,7 @@ static void sig_message_mode(IRC_SERVER_REC *server, const char *channel, if (chanrec != NULL && g_ascii_strcasecmp(nick, server->nick) != 0) msg_multi_mode(chanrec, nick, addr, mode); else { - printformat(server, channel, MSGLEVEL_MODES, + printformat(server, channel, level, IRCTXT_CHANMODE_CHANGE, channel, mode, nick, addr); } diff --git a/src/perl/common/Ignore.xs b/src/perl/common/Ignore.xs index 8dfd0ad3..144497de 100644 --- a/src/perl/common/Ignore.xs +++ b/src/perl/common/Ignore.xs @@ -25,6 +25,19 @@ CODE: OUTPUT: RETVAL +int +ignore_check_flags(nick, host, channel, text, level, flags) + char *nick + char *host + char *channel + char *text + int level + int flags +CODE: + RETVAL = ignore_check_flags(NULL, nick, host, channel, text, level, flags); +OUTPUT: + RETVAL + #******************************* MODULE = Irssi::Ignore PACKAGE = Irssi::Server #******************************* @@ -38,6 +51,16 @@ ignore_check(server, nick, host, channel, text, level) char *text int level +int +ignore_check_flags(server, nick, host, channel, text, level, flags) + Irssi::Server server + char *nick + char *host + char *channel + char *text + int level + int flags + #******************************* MODULE = Irssi::Ignore PACKAGE = Irssi::Ignore PREFIX = ignore_ #******************************* From 7e9f8c694b38ae785771fb837fb0a4a434b614d3 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Mon, 17 Sep 2018 12:48:42 +0200 Subject: [PATCH 2/4] simplify ignore hidden/no_act code --- src/core/ignore.c | 16 +++++ src/core/ignore.h | 2 + src/fe-common/core/fe-messages.c | 67 ++++---------------- src/fe-common/irc/dcc/fe-dcc-chat-messages.c | 27 ++------ src/fe-common/irc/fe-irc-messages.c | 31 ++------- src/fe-common/irc/fe-modes.c | 12 +--- 6 files changed, 45 insertions(+), 110 deletions(-) diff --git a/src/core/ignore.c b/src/core/ignore.c index 5b89f6f4..58999709 100644 --- a/src/core/ignore.c +++ b/src/core/ignore.c @@ -191,6 +191,22 @@ int ignore_check(SERVER_REC *server, const char *nick, const char *host, return ignore_check_flags(server, nick, host, channel, text, level, 0); } +int ignore_check_plus(SERVER_REC *server, const char *nick, const char *address, + const char *target, const char *msg, int *level, int test_ignore) { + int olevel = *level; + + if (test_ignore && ignore_check(server, nick, address, target, msg, olevel)) + return TRUE; + + if (ignore_check_flags(server, nick, address, target, msg, olevel, MSGLEVEL_NO_ACT)) + *level |= MSGLEVEL_NO_ACT; + + if (ignore_check_flags(server, nick, address, target, msg, olevel, MSGLEVEL_HIDDEN)) + *level |= MSGLEVEL_HIDDEN; + + return FALSE; +} + IGNORE_REC *ignore_find_full(const char *servertag, const char *mask, const char *pattern, char **channels, const int flags) { diff --git a/src/core/ignore.h b/src/core/ignore.h index 607ee115..20c5475e 100644 --- a/src/core/ignore.h +++ b/src/core/ignore.h @@ -27,6 +27,8 @@ int ignore_check(SERVER_REC *server, const char *nick, const char *host, const char *channel, const char *text, int level); int ignore_check_flags(SERVER_REC *server, const char *nick, const char *host, const char *channel, const char *text, int level, int flags); +int ignore_check_plus(SERVER_REC *server, const char *nick, const char *host, + const char *channel, const char *text, int *level, int test_ignore); enum { IGNORE_FIND_PATTERN = 0x01, /* Match the pattern */ diff --git a/src/fe-common/core/fe-messages.c b/src/fe-common/core/fe-messages.c index 31a2011d..12cb1055 100644 --- a/src/fe-common/core/fe-messages.c +++ b/src/fe-common/core/fe-messages.c @@ -201,11 +201,7 @@ static void sig_message_public(SERVER_REC *server, const char *msg, if (for_me) level |= MSGLEVEL_HILIGHT; - if (ignore_check_flags(server, nick, address, target, msg, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, nick, address, target, msg, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(server, nick, address, target, msg, &level, FALSE); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis((WI_ITEM_REC *) chanrec, msg); @@ -263,11 +259,7 @@ static void sig_message_private(SERVER_REC *server, const char *msg, if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); - if (ignore_check_flags(server, nick, address, NULL, msg, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, nick, address, NULL, msg, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(server, nick, address, NULL, msg, &level, FALSE); if (own) { printformat(server, target, level, @@ -361,11 +353,7 @@ static void sig_message_join(SERVER_REC *server, const char *channel, { int level = MSGLEVEL_JOINS; - if (ignore_check_flags(server, nick, address, channel, NULL, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, nick, address, channel, NULL, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(server, nick, address, channel, NULL, &level, FALSE); printformat(server, channel, level, TXT_JOIN, nick, address, channel); @@ -377,11 +365,7 @@ static void sig_message_part(SERVER_REC *server, const char *channel, { int level = MSGLEVEL_PARTS; - if (ignore_check_flags(server, nick, address, channel, NULL, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, nick, address, channel, NULL, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(server, nick, address, channel, NULL, &level, FALSE); printformat(server, channel, level, TXT_PART, nick, address, channel, reason); @@ -396,15 +380,9 @@ static void sig_message_quit(SERVER_REC *server, const char *nick, char *print_channel; int once, count, level = MSGLEVEL_QUITS; - if (ignore_check(server, nick, address, NULL, reason, MSGLEVEL_QUITS)) + if (ignore_check_plus(server, nick, address, NULL, reason, &level, TRUE)) return; - if (ignore_check_flags(server, nick, address, NULL, reason, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, nick, address, NULL, reason, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; - print_channel = NULL; once = settings_get_bool("show_quit_once"); @@ -418,18 +396,12 @@ static void sig_message_quit(SERVER_REC *server, const char *nick, if (!nicklist_find(rec, nick)) continue; - if (ignore_check(server, nick, address, rec->visible_name, - reason, MSGLEVEL_QUITS)) { + if (ignore_check_plus(server, nick, address, rec->visible_name, + reason, &level, TRUE)) { count++; continue; } - if (ignore_check_flags(server, nick, address, rec->visible_name, reason, MSGLEVEL_QUITS, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, nick, address, rec->visible_name, reason, MSGLEVEL_QUITS, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; - if (print_channel == NULL || active_win->active == (WI_ITEM_REC *) rec) print_channel = rec->visible_name; @@ -476,11 +448,7 @@ static void sig_message_kick(SERVER_REC *server, const char *channel, { int level = MSGLEVEL_KICKS; - if (ignore_check_flags(server, kicker, address, channel, reason, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, kicker, address, channel, reason, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(server, kicker, address, channel, reason, &level, FALSE); printformat(server, channel, level, TXT_KICK, nick, channel, kicker, reason, address); @@ -493,18 +461,11 @@ static void print_nick_change_channel(SERVER_REC *server, const char *channel, { int level; - if (ignore_check(server, oldnick, address, - channel, newnick, MSGLEVEL_NICKS)) - return; - level = MSGLEVEL_NICKS; if (ownnick) level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, oldnick, address, channel, newnick, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, oldnick, address, channel, newnick, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + if (ignore_check_plus(server, oldnick, address, + channel, newnick, &level, TRUE)) + return; printformat(server, channel, level, ownnick ? TXT_YOUR_NICK_CHANGED : TXT_NICK_CHANGED, @@ -582,11 +543,7 @@ static void sig_message_topic(SERVER_REC *server, const char *channel, { int level = MSGLEVEL_TOPICS; - if (ignore_check_flags(server, nick, address, channel, topic, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, nick, address, channel, topic, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(server, nick, address, channel, topic, &level, FALSE); printformat(server, channel, level, *topic != '\0' ? TXT_NEW_TOPIC : TXT_TOPIC_UNSET, diff --git a/src/fe-common/irc/dcc/fe-dcc-chat-messages.c b/src/fe-common/irc/dcc/fe-dcc-chat-messages.c index 9ae88c8e..41cea64c 100644 --- a/src/fe-common/irc/dcc/fe-dcc-chat-messages.c +++ b/src/fe-common/irc/dcc/fe-dcc-chat-messages.c @@ -92,13 +92,8 @@ static void sig_message_dcc(CHAT_DCC_REC *dcc, const char *msg) tag = g_strconcat("=", dcc->id, NULL); query = query_find(NULL, tag); - if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, - level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, - level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, + &level, FALSE); format_create_dest_tag(&dest, dcc->server, dcc->servertag, tag, level, NULL); @@ -118,13 +113,8 @@ static void sig_message_dcc_action(CHAT_DCC_REC *dcc, const char *msg) tag = g_strconcat("=", dcc->id, NULL); query = query_find(NULL, tag); - if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, - level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, - level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(SERVER(dcc->server), tag, dcc->addrstr, NULL, msg, + &level, FALSE); format_create_dest_tag(&dest, dcc->server, dcc->servertag, tag, level, NULL); @@ -143,13 +133,8 @@ static void sig_message_dcc_ctcp(CHAT_DCC_REC *dcc, const char *cmd, tag = g_strconcat("=", dcc->id, NULL); - if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, cmd, - level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(SERVER(dcc->server), tag, dcc->addrstr, NULL, cmd, - level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; + ignore_check_plus(SERVER(dcc->server), tag, dcc->addrstr, NULL, cmd, + &level, FALSE); format_create_dest_tag(&dest, dcc->server, dcc->servertag, tag, level, NULL); diff --git a/src/fe-common/irc/fe-irc-messages.c b/src/fe-common/irc/fe-irc-messages.c index 86e0836c..89c501a8 100644 --- a/src/fe-common/irc/fe-irc-messages.c +++ b/src/fe-common/irc/fe-irc-messages.c @@ -155,17 +155,9 @@ static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, level = MSGLEVEL_ACTIONS | (server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); - if (ignore_check(SERVER(server), nick, address, target, msg, level)) + if (ignore_check_plus(SERVER(server), nick, address, target, msg, &level, TRUE)) return; - if (ignore_check_flags(SERVER(server), nick, address, target, msg, - level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(SERVER(server), nick, address, target, msg, - level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; - if (server_ischannel(SERVER(server), target)) { item = irc_channel_find(server, target); } else { @@ -226,30 +218,21 @@ static void sig_message_irc_notice(SERVER_REC *server, const char *msg, target = fe_channel_skip_prefix(IRC_SERVER(server), target); if (address == NULL || *address == '\0') { + level = MSGLEVEL_SNOTES; /* notice from server */ - if (!ignore_check(server, nick, "", - target, msg, MSGLEVEL_SNOTES)) { - printformat(server, target, MSGLEVEL_SNOTES, + if (!ignore_check_plus(server, nick, "", + target, msg, &level, TRUE)) { + printformat(server, target, level, IRCTXT_NOTICE_SERVER, nick, msg); } return; } - if (ignore_check(server, nick, address, + if (ignore_check_plus(server, nick, address, server_ischannel(SERVER(server), target) ? target : NULL, - msg, level)) + msg, &level, TRUE)) return; - if (ignore_check_flags(server, nick, address, - server_ischannel(SERVER(server), target) ? target : NULL, - msg, level, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(server, nick, address, - server_ischannel(SERVER(server), target) ? target : NULL, - msg, level, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; - if (server_ischannel(SERVER(server), target)) { /* notice in some channel */ printformat(server, target, level, diff --git a/src/fe-common/irc/fe-modes.c b/src/fe-common/irc/fe-modes.c index ad829757..dfe65c2d 100644 --- a/src/fe-common/irc/fe-modes.c +++ b/src/fe-common/irc/fe-modes.c @@ -166,18 +166,10 @@ static void sig_message_mode(IRC_SERVER_REC *server, const char *channel, if (nick == NULL) nick = server->real_address; - if (ignore_check(SERVER(server), nick, addr, channel, - mode, MSGLEVEL_MODES)) + if (ignore_check_plus(SERVER(server), nick, addr, channel, + mode, &level, TRUE)) return; - if (ignore_check_flags(SERVER(server), nick, addr, channel, - mode, MSGLEVEL_MODES, MSGLEVEL_NO_ACT)) - level |= MSGLEVEL_NO_ACT; - - if (ignore_check_flags(SERVER(server), nick, addr, channel, - mode, MSGLEVEL_MODES, MSGLEVEL_HIDDEN)) - level |= MSGLEVEL_HIDDEN; - if (!server_ischannel(SERVER(server), channel)) { /* user mode change */ printformat(server, NULL, level, From 011d9437d158ae815cfab55a5e2c0b0a57430353 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Mon, 17 Sep 2018 13:08:43 +0200 Subject: [PATCH 3/4] oops --- src/core/ignore.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/ignore.c b/src/core/ignore.c index 58999709..9bfcfaf5 100644 --- a/src/core/ignore.c +++ b/src/core/ignore.c @@ -87,7 +87,7 @@ static int ignore_match_level(IGNORE_REC *rec, int level, int flags) level &= ~FLAG_MSGLEVELS; flags &= FLAG_MSGLEVELS; - return ((flags & rec->level) == flags) && ((level & rec->level) != 0); + return ((FLAG_MSGLEVELS & rec->level) == flags) && ((level & rec->level) != 0); } #define ignore_match_nickmask(rec, nick, nickmask) \ From f231a59e81a7487dc46ad58fbdbde90d3b750435 Mon Sep 17 00:00:00 2001 From: ailin-nemui Date: Thu, 20 Sep 2018 17:50:35 +0200 Subject: [PATCH 4/4] properly document the ignore_match_level so I understand it next time --- src/core/ignore.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/core/ignore.c b/src/core/ignore.c index 9bfcfaf5..371da83b 100644 --- a/src/core/ignore.c +++ b/src/core/ignore.c @@ -87,7 +87,17 @@ static int ignore_match_level(IGNORE_REC *rec, int level, int flags) level &= ~FLAG_MSGLEVELS; flags &= FLAG_MSGLEVELS; - return ((FLAG_MSGLEVELS & rec->level) == flags) && ((level & rec->level) != 0); + if (!flags) { + /* case: we are not checking special flags. then, the + record must not have any flags either, but it must + have some of the levels */ + return !(FLAG_MSGLEVELS & rec->level) && (level & rec->level); + } else { + /* case: we want to test if some special flags + apply. then, the record must have some of the + flags and some of the levels */ + return (flags & rec->level) && (level & rec->level); + } } #define ignore_match_nickmask(rec, nick, nickmask) \