diff options
| author | 2021-06-17 00:16:34 +0100 | |
|---|---|---|
| committer | 2021-06-17 00:16:34 +0100 | |
| commit | 6ffb226aa4cdc7fb9007e6495ed7722bf7a8ddbf (patch) | |
| tree | 038da29a75062aff9d411e9b149359da4853bda4 | |
| parent | Merge branch 'insp3' into master. (diff) | |
Import a greatly refactored version of the opmoderated module.
Co-authored-by: Daniel De Graaf <danieldg@inspircd.org>.
| -rw-r--r-- | docs/conf/modules.conf.example | 6 | ||||
| -rw-r--r-- | docs/conf/opers.conf.example | 1 | ||||
| -rw-r--r-- | src/modules/m_opmoderated.cpp | 90 |
3 files changed, 97 insertions, 0 deletions
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example index 38439fcbd..9d9a2e84e 100644 --- a/docs/conf/modules.conf.example +++ b/docs/conf/modules.conf.example @@ -1584,6 +1584,12 @@ # conn_umodes module. #<module name="opermodes"> +#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# +# Op moderated module: Adds channel mode +U and extban u: which allow +# making messages from matching unprivileged users only visible to +# channel operators. +#<module name="opmoderated"> + #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Password forwarding module: Forwards a password users can send on # connect to the specified client below. The client is usually NickServ diff --git a/docs/conf/opers.conf.example b/docs/conf/opers.conf.example index 9950607a2..31c16c2ff 100644 --- a/docs/conf/opers.conf.example +++ b/docs/conf/opers.conf.example @@ -29,6 +29,7 @@ # PERMISSIONS: # - channels/ignore-noctcp: allows opers with this priv to send a CTCP to a +C channel. # - channels/ignore-nonicks: allows opers with this priv to change their nick when on a +N channel. + # - channels/ignore-opmoderated: allows opers with this priv to ignore +U. # - channels/restricted-create: allows opers with this priv to create channels if the restrictchans module is loaded. # - users/flood/increased-buffers: allows opers with this priv to send and receive data without worrying about being disconnected for exceeding limits (*NOTE). # - users/flood/no-fakelag: prevents opers from being penalized with fake lag for flooding (*NOTE). diff --git a/src/modules/m_opmoderated.cpp b/src/modules/m_opmoderated.cpp new file mode 100644 index 000000000..505bdec50 --- /dev/null +++ b/src/modules/m_opmoderated.cpp @@ -0,0 +1,90 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2010 Daniel De Graaf <danieldg@inspircd.org> + * + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "inspircd.h" +#include "modules/ctctags.h" +#include "modules/exemption.h" +#include "modules/extban.h" + +class ModuleOpModerated final + : public Module + , public CTCTags::EventListener +{ + private: + CheckExemption::EventProvider exemptionprov; + ExtBan::Acting extban; + SimpleChannelMode mode; + + ModResult HandleMessage(User* user, const MessageTarget& target, CUList& exemptions) + { + // We only handle messages from local users. + if (!IS_LOCAL(user)) + return MOD_RES_PASSTHRU; + + // We only handle messages non-statusmsg messages sent to channels. + if (target.type != MessageTarget::TYPE_CHANNEL || target.status) + return MOD_RES_PASSTHRU; + + // Exempt opers who have the appropriate privileges. + if (user->HasPrivPermission("channels/ignore-opmoderated")) + return MOD_RES_PASSTHRU; + + // Exempt channel members who have the appropriate privileges. + Channel* const chan = target.Get<Channel>(); + if (chan->GetPrefixValue(user) > VOICE_VALUE) + return MOD_RES_PASSTHRU; + + // Check for channel members who are exempted by a module. + if (CheckExemption::Call(exemptionprov, user, chan, "opmoderated") == MOD_RES_ALLOW) + return MOD_RES_PASSTHRU; + + if (!extban.GetStatus(user, chan).check(!chan->IsModeSet(mode))) + { + // Add any unprivileged users to the exemption list. + for (const auto& [u, memb] : chan->GetUsers()) + { + if (memb->getRank() < OP_VALUE) + exemptions.insert(u); + } + } + + return MOD_RES_PASSTHRU; + } + + public: + ModuleOpModerated() + : Module(VF_OPTCOMMON, "Implements opmoderated channel mode +U (non-voiced messages sent to ops) and extban 'u'.") + , CTCTags::EventListener(this) + , exemptionprov(this) + , extban(this, "opmoderated", 'u') + , mode(this, "opmoderated", 'U') + { + } + + ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) override + { + return HandleMessage(user, target, details.exemptions); + } + + ModResult OnUserPreTagMessage(User* user, const MessageTarget& target, CTCTags::TagMessageDetails& details) override + { + return HandleMessage(user, target, details.exemptions); + } +}; + +MODULE_INIT(ModuleOpModerated) |
