summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-11-11 00:16:50 -0500
committerJune McEnroe <june@causal.agency>2019-11-11 00:16:50 -0500
commit3a6ff15c475069f707d1fd81aee0c101f73272c8 (patch)
tree61b6715a6cb3ce642421666f2e9bddbdd64267cc
parentCompare words without copying in filters (diff)
downloadpounce-3a6ff15c475069f707d1fd81aee0c101f73272c8.tar.gz
pounce-3a6ff15c475069f707d1fd81aee0c101f73272c8.zip
Filter userhost-in-names
I really want to be writing tests for these functions...
-rw-r--r--bounce.h1
-rw-r--r--client.c17
2 files changed, 18 insertions, 0 deletions
diff --git a/bounce.h b/bounce.h
index dd26bc3..d94eae4 100644
--- a/bounce.h
+++ b/bounce.h
@@ -64,6 +64,7 @@ static inline struct Message parse(char *line) {
 	X("invite-notify", CapInviteNotify) \
 	X("sasl", CapSASL) \
 	X("server-time", CapServerTime) \
+	X("userhost-in-names", CapUserhostInNames) \
 	X("", CapUnsupported)
 
 enum Cap {
diff --git a/client.c b/client.c
index 201566e..dec0041 100644
--- a/client.c
+++ b/client.c
@@ -318,12 +318,29 @@ static const char *filterInviteNotify(const char *line) {
 	return (wordcmp(line, 2, stateNick()) ? NULL : line);
 }
 
+static const char *filterUserhostInNames(const char *line) {
+	if (wordcmp(line, 1, "353")) return line;
+	static char buf[512];
+	if (strlen(line) >= sizeof(buf)) return NULL;
+	char *ptr = buf;
+	while (*line) {
+		size_t len = strcspn(line, "!");
+		memcpy(ptr, line, len);
+		ptr += len;
+		line += len;
+		line += strcspn(line, " ");
+	}
+	*ptr = '\0';
+	return buf;
+}
+
 static Filter *Filters[] = {
 	[CapAccountNotifyBit] = filterAccountNotify,
 	[CapAwayNotifyBit] = filterAwayNotify,
 	[CapChghostBit] = filterChghost,
 	[CapExtendedJoinBit] = filterExtendedJoin,
 	[CapInviteNotifyBit] = filterInviteNotify,
+	[CapUserhostInNamesBit] = filterUserhostInNames,
 };
 
 void clientConsume(struct Client *client) {