aboutsummaryrefslogtreecommitdiffstats
path: root/src/modules/m_services.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2024-02-27 13:25:31 +0000
committerGravatar Sadie Powell2024-02-27 14:01:33 +0000
commite6c3ba5af6737172336153f41dfa06f34575d204 (patch)
tree3b22a03d2b73cc603899d964758e61977c4a9f2e /src/modules/m_services.cpp
parentMove 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.cpp55
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)