inspircd

A modular C++ IRC daemon (ircd). https://www.inspircd.org/
Log | Files | Refs | README

commit 96cc17f65196391a64c38ffcbfb57b8f54ced4b3
parent 232332e064312b30de81230fbb7805e38a57c8f1
Author: Filippo Cortigiani <simos@simosnap.org>
Date:   Mon, 20 May 2019 15:15:00 +0200

Add an option to the filter module to exclude registered users from a filter.


Diffstat:
Mdocs/conf/filter.conf.example | 3++-
Mdocs/conf/helpop.conf.example | 3++-
Msrc/modules/m_filter.cpp | 14++++++++++++--
3 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/docs/conf/filter.conf.example b/docs/conf/filter.conf.example @@ -51,8 +51,9 @@ # P: Block part messages # q: Block quit messages # o: Don't match against opers +# r: Don't match against registered users # c: Strip color codes from text before trying to match -# *: Represents all of the above flags +# *: Represents all of the above flags except r # -: Does nothing, a no-op for when you do not want to specify any flags # Example filters: diff --git a/docs/conf/helpop.conf.example b/docs/conf/helpop.conf.example @@ -506,8 +506,9 @@ n Block private and channel notices P Block part messages q Block quit messages o Don't match against opers +r Don't match against registered users c Strip all formatting codes from the message before matching -* Represents all of the above flags +* Represents all of the above flags except r - Does nothing, a non-op for when you do not want to specify any flags diff --git a/src/modules/m_filter.cpp b/src/modules/m_filter.cpp @@ -26,6 +26,7 @@ #include "modules/server.h" #include "modules/shun.h" #include "modules/stats.h" +#include "modules/account.h" enum FilterFlags { @@ -58,6 +59,7 @@ class FilterResult bool from_config; bool flag_no_opers; + bool flag_no_registered; bool flag_part_message; bool flag_quit_message; bool flag_privmsg; @@ -79,7 +81,7 @@ class FilterResult char FillFlags(const std::string &fl) { - flag_no_opers = flag_part_message = flag_quit_message = flag_privmsg = + flag_no_opers = flag_no_registered = flag_part_message = flag_quit_message = flag_privmsg = flag_notice = flag_strip_color = false; for (std::string::const_iterator n = fl.begin(); n != fl.end(); ++n) @@ -104,6 +106,9 @@ class FilterResult case 'c': flag_strip_color = true; break; + case 'r': + flag_no_registered = true; + break; case '*': flag_no_opers = flag_part_message = flag_quit_message = flag_privmsg = flag_notice = flag_strip_color = true; @@ -129,13 +134,14 @@ class FilterResult flags.push_back('p'); if (flag_notice) flags.push_back('n'); - /* Order is important here, 'c' must be the last char in the string as it is unsupported * on < 2.0.10, and the logic in FillFlags() stops parsing when it ecounters an unknown * character. */ if (flag_strip_color) flags.push_back('c'); + if (flag_no_registered) + flags.push_back('r'); if (flags.empty()) flags.push_back('-'); @@ -305,8 +311,12 @@ CmdResult CommandFilter::Handle(User* user, const Params& parameters) bool ModuleFilter::AppliesToMe(User* user, FilterResult* filter, int iflags) { + const AccountExtItem* accountext = GetAccountExtItem(); + if ((filter->flag_no_opers) && user->IsOper()) return false; + if ((filter->flag_no_registered) && accountext && accountext->get(user)) + return false; if ((iflags & FLAG_PRIVMSG) && (!filter->flag_privmsg)) return false; if ((iflags & FLAG_NOTICE) && (!filter->flag_notice))