diff options
| author | 2021-06-17 00:16:34 +0100 | |
|---|---|---|
| committer | 2021-06-17 00:16:34 +0100 | |
| commit | 6ffb226aa4cdc7fb9007e6495ed7722bf7a8ddbf (patch) | |
| tree | 038da29a75062aff9d411e9b149359da4853bda4 /src/modules/m_opmoderated.cpp | |
| 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>.
Diffstat (limited to 'src/modules/m_opmoderated.cpp')
| -rw-r--r-- | src/modules/m_opmoderated.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
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) |
