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.weechat-hashes
parent
ff87d561bd
commit
6207aaf1a8
14
catgirl.1
14
catgirl.1
|
@ -935,6 +935,20 @@ catgirl freenode
|
|||
.Re
|
||||
.It
|
||||
.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.
|
||||
.%T The PLAIN Simple Authentication and Security Layer (SASL) Mechanism
|
||||
.%I IETF
|
||||
|
|
3
chat.h
3
chat.h
|
@ -171,6 +171,7 @@ extern struct Network {
|
|||
X("chghost", CapChghost) \
|
||||
X("extended-join", CapExtendedJoin) \
|
||||
X("invite-notify", CapInviteNotify) \
|
||||
X("message-tags", CapMessageTags) \
|
||||
X("multi-prefix", CapMultiPrefix) \
|
||||
X("sasl", CapSASL) \
|
||||
X("server-time", CapServerTime) \
|
||||
|
@ -205,7 +206,9 @@ static inline void set(char **field, const char *value) {
|
|||
}
|
||||
|
||||
#define ENUM_TAG \
|
||||
X("+draft/reply", TagReply) \
|
||||
X("causal.agency/pos", TagPos) \
|
||||
X("msgid", TagMsgID) \
|
||||
X("time", TagTime)
|
||||
|
||||
enum Tag {
|
||||
|
|
29
filter.c
29
filter.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue