Rename ignore code to filter
parent
6160b3f18c
commit
5a490945ea
2
Makefile
2
Makefile
|
@ -13,8 +13,8 @@ OBJS += command.o
|
|||
OBJS += complete.o
|
||||
OBJS += config.o
|
||||
OBJS += edit.o
|
||||
OBJS += filter.o
|
||||
OBJS += handle.o
|
||||
OBJS += ignore.o
|
||||
OBJS += irc.o
|
||||
OBJS += log.o
|
||||
OBJS += ui.o
|
||||
|
|
4
README.7
4
README.7
|
@ -1,4 +1,4 @@
|
|||
.Dd November 11, 2020
|
||||
.Dd January 16, 2021
|
||||
.Dt README 7
|
||||
.Os "Causal Agency"
|
||||
.\" To view this file, run: man ./README.7
|
||||
|
@ -167,7 +167,7 @@ line editing
|
|||
tab complete
|
||||
.It Pa url.c
|
||||
URL detection
|
||||
.It Pa ignore.c
|
||||
.It Pa filter.c
|
||||
message filtering
|
||||
.It Pa log.c
|
||||
chat logging
|
||||
|
|
2
chat.c
2
chat.c
|
@ -243,7 +243,7 @@ int main(int argc, char *argv[]) {
|
|||
break; case 'e': sasl = true;
|
||||
break; case 'g': genCert(optarg);
|
||||
break; case 'h': host = optarg;
|
||||
break; case 'i': ignoreAdd(optarg);
|
||||
break; case 'i': filterAdd(Ice, optarg);
|
||||
break; case 'j': self.join = optarg;
|
||||
break; case 'k': priv = optarg;
|
||||
break; case 'l': logEnable = true;
|
||||
|
|
15
chat.h
15
chat.h
|
@ -361,17 +361,18 @@ void urlCopyMatch(uint id, const char *str);
|
|||
int urlSave(FILE *file);
|
||||
void urlLoad(FILE *file, size_t version);
|
||||
|
||||
enum { IgnoreCap = 64 };
|
||||
extern struct Ignore {
|
||||
enum { FilterCap = 64 };
|
||||
extern struct Filter {
|
||||
enum Heat heat;
|
||||
char *mask;
|
||||
char *cmd;
|
||||
char *chan;
|
||||
char *mesg;
|
||||
} ignores[IgnoreCap];
|
||||
struct Ignore ignoreParse(char *pattern);
|
||||
struct Ignore ignoreAdd(const char *pattern);
|
||||
bool ignoreRemove(struct Ignore ignore);
|
||||
enum Heat ignoreCheck(enum Heat heat, uint id, const struct Message *msg);
|
||||
} filters[FilterCap];
|
||||
struct Filter filterParse(enum Heat heat, char *pattern);
|
||||
struct Filter filterAdd(enum Heat heat, const char *pattern);
|
||||
bool filterRemove(struct Filter filter);
|
||||
enum Heat filterCheck(enum Heat heat, uint id, const struct Message *msg);
|
||||
|
||||
extern bool logEnable;
|
||||
void logFormat(uint id, const time_t *time, const char *format, ...)
|
||||
|
|
23
command.c
23
command.c
|
@ -388,19 +388,20 @@ static void commandCopy(uint id, char *params) {
|
|||
|
||||
static void commandIgnore(uint id, char *params) {
|
||||
if (params) {
|
||||
struct Ignore ignore = ignoreAdd(params);
|
||||
struct Filter filter = filterAdd(Ice, params);
|
||||
uiFormat(
|
||||
id, Cold, NULL, "Ignoring \3%02d%s %s %s %s",
|
||||
Brown, ignore.mask,
|
||||
(ignore.cmd ?: ""), (ignore.chan ?: ""), (ignore.mesg ?: "")
|
||||
Brown, filter.mask,
|
||||
(filter.cmd ?: ""), (filter.chan ?: ""), (filter.mesg ?: "")
|
||||
);
|
||||
} else {
|
||||
for (size_t i = 0; i < IgnoreCap && ignores[i].mask; ++i) {
|
||||
for (size_t i = 0; i < FilterCap && filters[i].mask; ++i) {
|
||||
if (filters[i].heat != Ice) continue;
|
||||
uiFormat(
|
||||
Network, Warm, NULL, "Ignoring \3%02d%s %s %s %s",
|
||||
Brown, ignores[i].mask,
|
||||
(ignores[i].cmd ?: ""), (ignores[i].chan ?: ""),
|
||||
(ignores[i].mesg ?: "")
|
||||
Brown, filters[i].mask,
|
||||
(filters[i].cmd ?: ""), (filters[i].chan ?: ""),
|
||||
(filters[i].mesg ?: "")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -408,12 +409,12 @@ static void commandIgnore(uint id, char *params) {
|
|||
|
||||
static void commandUnignore(uint id, char *params) {
|
||||
if (!params) return;
|
||||
struct Ignore ignore = ignoreParse(params);
|
||||
bool found = ignoreRemove(ignore);
|
||||
struct Filter filter = filterParse(Ice, params);
|
||||
bool found = filterRemove(filter);
|
||||
uiFormat(
|
||||
id, Cold, NULL, "%s ignoring \3%02d%s %s %s %s",
|
||||
(found ? "No longer" : "Not"), Brown, ignore.mask,
|
||||
(ignore.cmd ?: ""), (ignore.chan ?: ""), (ignore.mesg ?: "")
|
||||
(found ? "No longer" : "Not"), Brown, filter.mask,
|
||||
(filter.cmd ?: ""), (filter.chan ?: ""), (filter.mesg ?: "")
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -35,20 +35,20 @@
|
|||
|
||||
#include "chat.h"
|
||||
|
||||
struct Ignore ignores[IgnoreCap];
|
||||
struct Filter filters[FilterCap];
|
||||
static size_t len;
|
||||
|
||||
struct Ignore ignoreParse(char *pattern) {
|
||||
struct Ignore ignore = {0};
|
||||
ignore.mask = strsep(&pattern, " ");
|
||||
ignore.cmd = strsep(&pattern, " ");
|
||||
ignore.chan = strsep(&pattern, " ");
|
||||
ignore.mesg = pattern;
|
||||
return ignore;
|
||||
struct Filter filterParse(enum Heat heat, char *pattern) {
|
||||
struct Filter filter = { .heat = heat };
|
||||
filter.mask = strsep(&pattern, " ");
|
||||
filter.cmd = strsep(&pattern, " ");
|
||||
filter.chan = strsep(&pattern, " ");
|
||||
filter.mesg = pattern;
|
||||
return filter;
|
||||
}
|
||||
|
||||
struct Ignore ignoreAdd(const char *pattern) {
|
||||
if (len == IgnoreCap) errx(EX_CONFIG, "ignore limit exceeded");
|
||||
struct Filter filterAdd(enum Heat heat, const char *pattern) {
|
||||
if (len == FilterCap) errx(EX_CONFIG, "filter limit exceeded");
|
||||
char *own;
|
||||
if (!strchr(pattern, '!') && !strchr(pattern, ' ')) {
|
||||
int n = asprintf(&own, "%s!*@*", pattern);
|
||||
|
@ -57,48 +57,49 @@ struct Ignore ignoreAdd(const char *pattern) {
|
|||
own = strdup(pattern);
|
||||
if (!own) err(EX_OSERR, "strdup");
|
||||
}
|
||||
struct Ignore ignore = ignoreParse(own);
|
||||
ignores[len++] = ignore;
|
||||
return ignore;
|
||||
struct Filter filter = filterParse(heat, own);
|
||||
filters[len++] = filter;
|
||||
return filter;
|
||||
}
|
||||
|
||||
bool ignoreRemove(struct Ignore ignore) {
|
||||
bool filterRemove(struct Filter filter) {
|
||||
bool found = false;
|
||||
for (size_t i = len - 1; i < len; --i) {
|
||||
if (!ignores[i].cmd != !ignore.cmd) continue;
|
||||
if (!ignores[i].chan != !ignore.chan) continue;
|
||||
if (!ignores[i].mesg != !ignore.mesg) continue;
|
||||
if (strcasecmp(ignores[i].mask, ignore.mask)) continue;
|
||||
if (ignore.cmd && strcasecmp(ignores[i].cmd, ignore.cmd)) continue;
|
||||
if (ignore.chan && strcasecmp(ignores[i].chan, ignore.chan)) continue;
|
||||
if (ignore.mesg && strcasecmp(ignores[i].mesg, ignore.mesg)) continue;
|
||||
free(ignores[i].mask);
|
||||
ignores[i] = ignores[--len];
|
||||
ignores[len] = (struct Ignore) {0};
|
||||
if (filters[i].heat != filter.heat) continue;
|
||||
if (!filters[i].cmd != !filter.cmd) continue;
|
||||
if (!filters[i].chan != !filter.chan) continue;
|
||||
if (!filters[i].mesg != !filter.mesg) continue;
|
||||
if (strcasecmp(filters[i].mask, filter.mask)) continue;
|
||||
if (filter.cmd && strcasecmp(filters[i].cmd, filter.cmd)) continue;
|
||||
if (filter.chan && strcasecmp(filters[i].chan, filter.chan)) continue;
|
||||
if (filter.mesg && strcasecmp(filters[i].mesg, filter.mesg)) continue;
|
||||
free(filters[i].mask);
|
||||
filters[i] = filters[--len];
|
||||
filters[len] = (struct Filter) {0};
|
||||
found = true;
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
static bool ignoreTest(
|
||||
struct Ignore ignore, const char *mask, uint id, const struct Message *msg
|
||||
static bool filterTest(
|
||||
struct Filter filter, const char *mask, uint id, const struct Message *msg
|
||||
) {
|
||||
if (fnmatch(ignore.mask, mask, FNM_CASEFOLD)) return false;
|
||||
if (!ignore.cmd) return true;
|
||||
if (fnmatch(ignore.cmd, msg->cmd, FNM_CASEFOLD)) return false;
|
||||
if (!ignore.chan) return true;
|
||||
if (fnmatch(ignore.chan, idNames[id], FNM_CASEFOLD)) return false;
|
||||
if (!ignore.mesg) return true;
|
||||
if (fnmatch(filter.mask, mask, FNM_CASEFOLD)) return false;
|
||||
if (!filter.cmd) return true;
|
||||
if (fnmatch(filter.cmd, msg->cmd, FNM_CASEFOLD)) return false;
|
||||
if (!filter.chan) return true;
|
||||
if (fnmatch(filter.chan, idNames[id], FNM_CASEFOLD)) return false;
|
||||
if (!filter.mesg) return true;
|
||||
if (!msg->params[1]) return false;
|
||||
return !fnmatch(ignore.mesg, msg->params[1], FNM_CASEFOLD);
|
||||
return !fnmatch(filter.mesg, msg->params[1], FNM_CASEFOLD);
|
||||
}
|
||||
|
||||
enum Heat ignoreCheck(enum Heat heat, uint id, const struct Message *msg) {
|
||||
enum Heat filterCheck(enum Heat heat, uint id, const struct Message *msg) {
|
||||
if (!len) return heat;
|
||||
char mask[512];
|
||||
snprintf(mask, sizeof(mask), "%s!%s@%s", msg->nick, msg->user, msg->host);
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
if (ignoreTest(ignores[i], mask, id, msg)) return Ice;
|
||||
if (filterTest(filters[i], mask, id, msg)) return filters[i].heat;
|
||||
}
|
||||
return heat;
|
||||
}
|
16
handle.c
16
handle.c
|
@ -343,7 +343,7 @@ static void handleJoin(struct Message *msg) {
|
|||
msg->params[2] = NULL;
|
||||
}
|
||||
uiFormat(
|
||||
id, ignoreCheck(Cold, id, msg), tagTime(msg),
|
||||
id, filterCheck(Cold, id, msg), tagTime(msg),
|
||||
"\3%02d%s\3\t%s%s%sarrives in \3%02d%s\3",
|
||||
hash(msg->user), msg->nick,
|
||||
(msg->params[2] ? "(" : ""),
|
||||
|
@ -373,7 +373,7 @@ static void handlePart(struct Message *msg) {
|
|||
completeClear(id);
|
||||
}
|
||||
completeRemove(id, msg->nick);
|
||||
enum Heat heat = ignoreCheck(Cold, id, msg);
|
||||
enum Heat heat = filterCheck(Cold, id, msg);
|
||||
if (heat > Ice) urlScan(id, msg->nick, msg->params[1]);
|
||||
uiFormat(
|
||||
id, heat, tagTime(msg),
|
||||
|
@ -423,7 +423,7 @@ static void handleNick(struct Message *msg) {
|
|||
set(&idNames[id], msg->params[0]);
|
||||
}
|
||||
uiFormat(
|
||||
id, ignoreCheck(Cold, id, msg), tagTime(msg),
|
||||
id, filterCheck(Cold, id, msg), tagTime(msg),
|
||||
"\3%02d%s\3\tis now known as \3%02d%s\3",
|
||||
hash(msg->user), msg->nick, hash(msg->user), msg->params[0]
|
||||
);
|
||||
|
@ -440,7 +440,7 @@ static void handleSetname(struct Message *msg) {
|
|||
require(msg, true, 1);
|
||||
for (uint id; (id = completeID(msg->nick));) {
|
||||
uiFormat(
|
||||
id, ignoreCheck(Cold, id, msg), tagTime(msg),
|
||||
id, filterCheck(Cold, id, msg), tagTime(msg),
|
||||
"\3%02d%s\3\tis now known as \3%02d%s\3 (%s)",
|
||||
hash(msg->user), msg->nick, hash(msg->user), msg->nick,
|
||||
msg->params[0]
|
||||
|
@ -451,7 +451,7 @@ static void handleSetname(struct Message *msg) {
|
|||
static void handleQuit(struct Message *msg) {
|
||||
require(msg, true, 0);
|
||||
for (uint id; (id = completeID(msg->nick));) {
|
||||
enum Heat heat = ignoreCheck(Cold, id, msg);
|
||||
enum Heat heat = filterCheck(Cold, id, msg);
|
||||
if (heat > Ice) urlScan(id, msg->nick, msg->params[0]);
|
||||
uiFormat(
|
||||
id, heat, tagTime(msg),
|
||||
|
@ -473,7 +473,7 @@ static void handleInvite(struct Message *msg) {
|
|||
require(msg, true, 2);
|
||||
if (!strcmp(msg->params[0], self.nick)) {
|
||||
uiFormat(
|
||||
Network, ignoreCheck(Hot, Network, msg), tagTime(msg),
|
||||
Network, filterCheck(Hot, Network, msg), tagTime(msg),
|
||||
"\3%02d%s\3\tinvites you to \3%02d%s\3",
|
||||
hash(msg->user), msg->nick, hash(msg->params[1]), msg->params[1]
|
||||
);
|
||||
|
@ -1199,7 +1199,7 @@ static void handlePrivmsg(struct Message *msg) {
|
|||
bool notice = (msg->cmd[0] == 'N');
|
||||
bool action = isAction(msg);
|
||||
bool mention = !mine && isMention(msg);
|
||||
enum Heat heat = ignoreCheck((mention || query ? Hot : Warm), id, msg);
|
||||
enum Heat heat = filterCheck((mention || query ? Hot : Warm), id, msg);
|
||||
if (!notice && !mine && heat > Ice) {
|
||||
completeTouch(id, msg->nick, hash(msg->user));
|
||||
}
|
||||
|
@ -1212,7 +1212,7 @@ static void handlePrivmsg(struct Message *msg) {
|
|||
logFormat(id, tagTime(msg), "-%s- %s", msg->nick, msg->params[1]);
|
||||
}
|
||||
uiFormat(
|
||||
id, ignoreCheck(Warm, id, msg), tagTime(msg),
|
||||
id, filterCheck(Warm, id, msg), tagTime(msg),
|
||||
"\3%d-%s-\3%d\t%s",
|
||||
hash(msg->user), msg->nick, LightGray, msg->params[1]
|
||||
);
|
||||
|
|
Loading…
Reference in New Issue