diff options
| author | 2024-02-27 16:49:57 +0000 | |
|---|---|---|
| committer | 2024-02-27 17:44:31 +0000 | |
| commit | 118f729e86ee649b9122d38333020bd7b7c14660 (patch) | |
| tree | 87b843991da050b8301fd693b63777b2baa586ac /src/modules/m_services.cpp | |
| parent | Refactor 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.cpp | 24 |
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; } |
