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.master
parent
ff87d561bd
commit
6207aaf1a8
14
catgirl.1
14
catgirl.1
|
@ -935,6 +935,20 @@ catgirl freenode
|
||||||
.Re
|
.Re
|
||||||
.It
|
.It
|
||||||
.Rs
|
.Rs
|
||||||
|
.%A James Wheare
|
||||||
|
.%T Reply Client Tag
|
||||||
|
.%I IRCv3 Working Group
|
||||||
|
.%U https://ircv3.net/specs/client-tags/reply
|
||||||
|
.Re
|
||||||
|
.It
|
||||||
|
.Rs
|
||||||
|
.%A James Wheare
|
||||||
|
.%T Message IDs
|
||||||
|
.%I IRCv3 Working Group
|
||||||
|
.%U https://ircv3.net/specs/extensions/message-ids
|
||||||
|
.Re
|
||||||
|
.It
|
||||||
|
.Rs
|
||||||
.%A K. Zeilenga, Ed.
|
.%A K. Zeilenga, Ed.
|
||||||
.%T The PLAIN Simple Authentication and Security Layer (SASL) Mechanism
|
.%T The PLAIN Simple Authentication and Security Layer (SASL) Mechanism
|
||||||
.%I IETF
|
.%I IETF
|
||||||
|
|
3
chat.h
3
chat.h
|
@ -171,6 +171,7 @@ extern struct Network {
|
||||||
X("chghost", CapChghost) \
|
X("chghost", CapChghost) \
|
||||||
X("extended-join", CapExtendedJoin) \
|
X("extended-join", CapExtendedJoin) \
|
||||||
X("invite-notify", CapInviteNotify) \
|
X("invite-notify", CapInviteNotify) \
|
||||||
|
X("message-tags", CapMessageTags) \
|
||||||
X("multi-prefix", CapMultiPrefix) \
|
X("multi-prefix", CapMultiPrefix) \
|
||||||
X("sasl", CapSASL) \
|
X("sasl", CapSASL) \
|
||||||
X("server-time", CapServerTime) \
|
X("server-time", CapServerTime) \
|
||||||
|
@ -205,7 +206,9 @@ static inline void set(char **field, const char *value) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ENUM_TAG \
|
#define ENUM_TAG \
|
||||||
|
X("+draft/reply", TagReply) \
|
||||||
X("causal.agency/pos", TagPos) \
|
X("causal.agency/pos", TagPos) \
|
||||||
|
X("msgid", TagMsgID) \
|
||||||
X("time", TagTime)
|
X("time", TagTime)
|
||||||
|
|
||||||
enum Tag {
|
enum Tag {
|
||||||
|
|
29
filter.c
29
filter.c
|
@ -94,12 +94,39 @@ static bool filterTest(
|
||||||
return !fnmatch(filter.mesg, msg->params[1], FNM_CASEFOLD);
|
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) {
|
enum Heat filterCheck(enum Heat heat, uint id, const struct Message *msg) {
|
||||||
if (!len) return heat;
|
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];
|
char mask[512];
|
||||||
snprintf(mask, sizeof(mask), "%s!%s@%s", msg->nick, msg->user, msg->host);
|
snprintf(mask, sizeof(mask), "%s!%s@%s", msg->nick, msg->user, msg->host);
|
||||||
for (size_t i = 0; i < len; ++i) {
|
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;
|
return heat;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue