summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--README.74
-rw-r--r--chat.c2
-rw-r--r--chat.h15
-rw-r--r--command.c23
-rw-r--r--filter.c (renamed from ignore.c)71
-rw-r--r--handle.c16
7 files changed, 68 insertions, 65 deletions
diff --git a/Makefile b/Makefile
index 2c3061d..5caa3ba 100644
--- a/Makefile
+++ b/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
diff --git a/README.7 b/README.7
index 0261d3e..03a535d 100644
--- a/README.7
+++ b/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
diff --git a/chat.c b/chat.c
index b4458be..cdea9a0 100644
--- a/chat.c
+++ b/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;
diff --git a/chat.h b/chat.h
index e027fa5..1b1c338 100644
--- a/chat.h
+++ b/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, ...)
diff --git a/command.c b/command.c
index f6db311..f266878 100644
--- a/command.c
+++ b/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 ?: "")
 	);
 }
 
diff --git a/ignore.c b/filter.c
index 5a9d296..2a7d564 100644
--- a/ignore.c
+++ b/filter.c
@@ -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;
 }
diff --git a/handle.c b/handle.c
index 9c5fac3..702196b 100644
--- a/handle.c
+++ b/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]
 		);