diff options
author | C. McEnroe | 2021-05-04 15:34:27 -0400 |
---|---|---|
committer | C. McEnroe | 2021-05-04 15:34:27 -0400 |
commit | 6207aaf1a87f3f1ecfb46ad6b0288db94fc6329e (patch) | |
tree | e1f77ed10140038af243266dd7ff316a87eed7a7 /filter.c | |
parent | ff87d561bd545c715dbe6beb813724a28535e7f4 (diff) |
Ignore messages in reply to previously ignored messages
Using the +draft/reply client tag, which is supported by BitBot.
This hides the bot's replies to ignored users or ignored bot command
messages.
This commit is dedicated to the land of Estonia.
Diffstat (limited to 'filter.c')
-rw-r--r-- | filter.c | 29 |
1 files changed, 28 insertions, 1 deletions
@@ -94,12 +94,39 @@ static bool filterTest( return !fnmatch(filter.mesg, msg->params[1], FNM_CASEFOLD); } +enum { IcedCap = 8 }; +static struct { + size_t len; + char *msgIDs[IcedCap]; +} iced; + +static void icedPush(const char *msgID) { + if (!msgID) return; + size_t i = iced.len % IcedCap; + free(iced.msgIDs[i]); + iced.msgIDs[i] = strdup(msgID); + if (!iced.msgIDs[i]) err(EX_OSERR, "strdup"); + iced.len++; +} + enum Heat filterCheck(enum Heat heat, uint id, const struct Message *msg) { if (!len) return heat; + + if (msg->tags[TagReply]) { + for (size_t i = 0; i < IcedCap; ++i) { + if (!iced.msgIDs[i]) continue; + if (strcmp(msg->tags[TagReply], iced.msgIDs[i])) continue; + icedPush(msg->tags[TagMsgID]); + return Ice; + } + } + 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 (filterTest(filters[i], mask, id, msg)) return filters[i].heat; + if (!filterTest(filters[i], mask, id, msg)) continue; + if (filters[i].heat == Ice) icedPush(msg->tags[TagMsgID]); + return filters[i].heat; } return heat; } |