From 6ffb226aa4cdc7fb9007e6495ed7722bf7a8ddbf Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Thu, 17 Jun 2021 00:16:34 +0100 Subject: Import a greatly refactored version of the opmoderated module. Co-authored-by: Daniel De Graaf . --- src/modules/m_opmoderated.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/modules/m_opmoderated.cpp (limited to 'src/modules/m_opmoderated.cpp') 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 + * + * 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 . + */ + +#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(); + 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) -- cgit v1.3.1-10-gc9f91