diff options
author | June McEnroe <june@causal.agency> | 2019-11-11 00:16:50 -0500 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2019-11-11 00:16:50 -0500 |
commit | 3a6ff15c475069f707d1fd81aee0c101f73272c8 (patch) | |
tree | 61b6715a6cb3ce642421666f2e9bddbdd64267cc | |
parent | Compare words without copying in filters (diff) | |
download | pounce-3a6ff15c475069f707d1fd81aee0c101f73272c8.tar.gz pounce-3a6ff15c475069f707d1fd81aee0c101f73272c8.zip |
Filter userhost-in-names
I really want to be writing tests for these functions...
-rw-r--r-- | bounce.h | 1 | ||||
-rw-r--r-- | client.c | 17 |
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) { |