diff options
| author | 2024-02-27 13:25:31 +0000 | |
|---|---|---|
| committer | 2024-02-27 14:01:33 +0000 | |
| commit | e6c3ba5af6737172336153f41dfa06f34575d204 (patch) | |
| tree | 3b22a03d2b73cc603899d964758e61977c4a9f2e /src/modules/m_services.cpp | |
| parent | Move SVSJOIN/SVSNICK/SVSPART to the services module. (diff) | |
Add a command to allow services to clear list modes matching a user.
Diffstat (limited to 'src/modules/m_services.cpp')
| -rw-r--r-- | src/modules/m_services.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/modules/m_services.cpp b/src/modules/m_services.cpp index d27d738c4..07d57029a 100644 --- a/src/modules/m_services.cpp +++ b/src/modules/m_services.cpp @@ -18,6 +18,7 @@ #include "inspircd.h" +#include "listmode.h" #include "modules/account.h" #include "modules/ctctags.h" #include "modules/stats.h" @@ -166,6 +167,58 @@ public: } }; +class CommandSVSCMode final + : public Command +{ +public: + CommandSVSCMode(Module* mod) + : Command(mod, "SVSCMODE", 3) + { + access_needed = CmdAccess::SERVER; + } + + CmdResult Handle(User* user, const Params& parameters) override + { + // The command can only be executed by remote services servers. + if (IS_LOCAL(user) || !user->server->IsService()) + return CmdResult::FAILURE; + + auto* u = ServerInstance->Users.FindUUID(parameters[0]); + if (!u) + return CmdResult::FAILURE; + + auto* c = ServerInstance->Channels.Find(parameters[1]); + if (!c) + return CmdResult::FAILURE; + + for (auto mode : parameters[2]) + { + auto* mh = ServerInstance->Modes.FindMode(mode, MODETYPE_CHANNEL); + if (!mh || !mh->IsListModeBase()) + continue; // Not a list mode. + + auto* list = mh->IsListModeBase()->GetList(c); + if (!list) + continue; // No list modes set. + + Modes::ChangeList changelist; + for (const auto& entry : *list) + { + if (c->CheckBan(u, entry.mask)) + changelist.push(mh, false, entry.mask); + } + ServerInstance->Modes.Process(user, c, nullptr, changelist); + } + return CmdResult::SUCCESS; + } + + RouteDescriptor GetRouting(User* user, const Params& parameters) override + { + // This can be made ROUTE_UNICAST in v5. + return ROUTE_OPT_UCAST(parameters[0]); + } +}; + class CommandSVSHold final : public Command { @@ -379,6 +432,7 @@ private: ServiceTag servicetag; ServProtect servprotectmode; SVSHoldFactory svsholdfactory; + CommandSVSCMode svscmodecmd; CommandSVSHold svsholdcmd; CommandSVSJoin svsjoincmd; CommandSVSNick svsnickcmd; @@ -394,6 +448,7 @@ public: , registeredumode(this) , servicetag(this) , servprotectmode(this) + , svscmodecmd(this) , svsholdcmd(this) , svsjoincmd(this) , svsnickcmd(this) |
