summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/anope.example.conf11
-rw-r--r--data/hybrid.example.conf2
-rw-r--r--data/plexus.example.conf2
-rw-r--r--include/channels.h2
-rw-r--r--include/messages.h558
-rw-r--r--include/module.h1
-rw-r--r--include/modules/protocol/bahamut.h195
-rw-r--r--include/modules/protocol/charybdis.h98
-rw-r--r--include/modules/protocol/hybrid.h234
-rw-r--r--include/modules/protocol/inspircd20.h264
-rw-r--r--include/modules/protocol/ngircd.h88
-rw-r--r--include/modules/protocol/plexus.h99
-rw-r--r--include/modules/protocol/ratbox.h93
-rw-r--r--include/modules/protocol/rfc1459.h159
-rw-r--r--include/modules/protocol/ts6.h37
-rw-r--r--include/modules/protocol/unreal.h232
-rw-r--r--include/protocol.h196
-rw-r--r--modules/botserv/bot.cpp5
-rw-r--r--modules/botserv/main/botserv.cpp1
-rw-r--r--modules/chanserv/invite.cpp2
-rw-r--r--modules/chanserv/main/chanserv.cpp4
-rw-r--r--modules/chanserv/set.cpp2
-rw-r--r--modules/dnsbl.cpp2
-rw-r--r--modules/hostserv/main/hostserv.cpp6
-rw-r--r--modules/hostserv/off.cpp2
-rw-r--r--modules/hostserv/on.cpp2
-rw-r--r--modules/nickserv/ajoin.cpp6
-rw-r--r--modules/nickserv/logout.cpp2
-rw-r--r--modules/nickserv/main/nickserv.cpp14
-rw-r--r--modules/nickserv/recover.cpp6
-rw-r--r--modules/nickserv/register.cpp4
-rw-r--r--modules/nickserv/set.cpp2
-rw-r--r--modules/operserv/jupe.cpp4
-rw-r--r--modules/operserv/main/operserv.cpp12
-rw-r--r--modules/operserv/noop.cpp4
-rw-r--r--modules/operserv/svs.cpp6
-rw-r--r--modules/protocol/bahamut.cpp436
-rw-r--r--modules/protocol/charybdis.cpp204
-rw-r--r--modules/protocol/hybrid.cpp445
-rw-r--r--modules/protocol/inspircd20.cpp581
-rw-r--r--modules/protocol/ngircd.cpp188
-rw-r--r--modules/protocol/plexus.cpp219
-rw-r--r--modules/protocol/ratbox.cpp207
-rw-r--r--modules/protocol/rfc1459.cpp142
-rw-r--r--modules/protocol/ts6.cpp71
-rw-r--r--modules/protocol/unreal.cpp480
-rw-r--r--modules/sasl.cpp10
-rw-r--r--src/bots.cpp8
-rw-r--r--src/channels.cpp2
-rw-r--r--src/command.cpp2
-rw-r--r--src/logger.cpp8
-rw-r--r--src/protocol.cpp179
-rw-r--r--src/servers.cpp19
-rw-r--r--src/service_manager.cpp3
-rw-r--r--src/uplink.cpp4
-rw-r--r--src/users.cpp19
56 files changed, 3765 insertions, 1819 deletions
diff --git a/data/anope.example.conf b/data/anope.example.conf
index 408120c37..89c63ebfd 100644
--- a/data/anope.example.conf
+++ b/data/anope.example.conf
@@ -643,7 +643,7 @@ log
* Target(s) to log to, which may be one of the following:
* - a channel name
* - a filename
- * - globops
+ * - wallops
*/
target = "services.log"
@@ -721,11 +721,11 @@ log
}
/*
- * A log block to globops some useful things.
+ * A log block to wallop some useful things.
*/
log
{
- target = "globops"
+ target = "wallops"
admin = "global/* operserv/chankill operserv/mode operserv/kick operserv/akill operserv/s*line operserv/noop operserv/jupe operserv/set operserv/svsnick operserv/svsjoin operserv/svspart */drop"
servers = "squit"
users = "oper"
@@ -831,11 +831,6 @@ opertype
/*
* Modes to be set on users when they identify to accounts linked to this opertype.
- *
- * This can be used to automatically oper users who identify for services operator accounts, and is
- * useful for setting modes such as Plexus's user mode +N.
- *
- * Note that some IRCds, such as InspIRCd, do not allow directly setting +o, and this will not work.
*/
#modes = "+o"
}
diff --git a/data/hybrid.example.conf b/data/hybrid.example.conf
index 6e9f4da6f..6ec0f5da6 100644
--- a/data/hybrid.example.conf
+++ b/data/hybrid.example.conf
@@ -121,7 +121,7 @@ channelmode
channelmode
{
name = "HALFOP"
- characater = "h"
+ character = "h"
status = "%"
level = 2
}
diff --git a/data/plexus.example.conf b/data/plexus.example.conf
index 9d1204828..9bf095e97 100644
--- a/data/plexus.example.conf
+++ b/data/plexus.example.conf
@@ -161,7 +161,7 @@ channelmode
channelmode
{
name = "HALFOP"
- characater = "h"
+ character = "h"
status = "%"
level = 2
}
diff --git a/include/channels.h b/include/channels.h
index d3161b7ae..31fa582c4 100644
--- a/include/channels.h
+++ b/include/channels.h
@@ -70,7 +70,7 @@ class CoreExport Channel : public Base, public Extensible
Anope::string topic;
/* Who set the topic */
Anope::string topic_setter;
- /* The timestamp associated with the topic. Not necessarually anywhere close to Anope::CurTime.
+ /* The timestamp associated with the topic. Not necessarily anywhere close to Anope::CurTime.
* This is the time the topic was *originally set*. When we restore the topic we want to change the TS back
* to this, but we can only do this on certain IRCds.
*/
diff --git a/include/messages.h b/include/messages.h
new file mode 100644
index 000000000..3361d5740
--- /dev/null
+++ b/include/messages.h
@@ -0,0 +1,558 @@
+/*
+ * Anope IRC Services
+ *
+ * Copyright (C) 2016 Anope Team <team@anope.org>
+ *
+ * This file is part of Anope. Anope is free software; you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License as published by the Free Software
+ * Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+template<typename T>
+class MessageSender : public Service
+{
+ public:
+ static constexpr const char *NAME = "messagesender";
+
+ MessageSender(Module *owner) : Service(owner, NAME, T::NAME) { }
+};
+
+namespace messages
+{
+
+class Akill : public MessageSender<Akill>
+{
+ public:
+ static constexpr const char *NAME = "akill";
+
+ using MessageSender::MessageSender;
+
+ /** Sets an akill. This is a recursive function that can be called multiple times
+ * for the same xline, but for different users, if the xline is not one that can be
+ * enforced by the IRCd, such as a nick/user/host/realname combination ban.
+ * @param u The user affected by the akill, if known
+ * @param x The akill
+ */
+ virtual void Send(User *, XLine *) anope_abstract;
+};
+
+class AkillDel : public MessageSender<AkillDel>
+{
+ public:
+ static constexpr const char *NAME = "akilldel";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(XLine *) anope_abstract;
+};
+
+class MessageChannel : public MessageSender<MessageChannel>
+{
+ public:
+ static constexpr const char *NAME = "channel";
+
+ using MessageSender::MessageSender;
+
+ /** Send a channel creation message to the uplink.
+ * On most IRCds this is a SJOIN with no nicks
+ */
+ virtual void Send(Channel *) anope_abstract;
+};
+
+class GlobalNotice : public MessageSender<GlobalNotice>
+{
+ public:
+ static constexpr const char *NAME = "globalnotice";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const MessageSource &, Server *dest, const Anope::string &msg) anope_abstract;
+};
+
+class GlobalPrivmsg : public MessageSender<GlobalPrivmsg>
+{
+ public:
+ static constexpr const char *NAME = "globalprivmsg";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const MessageSource &, Server *dest, const Anope::string &msg) anope_abstract;
+};
+
+class Invite : public MessageSender<Invite>
+{
+ public:
+ static constexpr const char *NAME = "invite";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const MessageSource &source, Channel *c, User *u) anope_abstract;
+};
+
+class Join : public MessageSender<Join>
+{
+ public:
+ static constexpr const char *NAME = "join";
+
+ using MessageSender::MessageSender;
+
+ /** Joins one of our users to a channel.
+ * @param u The user to join
+ * @param c The channel to join the user to
+ * @param status The status to set on the user after joining. This may or may not already internally
+ * be set on the user. This may include the modes in the join, but will usually place them on the mode
+ * stacker to be set "soon".
+ */
+ virtual void Send(User *u, Channel *c, const ChannelStatus *status) anope_abstract;
+};
+
+class Kick : public MessageSender<Kick>
+{
+ public:
+ static constexpr const char *NAME = "kick";
+
+ using MessageSender::MessageSender;
+
+ /** Kick a user from a channel
+ * @param source Who is doing the kick
+ * @param channel Channel
+ * @param user Target of the kick
+ * @param reason Kick reason
+ */
+ virtual void Send(const MessageSource &source, Channel *channel, User *user, const Anope::string &reason) anope_abstract;
+};
+
+class Kill : public MessageSender<Kill>
+{
+ public:
+ static constexpr const char *NAME = "svskill";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const MessageSource &source, const Anope::string &target, const Anope::string &reason) anope_abstract;
+
+ /** Kills a user
+ * @param source Who is doing the kill
+ * @param user The target to be killed
+ * @param reason Kill reason
+ */
+ virtual void Send(const MessageSource &source, User *user, const Anope::string &reason) anope_abstract;
+};
+
+class Login : public MessageSender<Login>
+{
+ public:
+ static constexpr const char *NAME = "login";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *u, NickServ::Nick *na) anope_abstract;
+};
+
+class Logout : public MessageSender<Logout>
+{
+ public:
+ static constexpr const char *NAME = "logout";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *u) anope_abstract;
+};
+
+class ModeChannel : public MessageSender<ModeChannel>
+{
+ public:
+ static constexpr const char *NAME = "modechannel";
+
+ using MessageSender::MessageSender;
+
+ /** Changes the mode on a channel
+ * @param source Who is changing the mode
+ * @param channel Channel
+ * @param modes Modes eg +nt
+ */
+ virtual void Send(const MessageSource &source, Channel *channel, const Anope::string &modes) anope_abstract;
+};
+
+class ModeUser : public MessageSender<ModeUser>
+{
+ public:
+ static constexpr const char *NAME = "modeuser";
+
+ using MessageSender::MessageSender;
+
+ /** Changes the mode on a user
+ * @param source Who is changing the mode
+ * @param user user
+ * @param modes Modes eg +i
+ */
+ virtual void Send(const MessageSource &source, User *user, const Anope::string &modes) anope_abstract;
+};
+
+class NickChange : public MessageSender<NickChange>
+{
+ public:
+ static constexpr const char *NAME = "nickchange";
+
+ using MessageSender::MessageSender;
+
+ /** Sends a nick change of one of our clients.
+ */
+ virtual void Send(User *u, const Anope::string &newnick, time_t ts) anope_abstract;
+};
+
+class NickIntroduction : public MessageSender<NickIntroduction>
+{
+ public:
+ static constexpr const char *NAME = "nickintroduction";
+
+ using MessageSender::MessageSender;
+
+ /** Introduces a client to the rest of the network
+ * @param user The client to introduce
+ */
+ virtual void Send(User *user) anope_abstract;
+};
+
+class NOOP : public MessageSender<NOOP>
+{
+ public:
+ static constexpr const char *NAME = "noop";
+
+ using MessageSender::MessageSender;
+
+ /** Sets the server in NOOP mode. If NOOP mode is enabled, no users
+ * will be able to oper on the server.
+ * @param s The server
+ * @param mode Whether to turn NOOP on or off
+ */
+ virtual void Send(Server *s, bool mode) anope_abstract;
+};
+
+class Notice : public MessageSender<Notice>
+{
+ public:
+ static constexpr const char *NAME = "notice";
+
+ using MessageSender::MessageSender;
+
+ /** Send a notice to a target
+ * @param source Source of the notice
+ * @param dest Destination user/channel
+ * @param msg Message to send
+ */
+ virtual void Send(const MessageSource &source, const Anope::string &dest, const Anope::string &msg) anope_abstract;
+};
+
+class Part : public MessageSender<Part>
+{
+ public:
+ static constexpr const char *NAME = "part";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *, Channel *chan, const Anope::string &reason) anope_abstract;
+};
+
+class Ping : public MessageSender<Ping>
+{
+ public:
+ static constexpr const char *NAME = "ping";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const Anope::string &servname, const Anope::string &who) anope_abstract;
+};
+
+class Pong : public MessageSender<Pong>
+{
+ public:
+ static constexpr const char *NAME = "pong";
+
+ using MessageSender::MessageSender;
+
+ /**
+ * Send a PONG reply to a received PING.
+ * servname should be left empty to send a one param reply.
+ * @param servname Daemon or client that is responding to the PING.
+ * @param who Origin of the PING and destination of the PONG message.
+ **/
+ virtual void Send(const Anope::string &servname, const Anope::string &who) anope_abstract;
+};
+
+class Privmsg : public MessageSender<Privmsg>
+{
+ public:
+ static constexpr const char *NAME = "privmsg";
+
+ using MessageSender::MessageSender;
+
+ /** Send a privmsg to a target
+ * @param source Source of the privmsg
+ * @param dest Destination user/channel
+ * @param msg Message to send
+ */
+ virtual void Send(const MessageSource &source, const Anope::string &dest, const Anope::string &msg) anope_abstract;
+};
+
+class Quit : public MessageSender<Quit>
+{
+ public:
+ static constexpr const char *NAME = "quit";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *user, const Anope::string &reason) anope_abstract;
+};
+
+class MessageServer : public MessageSender<MessageServer>
+{
+ public:
+ static constexpr const char *NAME = "server";
+
+ using MessageSender::MessageSender;
+
+ /** Introduces a server to the uplink
+ */
+ virtual void Send(Server *s) anope_abstract;
+};
+
+class SASL : public MessageSender<SASL>
+{
+ public:
+ static constexpr const char *NAME = "sasl";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const ::SASL::Message &) anope_abstract;
+};
+
+class SASLMechanisms : public MessageSender<SASLMechanisms>
+{
+ public:
+ static constexpr const char *NAME = "saslmechanisms";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const std::vector<Anope::string> &mechanisms) anope_abstract;
+};
+
+// realname ban
+class SGLine : public MessageSender<SGLine>
+{
+ public:
+ static constexpr const char *NAME = "sgline";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *, XLine *) anope_abstract;
+};
+
+class SGLineDel : public MessageSender<SGLineDel>
+{
+ public:
+ static constexpr const char *NAME = "sglinedel";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(XLine *) anope_abstract;
+};
+
+// Nick ban (and sometimes channel)
+class SQLine : public MessageSender<SQLine>
+{
+ public:
+ static constexpr const char *NAME = "sqline";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *, XLine *) anope_abstract;
+};
+
+class SQLineDel : public MessageSender<SQLineDel>
+{
+ public:
+ static constexpr const char *NAME = "sqlinedel";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(XLine *) anope_abstract;
+};
+
+// IP ban
+class SZLine : public MessageSender<SZLine>
+{
+ public:
+ static constexpr const char *NAME = "szline";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *, XLine *) anope_abstract;
+};
+
+class SZLineDel : public MessageSender<SZLineDel>
+{
+ public:
+ static constexpr const char *NAME = "szlinedel";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(XLine *) anope_abstract;
+};
+
+class SQuit : public MessageSender<SQuit>
+{
+ public:
+ static constexpr const char *NAME = "squit";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(Server *s, const Anope::string &message) anope_abstract;
+};
+
+class SVSHold : public MessageSender<SVSHold>
+{
+ public:
+ static constexpr const char *NAME = "svshold";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const Anope::string &, time_t) anope_abstract;
+};
+
+class SVSHoldDel : public MessageSender<SVSHoldDel>
+{
+ public:
+ static constexpr const char *NAME = "svsholddel";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const Anope::string &) anope_abstract;
+};
+
+class SVSJoin : public MessageSender<SVSJoin>
+{
+ public:
+ static constexpr const char *NAME = "svsjoin";
+
+ using MessageSender::MessageSender;
+
+ /** Force joins a user that isn't ours to a channel.
+ * @param bi The source of the message
+ * @param u The user to join
+ * @param chan The channel to join the user to
+ * @param key Channel key
+ */
+ virtual void Send(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &key) anope_abstract;
+};
+
+class SVSNick : public MessageSender<SVSNick>
+{
+ public:
+ static constexpr const char *NAME = "svsnick";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *u, const Anope::string &newnick, time_t ts) anope_abstract;
+};
+
+class SVSPart : public MessageSender<SVSPart>
+{
+ public:
+ static constexpr const char *NAME = "svspart";
+
+ using MessageSender::MessageSender;
+
+ /** Force parts a user that isn't ours from a channel.
+ * @param source The source of the message
+ * @param u The user to part
+ * @param chan The channel to part the user from
+ * @param param part reason, some IRCds don't support this
+ */
+ virtual void Send(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &reason) anope_abstract;
+};
+
+class SVSLogin : public MessageSender<SVSLogin>
+{
+ public:
+ static constexpr const char *NAME = "svslogin";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost) anope_abstract;
+};
+
+class SWhois : public MessageSender<SWhois>
+{
+ public:
+ static constexpr const char *NAME = "swhois";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const MessageSource &, User *user, const Anope::string &) anope_abstract;
+};
+
+class Topic : public MessageSender<Topic>
+{
+ public:
+ static constexpr const char *NAME = "topic";
+
+ using MessageSender::MessageSender;
+
+ /** Sets the topic on a channel
+ * @param source The bot to set the topic from
+ * @param chan The channel to set the topic on
+ * @param topic The new topic
+ * @param topic_ts The desired time set for the new topic
+ * @param topic_setter Who set the topic
+ */
+ virtual void Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter) anope_abstract;
+};
+
+class VhostDel : public MessageSender<VhostDel>
+{
+ public:
+ static constexpr const char *NAME = "vhostdel";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(User *u) anope_abstract;
+};
+
+class VhostSet : public MessageSender<VhostSet>
+{
+ public:
+ static constexpr const char *NAME = "vhostset";
+
+ using MessageSender::MessageSender;
+
+ /** Sets a vhost on a user.
+ * @param u The user
+ * @param vident The ident to set
+ * @param vhost The vhost to set
+ */
+ virtual void Send(User *u, const Anope::string &vident, const Anope::string &vhost) anope_abstract;
+};
+
+class Wallops : public MessageSender<Wallops>
+{
+ public:
+ static constexpr const char *NAME = "wallops";
+
+ using MessageSender::MessageSender;
+
+ virtual void Send(const MessageSource &source, const Anope::string &msg) anope_abstract;
+};
+
+} // namespace messages
diff --git a/include/module.h b/include/module.h
index 58b012fce..66446105a 100644
--- a/include/module.h
+++ b/include/module.h
@@ -32,6 +32,7 @@
#include "lists.h"
#include "logger.h"
#include "mail.h"
+#include "messages.h"
#include "modes.h"
#include "modules.h"
#include "numeric.h"
diff --git a/include/modules/protocol/bahamut.h b/include/modules/protocol/bahamut.h
index f120c7d4c..fd0d47c87 100644
--- a/include/modules/protocol/bahamut.h
+++ b/include/modules/protocol/bahamut.h
@@ -22,62 +22,201 @@
namespace bahamut
{
-class Proto : public IRCDProto
+namespace senders
+{
+
+class Akill : public messages::Akill
{
public:
- Proto(Module *creator);
+ using messages::Akill::Akill;
- void SendMode(const MessageSource &source, Channel *dest, const Anope::string &buf) override;
+ void Send(User *, XLine *) override;
+};
- void SendMode(const MessageSource &source, User *u, const Anope::string &buf) override;
+class AkillDel : public messages::AkillDel
+{
+ public:
+ using messages::AkillDel::AkillDel;
- void SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+ void Send(XLine *) override;
+};
+
+class MessageChannel : public messages::MessageChannel
+{
+ public:
+ using messages::MessageChannel::MessageChannel;
+
+ void Send(Channel *) override;
+};
- void SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+class Join : public messages::Join
+{
+ public:
+ using messages::Join::Join;
+
+ void Send(User *u, Channel *c, const ChannelStatus *status) override;
+};
+
+class Kill : public messages::Kill
+{
+ public:
+ using messages::Kill::Kill;
+
+ void Send(const MessageSource &source, const Anope::string &target, const Anope::string &reason) override;
+
+ void Send(const MessageSource &source, User *user, const Anope::string &reason) override;
+};
+
+class Login : public messages::Login
+{
+ public:
+ using messages::Login::Login;
- void SendSVSHold(const Anope::string &nick, time_t time) override;
+ void Send(User *u, NickServ::Nick *na) override;
+};
- void SendSVSHoldDel(const Anope::string &nick) override;
+class Logout : public messages::Logout
+{
+ public:
+ using messages::Logout::Logout;
- void SendSQLine(User *, XLine *x) override;
+ void Send(User *u) override;
+};
- void SendSGLineDel(XLine *x) override;
+class ModeChannel : public messages::ModeChannel
+{