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_ #*******************************