aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_services.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2024-02-27 16:49:57 +0000
committerGravatar Sadie Powell2024-02-27 17:44:31 +0000
commit118f729e86ee649b9122d38333020bd7b7c14660 (patch)
tree87b843991da050b8301fd693b63777b2baa586ac /src/modules/m_services.cpp
parentRefactor the services module slightly. (diff)
Merge the mlock module into the services module.
Diffstat (limited to 'src/modules/m_services.cpp')
-rw-r--r--src/modules/m_services.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/modules/m_services.cpp b/src/modules/m_services.cpp
index 1f9ac13c7..3a1b27e90 100644
--- a/src/modules/m_services.cpp
+++ b/src/modules/m_services.cpp
@@ -28,7 +28,10 @@
enum
{
// From UnrealIRCd.
- ERR_KILLDENY = 485
+ ERR_KILLDENY = 485,
+
+ // From Charybdis.
+ ERR_MLOCKRESTRICTED = 742,
};
class RegisteredChannel final
@@ -432,6 +435,7 @@ private:
ServiceTag servicetag;
ServProtect servprotectmode;
SVSHoldFactory svsholdfactory;
+ StringExtItem mlockext;
CommandSVSCMode svscmodecmd;
CommandSVSHold svsholdcmd;
CommandSVSJoin svsjoincmd;
@@ -439,6 +443,20 @@ private:
CommandSVSPart svspartcmd;
bool accountoverrideshold;
+ bool HandleModeLock(User* user, Channel* chan, const Modes::Change& change)
+ {
+ const auto* mlock = mlockext.Get(chan);
+ if (!mlock)
+ return true; // No mode lock.
+
+ if (mlock->find(change.mh->GetModeChar()) == std::string::npos)
+ return true; // Mode is not locked.
+
+ user->WriteNumeric(ERR_MLOCKRESTRICTED, chan->name, change.mh->GetModeChar(), *mlock, INSP_FORMAT("Mode cannot be changed as it has been locked {} by services!",
+ chan->IsModeSet(change.mh) ? "on" : "off"));
+ return false;
+ }
+
bool HandleProtectedService(User* user, Channel* chan, const Modes::Change& change)
{
if (change.adding || change.param.empty())
@@ -472,6 +490,7 @@ public:
, registeredumode(this)
, servicetag(this)
, servprotectmode(this)
+ , mlockext(this, "mlock", ExtensionType::CHANNEL, true)
, svscmodecmd(this)
, svsholdcmd(this)
, svsjoincmd(this)
@@ -518,6 +537,9 @@ public:
if (!HandleProtectedService(user, chan, change))
return MOD_RES_DENY;
+ if (!HandleModeLock(user, chan, change))
+ return MOD_RES_DENY;
+
return MOD_RES_PASSTHRU;
}