summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/example.conf6
-rw-r--r--data/operserv.example.conf12
-rw-r--r--modules/commands/os_svs.cpp176
-rw-r--r--modules/commands/os_svsnick.cpp84
-rw-r--r--modules/protocol/plexus.cpp4
5 files changed, 188 insertions, 94 deletions
diff --git a/data/example.conf b/data/example.conf
index 9a645a95e..849e7b551 100644
--- a/data/example.conf
+++ b/data/example.conf
@@ -716,7 +716,7 @@ log
log
{
target = "globops"
- admin = "global/* operserv/mode operserv/kick operserv/akill operserv/s*line operserv/noop operserv/jupe operserv/oline operserv/set operserv/svsnick nickserv/getpass */drop"
+ admin = "global/* operserv/mode operserv/kick operserv/akill operserv/s*line operserv/noop operserv/jupe operserv/oline operserv/set operserv/svsnick operserv/svsjoin operserv/svspart nickserv/getpass */drop"
servers = "squit"
users = "oper"
other = "expire/* bados akill/*"
@@ -782,7 +782,7 @@ log
* operserv/szline operserv/oper operserv/config operserv/umode
* operserv/modload operserv/jupe operserv/set operserv/noop
* operserv/quit operserv/update operserv/reload operserv/restart
- * operserv/shutdown operserv/svsnick operserv/oline operserv/kill
+ * operserv/shutdown operserv/svs operserv/oline operserv/kill
*
* Firstly, we define 'opertypes' which are named whatever we want ('Network Administrator', etc).
* These can contain commands for oper-only strings (see above) which grants access to that specific command,
@@ -833,7 +833,7 @@ opertype
inherits = "Services Operator"
- commands = "chanserv/access/list chanserv/drop chanserv/getkey chanserv/saset/noexpire memoserv/sendall nickserv/saset/* nickserv/getemail operserv/news operserv/jupe operserv/svsnick operserv/stats operserv/oline operserv/noop operserv/forbid global/* operserv/global"
+ commands = "chanserv/access/list chanserv/drop chanserv/getkey chanserv/saset/noexpire memoserv/sendall nickserv/saset/* nickserv/getemail operserv/news operserv/jupe operserv/svs operserv/stats operserv/oline operserv/noop operserv/forbid global/* operserv/global"
privs = "*"
}
diff --git a/data/operserv.example.conf b/data/operserv.example.conf
index cb3f19cc4..9c11555c7 100644
--- a/data/operserv.example.conf
+++ b/data/operserv.example.conf
@@ -644,14 +644,16 @@ module { name = "os_stats" }
command { service = "OperServ"; name = "STATS"; command = "operserv/stats"; permission = "operserv/stats"; }
/*
- * os_svsnick
+ * os_svs
*
- * Provides the operserv/svsnick command.
+ * Provides the commands operserv/svsnick, operserv/svsjoin, and operserv/svspart.
*
- * Used to force change user's nicks.
+ * Used to force users to change nicks, join and part channels.
*/
-module { name = "os_svsnick" }
-command { service = "OperServ"; name = "SVSNICK"; command = "operserv/svsnick"; permission = "operserv/svsnick"; }
+module { name = "os_svs" }
+command { service = "OperServ"; name = "SVSNICK"; command = "operserv/svsnick"; permission = "operserv/svs"; }
+command { service = "OperServ"; name = "SVSJOIN"; command = "operserv/svsjoin"; permission = "operserv/svs"; }
+command { service = "OperServ"; name = "SVSPART"; command = "operserv/svspart"; permission = "operserv/svs"; }
/*
* os_sxline
diff --git a/modules/commands/os_svs.cpp b/modules/commands/os_svs.cpp
new file mode 100644
index 000000000..91dc15657
--- /dev/null
+++ b/modules/commands/os_svs.cpp
@@ -0,0 +1,176 @@
+/* OperServ core functions
+ *
+ * (C) 2003-2013 Anope Team
+ * Contact us at team@anope.org
+ *
+ * Please read COPYING and README for further details.
+ *
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ */
+
+/*************************************************************************/
+
+#include "module.h"
+
+class CommandOSSVSNick : public Command
+{
+ public:
+ CommandOSSVSNick(Module *creator) : Command(creator, "operserv/svsnick", 2, 2)
+ {
+ this->SetDesc(_("Forcefully change a user's nickname"));
+ this->SetSyntax(_("\037nick\037 \037newnick\037"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params) anope_override
+ {
+ const Anope::string &nick = params[0];
+ Anope::string newnick = params[1];
+ User *u2;
+
+ if (!IRCD->CanSVSNick)
+ {
+ source.Reply(_("Your IRCd does not support SVSNICK."));
+ return;
+ }
+
+ /* Truncate long nicknames to Config->NickLen characters */
+ if (newnick.length() > Config->NickLen)
+ {
+ source.Reply(_("Nick \002%s\002 was truncated to %d characters."), newnick.c_str(), Config->NickLen, newnick.c_str());
+ newnick = params[1].substr(0, Config->NickLen);
+ }
+
+ /* Check for valid characters */
+ if (!IRCD->IsNickValid(newnick))
+ {
+ source.Reply(_("Nick \002%s\002 is an illegal nickname and cannot be used."), newnick.c_str());
+ return;
+ }
+
+ /* Check for a nick in use or a forbidden/suspended nick */
+ if (!(u2 = User::Find(nick, true)))
+ source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
+ else if (!nick.equals_ci(newnick) && User::Find(newnick))
+ source.Reply(_("Nick \002%s\002 is currently in use."), newnick.c_str());
+ else
+ {
+ source.Reply(_("The nick \002%s\002 is now being changed to \002%s\002."), nick.c_str(), newnick.c_str());
+ Log(LOG_ADMIN, source, this) << "to change " << nick << " to " << newnick;
+ IRCD->SendForceNickChange(u2, newnick, Anope::CurTime);
+ }
+ return;
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Forcefully changes a user's nickname from nick to newnick."));
+ return true;
+ }
+};
+
+class CommandOSSVSJoin : public Command
+{
+ public:
+ CommandOSSVSJoin(Module *creator) : Command(creator, "operserv/svsjoin", 2, 2)
+ {
+ this->SetDesc(_("Forcefully join a user to a channel"));
+ this->SetSyntax(_("\037nick\037 \037channel\037"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params) anope_override
+ {
+ if (!IRCD->CanSVSJoin)
+ {
+ source.Reply(_("Your IRCd does not support SVSJOIN"));
+ return;
+ }
+
+ User *target = User::Find(params[0], true);
+ Channel *c = Channel::Find(params[1]);
+ if (target == NULL)
+ source.Reply(NICK_X_NOT_IN_USE, params[0].c_str());
+ else if (target->IsProtected() || target->server == Me)
+ source.Reply(ACCESS_DENIED);
+ else if (!IRCD->IsChannelValid(params[1]))
+ source.Reply(CHAN_X_INVALID, params[1].c_str());
+ else if (c && c->FindUser(target))
+ source.Reply(_("\2%s\2 is already in \2%s\2."), target->nick.c_str(), c->name.c_str());
+ else
+ {
+ IRCD->SendSVSJoin(OperServ, target, params[1], "");
+ Log(LOG_ADMIN, source, this) << "to force " << target->nick << " to join " << params[1];
+ source.Reply(_("\2%s\2 has been joined to \2%s\2."), target->nick.c_str(), params[1].c_str());
+ }
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Forcefully join a user to a channel."));
+ return true;
+ }
+};
+
+class CommandOSSVSPart : public Command
+{
+ public:
+ CommandOSSVSPart(Module *creator) : Command(creator, "operserv/svspart", 2, 2)
+ {
+ this->SetDesc(_("Forcefully part a user from a channel"));
+ this->SetSyntax(_("\037nick\037 \037channel\037"));
+ }
+
+ void Execute(CommandSource &source, const std::vector<Anope::string> &params) anope_override
+ {
+ if (!IRCD->CanSVSJoin)
+ {
+ source.Reply(_("Your IRCd does not support SVSPART"));
+ return;
+ }
+
+ User *target = User::Find(params[0], true);
+ Channel *c = Channel::Find(params[1]);
+ if (target == NULL)
+ source.Reply(NICK_X_NOT_IN_USE, params[0].c_str());
+ else if (target->IsProtected() || target->server == Me)
+ source.Reply(ACCESS_DENIED);
+ else if (!c)
+ source.Reply(CHAN_X_NOT_IN_USE, params[1].c_str());
+ else if (!c->FindUser(target))
+ source.Reply(_("\2%s\2 is not in \2%s\2."), target->nick.c_str(), c->name.c_str());
+ else
+ {
+ IRCD->SendSVSPart(OperServ, target, params[1], "");
+ Log(LOG_ADMIN, source, this) << "to force " << target->nick << " to part " << c->name;
+ source.Reply(_("\2%s\2 has been parted from \2%s\2."), target->nick.c_str(), c->name.c_str());
+ }
+ }
+
+ bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
+ {
+ this->SendSyntax(source);
+ source.Reply(" ");
+ source.Reply(_("Forcefully part a user from a channel."));
+ return true;
+ }
+};
+
+class OSSVS : public Module
+{
+ CommandOSSVSNick commandossvsnick;
+ CommandOSSVSJoin commandossvsjoin;
+ CommandOSSVSPart commandossvspart;
+
+ public:
+ OSSVS(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
+ commandossvsnick(this), commandossvsjoin(this), commandossvspart(this)
+ {
+ this->SetAuthor("Anope");
+ }
+};
+
+MODULE_INIT(OSSVS)
diff --git a/modules/commands/os_svsnick.cpp b/modules/commands/os_svsnick.cpp
deleted file mode 100644
index 5f4652373..000000000
--- a/modules/commands/os_svsnick.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/* OperServ core functions
- *
- * (C) 2003-2013 Anope Team
- * Contact us at team@anope.org
- *
- * Please read COPYING and README for further details.
- *
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
- */
-
-/*************************************************************************/
-
-#include "module.h"
-
-class CommandOSSVSNick : public Command
-{
- public:
- CommandOSSVSNick(Module *creator) : Command(creator, "operserv/svsnick", 2, 2)
- {
- this->SetDesc(_("Forcefully change a user's nickname"));
- this->SetSyntax(_("\037nick\037 \037newnick\037"));
- }
-
- void Execute(CommandSource &source, const std::vector<Anope::string> &params) anope_override
- {
- const Anope::string &nick = params[0];
- Anope::string newnick = params[1];
- User *u2;
-
- /* Truncate long nicknames to Config->NickLen characters */
- if (newnick.length() > Config->NickLen)
- {
- source.Reply(_("Nick \002%s\002 was truncated to %d characters."), newnick.c_str(), Config->NickLen, newnick.c_str());
- newnick = params[1].substr(0, Config->NickLen);
- }
-
- /* Check for valid characters */
- if (!IRCD->IsNickValid(newnick))
- {
- source.Reply(_("Nick \002%s\002 is an illegal nickname and cannot be used."), newnick.c_str());
- return;
- }
-
- /* Check for a nick in use or a forbidden/suspended nick */
- if (!(u2 = User::Find(nick, true)))
- source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
- else if (!nick.equals_ci(newnick) && User::Find(newnick))
- source.Reply(_("Nick \002%s\002 is currently in use."), newnick.c_str());
- else
- {
- source.Reply(_("The nick \002%s\002 is now being changed to \002%s\002."), nick.c_str(), newnick.c_str());
- Log(LOG_ADMIN, source, this) << "to change " << nick << " to " << newnick;
- IRCD->SendForceNickChange(u2, newnick, Anope::CurTime);
- }
- return;
- }
-
- bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
- {
- this->SendSyntax(source);
- source.Reply(" ");
- source.Reply(_("Forcefully changes a user's nickname from nick to newnick."));
- return true;
- }
-};
-
-class OSSVSNick : public Module
-{
- CommandOSSVSNick commandossvsnick;
-
- public:
- OSSVSNick(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, CORE),
- commandossvsnick(this)
- {
- this->SetAuthor("Anope");
-
- if (!IRCD || !IRCD->CanSVSNick)
- throw ModuleException("Your IRCd does not support SVSNICK");
-
- }
-};
-
-MODULE_INIT(OSSVSNick)
diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp
index bd0932575..fd571e490 100644
--- a/modules/protocol/plexus.cpp
+++ b/modules/protocol/plexus.cpp
@@ -155,12 +155,12 @@ class PlexusProto : public IRCDProto
void SendSVSJoin(const BotInfo *source, const User *user, const Anope::string &chan, const Anope::string &param) anope_override
{
- UplinkSocket::Message(source) << "ENCAP " << user->server->GetSID() << " SVSJOIN " << user->GetUID() << " " << chan;
+ UplinkSocket::Message(source) << "ENCAP " << user->server->GetName() << " SVSJOIN " << user->GetUID() << " " << chan;
}
void SendSVSPart(const BotInfo *source, const User *user, const Anope::string &chan, const Anope::string &param) anope_override
{
- UplinkSocket::Message(source) << "ENCAP " << user->server->GetSID() << " SVSPART " << user->GetUID() << " " << chan;
+ UplinkSocket::Message(source) << "ENCAP " << user->server->GetName() << " SVSPART " << user->GetUID() << " " << chan;
}
};