aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_opmoderated.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2021-06-17 00:16:34 +0100
committerGravatar Sadie Powell2021-06-17 00:16:34 +0100
commit6ffb226aa4cdc7fb9007e6495ed7722bf7a8ddbf (patch)
tree038da29a75062aff9d411e9b149359da4853bda4 /src/modules/m_opmoderated.cpp
parentMerge 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.cpp90
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)