]> jfr.im git - irc/freenode/ircd-seven.git/commitdiff
Add modes to disable incoming filters
authorEd Kellett <redacted>
Sun, 7 Apr 2019 19:45:38 +0000 (20:45 +0100)
committerEd Kellett <redacted>
Sun, 7 Apr 2019 19:47:25 +0000 (20:47 +0100)
extensions/m_filter.c

index 85226cf84a0868d9afefd7d5300b2f56c3bf31b6..d204a5d619fa99523c48b1dbcb63ea84c6c416c9 100644 (file)
 #include "channel.h"
 #include "client.h"
 #include "common.h"
+#include "chmode.h"
 #include "match.h"
 #include "ircd.h"
 #include "numeric.h"
 #include "send.h"
-#include "s_serv.h"
 #include "s_newconf.h"
+#include "s_serv.h"
+#include "s_user.h"
 #include "msg.h"
 #include "parse.h"
 #include "modules.h"
@@ -81,6 +83,8 @@ enum filter_state {
 static enum filter_state state = FILTER_EMPTY;
 static char check_str[21] = "";
 
+static unsigned filter_chmode, filter_umode;
+
 mapi_hfn_list_av1 filter_hfnlist[] = {
        { "privmsg_user", (hookfn) filter_msg_user },
        { "privmsg_channel", (hookfn) filter_msg_channel },
@@ -94,9 +98,23 @@ struct Message setfilter_msgtab = {
        {mg_unreg, mg_not_oper, mg_ignore, mg_ignore, {me_setfilter, 2}, {mo_setfilter, 2}}
 };
 
+static void
+modinit(void)
+{
+       filter_umode = user_modes['u'] = find_umode_slot();
+       construct_umodebuf();
+       filter_chmode = cflag_add('u', chm_simple);
+}
+
 static void
 moddeinit(void)
 {
+       if (filter_umode) {
+               user_modes['u'] = 0;
+               construct_umodebuf();
+       }
+       if (filter_chmode)
+               cflag_orphan('u');
        if (filter_scratch)
                hs_free_scratch(filter_scratch);
        if (filter_db)
@@ -108,7 +126,7 @@ moddeinit(void)
 
 mapi_clist_av1 filter_clist[] = { &setfilter_msgtab, NULL };
 
-DECLARE_MODULE_AV1(filter, NULL, moddeinit, filter_clist, NULL, filter_hfnlist, "0.3");
+DECLARE_MODULE_AV1(filter, modinit, moddeinit, filter_clist, NULL, filter_hfnlist, "0.3");
 
 static int
 setfilter(const char *check, const char *data, const char **error)
@@ -335,6 +353,9 @@ filter_msg_user(void *data_)
        if (IsAnyOper(s) || IsAnyOper(data->target_p)) {
                return;
        }
+       if (data->target_p->umodes & filter_umode) {
+               return;
+       }
        char *text = strcpy(clean_buffer, data->text);
        strip_colour(text);
        strip_unprintable(text);
@@ -373,6 +394,9 @@ filter_msg_channel(void *data_)
        if (IsAnyOper(s)) {
                return;
        }
+       if (data->chptr->mode.mode & filter_chmode) {
+               return;
+       }
        char *text = strcpy(clean_buffer, data->text);
        strip_colour(text);
        strip_unprintable(text);