mirror of
https://github.com/irssi/irssi.git
synced 2024-12-04 14:46:39 -05:00
Merge pull request #390 from LemonBoy/ignore-find
Clean up the ignore_find API to make it more powerful.
This commit is contained in:
commit
d16f57b378
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user