summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorailin-nemui <ailin-nemui@users.noreply.github.com>2016-01-11 21:04:27 +0100
committerailin-nemui <ailin-nemui@users.noreply.github.com>2016-01-11 21:04:27 +0100
commitd16f57b3788ed780940151454be355923512c9f3 (patch)
tree7aba8f402e84929ae1dee4d108d56dcd58c6f2ee /src
parent12f4f1fa24943e4a46e4223d7c98d5fcf721f906 (diff)
parentdbee606c60c4d8d7c6e5cabd1241fc182ae6c4a3 (diff)
downloadirssi-d16f57b3788ed780940151454be355923512c9f3.zip
Merge pull request #390 from LemonBoy/ignore-find
Clean up the ignore_find API to make it more powerful.
Diffstat (limited to 'src')
-rw-r--r--src/core/ignore.c38
-rw-r--r--src/core/ignore.h10
-rw-r--r--src/fe-common/core/fe-ignore.c8
-rw-r--r--src/irc/flood/autoignore.c2
4 files changed, 41 insertions, 17 deletions
diff --git a/src/core/ignore.c b/src/core/ignore.c
index fd3c8a38..8d5a27c2 100644
--- a/src/core/ignore.c
+++ b/src/core/ignore.c
@@ -186,15 +186,8 @@ int ignore_check(SERVER_REC *server, const char *nick, const char *host,
return ignore_check_replies(chanrec, text, level);
}
-IGNORE_REC *ignore_find(const char *servertag, const char *mask,
- char **channels)
-{
- return ignore_find_noact(servertag, mask, channels, 0);
-}
-
-
-IGNORE_REC *ignore_find_noact(const char *servertag, const char *mask,
- char **channels, int noact)
+IGNORE_REC *ignore_find_full(const char *servertag, const char *mask, const char *pattern,
+ char **channels, const int flags)
{
GSList *tmp;
char **chan;
@@ -216,18 +209,29 @@ IGNORE_REC *ignore_find_noact(const char *servertag, const char *mask,
continue;
}
- if (noact && (rec->level & MSGLEVEL_NO_ACT) == 0)
+ if ((flags & IGNORE_FIND_NOACT) && (rec->level & MSGLEVEL_NO_ACT) == 0)
continue;
- if (!noact && (rec->level & MSGLEVEL_NO_ACT) != 0)
+ if (!(flags & IGNORE_FIND_NOACT) && (rec->level & MSGLEVEL_NO_ACT) != 0)
continue;
if ((rec->mask == NULL && mask != NULL) ||
- (rec->mask != NULL && mask == NULL)) continue;
+ (rec->mask != NULL && mask == NULL))
+ continue;
if (rec->mask != NULL && g_ascii_strcasecmp(rec->mask, mask) != 0)
continue;
+ /* match the pattern too if requested */
+ if (flags & IGNORE_FIND_PATTERN) {
+ if ((rec->pattern == NULL && pattern != NULL) ||
+ (rec->pattern != NULL && pattern == NULL))
+ continue;
+
+ if (rec->pattern != NULL && g_ascii_strcasecmp(rec->pattern, pattern) != 0)
+ continue;
+ }
+
if ((channels == NULL && rec->channels == NULL))
return rec; /* no channels - ok */
@@ -253,6 +257,16 @@ IGNORE_REC *ignore_find_noact(const char *servertag, const char *mask,
return NULL;
}
+IGNORE_REC *ignore_find(const char *servertag, const char *mask, char **channels)
+{
+ return ignore_find_full(servertag, mask, NULL, channels, 0);
+}
+
+IGNORE_REC *ignore_find_noact(const char *servertag, const char *mask, char **channels, int noact)
+{
+ return ignore_find_full(servertag, mask, NULL, channels, IGNORE_FIND_NOACT);
+}
+
static void ignore_set_config(IGNORE_REC *rec)
{
CONFIG_NODE *node;
diff --git a/src/core/ignore.h b/src/core/ignore.h
index 46025d4c..f889740f 100644
--- a/src/core/ignore.h
+++ b/src/core/ignore.h
@@ -31,6 +31,16 @@ extern GSList *ignores;
int ignore_check(SERVER_REC *server, const char *nick, const char *host,
const char *channel, const char *text, int level);
+enum {
+ IGNORE_FIND_PATTERN = 0x01, // Match the pattern
+ IGNORE_FIND_NOACT = 0x02, // Exclude the targets with NOACT level
+};
+
+IGNORE_REC *ignore_find_full (const char *servertag, const char *mask, const char *pattern,
+ char **channels, const int flags);
+
+// Convenience wrappers around ignore_find_full, for compatibility purpose
+
IGNORE_REC *ignore_find(const char *servertag, const char *mask, char **channels);
IGNORE_REC *ignore_find_noact(const char *servertag, const char *mask, char **channels, int noact);
diff --git a/src/fe-common/core/fe-ignore.c b/src/fe-common/core/fe-ignore.c
index d2f9de27..a809ac91 100644
--- a/src/fe-common/core/fe-ignore.c
+++ b/src/fe-common/core/fe-ignore.c
@@ -158,8 +158,8 @@ static void cmd_ignore(const char *data)
channels = (chanarg == NULL || *chanarg == '\0') ? NULL :
g_strsplit(chanarg, ",", -1);
- rec = patternarg != NULL ? NULL: ignore_find_noact(servertag, mask, channels,
- (level & MSGLEVEL_NO_ACT));
+ rec = ignore_find_full(servertag, mask, patternarg, channels,
+ IGNORE_FIND_PATTERN | ((level & MSGLEVEL_NO_ACT) ? IGNORE_FIND_NOACT : 0));
new_ignore = rec == NULL;
if (rec == NULL) {
@@ -237,9 +237,9 @@ static void cmd_unignore(const char *data)
chans[0] = mask;
mask = NULL;
}
- rec = ignore_find_noact("*", mask, (char **) chans, 0);
+ rec = ignore_find_full("*", mask, NULL, (char **) chans, 0);
if (rec == NULL) {
- rec = ignore_find_noact("*", mask, (char **) chans, 1);
+ rec = ignore_find_full("*", mask, NULL, (char **) chans, IGNORE_FIND_NOACT);
}
}
diff --git a/src/irc/flood/autoignore.c b/src/irc/flood/autoignore.c
index 250a1fe8..86ff3ec5 100644
--- a/src/irc/flood/autoignore.c
+++ b/src/irc/flood/autoignore.c
@@ -66,7 +66,7 @@ static void sig_flood(IRC_SERVER_REC *server, const char *nick, const char *host
mask = g_strdup_printf("%s!%s", nick, host);
if (level & check_level) {
- rec = ignore_find(server->tag, mask, NULL);
+ rec = ignore_find_full(server->tag, mask, NULL, NULL, 0);
if (rec == NULL)
autoignore_add(server, mask, level);
else