summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2016-12-17 21:44:22 -0500
committerAdam <Adam@anope.org>2016-12-17 21:44:22 -0500
commit4fcbbbe4fbc137841b47c8e2372477b85649270a (patch)
treef2a5fd3b5a77ef0384df6e2712fdd74f832d7dfe
parented08d1a31119adb379f8bec46d7ad47ee35c4c92 (diff)
Split ircdproto send functions out into separate services
This makes it easier to see which send functions a protocol module implements as they are all explicitly registered by the module, and avoids the problem of subtly breaking other protocol modules when using inheritance. Also split the old "core" send implementations out into a module, and the TS6 ID generator
-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
+{
+ public:
+ using messages::ModeChannel::ModeChannel;
- void SendSZLineDel(XLine *x) override;
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &modes) override;
+};
- void SendSZLine(User *, XLine *x) override;
+class ModeUser : public messages::ModeUser
+{
+ public:
+ using messages::ModeUser::ModeUser;
- void SendSVSNOOP(Server *server, bool set) override;
+ void Send(const MessageSource &source, User *user, const Anope::string &modes) override;
+};
- void SendSGLine(User *, XLine *x) override;
+class NickIntroduction : public messages::NickIntroduction
+{
+ public:
+ using messages::NickIntroduction::NickIntroduction;
- void SendAkillDel(XLine *x) override;
+ void Send(User *user) override;
+};
- void SendTopic(const MessageSource &source, Channel *c) override;
+class NOOP : public messages::NOOP
+{
+ public:
+ static constexpr const char *NAME = "noop";
- void SendSQLineDel(XLine *x) override;
+ using messages::NOOP::NOOP;
- void SendJoin(User *user, Channel *c, const ChannelStatus *status) override;
+ void Send(Server *s, bool mode) override;
+};
- void SendAkill(User *u, XLine *x) override;
+class SGLine : public messages::SGLine
+{
+ public:
+ using messages::SGLine::SGLine;
- void SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf) override;
+ void Send(User *, XLine *) override;
+};
- void SendBOB() override;
+class SGLineDel : public messages::SGLineDel
+{
+ public:
+ using messages::SGLineDel::SGLineDel;
- void SendEOB() override;
+ void Send(XLine *) override;
+};
- void SendClientIntroduction(User *u) override;
+class SQLine : public messages::SQLine
+{
+ public:
+ using messages::SQLine::SQLine;
+
+ void Send(User *, XLine *) override;
+};
+
+class SQLineDel : public messages::SQLineDel
+{
+ public:
+ using messages::SQLineDel::SQLineDel;
+
+ void Send(XLine *) override;
+};
+
+class SZLine : public messages::SZLine
+{
+ public:
+ using messages::SZLine::SZLine;
+
+ void Send(User *, XLine *) override;
+};
+
+class SZLineDel : public messages::SZLineDel
+{
+ public:
+ using messages::SZLineDel::SZLineDel;
+
+ void Send(XLine *) override;
+};
+
+class SVSHold : public messages::SVSHold
+{
+ public:
+ using messages::SVSHold::SVSHold;
+
+ void Send(const Anope::string &, time_t) override;
+};
+
+class SVSHoldDel : public messages::SVSHoldDel
+{
+ public:
+ using messages::SVSHoldDel::SVSHoldDel;
- void SendServer(Server *server) override;
+ void Send(const Anope::string &) override;
+};
- void SendConnect() override;
+class SVSNick : public messages::SVSNick
+{
+ public:
+ using messages::SVSNick::SVSNick;
- void SendChannel(Channel *c) override;
+ void Send(User *u, const Anope::string &newnick, time_t ts) override;
+};
- void SendLogin(User *u, NickServ::Nick *) override;
+class Topic : public messages::Topic
+{
+ public:
+ using messages::Topic::Topic;
+
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter) override;
+};
+
+class Wallops : public messages::Wallops
+{
+ public:
+ using messages::Wallops::Wallops;
+
+ void Send(const MessageSource &source, const Anope::string &msg) override;
+};
+
+} // namespace senders
+
+class Proto : public IRCDProto
+{
+ public:
+ Proto(Module *creator);
+
+ void SendBOB() override;
+
+ void SendEOB() override;
- void SendLogout(User *u) override;
+ void Handshake() override;
};
class Burst : public IRCDMessage
diff --git a/include/modules/protocol/charybdis.h b/include/modules/protocol/charybdis.h
index ee81a60a1..f3c06bfeb 100644
--- a/include/modules/protocol/charybdis.h
+++ b/include/modules/protocol/charybdis.h
@@ -19,53 +19,91 @@
#pragma once
+#include "modules/protocol/ts6.h"
+#include "modules/protocol/ratbox.h"
+
namespace charybdis
{
-class Proto : public IRCDProto
+namespace senders
{
- ServiceReference<IRCDProto> ratbox; // XXX
+class NickIntroduction : public messages::NickIntroduction
+{
public:
- Proto(Module *creator);
+ using messages::NickIntroduction::NickIntroduction;
- void SendSVSKill(const MessageSource &source, User *targ, const Anope::string &reason) override { ratbox->SendSVSKill(source, targ, reason); }
- void SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) override { ratbox->SendGlobalNotice(bi, dest, msg); }
- void SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) override { ratbox->SendGlobalPrivmsg(bi, dest, msg); }
- void SendGlobops(const MessageSource &source, const Anope::string &buf) override { ratbox->SendGlobops(source, buf); }
- void SendSGLine(User *u, XLine *x) override { ratbox->SendSGLine(u, x); }
- void SendSGLineDel(XLine *x) override { ratbox->SendSGLineDel(x); }
- void SendAkill(User *u, XLine *x) override { ratbox->SendAkill(u, x); }
- void SendAkillDel(XLine *x) override { ratbox->SendAkillDel(x); }
- void SendSQLine(User *u, XLine *x) override { ratbox->SendSQLine(u, x); }
- void SendSQLineDel(XLine *x) override { ratbox->SendSQLineDel(x); }
- void SendJoin(User *user, Channel *c, const ChannelStatus *status) override { ratbox->SendJoin(user, c, status); }
- void SendServer(Server *server) override { ratbox->SendServer(server); }
- void SendChannel(Channel *c) override { ratbox->SendChannel(c); }
- void SendTopic(const MessageSource &source, Channel *c) override { ratbox->SendTopic(source, c); }
- bool IsIdentValid(const Anope::string &ident) override { return ratbox->IsIdentValid(ident); }
- void SendLogin(User *u, NickServ::Nick *na) override { ratbox->SendLogin(u, na); }
- void SendLogout(User *u) override { ratbox->SendLogout(u); }
+ void Send(User *user) override;
+};
- void SendConnect() override;
+class SASL : public messages::SASL
+{
+ public:
+ using messages::SASL::SASL;
- void SendClientIntroduction(User *u) override;
+ void Send(const ::SASL::Message &) override;
+};
- void SendForceNickChange(User *u, const Anope::string &newnick, time_t when) override;
+class SASLMechanisms : public messages::SASLMechanisms
+{
+ public:
+ using messages::SASLMechanisms::SASLMechanisms;
- void SendSVSHold(const Anope::string &nick, time_t delay) override;
+ void Send(const std::vector<Anope::string> &mechanisms) override;
+};
- void SendSVSHoldDel(const Anope::string &nick) override;
+class SVSHold : public messages::SVSHold
+{
+ public:
+ using messages::SVSHold::SVSHold;
- void SendVhost(User *u, const Anope::string &ident, const Anope::string &host) override;
+ void Send(const Anope::string &, time_t) override;
+};
- void SendVhostDel(User *u) override;
+class SVSHoldDel : public messages::SVSHoldDel
+{
+ public:
+ using messages::SVSHoldDel::SVSHoldDel;
- void SendSASLMechanisms(std::vector<Anope::string> &mechanisms) override;
+ void Send(const Anope::string &) override;
+};
+
+class SVSLogin : public messages::SVSLogin
+{
+ public:
+ using messages::SVSLogin::SVSLogin;
+
+ void Send(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost) override;
+};
+
+class VhostDel : public messages::VhostDel
+{
+ public:
+ using messages::VhostDel::VhostDel;
+
+ void Send(User *u) override;
+};
+
+class VhostSet : public messages::VhostSet
+{
+ public:
+ using messages::VhostSet::VhostSet;
+
+ void Send(User *u, const Anope::string &vident, const Anope::string &vhost) override;
+};
+
+} // namespace senders
+
+class Proto : public ts6::Proto
+{
+ ratbox::Proto ratbox;
+
+ public:
+ Proto(Module *creator);
- void SendSASLMessage(const SASL::Message &message) override;
+ bool IsIdentValid(const Anope::string &ident) override { return ratbox.IsIdentValid(ident); }
- void SendSVSLogin(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost) override;
+ void Handshake() override;
};
class Encap : public IRCDMessage
diff --git a/include/modules/protocol/hybrid.h b/include/modules/protocol/hybrid.h
index a0a9143a8..7843859c0 100644
--- a/include/modules/protocol/hybrid.h
+++ b/include/modules/protocol/hybrid.h
@@ -20,74 +20,242 @@
#pragma once
#include "modules/protocol/rfc1459.h"
+#include "modules/protocol/ts6.h"
namespace hybrid
{
-class Proto : public IRCDProto
+namespace senders
{
- ServiceBot *FindIntroduced();
- void SendSVSKill(const MessageSource &source, User *u, const Anope::string &buf) override;
+class Akill : public messages::Akill
+{
+ public:
+ using messages::Akill::Akill;
- public:
- Proto(Module *creator);
+ void Send(User *, XLine *) override;
+};
- void SendInvite(const MessageSource &source, Channel *c, User *u) 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;
+};
- void SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+class MessageChannel : public messages::MessageChannel
+{
+ public:
+ using messages::MessageChannel::MessageChannel;
- void SendSQLine(User *, XLine *x) override;
+ void Send(Channel *) override;
+};
- void SendSGLineDel(XLine *x) override;
+class GlobalNotice : public messages::GlobalNotice
+{
+ public:
+ using messages::GlobalNotice::GlobalNotice;
- void SendSGLine(User *, XLine *x) override;
+ void Send(const MessageSource &, Server *dest, const Anope::string &msg) override;
+};
- void SendSZLineDel(XLine *x) override;
+class GlobalPrivmsg : public messages::GlobalPrivmsg
+{
+ public:
+ using messages::GlobalPrivmsg::GlobalPrivmsg;
- void SendSZLine(User *, XLine *x) override;
+ void Send(const MessageSource &, Server *dest, const Anope::string &msg) override;
+};
- void SendAkillDel(XLine *x) override;
+class Invite : public messages::Invite
+{
+ public:
+ using messages::Invite::Invite;
- void SendSQLineDel(XLine *x) override;
+ void Send(const MessageSource &source, Channel *chan, User *user) override;
+};
- void SendJoin(User *u, Channel *c, const ChannelStatus *status) override;
+class Join : public messages::Join
+{
+ public:
+ using messages::Join::Join;
- void SendAkill(User *u, XLine *x) override;
+ void Send(User *u, Channel *c, const ChannelStatus *status) override;
+};
- void SendServer(Server *server) override;
+class Login : public messages::Login
+{
+ public:
+ using messages::Login::Login;
- void SendConnect() override;
+ void Send(User *u, NickServ::Nick *na) override;
+};
- void SendClientIntroduction(User *u) override;
+class Logout : public messages::Logout
+{
+ public:
+ using messages::Logout::Logout;
- void SendEOB() override;
+ void Send(User *u) override;
+};
+
+class ModeUser : public messages::ModeUser
+{
+ public:
+ using messages::ModeUser::ModeUser;
- void SendMode(const MessageSource &source, User *u, const Anope::string &buf) override;
+ void Send(const MessageSource &source, User *user, const Anope::string &modes) override;
+};
+
+class NickIntroduction : public messages::NickIntroduction
+{
+ public:
+ using messages::NickIntroduction::NickIntroduction;
+
+ void Send(User *user) override;
+};
+
+class MessageServer : public messages::MessageServer
+{
+ public:
+ using messages::MessageServer::MessageServer;
+
+ void Send(Server *server) override;
+};
- void SendLogin(User *u, NickServ::Nick *na) override;
+class SGLine : public messages::SGLine
+{
+ public:
+ using messages::SGLine::SGLine;
- void SendLogout(User *u) override;
+ void Send(User *, XLine *) override;
+};
- void SendChannel(Channel *c) override;
+class SGLineDel : public messages::SGLineDel
+{
+ public:
+ using messages::SGLineDel::SGLineDel;
- void SendTopic(const MessageSource &source, Channel *c) override;
+ void Send(XLine *) override;
+};
- void SendForceNickChange(User *u, const Anope::string &newnick, time_t when) override;
+class SQLine : public messages::SQLine
+{
+ public:
+ using messages::SQLine::SQLine;
- void SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &) override;
+ void Send(User *, XLine *) override;
+};
- void SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &param) override;
+class SQLineDel : public messages::SQLineDel
+{
+ public:
+ using messages::SQLineDel::SQLineDel;
- void SendSVSHold(const Anope::string &nick, time_t t) override;
+ void Send(XLine *) override;
+};
- void SendSVSHoldDel(const Anope::string &nick) override;
+class SZLine : public messages::SZLine
+{
+ public:
+ using messages::SZLine::SZLine;
- void SendVhost(User *u, const Anope::string &ident, const Anope::string &host) override;
+ void Send(User *, XLine *) override;
+};
- void SendVhostDel(User *u) override;
+class SZLineDel : public messages::SZLineDel
+{
+ public:
+ using messages::SZLineDel::SZLineDel;
+
+ void Send(XLine *) override;
+};
+
+class SVSHold : public messages::SVSHold
+{
+ public:
+ using messages::SVSHold::SVSHold;
+
+ void Send(const Anope::string &, time_t) override;
+};
+
+class SVSHoldDel : public messages::SVSHoldDel
+{
+ public:
+ using messages::SVSHoldDel::SVSHoldDel;
+
+ void Send(const Anope::string &) override;
+};
+
+class SVSJoin : public messages::SVSJoin
+{
+ public:
+ using messages::SVSJoin::SVSJoin;
+
+ void Send(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &key) override;
+};
+
+class SVSNick : public messages::SVSNick
+{
+ public:
+ using messages::SVSNick::SVSNick;
+
+ void Send(User *u, const Anope::string &newnick, time_t ts) override;
+};
+
+class SVSPart : public messages::SVSPart
+{
+ public:
+ using messages::SVSPart::SVSPart;
+
+ void Send(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &reason) override;
+};
+
+class Topic : public messages::Topic
+{
+ public:
+ using messages::Topic::Topic;
+
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter) override;
+};
+
+class VhostDel : public messages::VhostDel
+{
+ public:
+ using messages::VhostDel::VhostDel;
+
+ void Send(User *u) override;
+};
+
+class VhostSet : public messages::VhostSet
+{
+ public:
+ using messages::VhostSet::VhostSet;
+
+ void Send(User *u, const Anope::string &vident, const Anope::string &vhost) override;
+};
+
+class Wallops : public messages::Wallops
+{
+ public:
+ using messages::Wallops::Wallops;
+
+ void Send(const MessageSource &source, const Anope::string &msg) override;
+};
+
+} // namespace senders
+
+class Proto : public ts6::Proto
+{
+ ServiceBot *FindIntroduced();
+
+ public:
+ Proto(Module *creator);
+
+ void Handshake() override;
+
+ void SendEOB() override;
bool IsIdentValid(const Anope::string &ident) override;
};
diff --git a/include/modules/protocol/inspircd20.h b/include/modules/protocol/inspircd20.h
index f2126a931..391a0bc79 100644
--- a/include/modules/protocol/inspircd20.h
+++ b/include/modules/protocol/inspircd20.h
@@ -19,88 +19,270 @@
#pragma once
+#include "modules/protocol/ts6.h"
+
namespace inspircd20
{
-class Proto : public IRCDProto
+class Proto;
+
+namespace senders
{
- private:
- void SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf) override;
- void SendChgIdentInternal(const Anope::string &nick, const Anope::string &vIdent);
+class Akill : public messages::Akill
+{
+ Proto *proto = nullptr;
- void SendChgHostInternal(const Anope::string &nick, const Anope::string &vhost);
+ public:
+ Akill(Module *creator, Proto *p) : messages::Akill(creator),
+ proto(p)
+ {
+ }
- void SendAddLine(const Anope::string &xtype, const Anope::string &mask, time_t duration, const Anope::string &addedby, const Anope::string &reason);
+ void Send(User *, XLine *) override;
+};
- void SendDelLine(const Anope::string &xtype, const Anope::string &mask);
+class AkillDel : public messages::AkillDel
+{
+ Proto *proto = nullptr;
public:
- Proto(Module *creator);
+ AkillDel(Module *creator, Proto *p) : messages::AkillDel(creator),
+ proto(p)
+ {
+ }
- void SendConnect() override;
+ void Send(XLine *) override;
+};
- void SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+class MessageChannel : public messages::MessageChannel
+{
+ public:
+ using messages::MessageChannel::MessageChannel;
- void SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+ void Send(Channel *) override;
+};
- void SendAkillDel(XLine *x) override;
+class Join : public messages::Join
+{
+ public:
+ using messages::Join::Join;
- void SendTopic(const MessageSource &source, Channel *c) override;
+ void Send(User *u, Channel *c, const ChannelStatus *status) override;
+};
- void SendVhostDel(User *u) override;
+class Login : public messages::Login
+{
+ public:
+ using messages::Login::Login;
- void SendAkill(User *u, XLine *x) override;
+ void Send(User *u, NickServ::Nick *na) override;
+};
- void SendNumeric(int numeric, User *dest, IRCMessage &message);
+class Logout : public messages::Logout
+{
+ public:
+ using messages::Logout::Logout;
- void SendMode(const MessageSource &source, Channel *dest, const Anope::string &buf) override;
+ void Send(User *u) override;
+};
- void SendClientIntroduction(User *u) override;
+class ModeChannel : public messages::ModeChannel
+{
+ public:
+ using messages::ModeChannel::ModeChannel;
- void SendServer(Server *server) override;
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &modes) override;
+};
- void SendSquit(Server *s, const Anope::string &message) override;
+class NickIntroduction : public messages::NickIntroduction
+{
+ public:
+ using messages::NickIntroduction::NickIntroduction;
- void SendJoin(User *user, Channel *c, const ChannelStatus *status) override;
+ void Send(User *user) override;
+};
- void SendSQLineDel(XLine *x) override;
+class MessageServer : public messages::MessageServer
+{
+ public:
+ using messages::MessageServer::MessageServer;
- void SendSQLine(User *, XLine *x) override;
+ void Send(Server *server) override;
+};
- void SendVhost(User *u, const Anope::string &vIdent, const Anope::string &vhost) override;
+class SASL : public messages::SASL
+{
+ public:
+ using messages::SASL::SASL;
- void SendSVSHold(const Anope::string &nick, time_t t) override;
+ void Send(const ::SASL::Message &) override;
+};
- void SendSVSHoldDel(const Anope::string &nick) override;
+class SASLMechanisms : public messages::SASLMechanisms
+{
+ public:
+ using messages::SASLMechanisms::SASLMechanisms;
- void SendSZLineDel(XLine *x) override;
+ void Send(const std::vector<Anope::string> &mechanisms) override;
+};
- void SendSZLine(User *, XLine *x) override;
+class SQLine : public messages::SQLine
+{
+ Proto *proto = nullptr;
- void SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &) override;
+ public:
+ SQLine(Module *creator, Proto *p) : messages::SQLine(creator),
+ proto(p)
+ {
+ }
- void SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &param) override;
+ void Send(User *, XLine *) override;
+};
- void SendSWhois(const MessageSource &, const Anope::string &who, const Anope::string &mask) override;
+class SQLineDel : public messages::SQLineDel
+{
+ Proto *proto = nullptr;
- void SendBOB() override;
+ public:
+ SQLineDel(Module *creator, Proto *p) : messages::SQLineDel(creator),
+ proto(p)
+ {
+ }
- void SendEOB() override;
+ void Send(XLine *) override;
+};
+
+class SQuit : public messages::SQuit
+{
+ public:
+ using messages::SQuit::SQuit;
+
+ void Send(Server *s, const Anope::string &message) override;
+};
+
+class SZLine : public messages::SZLine
+{
+ Proto *proto = nullptr;
+
+ public:
+ SZLine(Module *creator, Proto *p) : messages::SZLine(creator),
+ proto(p)
+ {
+ }
+
+ void Send(User *, XLine *) override;
+};
+
+class SZLineDel : public messages::SZLineDel
+{
+ Proto *proto = nullptr;
+
+ public:
+ SZLineDel(Module *creator, Proto *p) : messages::SZLineDel(creator),
+ proto(p)
+ {
+ }
+
+ void Send(XLine *) override;
+};
+
+class SVSHold : public messages::SVSHold
+{
+ public:
+ using messages::SVSHold::SVSHold;
+
+ void Send(const Anope::string &, time_t) override;
+};
+
+class SVSHoldDel : public messages::SVSHoldDel
+{
+ public:
+ using messages::SVSHoldDel::SVSHoldDel;
- void SendGlobops(const MessageSource &source, const Anope::string &buf) override;
+ void Send(const Anope::string &) override;
+};
- void SendLogin(User *u, NickServ::Nick *na) override;
+class SVSLogin : public messages::SVSLogin
+{
+ public:
+ using messages::SVSLogin::SVSLogin;
- void SendLogout(User *u) override;
+ void Send(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost) override;
+};
- void SendChannel(Channel *c) override;
+class SWhois : public messages::SWhois
+{
+ public:
+ using messages::SWhois::SWhois;
- void SendSASLMechanisms(std::vector<Anope::string> &mechanisms) override;
+ void Send(const MessageSource &, User *user, const Anope::string &) override;
+};
- void SendSASLMessage(const SASL::Message &message) override;
+class Topic : public messages::Topic
+{
+ public:
+ using messages::Topic::Topic;
+
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter) override;
+};
+
+class VhostDel : public messages::VhostDel
+{
+ Proto *proto = nullptr;
+
+ public:
+ VhostDel(Module *creator, Proto *p) : messages::VhostDel(creator),
+ proto(p)
+ {
+ }
- void SendSVSLogin(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost) override;
+ void Send(User *u) override;
+};
+
+class VhostSet : public messages::VhostSet
+{
+ Proto *proto = nullptr;
+
+ public:
+ VhostSet(Module *creator, Proto *p) : messages::VhostSet(creator),
+ proto(p)
+ {
+ }
+
+ void Send(User *u, const Anope::string &vident, const Anope::string &vhost) override;
+};
+
+class Wallops : public messages::Wallops
+{
+ public:
+ using messages::Wallops::Wallops;
+
+ void Send(const MessageSource &source, const Anope::string &msg) override;
+};
+
+} // namespace senders
+
+class Proto : public ts6::Proto
+{
+ public:
+ Proto(Module *creator);
+
+ void SendChgIdentInternal(const Anope::string &nick, const Anope::string &vIdent);
+
+ void SendChgHostInternal(const Anope::string &nick, const Anope::string &vhost);
+
+ void SendAddLine(const Anope::string &xtype, const Anope::string &mask, time_t duration, const Anope::string &addedby, const Anope::string &reason);
+
+ void SendDelLine(const Anope::string &xtype, const Anope::string &mask);
+
+ void Handshake() override;
+
+ void SendNumeric(int numeric, User *dest, IRCMessage &message) override;
+
+ void SendBOB() override;
+
+ void SendEOB() override;
bool IsExtbanValid(const Anope::string &mask) override;
@@ -272,7 +454,7 @@ class ServerMessage : public IRCDMessage
class SQuit : public rfc1459::SQuit
{
public:
- SQuit(Module *creator) : rfc1459::SQuit(creator) { }
+ using rfc1459::SQuit::SQuit;
void Run(MessageSource &source, const std::vector<Anope::string> &params) override;
};
diff --git a/include/modules/protocol/ngircd.h b/include/modules/protocol/ngircd.h
index fef637aca..072dfb0f6 100644
--- a/include/modules/protocol/ngircd.h
+++ b/include/modules/protocol/ngircd.h
@@ -23,46 +23,89 @@
namespace ngircd
{
-class Proto : public IRCDProto
+namespace senders
{
- void SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf) override;
+class Akill : public messages::Akill
+{
public:
- Proto(Module *creator);
+ using messages::Akill::Akill;
+
+ void Send(User *, XLine *) override;
+};
+
+class AkillDel : public messages::AkillDel
+{
+ public:
+ using messages::AkillDel::AkillDel;
+
+ void Send(XLine *) override;
+};
- void SendAkill(User *u, XLine *x) override;
+class MessageChannel : public messages::MessageChannel
+{
+ public:
+ using messages::MessageChannel::MessageChannel;
- void SendAkillDel(XLine *x) override;
+ void Send(Channel *) override;
+};
- void SendChannel(Channel *c) override;
+class NickIntroduction : public messages::NickIntroduction
+{
+ public:
+ using messages::NickIntroduction::NickIntroduction;
+
+ void Send(User *user) override;
+};
- // Received: :dev.anope.de NICK DukeP 1 ~DukePyro p57ABF9C9.dip.t-dialin.net 1 +i :DukePyrolator
- void SendClientIntroduction(User *u) override;
+class Login : public messages::Login
+{
+ public:
+ using messages::Login::Login;
- void SendConnect() override;
+ void Send(User *u, NickServ::Nick *na) override;
+};
- void SendForceNickChange(User *u, const Anope::string &newnick, time_t when) override;
+class Logout : public messages::Logout
+{
+ public:
+ using messages::Logout::Logout;
- void SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+ void Send(User *u) override;
+};
- void SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+class SVSNick : public messages::SVSNick
+{
+ public:
+ using messages::SVSNick::SVSNick;
- void SendGlobops(const MessageSource &source, const Anope::string &buf) override;
+ void Send(User *u, const Anope::string &newnick, time_t ts) override;
+};
- void SendJoin(User *user, Channel *c, const ChannelStatus *status) override;
+class VhostDel : public messages::VhostDel
+{
+ public:
+ using messages::VhostDel::VhostDel;
- void SendLogin(User *u, NickServ::Nick *na) override;
+ void Send(User *u) override;
+};
- void SendLogout(User *u) override;
+class VhostSet : public messages::VhostSet
+{
+ public:
+ using messages::VhostSet::VhostSet;
- /* SERVER name hop descript */
- void SendServer(Server *server) override;
+ void Send(User *u, const Anope::string &vident, const Anope::string &vhost) override;
+};
- void SendTopic(const MessageSource &source, Channel *c) override;
+}
- void SendVhost(User *u, const Anope::string &vIdent, const Anope::string &vhost) override;
+class Proto : public IRCDProto
+{
+ public:
+ Proto(Module *creator);
- void SendVhostDel(User *u) override;
+ void Handshake() override;
Anope::string Format(IRCMessage &message) override;
};
@@ -72,7 +115,6 @@ class Numeric005 : public IRCDMessage
public:
Numeric005(Module *creator) : IRCDMessage(creator, "005", 1) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); }
- // Please see <http://www.irc.org/tech_docs/005.html> for details.
void Run(MessageSource &source, const std::vector<Anope::string> &params) override;
};
@@ -168,4 +210,4 @@ class ServerMessage : public IRCDMessage
void Run(MessageSource &source, const std::vector<Anope::string> &params) override;
};
-} // namespace ngircd \ No newline at end of file
+} // namespace ngircd
diff --git a/include/modules/protocol/plexus.h b/include/modules/protocol/plexus.h
index 69be3d713..4afbc391e 100644
--- a/include/modules/protocol/plexus.h
+++ b/include/modules/protocol/plexus.h
@@ -19,55 +19,96 @@
#pragma once
+#include "modules/protocol/ts6.h"
+
namespace plexus
{
-class Proto : public IRCDProto
+namespace senders
{
- ServiceReference<IRCDProto> hybrid; // XXX use moddeps + inheritance here
+class ModeUser : public messages::ModeUser
+{
public:
- Proto(Module *creator);
+ using messages::ModeUser::ModeUser;
+
+ void Send(const MessageSource &source, User *user, const Anope::string &modes) override;
+};
+
+class NickIntroduction : public messages::NickIntroduction
+{
+ public:
+ using messages::NickIntroduction::NickIntroduction;
+
+ void Send(User *user) override;
+};
+
+class NOOP : public messages::NOOP
+{
+ public:
+ static constexpr const char *NAME = "noop";
+
+ using messages::NOOP::NOOP;
+
+ void Send(Server *s, bool mode) override;
+};
+
+class Topic : public messages::Topic
+{
+ public:
+ using messages::Topic::Topic;
- void SendSVSKill(const MessageSource &source, User *targ, const Anope::string &reason) override { hybrid->SendSVSKill(source, targ, reason); }
- void SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) override { hybrid->SendGlobalNotice(bi, dest, msg); }
- void SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) override { hybrid->SendGlobalPrivmsg(bi, dest, msg); }
- void SendSQLine(User *u, XLine *x) override { hybrid->SendSQLine(u, x); }
- void SendSQLineDel(XLine *x) override { hybrid->SendSQLineDel(x); }
- void SendSGLineDel(XLine *x) override { hybrid->SendSGLineDel(x); }
- void SendSGLine(User *u, XLine *x) override { hybrid->SendSGLine(u, x); }
- void SendAkillDel(XLine *x) override { hybrid->SendAkillDel(x); }
- void SendAkill(User *u, XLine *x) override { hybrid->SendAkill(u, x); }
- void SendServer(Server *server) override { hybrid->SendServer(server); }
- void SendChannel(Channel *c) override { hybrid->SendChannel(c); }
- void SendSVSHold(const Anope::string &nick, time_t t) override { hybrid->SendSVSHold(nick, t); }
- void SendSVSHoldDel(const Anope::string &nick) override { hybrid->SendSVSHoldDel(nick); }
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter) override;
+};
- void SendGlobops(const MessageSource &source, const Anope::string &buf) override;
+class SVSJoin : public messages::SVSJoin
+{
+ public:
+ using messages::SVSJoin::SVSJoin;
- void SendJoin(User *user, Channel *c, const ChannelStatus *status) override;
+ void Send(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &key) override;
+};
- void SendForceNickChange(User *u, const Anope::string &newnick, time_t when) override;
+class SVSNick : public messages::SVSNick
+{
+ public:
+ using messages::SVSNick::SVSNick;
- void SendVhost(User *u, const Anope::string &ident, const Anope::string &host) override;
+ void Send(User *u, const Anope::string &newnick, time_t ts) override;
+};
- void SendVhostDel(User *u) override;
+class SVSPart : public messages::SVSPart
+{
+ public:
+ using messages::SVSPart::SVSPart;
- void SendConnect() override;
+ void Send(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &reason) override;
+};
- void SendClientIntroduction(User *u) override;
+class VhostDel : public messages::VhostDel
+{
+ public:
+ using messages::VhostDel::VhostDel;
- void SendMode(const MessageSource &source, User *u, const Anope::string &buf) override;
+ void Send(User *u) override;
+};
- void SendLogin(User *u, NickServ::Nick *na) override;
+class VhostSet : public messages::VhostSet
+{
+ public:
+ using messages::VhostSet::VhostSet;
- void SendLogout(User *u) override;
+ void Send(User *u, const Anope::string &vident, const Anope::string &vhost) override;
+};
- void SendTopic(const MessageSource &source, Channel *c) override;
+} // namespace senders
- void SendSVSJoin(const MessageSource &source, User *user, const Anope::string &chan, const Anope::string &param) override;
+class Proto : public ts6::Proto
+{
+ public:
+ Proto(Module *creator);
- void SendSVSPart(const MessageSource &source, User *user, const Anope::string &chan, const Anope::string &param) override;
+ void Handshake() override;
};
class Encap : public IRCDMessage
diff --git a/include/modules/protocol/ratbox.h b/include/modules/protocol/ratbox.h
index ba7a7f19f..475b368cc 100644
--- a/include/modules/protocol/ratbox.h
+++ b/include/modules/protocol/ratbox.h
@@ -20,47 +20,92 @@
#pragma once
#include "modules/protocol/rfc1459.h"
+#include "modules/protocol/ts6.h"
namespace ratbox
{
-class Proto : public IRCDProto
+namespace senders
{
- ServiceReference<IRCDProto> hybrid; // XXX
- ServiceBot *FindIntroduced();
+class Login : public messages::Login
+{
+ public:
+ using messages::Login::Login;
+
+ void Send(User *u, NickServ::Nick *na) override;
+};
+class Logout : public messages::Logout
+{
public:
- Proto(Module *creator);
+ using messages::Logout::Logout;
+
+ void Send(User *u) override;
+};
+
+class NickIntroduction : public messages::NickIntroduction
+{
+ public:
+ using messages::NickIntroduction::NickIntroduction;
+
+ void Send(User *user) override;
+};
+
+class SQLine : public messages::SQLine
+{
+ public:
+ using messages::SQLine::SQLine;
+
+ void Send(User *, XLine *) override;
+};
+
+class SQLineDel : public messages::SQLineDel
+{
+ public:
+ using messages::SQLineDel::SQLineDel;
+
+ void Send(XLine *) override;
+};
+
+class SVSNick : public messages::SVSNick
+{
+ public:
+ using messages::SVSNick::SVSNick;
+
+ void Send(User *u, const Anope::string &newnick, time_t ts) override;
+};
+
+class Topic : public rfc1459::senders::Topic
+{
+ public:
+ using rfc1459::senders::Topic::Topic;
- void SendSVSKill(const MessageSource &source, User *targ, const Anope::string &reason) override { hybrid->SendSVSKill(source, targ, reason); }
- void SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) override { hybrid->SendGlobalNotice(bi, dest, msg); }
- void SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) override { hybrid->SendGlobalPrivmsg(bi, dest, msg); }
- void SendSGLine(User *u, XLine *x) override { hybrid->SendSGLine(u, x); }
- void SendSGLineDel(XLine *x) override { hybrid->SendSGLineDel(x); }
- void SendAkill(User *u, XLine *x) override { hybrid->SendAkill(u, x); }
- void SendAkillDel(XLine *x) override { hybrid->SendAkillDel(x); }
- void SendJoin(User *user, Channel *c, const ChannelStatus *status) override { hybrid->SendJoin(user, c, status); }
- void SendServer(Server *server) override { hybrid->SendServer(server); }
- void SendMode(const MessageSource &source, User *u, const Anope::string &buf) override { hybrid->SendMode(source, u, buf); }
- void SendChannel(Channel *c) override { hybrid->SendChannel(c); }
- bool IsIdentValid(const Anope::string &ident) override { return hybrid->IsIdentValid(ident); }
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter) override;
+};
- void SendGlobops(const MessageSource &source, const Anope::string &buf) override;
+class Wallops : public messages::Wallops
+{
+ public:
+ using messages::Wallops::Wallops;
- void SendConnect() override;
+ void Send(const MessageSource &source, const Anope::string &msg) override;
+};
- void SendClientIntroduction(User *u) override;
+} // senders
- void SendLogin(User *u, NickServ::Nick *na) override;
+class Proto : public ts6::Proto
+{
+ hybrid::Proto hybrid;
- void SendLogout(User *u) override;
+ ServiceBot *FindIntroduced();
- void SendTopic(const MessageSource &source, Channel *c) override;
+ public:
+ Proto(Module *creator);
- void SendSQLine(User *, XLine *x) override;
+ bool IsIdentValid(const Anope::string &ident) override { return hybrid.IsIdentValid(ident); }
- void SendSQLineDel(XLine *x) override;
+ void Handshake() override;
};
class Encap : public IRCDMessage
diff --git a/include/modules/protocol/rfc1459.h b/include/modules/protocol/rfc1459.h
index 4ef8f0313..54c4bada5 100644
--- a/include/modules/protocol/rfc1459.h
+++ b/include/modules/protocol/rfc1459.h
@@ -22,6 +22,165 @@
namespace rfc1459
{
+namespace senders
+{
+
+class GlobalNotice : public messages::GlobalNotice
+{
+ public:
+ using messages::GlobalNotice::GlobalNotice;
+
+ void Send(const MessageSource &, Server *dest, const Anope::string &msg) override;
+};
+
+class GlobalPrivmsg : public messages::GlobalPrivmsg
+{
+ public:
+ using messages::GlobalPrivmsg::GlobalPrivmsg;
+
+ void Send(const MessageSource &, Server *dest, const Anope::string &msg) override;
+};
+
+class Invite : public messages::Invite
+{
+ public:
+ using messages::Invite::Invite;
+
+ void Send(const MessageSource &source, Channel *chan, User *user) override;
+};
+
+class Join : public messages::Join
+{
+ public:
+ using messages::Join::Join;
+
+ void Send(User *u, Channel *c, const ChannelStatus *status) override;
+};
+
+class Kick : public messages::Kick
+{
+ public:
+ using messages::Kick::Kick;
+
+ void Send(const MessageSource &source, Channel *chan, User *user, const Anope::string &reason) 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 ModeChannel : public messages::ModeChannel
+{
+ public:
+ using messages::ModeChannel::ModeChannel;
+
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &modes) override;
+};
+
+class ModeUser : public messages::ModeUser
+{
+ public:
+ using messages::ModeUser::ModeUser;
+
+ void Send(const MessageSource &source, User *user, const Anope::string &modes) override;
+};
+
+class NickChange : public messages::NickChange
+{
+ public:
+ using messages::NickChange::NickChange;
+
+ void Send(User *u, const Anope::string &newnick, time_t ts) override;
+};
+
+class Notice : public messages::Notice
+{
+ public:
+ using messages::Notice::Notice;
+
+ void Send(const MessageSource &source, const Anope::string &dest, const Anope::string &msg) override;
+};
+
+class Part : public messages::Part
+{
+ public:
+ using messages::Part::Part;
+
+ void Send(User *, Channel *chan, const Anope::string &reason) override;
+};
+
+class Ping : public messages::Ping
+{
+ public:
+ using messages::Ping::Ping;
+
+ void Send(const Anope::string &servname, const Anope::string &who) override;
+};
+
+class Pong : public messages::Pong
+{
+ public:
+ using messages::Pong::Pong;
+
+ void Send(const Anope::string &servname, const Anope::string &who) override;
+};
+
+class Privmsg : public messages::Privmsg
+{
+ public:
+ using messages::Privmsg::Privmsg;
+
+ void Send(const MessageSource &source, const Anope::string &dest, const Anope::string &msg) override;
+};
+
+class Quit : public messages::Quit
+{
+ public:
+ using messages::Quit::Quit;
+
+ void Send(User *user, const Anope::string &reason) override;
+};
+
+class MessageServer : public messages::MessageServer
+{
+ public:
+ using messages::MessageServer::MessageServer;
+
+ void Send(Server *server) override;
+};
+
+class SQuit : public messages::SQuit
+{
+ public:
+ using messages::SQuit::SQuit;
+
+ void Send(Server *s, const Anope::string &message) override;
+};
+
+class Topic : public messages::Topic
+{
+ public:
+ using messages::Topic::Topic;
+
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter) override;
+};
+
+class Wallops : public messages::Wallops
+{
+ public:
+ using messages::Wallops::Wallops;
+
+ void Send(const MessageSource &, const Anope::string &msg) override;
+};
+
+} // namespace senders
+
class Away : public IRCDMessage
{
public:
diff --git a/include/modules/protocol/ts6.h b/include/modules/protocol/ts6.h
new file mode 100644
index 000000000..71748b5b7
--- /dev/null
+++ b/include/modules/protocol/ts6.h
@@ -0,0 +1,37 @@
+/*
+ * 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
+
+namespace ts6
+{
+
+class Proto : public IRCDProto
+{
+ public:
+ Proto(Module *creator, const Anope::string &proto_name) : IRCDProto(creator, proto_name)
+ {
+ }
+
+ /* Retrieves the next free UID or SID */
+ Anope::string UID_Retrieve() override;
+ Anope::string SID_Retrieve() override;
+};
+
+} // namespace ts6
diff --git a/include/modules/protocol/unreal.h b/include/modules/protocol/unreal.h
index 0a01cb4be..9039cc2cd 100644
--- a/include/modules/protocol/unreal.h
+++ b/include/modules/protocol/unreal.h
@@ -22,79 +22,237 @@
namespace unreal
{
-class Proto : public IRCDProto
+namespace senders
+{
+
+class Akill : public messages::Akill
{
public:
- Proto(Module *creator);
+ using messages::Akill::Akill;
- private:
- void SendSVSNOOP(Server *server, bool set) override;
+ void Send(User *, XLine *) override;
+};
+
+class AkillDel : public messages::AkillDel
+{
+ public:
+ using messages::AkillDel::AkillDel;
+
+ void Send(XLine *) override;
+};
+
+class MessageChannel : public messages::MessageChannel
+{
+ public:
+ using messages::MessageChannel::MessageChannel;
+
+ void Send(Channel *) override;
+};
- void SendAkillDel(XLine *x) override;
+class Join : public messages::Join
+{
+ public:
+ using messages::Join::Join;
- void SendTopic(const MessageSource &source, Channel *c) override;
+ void Send(User *u, Channel *c, const ChannelStatus *status) override;
+};
- void SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+class Login : public messages::Login
+{
+ public:
+ using messages::Login::Login;
- void SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg) override;
+ void Send(User *u, NickServ::Nick *na) override;
+};
- void SendVhostDel(User *u) override;
+class Logout : public messages::Logout
+{
+ public:
+ using messages::Logout::Logout;
- void SendAkill(User *u, XLine *x) override;
+ void Send(User *u) override;
+};
- void SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf) override;
+class Kill : public messages::Kill
+{
+ public:
+ using messages::Kill::Kill;
- void SendMode(const MessageSource &source, User *u, const Anope::string &buf) override;
+ void Send(const MessageSource &source, const Anope::string &target, const Anope::string &reason) override;
- void SendClientIntroduction(User *u) override;
+ void Send(const MessageSource &source, User *user, const Anope::string &reason) override;
+};
- void SendServer(Server *server) override;
+class ModeUser : public messages::ModeUser
+{
+ public:
+ using messages::ModeUser::ModeUser;
- void SendJoin(User *user, Channel *c, const ChannelStatus *status) override;
+ void Send(const MessageSource &source, User *user, const Anope::string &modes) override;
+};
- void SendSQLineDel(XLine *x) override;
+class NickIntroduction : public messages::NickIntroduction
+{
+ public:
+ using messages::NickIntroduction::NickIntroduction;
- void SendSQLine(User *, XLine *x) override;
+ void Send(User *user) override;
+};
- void SendVhost(User *u, const Anope::string &vIdent, const Anope::string &vhost) override;
+class SASL : public messages::SASL
+{
+ public:
+ using messages::SASL::SASL;
- void SendConnect() override;
+ void Send(const ::SASL::Message &) override;
+};
- void SendSVSHold(const Anope::string &nick, time_t t) override;
+class MessageServer : public messages::MessageServer
+{
+ public:
+ using messages::MessageServer::MessageServer;
- void SendSVSHoldDel(const Anope::string &nick) override;
+ void Send(Server *server) override;
+};
- void SendSGLineDel(XLine *x) override;
+class SGLine : public messages::SGLine
+{
+ public:
+ using messages::SGLine::SGLine;
- void SendSZLineDel(XLine *x) override;
+ void Send(User *, XLine *) override;
+};
- void SendSZLine(User *, XLine *x) override;
+class SGLineDel : public messages::SGLineDel
+{
+ public:
+ using messages::SGLineDel::SGLineDel;
- void SendSGLine(User *, XLine *x) override;
+ void Send(XLine *) override;
+};
- void SendSVSJoin(const MessageSource &source, User *user, const Anope::string &chan, const Anope::string &param) override;
+class SQLine : public messages::SQLine
+{
+ public:
+ using messages::SQLine::SQLine;
- void SendSVSPart(const MessageSource &source, User *user, const Anope::string &chan, const Anope::string &param) override;
+ void Send(User *, XLine *) override;
+};
- void SendSWhois(const MessageSource &source, const Anope::string &who, const Anope::string &mask) override;
+class SQLineDel : public messages::SQLineDel
+{
+ public:
+ using messages::SQLineDel::SQLineDel;
- void SendEOB() override;
+ void Send(XLine *) override;
+};
- bool IsNickValid(const Anope::string &nick) override;
+class SZLine : public messages::SZLine
+{
+ public:
+ using messages::SZLine::SZLine;
- bool IsChannelValid(const Anope::string &chan) override;
+ void Send(User *, XLine *) override;
+};
- bool IsExtbanValid(const Anope::string &mask) override;
+class SZLineDel : public messages::SZLineDel
+{
+ public:
+ using messages::SZLineDel::SZLineDel;
+
+ void Send(XLine *) override;
+};
+
+class SVSHold : public messages::SVSHold
+{
+ public:
+ using messages::SVSHold::SVSHold;
+
+ void Send(const Anope::string &, time_t) override;
+};
+
+class SVSHoldDel : public messages::SVSHoldDel
+{
+ public:
+ using messages::SVSHoldDel::SVSHoldDel;
+
+ void Send(const Anope::string &) override;
+};
+
+class SVSJoin : public messages::SVSJoin
+{
+ public:
+ using messages::SVSJoin::SVSJoin;
+
+ void Send(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &key) override;
+};
+
+class SVSLogin : public messages::SVSLogin
+{
+ public:
+ using messages::SVSLogin::SVSLogin;
+
+ void Send(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost) override;
+};
+
+class SVSPart : public messages::SVSPart
+{
+ public:
+ using messages::SVSPart::SVSPart;
+
+ void Send(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &reason) override;
+};
+
+class SWhois : public messages::SWhois
+{
+ public:
+ using messages::SWhois::SWhois;
+
+ void Send(const MessageSource &, User *user, const Anope::string &) override;
+};
+
+class Topic : public messages::Topic
+{
+ public:
+ using messages::Topic::Topic;
+
+ void Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter) override;
+};
+
+class VhostDel : public messages::VhostDel
+{
+ public:
+ using messages::VhostDel::VhostDel;
+
+ void Send(User *u) override;
+};
+
+class VhostSet : public messages::VhostSet
+{
+ public:
+ using messages::VhostSet::VhostSet;
+
+ void Send(User *u, const Anope::string &vident, const Anope::string &vhost) override;
+};
- void SendLogin(User *u, NickServ::Nick *na) override;
+} // namespace senders
- void SendLogout(User *u) override;
+class Proto : public IRCDProto
+{
+ public:
+ Proto(Module *creator);
- void SendChannel(Channel *c) override;
+ private:
- void SendSASLMessage(const ::SASL::Message &message) override;
+ void Handshake() override;
- void SendSVSLogin(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost) override;
+ void SendEOB() override;
+
+ bool IsNickValid(const Anope::string &nick) override;
+
+ bool IsChannelValid(const Anope::string &chan) override;
+
+ bool IsExtbanValid(const Anope::string &mask) override;
bool IsIdentValid(const Anope::string &ident) override;
};
diff --git a/include/protocol.h b/include/protocol.h
index ee782903b..4dc115fe6 100644
--- a/include/protocol.h
+++ b/include/protocol.h
@@ -24,6 +24,7 @@
#include "service.h"
#include "servers.h"
#include "users.h"
+#include "messages.h"
class IRCMessage;
@@ -72,168 +73,26 @@ public:
virtual void Parse(const Anope::string &, Anope::string &, Anope::string &, std::vector<Anope::string> &);
virtual Anope::string Format(IRCMessage &);
- /** Kills a user
- * @param source Who is doing the kill
- * @param user The target to be killed
- * @param reason Kill reason
- */
- virtual void SendSVSKill(const MessageSource &source, User *user, const Anope::string &reason);
- virtual void SendMode(const MessageSource &, Channel *, const Anope::string &);
- virtual void SendMode(const MessageSource &, User *, const Anope::string &);
- virtual void SendKick(const MessageSource &, Channel *, User *, const Anope::string &);
- virtual void SendNotice(const MessageSource &, const Anope::string &dest, const Anope::string &msg);
- virtual void SendPrivmsg(const MessageSource &, const Anope::string &dest, const Anope::string &msg);
- virtual void SendQuit(User *, const Anope::string &reason);
- virtual void SendPart(User *, Channel *chan, const Anope::string &reason);
- virtual void SendGlobops(const MessageSource &, const Anope::string &buf);
virtual void SendCTCPReply(const MessageSource &, const Anope::string &dest, const Anope::string &buf);
virtual void SendNumeric(int numeric, User *dest, IRCMessage &);
/* Retrieves the next free UID or SID */
- virtual Anope::string UID_Retrieve();
- virtual Anope::string SID_Retrieve();
-
- /** 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 SendSVSNOOP(Server *s, bool mode) { }
-
- /** Sets the topic on a channel
- * @param bi The bot to set the topic from
- * @param c The channel to set the topic on. The topic being set is Channel::topic
- */
- virtual void SendTopic(const MessageSource &, Channel *);
-
- /** Sets a vhost on a user.
- * @param u The user
- * @param vident The ident to set
- * @param vhost The vhost to set
- */
- virtual void SendVhost(User *u, const Anope::string &vident, const Anope::string &vhost) { }
- virtual void SendVhostDel(User *) { }
-
- /** 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 SendAkill(User *, XLine *) anope_abstract;
- virtual void SendAkillDel(XLine *) anope_abstract;
-
- /* Realname ban */
- virtual void SendSGLine(User *, XLine *) { }
- virtual void SendSGLineDel(XLine *) { }
-
- /* IP ban */
- virtual void SendSZLine(User *u, XLine *) { }
- virtual void SendSZLineDel(XLine *) { }
-
- /* Nick ban (and sometimes channel) */
- virtual void SendSQLine(User *, XLine *x) { }
- virtual void SendSQLineDel(XLine *x) { }
-
- virtual void SendKill(const MessageSource &source, const Anope::string &target, const Anope::string &reason);
-
- /** Introduces a client to the rest of the network
- * @param u The client to introduce
- */
- virtual void SendClientIntroduction(User *u) anope_abstract;
+ virtual Anope::string UID_Retrieve() { return ""; }
+ virtual Anope::string SID_Retrieve() { return ""; }
virtual void SendAction(const MessageSource &source, const Anope::string &dest, const Anope::string &message);
- virtual void SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg) anope_abstract;
- virtual void SendGlobalPrivmsg(ServiceBot *bi, Server *desc, const Anope::string &msg) anope_abstract;
-
-
- virtual void SendPing(const Anope::string &servname, const Anope::string &who);
-
- /**
- * 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 SendPong(const Anope::string &servname, const Anope::string &who);
-
- /** 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 SendJoin(User *u, Channel *c, const ChannelStatus *status) anope_abstract;
-
- /** 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 param Channel key?
- */
- virtual void SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &param) { }
-
- /** 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 SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &param) { }
-
- virtual void SendInvite(const MessageSource &source, Channel *c, User *u);
-
-
- /** Sends a nick change of one of our clients.
- */
- virtual void SendNickChange(User *u, const Anope::string &newnick);
-
- /** Forces a nick change of a user that isn't ours (SVSNICK)
- */
- virtual void SendForceNickChange(User *u, const Anope::string &newnick, time_t when);
-
- /** Used to introduce ourselves to our uplink. Usually will SendServer(Me) and any other
- * initial handshake requirements.
+ /** Used to introduce ourselves to our uplink.
*/
- virtual void SendConnect() anope_abstract;
+ virtual void Handshake() anope_abstract;
- /** Called right before we begin our burst, after we have handshaked successfully with the uplink/
- * At this point none of our servesr, users, or channels exist on the uplink
+ /** Called right before we begin our burst, after we have handshaked successfully with the uplink.
+ * At this point none of our servers, users, or channels exist on the uplink
*/
virtual void SendBOB() { }
virtual void SendEOB() { }
- virtual void SendSVSHold(const Anope::string &, time_t) { }
- virtual void SendSVSHoldDel(const Anope::string &) { }
-
- virtual void SendSWhois(const MessageSource &, const Anope::string &, const Anope::string &) { }
-
- /** Introduces a server to the uplink
- */
- virtual void SendServer(Server *) anope_abstract;
- virtual void SendSquit(Server *, const Anope::string &message);
-
-
- virtual void SendLogin(User *u, NickServ::Nick *na) anope_abstract;
- virtual void SendLogout(User *u) anope_abstract;
-
- /** Send a channel creation message to the uplink.
- * On most TS6 IRCds this is a SJOIN with no nick
- */
- virtual void SendChannel(Channel *c) { }
-
- /** Make the user an IRC operator
- * Normally this is a simple +o, though some IRCds require us to send the oper type
- */
- virtual void SendOper(User *u);
-
- virtual void SendSASLMechanisms(std::vector<Anope::string> &) { }
- virtual void SendSASLMessage(const SASL::Message &) { }
- virtual void SendSVSLogin(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost) { }
-
virtual bool IsNickValid(const Anope::string &);
virtual bool IsChannelValid(const Anope::string &);
virtual bool IsIdentValid(const Anope::string &);
@@ -247,35 +106,48 @@ public:
virtual Anope::string NormalizeMask(const Anope::string &mask);
+ template<typename T, typename... Args> void Send(Args&&... args)
+ {
+ ServiceReference<MessageSender<T>> sender(T::NAME);
+
+ if (!sender)
+ {
+ Log(LOG_DEBUG) << "No message sender for type " << T::NAME;
+ return;
+ }
+
+ static_cast<T*>(static_cast<MessageSender<T>*>(sender))->Send(std::forward<Args>(args)...);
+ }
+
/* Templated functions which overload the normal functions to provide format strings */
- template<typename... Args> void SendSVSKill(const MessageSource &source, User *user, const Anope::string &reason, Args&&... args)
+ template<typename... Args> void SendKill(const MessageSource &source, User *user, const Anope::string &reason, Args&&... args)
{
- SendSVSKill(source, user, Anope::Format(reason, std::forward<Args>(args)...));
+ Send<messages::Kill>(source, user, Anope::Format(reason, std::forward<Args>(args)...));
}
template<typename... Args> void SendMode(const MessageSource &source, Channel *chan, const Anope::string &modes, Args&&... args)
{
- SendMode(source, chan, Anope::Format(modes, std::forward<Args>(args)...));
+ Send<messages::ModeChannel>(source, chan, Anope::Format(modes, std::forward<Args>(args)...));
}
template<typename... Args> void SendMode(const MessageSource &source, User *u, const Anope::string &modes, Args&&... args)
{
- SendMode(source, u, Anope::Format(modes, std::forward<Args>(args)...));
+ Send<messages::ModeUser>(source, u, Anope::Format(modes, std::forward<Args>(args)...));
}
- template<typename... Args> void SendKick(const MessageSource &source, const Channel *chan, User *user, const Anope::string &reason, Args&&... args)
+ template<typename... Args> void SendKick(const MessageSource &source, Channel *chan, User *user, const Anope::string &reason, Args&&... args)
{
- SendKick(source, chan, user, Anope::Format(reason, std::forward<Args>(args)...));
+ Send<messages::Kick>(source, chan, user, Anope::Format(reason, std::forward<Args>(args)...));
}
template<typename... Args> void SendNotice(const MessageSource &source, const Anope::string &dest, const Anope::string &message, Args&&... args)
{
- SendNotice(source, dest, Anope::Format(message, std::forward<Args>(args)...));
+ Send<messages::Notice>(source, dest, Anope::Format(message, std::forward<Args>(args)...));
}
template<typename... Args> void SendPrivmsg(const MessageSource &source, const Anope::string &dest, const Anope::string &message, Args&&... args)
{
- SendPrivmsg(source, dest, Anope::Format(message, std::forward<Args>(args)...));
+ Send<messages::Privmsg>(source, dest, Anope::Format(message, std::forward<Args>(args)...));
}
template<typename... Args> void SendAction(const MessageSource &source, const Anope::string &dest, const Anope::string &message, Args&&... args)
@@ -288,21 +160,21 @@ public:
SendCTCPReply(source, dest, Anope::Format(message, std::forward<Args>(args)...));
}
- template<typename... Args> void SendGlobops(const MessageSource &source, const Anope::string &msg, Args&&... args)
+ template<typename... Args> void SendWallops(const MessageSource &source, const Anope::string &msg, Args&&... args)
{
- SendGlobops(source, Anope::Format(msg, std::forward<Args>(args)...));
+ Send<messages::Wallops>(source, Anope::Format(msg, std::forward<Args>(args)...));
}
template<typename... Args> void SendNumeric(int numeric, User *dest, Args&&... args);
template<typename... Args> void SendQuit(User *u, const Anope::string &reason, Args&&... args)
{
- SendQuit(u, Anope::Format(reason, std::forward<Args>(args)...));
+ Send<messages::Quit>(u, Anope::Format(reason, std::forward<Args>(args)...));
}
template<typename... Args> void SendPart(User *u, Channel *chan, const Anope::string &reason, Args&&... args)
{
- SendPart(u, chan, Anope::Format(reason, std::forward<Args>(args)...));
+ Send<messages::Part>(u, chan, Anope::Format(reason, std::forward<Args>(args)...));
}
};
@@ -334,10 +206,10 @@ enum IRCDMessageFlag
class CoreExport IRCDMessage : public Service
{
Anope::string name;
- unsigned param_count;
+ unsigned int param_count;
std::set<IRCDMessageFlag> flags;
public:
- static constexpr const char *NAME = "IRCDMessage";
+ static constexpr const char *NAME = "ircdmessage";
IRCDMessage(Module *owner, const Anope::string &n, unsigned int p = 0);
unsigned int GetParamCount() const;
diff --git a/modules/botserv/bot.cpp b/modules/botserv/bot.cpp
index 30550df56..082bd6337 100644
--- a/modules/botserv/bot.cpp
+++ b/modules/botserv/bot.cpp
@@ -232,7 +232,10 @@ class CommandBSBot : public Command
bi->introduced = false;
}
else
- IRCD->SendNickChange(bi, nick);
+ {
+ IRCD->Send<messages::NickChange>(bi, nick, Anope::CurTime);
+ bi->timestamp = Anope::CurTime;
+ }
if (!nick.equals_cs(bi->nick))
{
diff --git a/modules/botserv/main/botserv.cpp b/modules/botserv/main/botserv.cpp
index 4f3d4c92b..4b0309b31 100644
--- a/modules/botserv/main/botserv.cpp
+++ b/modules/botserv/main/botserv.cpp
@@ -62,6 +62,7 @@ class BotServCore : public Module, public BotServ::BotServService
void OnBotAssign(User *sender, ChanServ::Channel *ci, ServiceBot *bi) override
{
+ printf("on bot assign !\n");
if (ci->c && ci->c->users.size() >= Config->GetModule(this)->Get<unsigned>("minusers"))
{
ChannelStatus status(Config->GetModule(this)->Get<Anope::string>("botmodes"));
diff --git a/modules/chanserv/invite.cpp b/modules/chanserv/invite.cpp
index b6d0f19c9..9c21bc704 100644
--- a/modules/chanserv/invite.cpp
+++ b/modules/chanserv/invite.cpp
@@ -78,7 +78,7 @@ class CommandCSInvite : public Command
bool override = !source.AccessFor(ci).HasPriv("INVITE");
- IRCD->SendInvite(ci->WhoSends(), c, u2);
+ IRCD->Send<messages::Invite>(ci->WhoSends(), c, u2);
if (u2 != u)
{
source.Reply(_("\002{0}\002 has been invited to \002{1}\002."), u2->nick, c->name);
diff --git a/modules/chanserv/main/chanserv.cpp b/modules/chanserv/main/chanserv.cpp
index b6aedb0dd..492f64459 100644
--- a/modules/chanserv/main/chanserv.cpp
+++ b/modules/chanserv/main/chanserv.cpp
@@ -471,7 +471,7 @@ class ChanServCore : public Module
if (ModeManager::FindChannelModeByName("PERM") != NULL)
{
if (c)
- IRCD->SendChannel(ci->c);
+ IRCD->Send<messages::MessageChannel>(ci->c);
ci->c->SetMode(NULL, "PERM");
}
else
@@ -513,7 +513,7 @@ class ChanServCore : public Module
{
::Log(LOG_DEBUG) << "Changing TS of " << c->name << " from " << c->creation_time << " to " << c->ci->GetTimeRegistered();
c->creation_time = c->ci->GetTimeRegistered();
- IRCD->SendChannel(c);
+ IRCD->Send<messages::MessageChannel>(c);
c->Reset();
}
}
diff --git a/modules/chanserv/set.cpp b/modules/chanserv/set.cpp
index 89eb4985a..833817cde 100644
--- a/modules/chanserv/set.cpp
+++ b/modules/chanserv/set.cpp
@@ -1242,7 +1242,7 @@ class CSSet : public Module
{
Log(LOG_DEBUG) << "Changing TS of " << c->name << " from " << c->creation_time << " to " << c->ci->GetTimeRegistered();
c->creation_time = c->ci->GetTimeRegistered();
- IRCD->SendChannel(c);
+ IRCD->Send<messages::MessageChannel>(c);
c->Reset();
}
}
diff --git a/modules/dnsbl.cpp b/modules/dnsbl.cpp
index a2c8a4380..f8d35bf71 100644
--- a/modules/dnsbl.cpp
+++ b/modules/dnsbl.cpp
@@ -107,7 +107,7 @@ class DNSBLResolver : public Request
}
else
{
- IRCD->SendAkill(NULL, x);
+ IRCD->Send<messages::Akill>(nullptr, x);
delete x;
}
}
diff --git a/modules/hostserv/main/hostserv.cpp b/modules/hostserv/main/hostserv.cpp
index 4ff348f2b..f7ba03418 100644
--- a/modules/hostserv/main/hostserv.cpp
+++ b/modules/hostserv/main/hostserv.cpp
@@ -76,7 +76,7 @@ class HostServCore : public Module
if (u->vhost.empty() || !u->vhost.equals_cs(vhost->GetHost()) || (!vhost->GetIdent().empty() && !u->GetVIdent().equals_cs(vhost->GetIdent())))
{
- IRCD->SendVhost(u, vhost->GetIdent(), vhost->GetHost());
+ IRCD->Send<messages::VhostSet>(u, vhost->GetIdent(), vhost->GetHost());
u->vhost = vhost->GetHost();
u->UpdateHost();
@@ -124,7 +124,7 @@ class HostServCore : public Module
if (vhost == nullptr)
return;
- IRCD->SendVhost(u, vhost->GetIdent(), vhost->GetHost());
+ IRCD->Send<messages::VhostSet>(u, vhost->GetIdent(), vhost->GetHost());
u->vhost = vhost->GetHost();
u->UpdateHost();
@@ -150,7 +150,7 @@ class HostServCore : public Module
User *u = User::Find(na->GetNick());
if (u && u->Account() == na->GetAccount())
- IRCD->SendVhostDel(u);
+ IRCD->Send<messages::VhostDel>(u);
}
}
diff --git a/modules/hostserv/off.cpp b/modules/hostserv/off.cpp
index 1d7d91876..e1af7def4 100644
--- a/modules/hostserv/off.cpp
+++ b/modules/hostserv/off.cpp
@@ -42,7 +42,7 @@ class CommandHSOff : public Command
// XXX vident?
u->vhost.clear();
- IRCD->SendVhostDel(u);
+ IRCD->Send<messages::VhostDel>(u);
Log(LOG_COMMAND, source, this) << "to disable their vhost";
source.Reply(_("Your vhost was removed and the normal cloaking restored."));
}
diff --git a/modules/hostserv/on.cpp b/modules/hostserv/on.cpp
index c8f4211de..3041f65a5 100644
--- a/modules/hostserv/on.cpp
+++ b/modules/hostserv/on.cpp
@@ -60,7 +60,7 @@ class CommandHSOn : public Command
source.Reply(_("Your vhost of \002{0}\002 is now activated."), vhost->Mask());
Log(LOG_COMMAND, source, this) << "to enable their vhost of " << vhost->Mask();
- IRCD->SendVhost(u, vhost->GetIdent(), vhost->GetHost());
+ IRCD->Send<messages::VhostSet>(u, vhost->GetIdent(), vhost->GetHost());
u->vhost = vhost->GetHost();
if (IRCD->CanSetVIdent && !vhost->GetIdent().empty())
u->SetVIdent(vhost->GetIdent());
diff --git a/modules/nickserv/ajoin.cpp b/modules/nickserv/ajoin.cpp
index 5973c95ac..0d708143c 100644
--- a/modules/nickserv/ajoin.cpp
+++ b/modules/nickserv/ajoin.cpp
@@ -371,7 +371,7 @@ class NSAJoin : public Module
{
try
{
- unsigned limit = convertTo<unsigned>(l);
+ unsigned int limit = convertTo<unsigned int>(l);
if (c->users.size() >= limit)
need_invite = true;
}
@@ -384,10 +384,10 @@ class NSAJoin : public Module
{
if (!u_access.HasPriv("INVITE"))
continue;
- IRCD->SendInvite(NickServ, c, u);
+ IRCD->Send<messages::Invite>(NickServ, c, u);
}
- IRCD->SendSVSJoin(NickServ, u, entry->GetChannel(), key);
+ IRCD->Send<messages::SVSJoin>(NickServ, u, entry->GetChannel(), key);
}
}
};
diff --git a/modules/nickserv/logout.cpp b/modules/nickserv/logout.cpp
index 6a9d119ad..0e6cdb46a 100644
--- a/modules/nickserv/logout.cpp
+++ b/modules/nickserv/logout.cpp
@@ -68,7 +68,7 @@ class CommandNSLogout : public Command
else
source.Reply(_("You have been logged out."));
- IRCD->SendLogout(u2);
+ IRCD->Send<messages::Logout>(u2);
u2->RemoveMode(source.service, "REGISTERED");
u2->Logout();
diff --git a/modules/nickserv/main/nickserv.cpp b/modules/nickserv/main/nickserv.cpp
index 60b136db1..3741d119b 100644
--- a/modules/nickserv/main/nickserv.cpp
+++ b/modules/nickserv/main/nickserv.cpp
@@ -115,7 +115,7 @@ class NickServRelease : public User, public Timer
NickServReleases.insert(std::make_pair(this->nick, this));
- IRCD->SendClientIntroduction(this);
+ IRCD->Send<messages::NickIntroduction>(this);
}
~NickServRelease()
@@ -168,7 +168,7 @@ class NickServCore : public Module, public NickServ::NickServService
new NickServHeld(this, na, Config->GetModule("nickserv/main")->Get<time_t>("releasetimeout", "1m"));
if (IRCD->CanSVSHold)
- IRCD->SendSVSHold(na->GetNick(), Config->GetModule("nickserv/main")->Get<time_t>("releasetimeout", "1m"));
+ IRCD->Send<messages::SVSHold>(na->GetNick(), Config->GetModule("nickserv/main")->Get<time_t>("releasetimeout", "1m"));
else
new NickServRelease(this, na, Config->GetModule("nickserv/main")->Get<time_t>("releasetimeout", "1m"));
}
@@ -324,7 +324,7 @@ class NickServCore : public Module, public NickServ::NickServService
else
{
u->SendMessage(*NickServ, _("Your nickname is now being changed to \002%s\002"), guestnick.c_str());
- IRCD->SendForceNickChange(u, guestnick, Anope::CurTime);
+ IRCD->Send<messages::SVSNick>(u, guestnick, Anope::CurTime);
}
}
else
@@ -338,7 +338,7 @@ class NickServCore : public Module, public NickServ::NickServService
if (held.HasExt(na))
{
if (IRCD->CanSVSHold)
- IRCD->SendSVSHoldDel(na->GetNick());
+ IRCD->Send<messages::SVSHoldDel>(na->GetNick());
else
{
User *u = User::Find(na->GetNick(), true);
@@ -418,7 +418,7 @@ class NickServCore : public Module, public NickServ::NickServService
User *u = User::Find(na->GetNick(), true);
if (u && u->Account() == na->GetAccount())
{
- IRCD->SendLogout(u);
+ IRCD->Send<messages::Logout>(u);
u->RemoveMode(NickServ, "REGISTERED");
u->Logout();
}
@@ -432,7 +432,7 @@ class NickServCore : public Module, public NickServ::NickServService
for (unsigned int i = nc->users.size(); i > 0; --i)
{
User *user = nc->users[i - 1];
- IRCD->SendLogout(user);
+ IRCD->Send<messages::Logout>(user);
user->RemoveMode(NickServ, "REGISTERED");
user->Logout();
EventManager::Get()->Dispatch(&Event::NickLogout::OnNickLogout, user);
@@ -552,7 +552,7 @@ class NickServCore : public Module, public NickServ::NickServService
else
{
/* Reset +r and re-send account (even though it really should be set at this point) */
- IRCD->SendLogin(u, na);
+ IRCD->Send<messages::Login>(u, na);
if (!Config->GetModule("nickserv/main")->Get<bool>("nonicknameownership") && na->GetAccount() == u->Account() && !na->GetAccount()->IsUnconfirmed())
u->SetMode(NickServ, "REGISTERED");
Log(u, "", NickServ) << u->GetMask() << " automatically identified for group " << u->Account()->GetDisplay();
diff --git a/modules/nickserv/recover.cpp b/modules/nickserv/recover.cpp
index f3fa24bb6..60a0bee2f 100644
--- a/modules/nickserv/recover.cpp
+++ b/modules/nickserv/recover.cpp
@@ -92,7 +92,7 @@ class NSRecoverRequestListener : public NickServ::IdentifyRequestListener
source.Reply(_("Ghost with your nick has been killed."));
if (IRCD->CanSVSNick)
- IRCD->SendForceNickChange(source.GetUser(), user, Anope::CurTime);
+ IRCD->Send<messages::SVSNick>(source.GetUser(), user, Anope::CurTime);
}
/* User is not identified or not identified to the same account as the person using this command */
else
@@ -266,7 +266,7 @@ class NSRecover : public Module
if (u->FindChannel(c))
this->OnJoinChannel(u, c);
else if (IRCD->CanSVSJoin)
- IRCD->SendSVSJoin(NickServ, u, cname, "");
+ IRCD->Send<messages::SVSJoin>(NickServ, u, cname, "");
}
}
@@ -276,7 +276,7 @@ class NSRecover : public Module
if (svs->from)
{
// svsnick from to to
- IRCD->SendForceNickChange(svs->from, svs->to, Anope::CurTime);
+ IRCD->Send<messages::SVSNick>(svs->from, svs->to, Anope::CurTime);
}
svsnick.Unset(u);
diff --git a/modules/nickserv/register.cpp b/modules/nickserv/register.cpp
index 4ceb3f113..b06e08075 100644
--- a/modules/nickserv/register.cpp
+++ b/modules/nickserv/register.cpp
@@ -59,7 +59,7 @@ class CommandNSConfirm : public Command
/* Login the users online already */
for (User *u : na->GetAccount()->users)
{
- IRCD->SendLogin(u, na);
+ IRCD->Send<messages::Login>(u, na);
NickServ::Nick *u_na = NickServ::FindNick(u->nick);
@@ -90,7 +90,7 @@ class CommandNSConfirm : public Command
NickServ::Nick *na = NickServ::FindNick(source.GetNick());
if (na)
{
- IRCD->SendLogin(source.GetUser(), na);
+ IRCD->Send<messages::Login>(source.GetUser(), na);
if (!Config->GetModule("nickserv/main")->Get<bool>("nonicknameownership") && na->GetAccount() == source.GetAccount() && !na->GetAccount()->IsUnconfirmed())
source.GetUser()->SetMode(source.service, "REGISTERED");
}
diff --git a/modules/nickserv/set.cpp b/modules/nickserv/set.cpp
index 136d43be8..c7d03f8d2 100644
--- a/modules/nickserv/set.cpp
+++ b/modules/nickserv/set.cpp
@@ -362,7 +362,7 @@ class CommandNSSetDisplay : public Command
for (User *u : user_na->GetAccount()->users)
{
- IRCD->SendLogin(u, user_na);
+ IRCD->Send<messages::Login>(u, user_na);
}
source.Reply(_("The new display is now \002{0}\002."), user_na->GetAccount()->GetDisplay());
diff --git a/modules/operserv/jupe.cpp b/modules/operserv/jupe.cpp
index 2f9386eda..882effa4f 100644
--- a/modules/operserv/jupe.cpp
+++ b/modules/operserv/jupe.cpp
@@ -57,11 +57,11 @@ class CommandOSJupe : public Command
Anope::string sid = IRCD->SID_Retrieve();
if (server)
{
- IRCD->SendSquit(server, rbuf);
+ IRCD->Send<messages::SQuit>(server, rbuf);
server->Delete(rbuf);
}
Server *juped_server = new Server(Me, jserver, 1, rbuf, sid, true);
- IRCD->SendServer(juped_server);
+ IRCD->Send<messages::MessageServer>(juped_server);
Log(LOG_ADMIN, source, this) << "on " << jserver << " (" << rbuf << ")";
}
diff --git a/modules/operserv/main/operserv.cpp b/modules/operserv/main/operserv.cpp
index 09dc3bbac..fc8dbf423 100644
--- a/modules/operserv/main/operserv.cpp
+++ b/modules/operserv/main/operserv.cpp
@@ -38,12 +38,12 @@ class SGLineManager : public XLineManager
void Send(User *u, XLine *x) override
{
- IRCD->SendAkill(u, x);
+ IRCD->Send<messages::Akill>(u, x);
}
void SendDel(XLine *x) override
{
- IRCD->SendAkillDel(x);
+ IRCD->Send<messages::AkillDel>(x);
}
bool Check(User *u, XLine *x) override
@@ -106,7 +106,7 @@ class SQLineManager : public XLineManager
}
else if (x->GetMask()[0] != '#' || IRCD->CanSQLineChannel)
{
- IRCD->SendSQLine(u, x);
+ IRCD->Send<messages::SQLine>(u, x);
/* If it is an oper, assume they're walking it, otherwise kill for good measure */
if (u && !u->HasMode("OPER"))
u->Kill(Config->GetClient("OperServ"), "Q-Lined: " + x->GetReason());
@@ -118,7 +118,7 @@ class SQLineManager : public XLineManager
if (!IRCD->CanSQLine || x->IsRegex())
;
else if (x->GetMask()[0] != '#' || IRCD->CanSQLineChannel)
- IRCD->SendSQLineDel(x);
+ IRCD->Send<messages::SQLineDel>(x);
}
bool Check(User *u, XLine *x) override
@@ -168,7 +168,7 @@ class SNLineManager : public XLineManager
void Send(User *u, XLine *x) override
{
if (IRCD->CanSNLine && !x->IsRegex())
- IRCD->SendSGLine(u, x);
+ IRCD->Send<messages::SGLine>(u, x);
if (u)
u->Kill(Config->GetClient("OperServ"), "SNLined: " + x->GetReason());
@@ -177,7 +177,7 @@ class SNLineManager : public XLineManager
void SendDel(XLine *x) override
{
if (IRCD->CanSNLine && !x->IsRegex())
- IRCD->SendSGLineDel(x);
+ IRCD->Send<messages::SGLineDel>(x);
}
bool Check(User *u, XLine *x) override
diff --git a/modules/operserv/noop.cpp b/modules/operserv/noop.cpp
index 2d813a0cc..329a6c338 100644
--- a/modules/operserv/noop.cpp
+++ b/modules/operserv/noop.cpp
@@ -50,7 +50,7 @@ class CommandOSNOOP : public Command
if (cmd.equals_ci("SET"))
{
/* Remove the O:lines */
- IRCD->SendSVSNOOP(s, true);
+ IRCD->Send<messages::NOOP>(s, true);
s->Extend<Anope::string>("noop", source.GetNick());
Log(LOG_ADMIN, source, this) << "SET on " << s->GetName();
@@ -69,7 +69,7 @@ class CommandOSNOOP : public Command
else if (cmd.equals_ci("REVOKE"))
{
s->Shrink<Anope::string>("noop");
- IRCD->SendSVSNOOP(s, false);
+ IRCD->Send<messages::NOOP>(s, false);
Log(LOG_ADMIN, source, this) << "REVOKE on " << s->GetName();
source.Reply(_("All O:lines of \002{0}\002 have been reset."), s->GetName());
}
diff --git a/modules/operserv/svs.cpp b/modules/operserv/svs.cpp
index 81138740f..ccba9d8d1 100644
--- a/modules/operserv/svs.cpp
+++ b/modules/operserv/svs.cpp
@@ -69,7 +69,7 @@ class CommandOSSVSNick : public Command
source.Reply(_("\002{0}\002 is now being changed to \002{1}\002."), nick, newnick);
Log(LOG_ADMIN, source, this) << "to change " << nick << " to " << newnick;
- IRCD->SendForceNickChange(u2, newnick, Anope::CurTime);
+ IRCD->Send<messages::SVSNick>(u2, newnick, Anope::CurTime);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand) override
@@ -122,7 +122,7 @@ class CommandOSSVSJoin : public Command
return;
}
- IRCD->SendSVSJoin(*source.service, target, params[1], "");
+ IRCD->Send<messages::SVSJoin>(*source.service, target, params[1], "");
Log(LOG_ADMIN, source, this) << "to force " << target->nick << " to join " << params[1];
source.Reply(_("\002{0}\002 has been joined to \002{1}\002."), target->nick, params[1]);
}
@@ -178,7 +178,7 @@ class CommandOSSVSPart : public Command
}
const Anope::string &reason = params.size() > 2 ? params[2] : "";
- IRCD->SendSVSPart(*source.service, target, params[1], reason);
+ IRCD->Send<messages::SVSPart>(*source.service, target, params[1], reason);
if (!reason.empty())
Log(LOG_ADMIN, source, this) << "to force " << target->nick << " to part " << c->name << " with reason " << reason;
else
diff --git a/modules/protocol/bahamut.cpp b/modules/protocol/bahamut.cpp
index 46ffb3ea2..cdb05e7f7 100644
--- a/modules/protocol/bahamut.cpp
+++ b/modules/protocol/bahamut.cpp
@@ -23,103 +23,175 @@
#include "modules/protocol/rfc1459.h"
#include "modules/protocol/bahamut.h"
-class ChannelModeFlood : public ChannelModeParam
+void bahamut::senders::Akill::Send(User* u, XLine* x)
{
- public:
- ChannelModeFlood(char modeChar, bool minusNoArg) : ChannelModeParam("FLOOD", modeChar, minusNoArg) { }
-
- bool IsValid(Anope::string &value) const override
+ if (x->IsRegex() || x->HasNickOrReal())
{
- try
+ if (!u)
{
- Anope::string rest;
- if (!value.empty() && value[0] != ':' && convertTo<int>(value[0] == '*' ? value.substr(1) : value, rest, false) > 0 && rest[0] == ':' && rest.length() > 1 && convertTo<int>(rest.substr(1), rest, false) > 0 && rest.empty())
- return true;
+ /* No user (this akill was just added), and contains nick and/or realname. Find users that match and ban them */
+ for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
+ if (x->GetManager()->Check(it->second, x))
+ this->Send(it->second, x);
+ return;
}
- catch (const ConvertException &) { }
- return false;
+ XLine *old = x;
+
+ if (old->GetManager()->HasEntry("*@" + u->host))
+ return;
+
+ /* We can't akill x as it has a nick and/or realname included, so create a new akill for *@host */
+ x = Serialize::New<XLine *>();
+ x->SetMask("*@" + u->host);
+ x->SetBy(old->GetBy());
+ x->SetExpires(old->GetExpires());
+ x->SetReason(old->GetReason());
+ x->SetID(old->GetID());
+ old->GetManager()->AddXLine(x);
+
+ Log(Config->GetClient("OperServ"), "akill") << "AKILL: Added an akill for " << x->GetMask() << " because " << u->GetMask() << "#" << u->realname << " matches " << old->GetMask();
}
-};
-bahamut::Proto::Proto(Module *creator) : IRCDProto(creator, "Bahamut 1.8.x")
-{
- DefaultPseudoclientModes = "+";
- CanSVSNick = true;
- CanSNLine = true;
- CanSQLine = true;
- CanSQLineChannel = true;
- CanSZLine = true;
- CanSVSHold = true;
- MaxModes = 60;
+ /* ZLine if we can instead */
+ if (x->GetUser() == "*")
+ {
+ cidr a(x->GetHost());
+ if (a.valid())
+ {
+ IRCD->Send<messages::SZLine>(u, x);
+ return;
+ }
+ }
+
+ // Calculate the time left before this would expire, capping it at 2 days
+ time_t timeleft = x->GetExpires() - Anope::CurTime;
+ if (timeleft > 172800)
+ timeleft = 172800;
+
+ Uplink::Send("AKILL", x->GetHost(), x->GetUser(), timeleft, x->GetBy(), Anope::CurTime, x->GetReason());
}
-void bahamut::Proto::SendMode(const MessageSource &source, Channel *dest, const Anope::string &buf)
+void bahamut::senders::AkillDel::Send(XLine* x)
{
- if (Servers::Capab.count("TSMODE") > 0)
+ if (x->IsRegex() || x->HasNickOrReal())
+ return;
+
+ /* ZLine if we can instead */
+ if (x->GetUser() == "*")
{
- IRCMessage message(source, "MODE", dest->name, dest->creation_time);
- message.TokenizeAndPush(buf);
- Uplink::SendMessage(message);
+ cidr a(x->GetHost());
+ if (a.valid())
+ {
+ IRCD->Send<messages::SZLineDel>(x);
+ return;
+ }
}
- else
+
+ Uplink::Send("RAKKILL", x->GetHost(), x->GetUser());
+}
+
+void bahamut::senders::MessageChannel::Send(Channel* c)
+{
+ Anope::string modes = c->GetModes(true, true);
+ if (modes.empty())
+ modes = "+";
+ Uplink::Send("SJOIN", c->creation_time, c->name, modes, "");
+}
+
+void bahamut::senders::Join::Send(User* user, Channel* c, const ChannelStatus* status)
+{
+ Uplink::Send(user, "SJOIN", c->creation_time, c->name);
+
+ if (status)
{
- IRCDProto::SendMode(source, dest, buf);
+ /* First save the channel status incase uc->Status == status */
+ ChannelStatus cs = *status;
+ /* If the user is internally on the channel with flags, kill them so that
+ * the stacker will allow this.
+ */
+ ChanUserContainer *uc = c->FindUser(user);
+ if (uc != NULL)
+ uc->status.Clear();
+
+ ServiceBot *setter = ServiceBot::Find(user->GetUID());
+ for (size_t i = 0; i < cs.Modes().length(); ++i)
+ c->SetMode(setter, ModeManager::FindChannelModeByChar(cs.Modes()[i]), user->GetUID(), false);
+
+ if (uc != NULL)
+ uc->status = cs;
}
}
-void bahamut::Proto::SendMode(const MessageSource &source, User *u, const Anope::string &buf)
+void bahamut::senders::Kill::Send(const MessageSource &source, const Anope::string &target, const Anope::string &reason)
{
- IRCMessage message(source, "SVSMODE", u->nick, u->timestamp);
- message.TokenizeAndPush(buf);
- Uplink::SendMessage(message);
+ Uplink::Send(source, "SVSKILL", target, reason);
+}
+
+/*
+ Note: if the stamp is null 0, the below usage is correct of Bahamut
+*/
+void bahamut::senders::Kill::Send(const MessageSource &source, User *user, const Anope::string &reason)
+{
+ Uplink::Send(source, "SVSKILL", user->nick, reason);
}
-void bahamut::Proto::SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg)
+void bahamut::senders::Login::Send(User *u, NickServ::Nick *na)
{
- Uplink::Send(bi, "NOTICE", "$" + dest->GetName(), msg);
+ IRCD->SendMode(Config->GetClient("NickServ"), u, "+d {0}", u->signon);
}
-void bahamut::Proto::SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg)
+void bahamut::senders::Logout::Send(User *u)
{
- Uplink::Send(bi, "PRIVMSG", "$" + dest->GetName(), msg);
+ IRCD->SendMode(Config->GetClient("NickServ"), u, "+d 1");
}
-/* SVSHOLD - set */
-void bahamut::Proto::SendSVSHold(const Anope::string &nick, time_t time)
+void bahamut::senders::ModeChannel::Send(const MessageSource &source, Channel *channel, const Anope::string &modes)
{
- Uplink::Send(Me, "SVSHOLD", nick, time, "Being held for registered user");
+ IRCMessage message(source, "MODE", channel->name, channel->creation_time);
+ message.TokenizeAndPush(modes);
+ Uplink::SendMessage(message);
}
-/* SVSHOLD - release */
-void bahamut::Proto::SendSVSHoldDel(const Anope::string &nick)
+void bahamut::senders::ModeUser::Send(const MessageSource &source, User *user, const Anope::string &modes)
{
- Uplink::Send(Me, "SVSHOLD", nick, 0);
+ IRCMessage message(source, "SVSMODE", user->nick, user->timestamp);
+ message.TokenizeAndPush(modes);
+ Uplink::SendMessage(message);
}
-/* SQLINE */
-void bahamut::Proto::SendSQLine(User *, XLine *x)
+void bahamut::senders::NickIntroduction::Send(User *user)
{
- Uplink::Send(Me, "SQLINE", x->GetMask(), x->GetReason());
+ Anope::string modes = "+" + user->GetModes();
+ Uplink::Send("NICK", user->nick, 1, user->timestamp, modes, user->GetIdent(), user->host, user->server->GetName(), 0, 0, user->realname);
+}
+
+void bahamut::senders::NOOP::Send(Server* server, bool set)
+{
+ Uplink::Send("SVSNOOP", server->GetSID(), set ? "+" : "-");
+}
+
+void bahamut::senders::SGLine::Send(User*, XLine* x)
+{
+ Uplink::Send("SGLINE", x->GetMask().length(), x->GetMask() + ":" + x->GetReason());
}
-/* UNSLINE */
-void bahamut::Proto::SendSGLineDel(XLine *x)
+void bahamut::senders::SGLineDel::Send(XLine* x)
{
Uplink::Send("UNSGLINE", 0, x->GetMask());
}
-/* UNSZLINE */
-void bahamut::Proto::SendSZLineDel(XLine *x)
+void bahamut::senders::SQLine::Send(User*, XLine* x)
{
- /* this will likely fail so its only here for legacy */
- Uplink::Send("UNSZLINE", 0, x->GetHost());
- /* this is how we are supposed to deal with it */
- Uplink::Send("RAKILL", x->GetHost(), "*");
+ Uplink::Send(Me, "SQLINE", x->GetMask(), x->GetReason());
+}
+
+void bahamut::senders::SQLineDel::Send(XLine* x)
+{
+ Uplink::Send("UNSQLINE", x->GetMask());
}
-/* SZLINE */
-void bahamut::Proto::SendSZLine(User *, XLine *x)
+void bahamut::senders::SZLine::Send(User*, XLine* x)
{
// Calculate the time left before this would expire, capping it at 2 days
time_t timeleft = x->GetExpires() - Anope::CurTime;
@@ -131,130 +203,69 @@ void bahamut::Proto::SendSZLine(User *, XLine *x)
Uplink::Send("AKILL", x->GetHost(), "*", timeleft, x->GetBy(), Anope::CurTime, x->GetReason());
}
-/* SVSNOOP */
-void bahamut::Proto::SendSVSNOOP(Server *server, bool set)
+void bahamut::senders::SZLineDel::Send(XLine* x)
{
- Uplink::Send("SVSNOOP", server->GetName(), set ? "+" : "-");
+ /* this will likely fail so its only here for legacy */
+ Uplink::Send("UNSZLINE", 0, x->GetHost());
+ /* this is how we are supposed to deal with it */
+ Uplink::Send("RAKILL", x->GetHost(), "*");
}
-/* SGLINE */
-void bahamut::Proto::SendSGLine(User *, XLine *x)
+void bahamut::senders::SVSHold::Send(const Anope::string& nick, time_t t)
{
- Uplink::Send("SGLINE", x->GetMask().length(), x->GetMask() + ":" + x->GetReason());
+ Uplink::Send(Me, "SVSHOLD", nick, t, "Being held for registered user");
}
-/* RAKILL */
-void bahamut::Proto::SendAkillDel(XLine *x)
+void bahamut::senders::SVSHoldDel::Send(const Anope::string& nick)
{
- if (x->IsRegex() || x->HasNickOrReal())
- return;
-
- /* ZLine if we can instead */
- if (x->GetUser() == "*")
- {
- cidr a(x->GetHost());
- if (a.valid())
- {
- IRCD->SendSZLineDel(x);
- return;
- }
- }
-
- Uplink::Send("RAKKILL", x->GetHost(), x->GetUser());
+ Uplink::Send(Me, "SVSHOLD", nick, 0);
}
-/* TOPIC */
-void bahamut::Proto::SendTopic(const MessageSource &source, Channel *c)
+void bahamut::senders::SVSNick::Send(User* u, const Anope::string& newnick, time_t ts)
{
- Uplink::Send(source, "TOPIC", c->name, c->topic_setter, c->topic_ts, c->topic);
+ Uplink::Send("SVSNICK", u->GetUID(), newnick, ts);
}
-/* UNSQLINE */
-void bahamut::Proto::SendSQLineDel(XLine *x)
+void bahamut::senders::Topic::Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter)
{
- Uplink::Send("UNSQLINE", x->GetMask());
+ Uplink::Send(source, "TOPIC", channel->name, topic_setter, topic_ts, topic);
}
-/* JOIN - SJOIN */
-void bahamut::Proto::SendJoin(User *user, Channel *c, const ChannelStatus *status)
+void bahamut::senders::Wallops::Send(const MessageSource &source, const Anope::string &msg)
{
- Uplink::Send(user, "SJOIN", c->creation_time, c->name);
-
- if (status)
- {
- /* First save the channel status incase uc->Status == status */
- ChannelStatus cs = *status;
- /* If the user is internally on the channel with flags, kill them so that
- * the stacker will allow this.
- */
- ChanUserContainer *uc = c->FindUser(user);
- if (uc != NULL)
- uc->status.Clear();
-
- ServiceBot *setter = ServiceBot::Find(user->GetUID());
- for (size_t i = 0; i < cs.Modes().length(); ++i)
- c->SetMode(setter, ModeManager::FindChannelModeByChar(cs.Modes()[i]), user->GetUID(), false);
-
- if (uc != NULL)
- uc->status = cs;
- }
+ Uplink::Send(source, "GLOBOPS", msg);
}
-void bahamut::Proto::SendAkill(User *u, XLine *x)
+#warning "not used"
+class ChannelModeFlood : public ChannelModeParam
{
- if (x->IsRegex() || x->HasNickOrReal())
- {
- if (!u)
- {
- /* No user (this akill was just added), and contains nick and/or realname. Find users that match and ban them */
- for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- if (x->GetManager()->Check(it->second, x))
- this->SendAkill(it->second, x);
- return;
- }
-
- XLine *old = x;
-
- if (old->GetManager()->HasEntry("*@" + u->host))
- return;
-
- /* We can't akill x as it has a nick and/or realname included, so create a new akill for *@host */
- x = Serialize::New<XLine *>();
- x->SetMask("*@" + u->host);
- x->SetBy(old->GetBy());
- x->SetExpires(old->GetExpires());
- x->SetReason(old->GetReason());
- x->SetID(old->GetID());
- old->GetManager()->AddXLine(x);
-
- Log(Config->GetClient("OperServ"), "akill") << "AKILL: Added an akill for " << x->GetMask() << " because " << u->GetMask() << "#" << u->realname << " matches " << old->GetMask();
- }
+ public:
+ ChannelModeFlood(char modeChar, bool minusNoArg) : ChannelModeParam("FLOOD", modeChar, minusNoArg) { }
- /* ZLine if we can instead */
- if (x->GetUser() == "*")
+ bool IsValid(Anope::string &value) const override
{
- cidr a(x->GetHost());
- if (a.valid())
+ try
{
- IRCD->SendSZLine(u, x);
- return;
+ Anope::string rest;
+ if (!value.empty() && value[0] != ':' && convertTo<int>(value[0] == '*' ? value.substr(1) : value, rest, false) > 0 && rest[0] == ':' && rest.length() > 1 && convertTo<int>(rest.substr(1), rest, false) > 0 && rest.empty())
+ return true;
}
- }
-
- // Calculate the time left before this would expire, capping it at 2 days
- time_t timeleft = x->GetExpires() - Anope::CurTime;
- if (timeleft > 172800)
- timeleft = 172800;
+ catch (const ConvertException &) { }
- Uplink::Send("AKILL", x->GetHost(), x->GetUser(), timeleft, x->GetBy(), Anope::CurTime, x->GetReason());
-}
+ return false;
+ }
+};
-/*
- Note: if the stamp is null 0, the below usage is correct of Bahamut
-*/
-void bahamut::Proto::SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf)
+bahamut::Proto::Proto(Module *creator) : IRCDProto(creator, "Bahamut 1.8.x")
{
- Uplink::Send(source, "SVSKILL", user->nick, buf);
+ DefaultPseudoclientModes = "+";
+ CanSVSNick = true;
+ CanSNLine = true;
+ CanSQLine = true;
+ CanSQLineChannel = true;
+ CanSZLine = true;
+ CanSVSHold = true;
+ MaxModes = 60;
}
void bahamut::Proto::SendBOB()
@@ -267,23 +278,11 @@ void bahamut::Proto::SendEOB()
Uplink::Send("BURST", 0);
}
-void bahamut::Proto::SendClientIntroduction(User *u)
-{
- Anope::string modes = "+" + u->GetModes();
- Uplink::Send("NICK", u->nick, 1, u->timestamp, modes, u->GetIdent(), u->host, u->server->GetName(), 0, 0, u->realname);
-}
-
-/* SERVER */
-void bahamut::Proto::SendServer(Server *server)
-{
- Uplink::Send("SERVER", server->GetName(), server->GetHops(), server->GetDescription());
-}
-
-void bahamut::Proto::SendConnect()
+void bahamut::Proto::Handshake()
{
Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "TS");
Uplink::Send("CAPAB", "SSJOIN NOQUIT BURST UNCONNECT NICKIP TSMODE TS3");
- SendServer(Me);
+ IRCD->Send<messages::MessageServer>(Me);
/*
* SVINFO
* parv[0] = sender prefix
@@ -296,24 +295,6 @@ void bahamut::Proto::SendConnect()
this->SendBOB();
}
-void bahamut::Proto::SendChannel(Channel *c)
-{
- Anope::string modes = c->GetModes(true, true);
- if (modes.empty())
- modes = "+";
- Uplink::Send("SJOIN", c->creation_time, c->name, modes, "");
-}
-
-void bahamut::Proto::SendLogin(User *u, NickServ::Nick *)
-{
- IRCD->SendMode(Config->GetClient("NickServ"), u, "+d {0}", u->signon);
-}
-
-void bahamut::Proto::SendLogout(User *u)
-{
- IRCD->SendMode(Config->GetClient("NickServ"), u, "+d 1");
-}
-
void bahamut::Burst::Run(MessageSource &source, const std::vector<Anope::string> &params)
{
Server *s = source.GetServer();
@@ -522,6 +503,45 @@ class ProtoBahamut : public Module
bahamut::SJoin message_sjoin;
bahamut::Topic message_topic;
+ /* Core message senders */
+ rfc1459::senders::GlobalNotice sender_global_notice;
+ rfc1459::senders::GlobalPrivmsg sender_global_privmsg;
+ rfc1459::senders::Invite sender_invite;
+ rfc1459::senders::Kick sender_kick;
+ rfc1459::senders::NickChange sender_nickchange;
+ rfc1459::senders::Notice sender_notice;
+ rfc1459::senders::Part sender_part;
+ rfc1459::senders::Ping sender_ping;
+ rfc1459::senders::Pong sender_pong;
+ rfc1459::senders::Privmsg sender_privmsg;
+ rfc1459::senders::Quit sender_quit;
+ rfc1459::senders::MessageServer sender_server;
+ rfc1459::senders::SQuit sender_squit;
+
+ /* Our message senders */
+ bahamut::senders::Akill sender_akill;
+ bahamut::senders::AkillDel sender_akill_del;
+ bahamut::senders::MessageChannel sender_channel;
+ bahamut::senders::Join sender_join;
+ bahamut::senders::Kill sender_kill;
+ bahamut::senders::Login sender_login;
+ bahamut::senders::Logout sender_logout;
+ bahamut::senders::ModeChannel sender_mode_channel;
+ bahamut::senders::ModeUser sender_mode_user;
+ bahamut::senders::NickIntroduction sender_nickintroduction;
+ bahamut::senders::NOOP sender_noop;
+ bahamut::senders::SGLine sender_sgline;
+ bahamut::senders::SGLineDel sender_sgline_del;
+ bahamut::senders::SQLine sender_sqline;
+ bahamut::senders::SQLineDel sender_sqline_del;
+ bahamut::senders::SZLine sender_szline;
+ bahamut::senders::SZLineDel sender_szline_del;
+ bahamut::senders::SVSHold sender_svshold;
+ bahamut::senders::SVSHoldDel sender_svsholddel;
+ bahamut::senders::SVSNick sender_svsnick;
+ bahamut::senders::Topic sender_topic;
+ bahamut::senders::Wallops sender_wallops;
+
public:
ProtoBahamut(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR)
, EventHook<Event::UserNickChange>(this)
@@ -552,13 +572,55 @@ class ProtoBahamut : public Module
, message_server(this)
, message_sjoin(this)
, message_topic(this)
+
+ , sender_akill(this)
+ , sender_akill_del(this)
+ , sender_channel(this)
+ , sender_global_notice(this)
+ , sender_global_privmsg(this)
+ , sender_invite(this)
+ , sender_join(this)
+ , sender_kick(this)
+ , sender_kill(this)
+ , sender_login(this)
+ , sender_logout(this)
+ , sender_mode_channel(this)
+ , sender_mode_user(this)
+ , sender_nickchange(this)
+ , sender_nickintroduction(this)
+ , sender_noop(this)
+ , sender_topic(this)
+ , sender_notice(this)
+ , sender_part(this)
+ , sender_ping(this)
+ , sender_pong(this)
+ , sender_privmsg(this)
+ , sender_quit(this)
+ , sender_server(this)
+ , sender_sgline(this)
+ , sender_sgline_del(this)
+ , sender_sqline(this)
+ , sender_sqline_del(this)
+ , sender_szline(this)
+ , sender_szline_del(this)
+ , sender_squit(this)
+ , sender_svshold(this)
+ , sender_svsholddel(this)
+ , sender_svsnick(this)
+ , sender_wallops(this)
+ {
+ IRCD = &ircd_proto;
+ }
+
+ ~ProtoBahamut()
{
+ IRCD = nullptr;
}
void OnUserNickChange(User *u, const Anope::string &) override
{
u->RemoveModeInternal(Me, ModeManager::FindUserModeByName("REGISTERED"));
- IRCD->SendLogout(u);
+ sender_logout.Send(u);
}
};
diff --git a/modules/protocol/charybdis.cpp b/modules/protocol/charybdis.cpp
index 4488f5425..a808bb594 100644
--- a/modules/protocol/charybdis.cpp
+++ b/modules/protocol/charybdis.cpp
@@ -23,7 +23,6 @@
#include "modules/sasl.h"
#include "modules/protocol/hybrid.h"
#include "modules/protocol/charybdis.h"
-#include "modules/protocol/ratbox.h"
#include "modules/chanserv/mode.h"
static Anope::string UplinkSID;
@@ -39,9 +38,57 @@ class ChannelModeLargeBan : public ChannelMode
}
};
+void charybdis::senders::NickIntroduction::Send(User *user)
+{
+ Anope::string modes = "+" + user->GetModes();
+ Uplink::Send(Me, "EUID", user->nick, 1, user->timestamp, modes, user->GetIdent(), user->host, 0, user->GetUID(), "*", "*", user->realname);
+}
+void charybdis::senders::SASL::Send(const ::SASL::Message& message)
+{
+ Server *s = Server::Find(message.target.substr(0, 3));
+ Uplink::Send(Me, "ENCAP", s ? s->GetName() : message.target.substr(0, 3), "SASL", message.source, message.target, message.type, message.data, message.ext.empty() ? "" : message.ext);
+}
-charybdis::Proto::Proto(Module *creator) : IRCDProto(creator, "Charybdis 3.4+")
- , ratbox("ratbox")
+void charybdis::senders::SASLMechanisms::Send(const std::vector<Anope::string>& mechanisms)
+{
+ Anope::string mechlist;
+
+ for (unsigned int i = 0; i < mechanisms.size(); ++i)
+ {
+ mechlist += "," + mechanisms[i];
+ }
+
+ Uplink::Send(Me, "ENCAP", "*", "MECHLIST", mechlist.empty() ? "" : mechlist.substr(1));
+}
+
+void charybdis::senders::SVSHold::Send(const Anope::string& nick, time_t delay)
+{
+ Uplink::Send(Me, "ENCAP", "*", "NICKDELAY", delay, nick);
+}
+
+void charybdis::senders::SVSHoldDel::Send(const Anope::string& nick)
+{
+ Uplink::Send(Me, "ENCAP", "*", "NICKDELAY", 0, nick);
+}
+
+void charybdis::senders::SVSLogin::Send(const Anope::string& uid, const Anope::string& acc, const Anope::string& vident, const Anope::string& vhost)
+{
+ Server *s = Server::Find(uid.substr(0, 3));
+ Uplink::Send(Me, "ENCAP", s ? s->GetName() : uid.substr(0, 3), "SVSLOGIN", uid, "*", vident.empty() ? "*" : vident, vhost.empty() ? "*" : vhost, acc);
+}
+
+void charybdis::senders::VhostDel::Send(User* u)
+{
+ IRCD->Send<messages::VhostSet>(u, "", u->host);
+}
+
+void charybdis::senders::VhostSet::Send(User* u, const Anope::string& vident, const Anope::string& vhost)
+{
+ Uplink::Send(Me, "ENCAP", "*", "CHGHOST", u->GetUID(), vhost);
+}
+
+charybdis::Proto::Proto(Module *creator) : ts6::Proto(creator, "Charybdis 3.4+")
+ , ratbox(creator)
{
DefaultPseudoclientModes = "+oiS";
CanCertFP = true;
@@ -56,7 +103,7 @@ charybdis::Proto::Proto(Module *creator) : IRCDProto(creator, "Charybdis 3.4+")
MaxModes = 4;
}
-void charybdis::Proto::SendConnect()
+void charybdis::Proto::Handshake()
{
Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "TS", 6, Me->GetSID());
@@ -86,7 +133,7 @@ void charybdis::Proto::SendConnect()
Uplink::Send("CAPAB", "BAN CHW CLUSTER ENCAP EOPMOD EUID EX IE KLN KNOCK MLOCK QS RSFNC SERVICES TB UNKLN");
/* Make myself known to myself in the serverlist */
- SendServer(Me);
+ Uplink::Send("SERVER", Me->GetName(), Me->GetHops() + 1, Me->GetDescription());
/*
* Received: SVINFO 6 6 0 :1353235537
@@ -95,66 +142,9 @@ void charybdis::Proto::SendConnect()
* arg[2] = '0'
* arg[3] = server's idea of UTC time
*/
- Uplink::Send("SVINFO", 6, 6, Anope::CurTime);
-}
-
-void charybdis::Proto::SendClientIntroduction(User *u)
-{
- Anope::string modes = "+" + u->GetModes();
- Uplink::Send(Me, "EUID", u->nick, 1, u->timestamp, modes, u->GetIdent(), u->host, 0, u->GetUID(), "*", "*", u->realname);
-}
-
-void charybdis::Proto::SendForceNickChange(User *u, const Anope::string &newnick, time_t when)
-{
- Uplink::Send(Me, "ENCAP", u->server->GetName(), "RSFNC", u->GetUID(),
- newnick, when, u->timestamp);
+ Uplink::Send("SVINFO", 6, 6, 0, Anope::CurTime);
}
-void charybdis::Proto::SendSVSHold(const Anope::string &nick, time_t delay)
-{
- Uplink::Send(Me, "ENCAP", "*", "NICKDELAY", delay, nick);
-}
-
-void charybdis::Proto::SendSVSHoldDel(const Anope::string &nick)
-{
- Uplink::Send(Me, "ENCAP", "*", "NICKDELAY", 0, nick);
-}
-
-void charybdis::Proto::SendVhost(User *u, const Anope::string &ident, const Anope::string &host)
-{
- Uplink::Send(Me, "ENCAP", "*", "CHGHOST", u->GetUID(), host);
-}
-
-void charybdis::Proto::SendVhostDel(User *u)
-{
- this->SendVhost(u, "", u->host);
-}
-
-void charybdis::Proto::SendSASLMechanisms(std::vector<Anope::string> &mechanisms)
-{
- Anope::string mechlist;
-
- for (unsigned i = 0; i < mechanisms.size(); ++i)
- {
- mechlist += "," + mechanisms[i];
- }
-
- Uplink::Send(Me, "ENCAP", "*", "MECHLIST", mechlist.empty() ? "" : mechlist.substr(1));
-}
-
-void charybdis::Proto::SendSASLMessage(const SASL::Message &message)
-{
- Server *s = Server::Find(message.target.substr(0, 3));
- Uplink::Send(Me, "ENCAP", s ? s->GetName() : message.target.substr(0, 3), "SASL", message.source, message.target, message.type, message.data, message.ext.empty() ? "" : message.ext);
-}
-
-void charybdis::Proto::SendSVSLogin(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost)
-{
- Server *s = Server::Find(uid.substr(0, 3));
- Uplink::Send(Me, "ENCAP", s ? s->GetName() : uid.substr(0, 3), "SVSLOGIN", uid, "*", vident.empty() ? "*" : vident, vhost.empty() ? "*" : vhost, acc);
-}
-
-
void charybdis::Encap::Run(MessageSource &source, const std::vector<Anope::string> &params)
{
// In a burst, states that the source user is logged in as the account.
@@ -228,7 +218,7 @@ void charybdis::ServerMessage::Run(MessageSource &source, const std::vector<Anop
if (params[1] != "1")
return;
new Server(source.GetServer() == NULL ? Me : source.GetServer(), params[0], 1, params[2], UplinkSID);
- IRCD->SendPing(Me->GetName(), params[0]);
+ IRCD->Send<messages::Ping>(Me->GetName(), params[0]);
}
// we can't use this function from ratbox because we set a local variable here
@@ -282,6 +272,48 @@ class ProtoCharybdis : public Module
hybrid::TMode message_tmode;
ratbox::UID message_uid;
+ /* Core message senders */
+ rfc1459::senders::Invite sender_invite;
+ rfc1459::senders::Kick sender_kick;
+ rfc1459::senders::Kill sender_svskill;
+ rfc1459::senders::ModeChannel sender_mode_chan;
+ rfc1459::senders::ModeUser sender_mode_user;
+ rfc1459::senders::NickChange sender_nickchange;
+ rfc1459::senders::Notice sender_notice;
+ rfc1459::senders::Part sender_part;
+ rfc1459::senders::Ping sender_ping;
+ rfc1459::senders::Pong sender_pong;
+ rfc1459::senders::Privmsg sender_privmsg;
+ rfc1459::senders::Quit sender_quit;
+ rfc1459::senders::SQuit sender_squit;
+
+ hybrid::senders::Akill sender_akill;
+ hybrid::senders::AkillDel sender_akill_del;
+ hybrid::senders::MessageChannel sender_channel;
+ hybrid::senders::GlobalNotice sender_global_notice;
+ hybrid::senders::GlobalPrivmsg sender_global_privmsg;
+ hybrid::senders::Join sender_join;
+ hybrid::senders::MessageServer sender_server;
+ hybrid::senders::SGLine sender_sgline;
+ hybrid::senders::SGLineDel sender_sgline_del;
+ hybrid::senders::SVSHold sender_svshold;
+ hybrid::senders::SVSHoldDel sender_svsholddel;
+
+ ratbox::senders::Login sender_login;
+ ratbox::senders::Logout sender_logout;
+ ratbox::senders::SQLine sender_sqline;
+ ratbox::senders::SQLineDel sender_sqline_del;
+ ratbox::senders::SVSNick sender_svsnick;
+ ratbox::senders::Topic sender_topic;
+ ratbox::senders::Wallops sender_wallops;
+
+ charybdis::senders::NickIntroduction sender_nickintroduction;
+ charybdis::senders::SASL sender_sasl;
+ charybdis::senders::SASLMechanisms sender_sasl_mechs;
+ charybdis::senders::SVSLogin sender_svslogin;
+ charybdis::senders::VhostDel sender_vhost_del;
+ charybdis::senders::VhostSet sender_vhost_set;
+
bool use_server_side_mlock;
public:
@@ -322,7 +354,51 @@ class ProtoCharybdis : public Module
, message_tb(this)
, message_tmode(this)
, message_uid(this)
+
+ , sender_akill(this)
+ , sender_akill_del(this)
+ , sender_channel(this)
+ , sender_global_notice(this)
+ , sender_global_privmsg(this)
+ , sender_invite(this)
+ , sender_join(this)
+ , sender_kick(this)
+ , sender_svskill(this)
+ , sender_login(this)
+ , sender_logout(this)
+ , sender_mode_chan(this)
+ , sender_mode_user(this)
+ , sender_nickchange(this)
+ , sender_nickintroduction(this)
+ , sender_notice(this)
+ , sender_part(this)
+ , sender_ping(this)
+ , sender_pong(this)
+ , sender_privmsg(this)
+ , sender_quit(this)
+ , sender_server(this)
+ , sender_sasl(this)
+ , sender_sasl_mechs(this)
+ , sender_sgline(this)
+ , sender_sgline_del(this)
+ , sender_sqline(this)
+ , sender_sqline_del(this)
+ , sender_squit(this)
+ , sender_svshold(this)
+ , sender_svsholddel(this)
+ , sender_svslogin(this)
+ , sender_svsnick(this)
+ , sender_topic(this)
+ , sender_vhost_del(this)
+ , sender_vhost_set(this)
+ , sender_wallops(this)
+ {
+ IRCD = &ircd_proto;
+ }
+
+ ~ProtoCharybdis()
{
+ IRCD = nullptr;
}
void OnReload(Configuration::Conf *conf) override
diff --git a/modules/protocol/hybrid.cpp b/modules/protocol/hybrid.cpp
index 922083587..2cb508f0e 100644
--- a/modules/protocol/hybrid.cpp
+++ b/modules/protocol/hybrid.cpp
@@ -18,134 +18,14 @@
* along with this program; if not, see see <http://www.gnu.org/licenses/>.
*/
-/* Dependencies: anope_protocol.rfc1459 */
+/* Dependencies: anope_protocol.rfc1459,anope_protocol.ts6 */
#include "module.h"
#include "modules/protocol/hybrid.h"
static Anope::string UplinkSID;
-
-ServiceBot *hybrid::Proto::FindIntroduced()
-{
- ServiceBot *bi = Config->GetClient("OperServ");
- if (bi && bi->introduced)
- return bi;
-
- for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- {
- User *u = it->second;
- if (u->type == UserType::BOT)
- {
- bi = anope_dynamic_static_cast<ServiceBot *>(u);
- if (bi->introduced)
- return bi;
- }
- }
-
- return NULL;
-}
-
-void hybrid::Proto::SendSVSKill(const MessageSource &source, User *u, const Anope::string &buf)
-{
- IRCDProto::SendSVSKill(source, u, buf);
- u->KillInternal(source, buf);
-}
-
-hybrid::Proto::Proto(Module *creator) : IRCDProto(creator, "Hybrid 8.2.x")
-{
- DefaultPseudoclientModes = "+oi";
- CanSVSNick = true;
- CanSVSHold = true;
- CanSVSJoin = true;
- CanSNLine = true;
- CanSQLine = true;
- CanSQLineChannel = true;
- CanSZLine = true;
- CanCertFP = true;
- CanSetVHost = true;
- RequiresID = true;
- MaxModes = 6;
-}
-
-void hybrid::Proto::SendInvite(const MessageSource &source, Channel *c, User *u)
-{
- Uplink::Send(source, "INVITE", u->GetUID(), c->name, c->creation_time);
-}
-
-void hybrid::Proto::SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg)
-{
- Uplink::Send(bi, "NOTICE", "$$" + dest->GetName(), msg);
-}
-
-void hybrid::Proto::SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg)
-{
- Uplink::Send(bi, "PRIVMSG", "$$" + dest->GetName(), msg);
-}
-
-void hybrid::Proto::SendSQLine(User *, XLine *x)
-{
- Uplink::Send(FindIntroduced(), "RESV", "*", x->GetExpires() ? x->GetExpires() - Anope::CurTime : 0, x->GetMask(), x->GetReason());
-}
-
-void hybrid::Proto::SendSGLineDel(XLine *x)
-{
- Uplink::Send(Config->GetClient("OperServ"), "UNXLINE", "*", x->GetMask());
-}
-
-void hybrid::Proto::SendSGLine(User *, XLine *x)
-{
- Uplink::Send(Config->GetClient("OperServ"), "XLINE", "*", x->GetMask(), x->GetExpires() ? x->GetExpires() - Anope::CurTime : 0, x->GetReason());
-}
-
-void hybrid::Proto::SendSZLineDel(XLine *x)
-{
- Uplink::Send(Config->GetClient("OperServ"), "UNDLINE", "*", x->GetHost());
-}
-
-void hybrid::Proto::SendSZLine(User *, XLine *x)
-{
- /* Calculate the time left before this would expire, capping it at 2 days */
- time_t timeleft = x->GetExpires() - Anope::CurTime;
-
- if (timeleft > 172800 || !x->GetExpires())
- timeleft = 172800;
-
- Uplink::Send(Config->GetClient("OperServ"), "DLINE", "*", timeleft, x->GetHost(), x->GetReason());
-}
-
-void hybrid::Proto::SendAkillDel(XLine *x)
-{
- if (x->IsRegex() || x->HasNickOrReal())
- return;
-
- Uplink::Send(Config->GetClient("OperServ"), "UNKLINE", "*", x->GetUser(), x->GetHost());
-}
-
-void hybrid::Proto::SendSQLineDel(XLine *x)
-{
- Uplink::Send(Config->GetClient("OperServ"), "UNRESV", "*", x->GetMask());
-}
-
-void hybrid::Proto::SendJoin(User *u, Channel *c, const ChannelStatus *status)
-{
- /*
- * Note that we must send our modes with the SJOIN and can not add them to the
- * mode stacker because ircd-hybrid does not allow *any* client to op itself
- */
- Uplink::Send("SJOIN", c->creation_time, c->name, "+" + c->GetModes(true, true), (status != NULL ? status->BuildModePrefixList() : "") + u->GetUID());
-
- /* And update our internal status for this user since this is not going through our mode handling system */
- if (status)
- {
- ChanUserContainer *uc = c->FindUser(u);
-
- if (uc)
- uc->status = *status;
- }
-}
-
-void hybrid::Proto::SendAkill(User *u, XLine *x)
+void hybrid::senders::Akill::Send(User* u, XLine* x)
{
if (x->IsRegex() || x->HasNickOrReal())
{
@@ -157,7 +37,7 @@ void hybrid::Proto::SendAkill(User *u, XLine *x)
*/
for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
if (x->GetManager()->Check(it->second, x))
- this->SendAkill(it->second, x);
+ this->Send(it->second, x);
return;
}
@@ -191,111 +71,132 @@ void hybrid::Proto::SendAkill(User *u, XLine *x)
Uplink::Send(Config->GetClient("OperServ"), "KLINE", timeleft, x->GetUser(), x->GetHost(), x->GetReason());
}
-void hybrid::Proto::SendServer(Server *server)
+void hybrid::senders::AkillDel::Send(XLine* x)
{
- if (server == Me)
- Uplink::Send("SERVER", server->GetName(), server->GetHops() + 1, server->GetDescription());
- else
- Uplink::Send(Me, "SID", server->GetName(), server->GetHops() + 1, server->GetSID(), server->GetDescription());
+ if (x->IsRegex() || x->HasNickOrReal())
+ return;
+
+ Uplink::Send(Config->GetClient("OperServ"), "UNKLINE", "*", x->GetUser(), x->GetHost());
}
-void hybrid::Proto::SendConnect()
+void hybrid::senders::MessageChannel::Send(Channel* c)
{
- Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "TS", 6, Me->GetSID());
-
- /*
- * As of January 13, 2016, ircd-hybrid-8 supports the following capabilities
- * which are required to work with IRC-services:
- *
- * QS - Can handle quit storm removal
- * EX - Can do channel +e exemptions
- * IE - Can do invite exceptions
- * CHW - Can do channel wall @#
- * TBURST - Supports topic burst
- * ENCAP - Supports ENCAP
- * HOPS - Supports HalfOps
- * SVS - Supports services
- * EOB - Supports End Of Burst message
- */
- Uplink::Send("CAPAB", "QS EX CHW IE ENCAP TBURST SVS HOPS EOB");
+ Anope::string modes = c->GetModes(true, true);
- SendServer(Me);
+ if (modes.empty())
+ modes = "+";
- Uplink::Send("SVINFO", 6, 6, 0, Anope::CurTime);
+ Uplink::Send("SJOIN", c->creation_time, c->name, modes, "");
}
-void hybrid::Proto::SendClientIntroduction(User *u)
+void hybrid::senders::GlobalNotice::Send(const MessageSource &source, Server *dest, const Anope::string &msg)
{
- Anope::string modes = "+" + u->GetModes();
+ Uplink::Send(source, "NOTICE", "$$" + dest->GetName(), msg);
+}
- Uplink::Send(Me, "UID", u->nick, 1, u->timestamp, modes, u->GetIdent(), u->host, "0.0.0.0", u->GetUID(), "*", u->realname);
+void hybrid::senders::GlobalPrivmsg::Send(const MessageSource& source, Server* dest, const Anope::string& msg)
+{
+ Uplink::Send(source, "PRIVMSG", "$$" + dest->GetName(), msg);
}
-void hybrid::Proto::SendEOB()
+void hybrid::senders::Invite::Send(const MessageSource &source, Channel *chan, User *user)
{
- Uplink::Send(Me, "EOB");
+ Uplink::Send(source, "INVITE", user->GetUID(), chan->name, chan->creation_time);
}
-void hybrid::Proto::SendMode(const MessageSource &source, User *u, const Anope::string &buf)
+void hybrid::senders::Join::Send(User* u, Channel* c, const ChannelStatus* status)
{
- IRCMessage message(source, "SVSMODE", u->GetUID(), u->timestamp);
- message.TokenizeAndPush(buf);
- Uplink::SendMessage(message);
+ /*
+ * Note that we must send our modes with the SJOIN and can not add them to the
+ * mode stacker because ircd-hybrid does not allow *any* client to op itself
+ */
+ Uplink::Send("SJOIN", c->creation_time, c->name, "+" + c->GetModes(true, true), (status != NULL ? status->BuildModePrefixList() : "") + u->GetUID());
+
+ /* And update our internal status for this user since this is not going through our mode handling system */
+ if (status)
+ {
+ ChanUserContainer *uc = c->FindUser(u);
+
+ if (uc)
+ uc->status = *status;
+ }
}
-void hybrid::Proto::SendLogin(User *u, NickServ::Nick *na)
+void hybrid::senders::Login::Send(User *u, NickServ::Nick *na)
{
IRCD->SendMode(Config->GetClient("NickServ"), u, "+d {0}", na->GetAccount()->GetDisplay());
}
-void hybrid::Proto::SendLogout(User *u)
+void hybrid::senders::Logout::Send(User *u)
{
IRCD->SendMode(Config->GetClient("NickServ"), u, "+d *");
}
-void hybrid::Proto::SendChannel(Channel *c)
+void hybrid::senders::ModeUser::Send(const MessageSource &source, User *user, const Anope::string &modes)
{
- Anope::string modes = c->GetModes(true, true);
+ IRCMessage message(source, "SVSMODE", user->GetUID(), user->timestamp);
+ message.TokenizeAndPush(modes);
+ Uplink::SendMessage(message);
+}
- if (modes.empty())
- modes = "+";
+void hybrid::senders::NickIntroduction::Send(User *user)
+{
+ Anope::string modes = "+" + user->GetModes();
+ Uplink::Send(Me, "UID", user->nick, 1, user->timestamp, modes, user->GetIdent(), user->host, "0.0.0.0", user->GetUID(), "*", user->realname);
+}
- Uplink::Send("SJOIN", c->creation_time, c->name, modes, "");
+void hybrid::senders::MessageServer::Send(Server* server)
+{
+ Uplink::Send(Me, "SID", server->GetName(), server->GetHops() + 1, server->GetSID(), server->GetDescription());
+}
+
+void hybrid::senders::SGLine::Send(User*, XLine* x)
+{
+ Uplink::Send(Config->GetClient("OperServ"), "XLINE", "*", x->GetMask(), x->GetExpires() ? x->GetExpires() - Anope::CurTime : 0, x->GetReason());
}
-void hybrid::Proto::SendTopic(const MessageSource &source, Channel *c)
+void hybrid::senders::SGLineDel::Send(XLine* x)
{
- Uplink::Send(source, "TBURST", c->creation_time, c->name, c->topic_ts, c->topic_setter, c->topic);
+ Uplink::Send(Config->GetClient("OperServ"), "UNXLINE", "*", x->GetMask());
}
-void hybrid::Proto::SendForceNickChange(User *u, const Anope::string &newnick, time_t when)
+void hybrid::senders::SQLine::Send(User*, XLine* x)
{
- Uplink::Send(Me, "SVSNICK", u->GetUID(), newnick, when);
+#warning "findintroduced"
+ //Uplink::Send(FindIntroduced(), "RESV", "*", x->GetExpires() ? x->GetExpires() - Anope::CurTime : 0, x->GetMask(), x->GetReason());
}
-void hybrid::Proto::SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &)
+void hybrid::senders::SQLineDel::Send(XLine* x)
{
- Uplink::Send(source, "SVSJOIN", u->GetUID(), chan);
+ Uplink::Send(Config->GetClient("OperServ"), "UNRESV", "*", x->GetMask());
}
-void hybrid::Proto::SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &param)
+void hybrid::senders::SZLine::Send(User*, XLine* x)
{
- if (!param.empty())
- Uplink::Send(source, "SVSPART", u->GetUID(), chan, param);
- else
- Uplink::Send(source, "SVSPART", u->GetUID(), chan);
+ /* Calculate the time left before this would expire, capping it at 2 days */
+ time_t timeleft = x->GetExpires() - Anope::CurTime;
+
+ if (timeleft > 172800 || !x->GetExpires())
+ timeleft = 172800;
+
+ Uplink::Send(Config->GetClient("OperServ"), "DLINE", "*", timeleft, x->GetHost(), x->GetReason());
}
-void hybrid::Proto::SendSVSHold(const Anope::string &nick, time_t t)
+void hybrid::senders::SZLineDel::Send(XLine* x)
+{
+ Uplink::Send(Config->GetClient("OperServ"), "UNDLINE", "*", x->GetHost());
+}
+
+void hybrid::senders::SVSHold::Send(const Anope::string&, time_t)
{
#if 0
XLine x(nick, Me->GetName(), Anope::CurTime + t, "Being held for registered user");
this->SendSQLine(NULL, &x);
#endif
}
-#warning "xline on stack"
-void hybrid::Proto::SendSVSHoldDel(const Anope::string &nick)
+#warning "xline on stack"
+void hybrid::senders::SVSHoldDel::Send(const Anope::string&)
{
#if 0
XLine x(nick);
@@ -303,19 +204,113 @@ void hybrid::Proto::SendSVSHoldDel(const Anope::string &nick)
#endif
}
-void hybrid::Proto::SendVhost(User *u, const Anope::string &ident, const Anope::string &host)
+void hybrid::senders::SVSJoin::Send(const MessageSource& source, User* u, const Anope::string& chan, const Anope::string& key)
+{
+ Uplink::Send(source, "SVSJOIN", u->GetUID(), chan);
+}
+
+void hybrid::senders::SVSNick::Send(User* u, const Anope::string& newnick, time_t ts)
{
- u->SetMode(Config->GetClient("HostServ"), "CLOAK", host);
+ Uplink::Send(Me, "SVSNICK", u->GetUID(), newnick, ts);
}
-void hybrid::Proto::SendVhostDel(User *u)
+void hybrid::senders::SVSPart::Send(const MessageSource& source, User* u, const Anope::string& chan, const Anope::string& reason)
+{
+ if (!reason.empty())
+ Uplink::Send(source, "SVSPART", u->GetUID(), chan, reason);
+ else
+ Uplink::Send(source, "SVSPART", u->GetUID(), chan);
+}
+
+void hybrid::senders::Topic::Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter)
+{
+ Uplink::Send(source, "TBURST", channel->creation_time, channel->name, topic_ts, topic_setter, topic);
+}
+
+void hybrid::senders::VhostDel::Send(User* u)
{
u->RemoveMode(Config->GetClient("HostServ"), "CLOAK", u->host);
}
+void hybrid::senders::VhostSet::Send(User* u, const Anope::string& vident, const Anope::string& vhost)
+{
+ u->SetMode(Config->GetClient("HostServ"), "CLOAK", vhost);
+}
+
+void hybrid::senders::Wallops::Send(const MessageSource &source, const Anope::string &msg)
+{
+ Uplink::Send(source, "GLOBOPS", msg);
+}
+
+ServiceBot *hybrid::Proto::FindIntroduced()
+{
+ ServiceBot *bi = Config->GetClient("OperServ");
+ if (bi && bi->introduced)
+ return bi;
+
+ for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
+ {
+ User *u = it->second;
+ if (u->type == UserType::BOT)
+ {
+ bi = anope_dynamic_static_cast<ServiceBot *>(u);
+ if (bi->introduced)
+ return bi;
+ }
+ }
+
+ return NULL;
+}
+
+hybrid::Proto::Proto(Module *creator) : ts6::Proto(creator, "Hybrid 8.2.x")
+{
+ DefaultPseudoclientModes = "+oi";
+ CanSVSNick = true;
+ CanSVSHold = true;
+ CanSVSJoin = true;
+ CanSNLine = true;
+ CanSQLine = true;
+ CanSQLineChannel = true;
+ CanSZLine = true;
+ CanCertFP = true;
+ CanSetVHost = true;
+ RequiresID = true;
+ MaxModes = 6;
+}
+
+void hybrid::Proto::Handshake()
+{
+ Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "TS", 6, Me->GetSID());
+
+ /*
+ * As of January 13, 2016, ircd-hybrid-8 supports the following capabilities
+ * which are required to work with IRC-services:
+ *
+ * QS - Can handle quit storm removal
+ * EX - Can do channel +e exemptions
+ * IE - Can do invite exceptions
+ * CHW - Can do channel wall @#
+ * TBURST - Supports topic burst
+ * ENCAP - Supports ENCAP
+ * HOPS - Supports HalfOps
+ * SVS - Supports services
+ * EOB - Supports End Of Burst message
+ */
+ Uplink::Send("CAPAB", "QS EX CHW IE ENCAP TBURST SVS HOPS EOB");
+
+ Uplink::Send("SERVER", Me->GetName(), Me->GetHops() + 1, Me->GetDescription());
+
+ Uplink::Send("SVINFO", 6, 6, 0, Anope::CurTime);
+}
+
+void hybrid::Proto::SendEOB()
+{
+ Uplink::Send(Me, "EOB");
+}
+
bool hybrid::Proto::IsIdentValid(const Anope::string &ident)
{
- if (ident.empty() || ident.length() > Config->GetBlock("networkinfo")->Get<unsigned>("userlen"))
+ if (ident.empty() || ident.length() > Config->GetBlock("networkinfo")->Get<unsigned int>("userlen"))
return false;
Anope::string chars = "~}|{ `_^]\\[ .-$";
@@ -410,7 +405,7 @@ void hybrid::ServerMessage::Run(MessageSource &source, const std::vector<Anope::
new Server(source.GetServer() == NULL ? Me : source.GetServer(), params[0], 1, params[2], UplinkSID);
- IRCD->SendPing(Me->GetName(), params[0]);
+ IRCD->Send<messages::Ping>(Me->GetName(), params[0]);
}
void hybrid::SID::Run(MessageSource &source, const std::vector<Anope::string> &params)
@@ -425,7 +420,7 @@ void hybrid::SID::Run(MessageSource &source, const std::vector<Anope::string> &p
new Server(source.GetServer() == NULL ? Me : source.GetServer(), params[0], hops, params[3], params[2]);
- IRCD->SendPing(Me->GetName(), params[0]);
+ IRCD->Send<messages::Ping>(Me->GetName(), params[0]);
}
void hybrid::SJoin::Run(MessageSource &source, const std::vector<Anope::string> &params)
@@ -621,6 +616,45 @@ class ProtoHybrid : public Module
hybrid::TMode message_tmode;
hybrid::UID message_uid;
+ /* Core message senders */
+ rfc1459::senders::Kick sender_kick;
+ rfc1459::senders::Kill sender_svskill;
+ rfc1459::senders::ModeChannel sender_mode_chan;
+ rfc1459::senders::NickChange sender_nickchange;
+ rfc1459::senders::Notice sender_notice;
+ rfc1459::senders::Part sender_part;
+ rfc1459::senders::Ping sender_ping;
+ rfc1459::senders::Pong sender_pong;
+ rfc1459::senders::Privmsg sender_privmsg;
+ rfc1459::senders::Quit sender_quit;
+ rfc1459::senders::SQuit sender_squit;
+
+ hybrid::senders::Akill sender_akill;
+ hybrid::senders::AkillDel sender_akill_del;
+ hybrid::senders::MessageChannel sender_channel;
+ hybrid::senders::GlobalNotice sender_global_notice;
+ hybrid::senders::GlobalPrivmsg sender_global_privmsg;
+ hybrid::senders::Invite sender_invite;
+ hybrid::senders::Join sender_join;
+ hybrid::senders::Login sender_login;
+ hybrid::senders::Logout sender_logout;
+ hybrid::senders::ModeUser sender_mode_user;
+ hybrid::senders::NickIntroduction sender_nickintroduction;
+ hybrid::senders::MessageServer sender_server;
+ hybrid::senders::SGLine sender_sgline;
+ hybrid::senders::SGLineDel sender_sgline_del;
+ hybrid::senders::SQLine sender_sqline;
+ hybrid::senders::SQLineDel sender_sqline_del;
+ hybrid::senders::SZLine sender_szline;
+ hybrid::senders::SZLineDel sender_szline_del;
+ hybrid::senders::SVSHold sender_svshold;
+ hybrid::senders::SVSHoldDel sender_svsholddel;
+ hybrid::senders::SVSNick sender_svsnick;
+ hybrid::senders::Topic sender_topic;
+ hybrid::senders::VhostDel sender_vhost_del;
+ hybrid::senders::VhostSet sender_vhost_set;
+ hybrid::senders::Wallops sender_wallops;
+
public:
ProtoHybrid(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR)
, EventHook<Event::UserNickChange>(this)
@@ -658,7 +692,50 @@ public:
, message_tmode(this)
, message_uid(this)
, message_certfp(this)
+
+ , sender_akill(this)
+ , sender_akill_del(this)
+ , sender_channel(this)
+ , sender_global_notice(this)
+ , sender_global_privmsg(this)
+ , sender_invite(this)
+ , sender_join(this)
+ , sender_kick(this)
+ , sender_svskill(this)
+ , sender_login(this)
+ , sender_logout(this)
+ , sender_mode_chan(this)
+ , sender_mode_user(this)
+ , sender_nickchange(this)
+ , sender_nickintroduction(this)
+ , sender_notice(this)
+ , sender_part(this)
+ , sender_ping(this)
+ , sender_pong(this)
+ , sender_privmsg(this)
+ , sender_quit(this)
+ , sender_server(this)
+ , sender_sgline(this)
+ , sender_sgline_del(this)
+ , sender_sqline(this)
+ , sender_sqline_del(this)
+ , sender_szline(this)
+ , sender_szline_del(this)
+ , sender_squit(this)
+ , sender_svshold(this)
+ , sender_svsholddel(this)
+ , sender_svsnick(this)
+ , sender_topic(this)
+ , sender_vhost_del(this)
+ , sender_vhost_set(this)
+ , sender_wallops(this)
+ {
+ IRCD = &ircd_proto;
+ }
+
+ ~ProtoHybrid()
{
+ IRCD = nullptr;
}
void OnUserNickChange(User *u, const Anope::string &) override
diff --git a/modules/protocol/inspircd20.cpp b/modules/protocol/inspircd20.cpp
index a8caac27a..011ecfd13 100644
--- a/modules/protocol/inspircd20.cpp
+++ b/modules/protocol/inspircd20.cpp
@@ -17,7 +17,7 @@
* along with this program; if not, see see <http://www.gnu.org/licenses/>.
*/
-/* Dependencies: anope_protocol.rfc1459 */
+/* Dependencies: anope_protocol.rfc1459,anope_protocol.ts6,anope_protocol.hybrid,anope_protocol.bahamut */
#include "module.h"
#include "modules/sasl.h"
@@ -25,6 +25,8 @@
#include "modules/chanserv/set.h"
#include "modules/protocol/rfc1459.h"
#include "modules/protocol/inspircd20.h"
+#include "modules/protocol/bahamut.h"
+#include "modules/protocol/hybrid.h"
struct SASLUser
{
@@ -37,129 +39,7 @@ static std::list<SASLUser> saslusers;
static Anope::string rsquit_server, rsquit_id;
static unsigned int spanningtree_proto_ver = 0;
-void inspircd20::Proto::SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf)
-{
- IRCDProto::SendSVSKill(source, user, buf);
- user->KillInternal(source, buf);
-}
-
-void inspircd20::Proto::SendChgIdentInternal(const Anope::string &nick, const Anope::string &vIdent)
-{
- if (!Servers::Capab.count("CHGIDENT"))
- Log() << "CHGIDENT not loaded!";
- else
- Uplink::Send(Me, "CHGIDENT", nick, vIdent);
-}
-
-void inspircd20::Proto::SendChgHostInternal(const Anope::string &nick, const Anope::string &vhost)
-{
- if (!Servers::Capab.count("CHGHOST"))
- Log() << "CHGHOST not loaded!";
- else
- Uplink::Send(Me, "CHGHOST", nick, vhost);
-}
-
-void inspircd20::Proto::SendAddLine(const Anope::string &xtype, const Anope::string &mask, time_t duration, const Anope::string &addedby, const Anope::string &reason)
-{
- Uplink::Send(Me, "ADDLINE", xtype, mask, addedby, Anope::CurTime, duration, reason);
-}
-
-void inspircd20::Proto::SendDelLine(const Anope::string &xtype, const Anope::string &mask)
-{
- Uplink::Send(Me, "DELLINE", xtype, mask);
-}
-
-inspircd20::Proto::Proto(Module *creator) : IRCDProto(creator, "InspIRCd 2.0")
-{
- DefaultPseudoclientModes = "+I";
- CanSVSNick = true;
- CanSVSJoin = true;
- CanSetVHost = true;
- CanSetVIdent = true;
- CanSQLine = true;
- CanSZLine = true;
- CanSVSHold = true;
- CanCertFP = true;
- RequiresID = true;
- MaxModes = 20;
-}
-
-void inspircd20::Proto::SendConnect()
-{
- Uplink::Send("CAPAB START 1202");
- Uplink::Send("CAPAB CAPABILITIES :PROTOCOL=1202");
- Uplink::Send("CAPAB END");
- SendServer(Me);
-}
-
-void inspircd20::Proto::SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg)
-{
- Uplink::Send(bi, "NOTICE", "$" + dest->GetName(), msg);
-}
-
-void inspircd20::Proto::SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg)
-{
- Uplink::Send(bi, "PRIVMSG", "$" + dest->GetName(), msg);
-}
-
-void inspircd20::Proto::SendAkillDel(XLine *x)
-{
- /* InspIRCd may support regex bans */
- if (x->IsRegex() && Servers::Capab.count("RLINE"))
- {
- Anope::string mask = x->GetMask();
- size_t h = mask.find('#');
- if (h != Anope::string::npos)
- mask = mask.replace(h, 1, ' ');
- SendDelLine("R", mask);
- return;
- }
- else if (x->IsRegex() || x->HasNickOrReal())
- return;
-
- /* ZLine if we can instead */
- if (x->GetUser() == "*")
- {
- cidr addr(x->GetHost());
- if (addr.valid())
- {
- IRCD->SendSZLineDel(x);
- return;
- }
- }
-
- SendDelLine("G", x->GetUser() + "@" + x->GetHost());
-}
-
-void inspircd20::Proto::SendTopic(const MessageSource &source, Channel *c)
-{
- if (Servers::Capab.count("SVSTOPIC"))
- {
- Uplink::Send(c->ci->WhoSends(), "SVSTOPIC", c->name, c->topic_ts, c->topic_setter, c->topic);
- }
- else
- {
- /* If the last time a topic was set is after the TS we want for this topic we must bump this topic's timestamp to now */
- time_t ts = c->topic_ts;
- if (c->topic_time > ts)
- ts = Anope::CurTime;
- /* But don't modify c->topic_ts, it should remain set to the real TS we want as ci->last_topic_time pulls from it */
- Uplink::Send(source, "FTOPIC", c->name, ts, c->topic_setter, c->topic);
- }
-}
-
-void inspircd20::Proto::SendVhostDel(User *u)
-{
- if (u->HasMode("CLOAK"))
- this->SendChgHostInternal(u->nick, u->chost);
- else
- this->SendChgHostInternal(u->nick, u->host);
-
- if (Servers::Capab.count("CHGIDENT") && u->GetIdent() != u->GetVIdent())
- this->SendChgIdentInternal(u->nick, u->GetIdent());
-}
-
-void inspircd20::Proto::SendAkill(User *u, XLine *x)
+void inspircd20::senders::Akill::Send(User* u, XLine* x)
{
// Calculate the time left before this would expire, capping it at 2 days
time_t timeleft = x->GetExpires() - Anope::CurTime;
@@ -173,7 +53,7 @@ void inspircd20::Proto::SendAkill(User *u, XLine *x)
size_t h = mask.find('#');
if (h != Anope::string::npos)
mask = mask.replace(h, 1, ' ');
- SendAddLine("R", mask, timeleft, x->GetBy(), x->GetReason());
+ proto->SendAddLine("R", mask, timeleft, x->GetBy(), x->GetReason());
return;
}
else if (x->IsRegex() || x->HasNickOrReal())
@@ -183,7 +63,7 @@ void inspircd20::Proto::SendAkill(User *u, XLine *x)
/* No user (this akill was just added), and contains nick and/or realname. Find users that match and ban them */
for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
if (x->GetManager()->Check(it->second, x))
- this->SendAkill(it->second, x);
+ this->Send(it->second, x);
return;
}
@@ -209,70 +89,49 @@ void inspircd20::Proto::SendAkill(User *u, XLine *x)
cidr addr(x->GetHost());
if (addr.valid())
{
- IRCD->SendSZLine(u, x);
+ IRCD->Send<messages::SZLine>(u, x);
return;
}
}
- SendAddLine("G", x->GetUser() + "@" + x->GetHost(), timeleft, x->GetBy(), x->GetReason());
+ proto->SendAddLine("G", x->GetUser() + "@" + x->GetHost(), timeleft, x->GetBy(), x->GetReason());
}
-void inspircd20::Proto::SendNumeric(int numeric, User *dest, IRCMessage &message)
+void inspircd20::senders::AkillDel::Send(XLine* x)
{
- std::vector<Anope::string> params = message.GetParameters();
- if (params.empty())
+ /* InspIRCd may support regex bans */
+ if (x->IsRegex() && Servers::Capab.count("RLINE"))
+ {
+ Anope::string mask = x->GetMask();
+ size_t h = mask.find('#');
+ if (h != Anope::string::npos)
+ mask = mask.replace(h, 1, ' ');
+ proto->SendDelLine("R", mask);
+ return;
+ }
+ else if (x->IsRegex() || x->HasNickOrReal())
return;
- /* First parameter is the UID, change it to nick because it is pushed */
- params[0] = dest->nick;
-
- IRCMessage m(message.GetSource(), message.GetCommand());
- for (const Anope::string &s : params)
- m.Push(s);
-
- Uplink::Send("PUSH", dest->GetUID(), Format(m));
-}
-
-void inspircd20::Proto::SendMode(const MessageSource &source, Channel *dest, const Anope::string &buf)
-{
- IRCMessage message(source, "FMODE", dest->name, dest->creation_time);
- message.TokenizeAndPush(buf);
- Uplink::SendMessage(message);
-}
-
-void inspircd20::Proto::SendClientIntroduction(User *u)
-{
- Anope::string modes = "+" + u->GetModes();
- Uplink::Send(Me, "UID", u->GetUID(), u->timestamp, u->nick, u->host, u->host, u->GetIdent(), "0.0.0.0", u->timestamp, modes, u->realname);
- if (modes.find('o') != Anope::string::npos)
- Uplink::Send(u, "OPERTYPE", "services");
-}
+ /* ZLine if we can instead */
+ if (x->GetUser() == "*")
+ {
+ cidr addr(x->GetHost());
+ if (addr.valid())
+ {
+ IRCD->Send<messages::SZLineDel>(x);
+ return;
+ }
+ }
-/* SERVER services-dev.chatspike.net password 0 :Description here */
-void inspircd20::Proto::SendServer(Server *server)
-{
- /* if rsquit is set then we are waiting on a squit */
- if (rsquit_id.empty() && rsquit_server.empty())
- Uplink::Send("SERVER", server->GetName(), Config->Uplinks[Anope::CurrentUplink].password, server->GetHops(), server->GetSID(), server->GetDescription());
+ proto->SendDelLine("G", x->GetUser() + "@" + x->GetHost());
}
-void inspircd20::Proto::SendSquit(Server *s, const Anope::string &message)
+void inspircd20::senders::MessageChannel::Send(Channel* c)
{
- if (s != Me)
- {
- rsquit_id = s->GetSID();
- rsquit_server = s->GetName();
-
- Uplink::Send("RSQUIT", s->GetName(), message);
- }
- else
- {
- Uplink::Send("SQUIT", s->GetName(), message);
- }
+ Uplink::Send(Me, "FJOIN", c->name, c->creation_time, "+" + c->GetModes(true, true), "");
}
-/* JOIN */
-void inspircd20::Proto::SendJoin(User *user, Channel *c, const ChannelStatus *status)
+void inspircd20::senders::Join::Send(User* user, Channel* c, const ChannelStatus* status)
{
Uplink::Send(Me, "FJOIN", c->name, c->creation_time, "+" + c->GetModes(true, true), "," + user->GetUID());
@@ -300,159 +159,264 @@ void inspircd20::Proto::SendJoin(User *user, Channel *c, const ChannelStatus *st
}
}
-/* UNSQLINE */
-void inspircd20::Proto::SendSQLineDel(XLine *x)
+void inspircd20::senders::Login::Send(User *u, NickServ::Nick *na)
{
- SendDelLine("Q", x->GetMask());
+ /* InspIRCd uses an account to bypass chmode +R, not umode +r, so we can't send this here */
+ if (na->GetAccount()->IsUnconfirmed())
+ return;
+
+ Uplink::Send(Me, "METADATA", u->GetUID(), "accountname", na->GetAccount()->GetDisplay());
}
-/* SQLINE */
-void inspircd20::Proto::SendSQLine(User *, XLine *x)
+void inspircd20::senders::Logout::Send(User *u)
{
- // Calculate the time left before this would expire, capping it at 2 days
- time_t timeleft = x->GetExpires() - Anope::CurTime;
- if (timeleft > 172800 || !x->GetExpires())
- timeleft = 172800;
- SendAddLine("Q", x->GetMask(), timeleft, x->GetBy(), x->GetReason());
+ Uplink::Send(Me, "METADATA", u->GetUID(), "accountname", "");
}
-void inspircd20::Proto::SendVhost(User *u, const Anope::string &vIdent, const Anope::string &vhost)
+void inspircd20::senders::ModeChannel::Send(const MessageSource &source, Channel *channel, const Anope::string &modes)
{
- if (!vIdent.empty())
- this->SendChgIdentInternal(u->nick, vIdent);
- if (!vhost.empty())
- this->SendChgHostInternal(u->nick, vhost);
+ IRCMessage message(source, "FMODE", channel->name, channel->creation_time);
+ message.TokenizeAndPush(modes);
+ Uplink::SendMessage(message);
}
-/* SVSHOLD - set */
-void inspircd20::Proto::SendSVSHold(const Anope::string &nick, time_t t)
+void inspircd20::senders::NickIntroduction::Send(User *user)
{
- Uplink::Send(Config->GetClient("NickServ"), "SVSHOLD", nick, t, "Being held for registered user");
+ Anope::string modes = "+" + user->GetModes();
+ Uplink::Send(Me, "UID", user->GetUID(), user->timestamp, user->nick, user->host, user->host, user->GetIdent(), "0.0.0.0", user->timestamp, modes, user->realname);
+ if (modes.find('o') != Anope::string::npos)
+ Uplink::Send(user, "OPERTYPE", "services");
}
-/* SVSHOLD - release */
-void inspircd20::Proto::SendSVSHoldDel(const Anope::string &nick)
+
+void inspircd20::senders::SASL::Send(const ::SASL::Message& message)
{
- Uplink::Send(Config->GetClient("NickServ"), "SVSHOLD", nick);
+ if (!message.ext.empty())
+ Uplink::Send(Me, "ENCAP", message.target.substr(0, 3), "SASL",
+ message.source, message.target,
+ message.type, message.data, message.ext);
+ else
+ Uplink::Send(Me, "ENCAP", message.target.substr(0, 3), "SASL",
+ message.source, message.target,
+ message.type, message.data);
}
-/* UNSZLINE */
-void inspircd20::Proto::SendSZLineDel(XLine *x)
+void inspircd20::senders::SASLMechanisms::Send(const std::vector<Anope::string>& mechanisms)
{
- SendDelLine("Z", x->GetHost());
+ Anope::string mechlist;
+ for (unsigned int i = 0; i < mechanisms.size(); ++i)
+ mechlist += "," + mechanisms[i];
+
+ Uplink::Send(Me, "METADATA", "*", "saslmechlist", mechlist.empty() ? "" : mechlist.substr(1));
+}
+
+void inspircd20::senders::MessageServer::Send(Server* server)
+{
+ /* if rsquit is set then we are waiting on a squit */
+ if (rsquit_id.empty() && rsquit_server.empty())
+ Uplink::Send("SERVER", server->GetName(), Config->Uplinks[Anope::CurrentUplink].password, server->GetHops(), server->GetSID(), server->GetDescription());
}
-/* SZLINE */
-void inspircd20::Proto::SendSZLine(User *, XLine *x)
+void inspircd20::senders::SQLine::Send(User*, XLine* x)
{
// Calculate the time left before this would expire, capping it at 2 days
time_t timeleft = x->GetExpires() - Anope::CurTime;
if (timeleft > 172800 || !x->GetExpires())
timeleft = 172800;
- SendAddLine("Z", x->GetHost(), timeleft, x->GetBy(), x->GetReason());
+ proto->SendAddLine("Q", x->GetMask(), timeleft, x->GetBy(), x->GetReason());
}
-void inspircd20::Proto::SendSVSJoin(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &)
+void inspircd20::senders::SQLineDel::Send(XLine* x)
{
- Uplink::Send(source, "SVSJOIN", u->GetUID(), chan);
+ proto->SendDelLine("Q", x->GetMask());
}
-void inspircd20::Proto::SendSVSPart(const MessageSource &source, User *u, const Anope::string &chan, const Anope::string &param)
+void inspircd20::senders::SQuit::Send(Server *s, const Anope::string &message)
{
- if (!param.empty())
- Uplink::Send(source, "SVSPART", u->GetUID(), chan, param);
+ if (s != Me)
+ {
+ rsquit_id = s->GetSID();
+ rsquit_server = s->GetName();
+
+ Uplink::Send("RSQUIT", s->GetName(), message);
+ }
else
- Uplink::Send(source, "SVSPART", u->GetUID(), chan);
+ {
+ Uplink::Send("SQUIT", s->GetName(), message);
+ }
}
-void inspircd20::Proto::SendSWhois(const MessageSource &, const Anope::string &who, const Anope::string &mask)
+void inspircd20::senders::SZLine::Send(User*, XLine* x)
{
- User *u = User::Find(who);
+ // Calculate the time left before this would expire, capping it at 2 days
+ time_t timeleft = x->GetExpires() - Anope::CurTime;
+ if (timeleft > 172800 || !x->GetExpires())
+ timeleft = 172800;
+ proto->SendAddLine("Z", x->GetHost(), timeleft, x->GetBy(), x->GetReason());
+}
- Uplink::Send(Me, "METADATA", u->GetUID(), "swhois", mask);
+void inspircd20::senders::SZLineDel::Send(XLine* x)
+{
+ proto->SendDelLine("Z", x->GetHost());
}
-void inspircd20::Proto::SendBOB()
+void inspircd20::senders::SVSHold::Send(const Anope::string& nick, time_t t)
{
- Uplink::Send(Me, "BURST", Anope::CurTime);
- Module *enc = ModuleManager::FindFirstOf(ENCRYPTION);
- Uplink::Send(Me, "VERSION", Anope::Format("Anope-{0} {1} {2} - {3} - Built: {4} - Flags: {5}",
- Anope::Version(), Me->GetName(), IRCD->GetProtocolName(), enc ? enc->name : "(none)", Anope::VersionBuildTime(), Anope::VersionFlags()));
+ Uplink::Send(Config->GetClient("NickServ"), "SVSHOLD", nick, t, "Being held for registered user");
}
-void inspircd20::Proto::SendEOB()
+void inspircd20::senders::SVSHoldDel::Send(const Anope::string& nick)
{
- Uplink::Send(Me, "ENDBURST");
+ Uplink::Send(Config->GetClient("NickServ"), "SVSHOLD", nick);
}
-void inspircd20::Proto::SendGlobops(const MessageSource &source, const Anope::string &buf)
+void inspircd20::senders::SVSLogin::Send(const Anope::string& uid, const Anope::string& acc, const Anope::string& vident, const Anope::string& vhost)
{
- if (Servers::Capab.count("GLOBOPS"))
- Uplink::Send(source, "SNONOTICE", "g", buf);
- else
- Uplink::Send(source, "SNONOTICE", "A", buf);
+ Uplink::Send(Me, "METADATA", uid, "accountname", acc);
+
+ SASLUser su;
+ su.uid = uid;
+ su.acc = acc;
+ su.created = Anope::CurTime;
+
+ for (std::list<SASLUser>::iterator it = saslusers.begin(); it != saslusers.end();)
+ {
+ SASLUser &u = *it;
+
+ if (u.created + 30 < Anope::CurTime || u.uid == uid)
+ it = saslusers.erase(it);
+ else
+ ++it;
+ }
+
+ saslusers.push_back(su);
}
-void inspircd20::Proto::SendLogin(User *u, NickServ::Nick *na)
+void inspircd20::senders::SWhois::Send(const MessageSource&, User *user, const Anope::string& swhois)
{
- /* InspIRCd uses an account to bypass chmode +R, not umode +r, so we can't send this here */
- if (na->GetAccount()->IsUnconfirmed())
- return;
+ Uplink::Send(Me, "METADATA", user->GetUID(), "swhois", swhois);
+}
- Uplink::Send(Me, "METADATA", u->GetUID(), "accountname", na->GetAccount()->GetDisplay());
+void inspircd20::senders::Topic::Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter)
+{
+ if (Servers::Capab.count("SVSTOPIC"))
+ {
+ Uplink::Send(source, "SVSTOPIC", channel->name, topic_ts, topic_setter, topic);
+ }
+ else
+ {
+ /* If the last time a topic was set is after the TS we want for this topic we must bump this topic's timestamp to now */
+ time_t ts = topic_ts;
+ if (channel->topic_time > ts)
+ ts = Anope::CurTime;
+ /* But don't modify c->topic_ts, it should remain set to the real TS we want as ci->last_topic_time pulls from it */
+ Uplink::Send(source, "FTOPIC", channel->name, ts, topic_setter, topic);
+ }
}
-void inspircd20::Proto::SendLogout(User *u)
+void inspircd20::senders::VhostDel::Send(User* u)
{
- Uplink::Send(Me, "METADATA", u->GetUID(), "accountname", "");
+ if (u->HasMode("CLOAK"))
+ proto->SendChgHostInternal(u->nick, u->chost);
+ else
+ proto->SendChgHostInternal(u->nick, u->host);
+
+ if (Servers::Capab.count("CHGIDENT") && u->GetIdent() != u->GetVIdent())
+ proto->SendChgIdentInternal(u->nick, u->GetIdent());
}
-void inspircd20::Proto::SendChannel(Channel *c)
+void inspircd20::senders::VhostSet::Send(User* u, const Anope::string& vident, const Anope::string& vhost)
{
- Uplink::Send(Me, "FJOIN", c->name, c->creation_time, "+" + c->GetModes(true, true), "");
+ if (!vident.empty())
+ proto->SendChgIdentInternal(u->nick, vident);
+ if (!vhost.empty())
+ proto->SendChgHostInternal(u->nick, vhost);
}
-void inspircd20::Proto::SendSASLMechanisms(std::vector<Anope::string> &mechanisms)
+void inspircd20::senders::Wallops::Send(const MessageSource &source, const Anope::string &msg)
{
- Anope::string mechlist;
- for (unsigned i = 0; i < mechanisms.size(); ++i)
- mechlist += "," + mechanisms[i];
+ if (Servers::Capab.count("GLOBOPS"))
+ Uplink::Send(source, "SNONOTICE", "g", msg);
+ else
+ Uplink::Send(source, "SNONOTICE", "A", msg);
+}
- Uplink::Send(Me, "METADATA", "*", "saslmechlist", mechlist.empty() ? "" : mechlist.substr(1));
+void inspircd20::Proto::SendChgIdentInternal(const Anope::string &nick, const Anope::string &vIdent)
+{
+ if (!Servers::Capab.count("CHGIDENT"))
+ Log() << "CHGIDENT not loaded!";
+ else
+ Uplink::Send(Me, "CHGIDENT", nick, vIdent);
}
-void inspircd20::Proto::SendSASLMessage(const SASL::Message &message)
+void inspircd20::Proto::SendChgHostInternal(const Anope::string &nick, const Anope::string &vhost)
{
- if (!message.ext.empty())
- Uplink::Send(Me, "ENCAP", message.target.substr(0, 3), "SASL",
- message.source, message.target,
- message.type, message.data, message.ext);
+ if (!Servers::Capab.count("CHGHOST"))
+ Log() << "CHGHOST not loaded!";
else
- Uplink::Send(Me, "ENCAP", message.target.substr(0, 3), "SASL",
- message.source, message.target,
- message.type, message.data);
+ Uplink::Send(Me, "CHGHOST", nick, vhost);
}
-void inspircd20::Proto::SendSVSLogin(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost)
+void inspircd20::Proto::SendAddLine(const Anope::string &xtype, const Anope::string &mask, time_t duration, const Anope::string &addedby, const Anope::string &reason)
{
- Uplink::Send(Me, "METADATA", uid, "accountname", acc);
+ Uplink::Send(Me, "ADDLINE", xtype, mask, addedby, Anope::CurTime, duration, reason);
+}
- SASLUser su;
- su.uid = uid;
- su.acc = acc;
- su.created = Anope::CurTime;
+void inspircd20::Proto::SendDelLine(const Anope::string &xtype, const Anope::string &mask)
+{
+ Uplink::Send(Me, "DELLINE", xtype, mask);
+}
- for (std::list<SASLUser>::iterator it = saslusers.begin(); it != saslusers.end();)
- {
- SASLUser &u = *it;
+inspircd20::Proto::Proto(Module *creator) : ts6::Proto(creator, "InspIRCd 2.0")
+{
+ DefaultPseudoclientModes = "+I";
+ CanSVSNick = true;
+ CanSVSJoin = true;
+ CanSetVHost = true;
+ CanSetVIdent = true;
+ CanSQLine = true;
+ CanSZLine = true;
+ CanSVSHold = true;
+ CanCertFP = true;
+ RequiresID = true;
+ MaxModes = 20;
+}
- if (u.created + 30 < Anope::CurTime || u.uid == uid)
- it = saslusers.erase(it);
- else
- ++it;
- }
+void inspircd20::Proto::Handshake()
+{
+ Uplink::Send("CAPAB START 1202");
+ Uplink::Send("CAPAB CAPABILITIES :PROTOCOL=1202");
+ Uplink::Send("CAPAB END");
+ IRCD->Send<messages::MessageServer>(Me);
+}
- saslusers.push_back(su);
+void inspircd20::Proto::SendNumeric(int numeric, User *dest, IRCMessage &message)
+{
+ std::vector<Anope::string> params = message.GetParameters();
+ if (params.empty())
+ return;
+
+ /* First parameter is the UID, change it to nick because it is pushed */
+ params[0] = dest->nick;
+
+ IRCMessage m(message.GetSource(), message.GetCommand());
+ for (const Anope::string &s : params)
+ m.Push(s);
+
+ Uplink::Send("PUSH", dest->GetUID(), Format(m));
+}
+
+void inspircd20::Proto::SendBOB()
+{
+ Uplink::Send(Me, "BURST", Anope::CurTime);
+ Module *enc = ModuleManager::FindFirstOf(ENCRYPTION);
+ Uplink::Send(Me, "VERSION", Anope::Format("Anope-{0} {1} {2} - {3} - Built: {4} - Flags: {5}",
+ Anope::Version(), Me->GetName(), IRCD->GetProtocolName(), enc ? enc->name : "(none)", Anope::VersionBuildTime(), Anope::VersionFlags()));
+}
+
+void inspircd20::Proto::SendEOB()
+{
+ Uplink::Send(Me, "ENDBURST");
}
bool inspircd20::Proto::IsExtbanValid(const Anope::string &mask)
@@ -1162,8 +1126,9 @@ void inspircd20::Save::Run(MessageSource &source, const std::vector<Anope::strin
return;
}
- IRCD->SendKill(Me, targ->nick, "Nick collision");
- IRCD->SendNickChange(targ, targ->nick);
+ IRCD->Send<messages::Kill>(Me, targ->nick, "Nick collision");
+ IRCD->Send<messages::NickChange>(targ, targ->nick, Anope::CurTime);
+ targ->timestamp = Anope::CurTime;
last_collide = Anope::CurTime;
}
else
@@ -1202,7 +1167,7 @@ void inspircd20::SQuit::Run(MessageSource &source, const std::vector<Anope::stri
rsquit_server.clear();
if (s && s->IsJuped())
- IRCD->SendServer(s);
+ IRCD->Send<messages::MessageServer>(s);
}
else
rfc1459::SQuit::Run(source, params);
@@ -1318,6 +1283,49 @@ class ProtoInspIRCd20 : public Module
inspircd20::Time message_time;
inspircd20::UID message_uid;
+ rfc1459::senders::GlobalNotice sender_global_notice;
+ rfc1459::senders::GlobalPrivmsg sender_global_privmsg;
+ rfc1459::senders::Invite sender_invite;
+ rfc1459::senders::Kick sender_kick;
+ rfc1459::senders::Kill sender_svskill;
+ rfc1459::senders::ModeChannel sender_mode_chan;
+ rfc1459::senders::ModeUser sender_mode_user;
+ rfc1459::senders::NickChange sender_nickchange;
+ rfc1459::senders::Notice sender_notice;
+ rfc1459::senders::Part sender_part;
+ rfc1459::senders::Ping sender_ping;
+ rfc1459::senders::Pong sender_pong;
+ rfc1459::senders::Privmsg sender_privmsg;
+ rfc1459::senders::Quit sender_quit;
+
+ hybrid::senders::SVSJoin sender_svsjoin;
+ hybrid::senders::SVSPart sender_svspart;
+
+ bahamut::senders::SVSNick sender_svsnick;
+
+ inspircd20::senders::Akill sender_akill;
+ inspircd20::senders::AkillDel sender_akill_del;
+ inspircd20::senders::MessageChannel sender_channel;
+ inspircd20::senders::Login sender_login;
+ inspircd20::senders::Logout sender_logout;
+ inspircd20::senders::NickIntroduction sender_nickintroduction;
+ inspircd20::senders::MessageServer sender_server;
+ inspircd20::senders::SASL sender_sasl;
+ inspircd20::senders::SASLMechanisms sender_sasl_mechs;
+ inspircd20::senders::SQLine sender_sqline;
+ inspircd20::senders::SQLineDel sender_sqline_del;
+ inspircd20::senders::SQuit sender_squit;
+ inspircd20::senders::SZLine sender_szline;
+ inspircd20::senders::SZLineDel sender_szline_del;
+ inspircd20::senders::SVSHold sender_svshold;
+ inspircd20::senders::SVSHoldDel sender_svsholddel;
+ inspircd20::senders::SVSLogin sender_svslogin;
+ inspircd20::senders::SWhois sender_swhois;
+ inspircd20::senders::Topic sender_topic;
+ inspircd20::senders::VhostDel sender_vhost_del;
+ inspircd20::senders::VhostSet sender_vhost_set;
+ inspircd20::senders::Wallops sender_wallops;
+
bool use_server_side_topiclock, use_server_side_mlock;
void SendChannelMetadata(Channel *c, const Anope::string &metadataname, const Anope::string &value)
@@ -1336,6 +1344,7 @@ class ProtoInspIRCd20 : public Module
, ircd_proto(this)
, ssl(this, "ssl")
+
, message_away(this)
, message_error(this)
, message_invite(this)
@@ -1373,7 +1382,53 @@ class ProtoInspIRCd20 : public Module
, message_squit(this)
, message_time(this)
, message_uid(this)
+
+ , sender_akill(this, &ircd_proto)
+ , sender_akill_del(this, &ircd_proto)
+ , sender_channel(this)
+ , sender_global_notice(this)
+ , sender_global_privmsg(this)
+ , sender_invite(this)
+ , sender_kick(this)
+ , sender_svskill(this)
+ , sender_login(this)
+ , sender_logout(this)
+ , sender_mode_chan(this)
+ , sender_mode_user(this)
+ , sender_nickchange(this)
+ , sender_nickintroduction(this)
+ , sender_notice(this)
+ , sender_part(this)
+ , sender_ping(this)
+ , sender_pong(this)
+ , sender_privmsg(this)
+ , sender_quit(this)
+ , sender_server(this)
+ , sender_sasl(this)
+ , sender_sasl_mechs(this)
+ , sender_sqline(this, &ircd_proto)
+ , sender_sqline_del(this, &ircd_proto)
+ , sender_squit(this)
+ , sender_szline(this, &ircd_proto)
+ , sender_szline_del(this, &ircd_proto)
+ , sender_svshold(this)
+ , sender_svsholddel(this)
+ , sender_svslogin(this)
+ , sender_svsjoin(this)
+ , sender_svsnick(this)
+ , sender_svspart(this)
+ , sender_swhois(this)
+ , sender_topic(this)
+ , sender_vhost_del(this, &ircd_proto)
+ , sender_vhost_set(this, &ircd_proto)
+ , sender_wallops(this)
+ {
+ IRCD = &ircd_proto;
+ }
+
+ ~ProtoInspIRCd20()
{
+ IRCD = nullptr;
}
void OnReload(Configuration::Conf *conf) override
diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
index 1818c1021..7712aec8f 100644
--- a/modules/protocol/ngircd.cpp
+++ b/modules/protocol/ngircd.cpp
@@ -24,23 +24,7 @@
#include "modules/protocol/rfc1459.h"
#include "modules/protocol/ngircd.h"
-void ngircd::Proto::SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf)
-{
- IRCDProto::SendSVSKill(source, user, buf);
- user->KillInternal(source, buf);
-}
-
-ngircd::Proto::Proto(Module *creator) : IRCDProto(creator, "ngIRCd")
-{
- DefaultPseudoclientModes = "+oi";
- CanCertFP = true;
- CanSVSNick = true;
- CanSetVHost = true;
- CanSetVIdent = true;
- MaxModes = 5;
-}
-
-void ngircd::Proto::SendAkill(User *u, XLine *x)
+void ngircd::senders::Akill::Send(User* u, XLine* x)
{
// Calculate the time left before this would expire, capping it at 2 days
time_t timeleft = x->GetExpires() - Anope::CurTime;
@@ -49,100 +33,47 @@ void ngircd::Proto::SendAkill(User *u, XLine *x)
Uplink::Send(Me, "GLINE", x->GetMask(), timeleft, x->GetReason() + " (" + x->GetBy() + ")");
}
-void ngircd::Proto::SendAkillDel(XLine *x)
+void ngircd::senders::AkillDel::Send(XLine* x)
{
Uplink::Send(Me, "GLINE", x->GetMask());
}
-void ngircd::Proto::SendChannel(Channel *c)
+void ngircd::senders::MessageChannel::Send(Channel* c)
{
Uplink::Send(Me, "CHANINFO", c->name, "+" + c->GetModes(true, true));
}
-// Received: :dev.anope.de NICK DukeP 1 ~DukePyro p57ABF9C9.dip.t-dialin.net 1 +i :DukePyrolator
-void ngircd::Proto::SendClientIntroduction(User *u)
+void ngircd::senders::Login::Send(User *u, NickServ::Nick *na)
{
- Anope::string modes = "+" + u->GetModes();
- Uplink::Send(Me, "NICK", u->nick, 1, u->GetIdent(), u->host, 1, modes, u->realname);
+ Uplink::Send(Me, "METADATA", u->GetUID(), "accountname", na->GetAccount()->GetDisplay());
}
-void ngircd::Proto::SendConnect()
+void ngircd::senders::Logout::Send(User *u)
{
- Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "0210-IRC+", "Anope|" + Anope::VersionShort(), "CLHMSo P");
- /* Make myself known to myself in the serverlist */
- SendServer(Me);
- /* finish the enhanced server handshake and register the connection */
- Uplink::Send("376", "*", "End of MOTD command");
+ Uplink::Send(Me, "METADATA", u->GetUID(), "accountname", "");
}
-void ngircd::Proto::SendForceNickChange(User *u, const Anope::string &newnick, time_t when)
+void ngircd::senders::SVSNick::Send(User* u, const Anope::string& newnick, time_t ts)
{
Uplink::Send(Me, "SVSNICK", u->nick, newnick);
}
-void ngircd::Proto::SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg)
-{
- Uplink::Send(bi, "NOTICE", "$" + dest->GetName(), msg);
-}
-
-void ngircd::Proto::SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg)
-{
- Uplink::Send(bi, "PRIVMSG", "$" + dest->GetName(), msg);
-}
-
-void ngircd::Proto::SendGlobops(const MessageSource &source, const Anope::string &buf)
-{
- Uplink::Send(source, "WALLOPS", buf);
-}
-
-void ngircd::Proto::SendJoin(User *user, Channel *c, const ChannelStatus *status)
-{
- Uplink::Send(user, "JOIN", c->name);
- if (status)
- {
- /* First save the channel status incase uc->Status == status */
- ChannelStatus cs = *status;
- /* If the user is internally on the channel with flags, kill them so that
- * the stacker will allow this.
- */
- ChanUserContainer *uc = c->FindUser(user);
- if (uc != NULL)
- uc->status.Clear();
-
- ServiceBot *setter = ServiceBot::Find(user->GetUID());
- for (size_t i = 0; i < cs.Modes().length(); ++i)
- c->SetMode(setter, ModeManager::FindChannelModeByChar(cs.Modes()[i]), user->GetUID(), false);
-
- if (uc != NULL)
- uc->status = cs;
- }
-}
-
-void ngircd::Proto::SendLogin(User *u, NickServ::Nick *na)
-{
- Uplink::Send(Me, "METADATA", u->GetUID(), "accountname", na->GetAccount()->GetDisplay());
-}
-
-void ngircd::Proto::SendLogout(User *u)
-{
- Uplink::Send(Me, "METADATA", u->GetUID(), "accountname", "");
-}
-
-/* SERVER name hop descript */
-void ngircd::Proto::SendServer(Server *server)
+// Received: :dev.anope.de NICK DukeP 1 ~DukePyro p57ABF9C9.dip.t-dialin.net 1 +i :DukePyrolator
+void ngircd::senders::NickIntroduction::Send(User *user)
{
- Uplink::Send("SERVER", server->GetName(), server->GetHops(), server->GetDescription());
+ Anope::string modes = "+" + user->GetModes();
+ Uplink::Send(Me, "NICK", user->nick, 1, user->GetIdent(), user->host, 1, modes, user->realname);
}
-void ngircd::Proto::SendTopic(const MessageSource &source, Channel *c)
+void ngircd::senders::VhostDel::Send(User* u)
{
- Uplink::Send(source, "TOPIC", c->name, c->topic);
+ IRCD->Send<messages::VhostSet>(u, u->GetIdent(), "");
}
-void ngircd::Proto::SendVhost(User *u, const Anope::string &vIdent, const Anope::string &vhost)
+void ngircd::senders::VhostSet::Send(User* u, const Anope::string& vident, const Anope::string& vhost)
{
- if (!vIdent.empty())
- Uplink::Send(Me, "METADATA", u->nick, "user", vIdent);
+ if (!vident.empty())
+ Uplink::Send(Me, "METADATA", u->nick, "user", vident);
Uplink::Send(Me, "METADATA", u->nick, "cloakhost", vhost);
if (!u->HasMode("CLOAK"))
@@ -152,9 +83,23 @@ void ngircd::Proto::SendVhost(User *u, const Anope::string &vIdent, const Anope:
}
}
-void ngircd::Proto::SendVhostDel(User *u)
+ngircd::Proto::Proto(Module *creator) : IRCDProto(creator, "ngIRCd")
{
- this->SendVhost(u, u->GetIdent(), "");
+ DefaultPseudoclientModes = "+oi";
+ CanCertFP = true;
+ CanSVSNick = true;
+ CanSetVHost = true;
+ CanSetVIdent = true;
+ MaxModes = 5;
+}
+
+void ngircd::Proto::Handshake()
+{
+ Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "0210-IRC+", "Anope|" + Anope::VersionShort(), "CLHMSo P");
+ /* Make myself known to myself in the serverlist */
+ IRCD->Send<messages::MessageServer>(Me);
+ /* finish the enhanced server handshake and register the connection */
+ Uplink::Send("376", "*", "End of MOTD command");
}
Anope::string ngircd::Proto::Format(IRCMessage &message)
@@ -508,7 +453,7 @@ void ngircd::ServerMessage::Run(MessageSource &source, const std::vector<Anope::
* when receiving a new server and then finish sync once we
* get a pong back from that server.
*/
- IRCD->SendPing(Me->GetName(), params[0]);
+ IRCD->Send<messages::Ping>(Me->GetName(), params[0]);
}
class ProtongIRCd : public Module
@@ -546,6 +491,36 @@ class ProtongIRCd : public Module
ngircd::Pong message_pong;
ngircd::ServerMessage message_server;
+ /* Core message senders */
+ rfc1459::senders::GlobalNotice sender_global_notice;
+ rfc1459::senders::GlobalPrivmsg sender_global_privmsg;
+ rfc1459::senders::Invite sender_invite;
+ rfc1459::senders::Join sender_join;
+ rfc1459::senders::Kick sender_kick;
+ rfc1459::senders::Kill sender_svskill;
+ rfc1459::senders::ModeChannel sender_mode_chan;
+ rfc1459::senders::ModeUser sender_mode_user;
+ rfc1459::senders::NickChange sender_nickchange;
+ rfc1459::senders::Notice sender_notice;
+ rfc1459::senders::Part sender_part;
+ rfc1459::senders::Ping sender_ping;
+ rfc1459::senders::Pong sender_pong;
+ rfc1459::senders::Privmsg sender_privmsg;
+ rfc1459::senders::Quit sender_quit;
+ rfc1459::senders::MessageServer sender_server;
+ rfc1459::senders::SQuit sender_squit;
+ rfc1459::senders::Topic sender_topic;
+ rfc1459::senders::Wallops sender_wallops;
+
+ ngircd::senders::Akill sender_akill;
+ ngircd::senders::AkillDel sender_akill_del;
+ ngircd::senders::MessageChannel sender_channel;
+ ngircd::senders::Login sender_login;
+ ngircd::senders::Logout sender_logout;
+ ngircd::senders::SVSNick sender_svsnick;
+ ngircd::senders::VhostDel sender_vhost_del;
+ ngircd::senders::VhostSet sender_vhost_set;
+
public:
ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR)
, EventHook<Event::UserNickChange>(this)
@@ -578,10 +553,43 @@ class ProtongIRCd : public Module
, message_pong(this)
, message_server(this)
, message_topic(this)
- {
+ , sender_akill(this)
+ , sender_akill_del(this)
+ , sender_channel(this)
+ , sender_global_notice(this)
+ , sender_global_privmsg(this)
+ , sender_invite(this)
+ , sender_join(this)
+ , sender_kick(this)
+ , sender_svskill(this)
+ , sender_login(this)
+ , sender_logout(this)
+ , sender_mode_chan(this)
+ , sender_mode_user(this)
+ , sender_nickchange(this)
+ , sender_notice(this)
+ , sender_part(this)
+ , sender_ping(this)
+ , sender_pong(this)
+ , sender_privmsg(this)
+ , sender_quit(this)
+ , sender_server(this)
+ , sender_squit(this)
+ , sender_svsnick(this)
+ , sender_topic(this)
+ , sender_vhost_del(this)
+ , sender_vhost_set(this)
+ , sender_wallops(this)
+ {
Servers::Capab.insert("QS");
+ IRCD = &ircd_proto;
+ }
+
+ ~ProtongIRCd()
+ {
+ IRCD = nullptr;
}
void OnUserNickChange(User *u, const Anope::string &) override
diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp
index eb1fe48b5..68c23f18e 100644
--- a/modules/protocol/plexus.cpp
+++ b/modules/protocol/plexus.cpp
@@ -17,78 +17,83 @@
* along with this program; if not, see see <http://www.gnu.org/licenses/>.
*/
-/* Dependencies: anope_protocol.hybrid */
+/* Dependencies: anope_protocol.ratbox */
#include "module.h"
#include "modules/protocol/plexus.h"
#include "modules/protocol/hybrid.h"
+#include "modules/protocol/ratbox.h"
static Anope::string UplinkSID;
-plexus::Proto::Proto(Module *creator) : IRCDProto(creator, "hybrid-7.2.3+plexus-3.0.1")
- , hybrid("hybrid")
+void plexus::senders::ModeUser::Send(const MessageSource &source, User *user, const Anope::string &modes)
{
- DefaultPseudoclientModes = "+oiU";
- CanSVSNick = true;
- CanSVSJoin = true;
- CanSetVHost = true;
- CanSetVIdent = true;
- CanSNLine = true;
- CanSQLine = true;
- CanSQLineChannel = true;
- CanSVSHold = true;
- CanCertFP = true;
- RequiresID = true;
- MaxModes = 4;
+ IRCMessage message(source, "ENCAP", "*", "SVSMODE", user->GetUID(), user->timestamp);
+ message.TokenizeAndPush(modes);
+ Uplink::SendMessage(message);
}
-void plexus::Proto::SendGlobops(const MessageSource &source, const Anope::string &buf)
+void plexus::senders::NickIntroduction::Send(User *user)
{
- Uplink::Send(source, "OPERWALL", buf);
+ Anope::string modes = "+" + user->GetModes();
+ Uplink::Send(Me, "UID", user->nick, 1, user->timestamp, modes, user->GetIdent(), user->host, "255.255.255.255", user->GetUID(), 0, user->host, user->realname);
}
-void plexus::Proto::SendJoin(User *user, Channel *c, const ChannelStatus *status)
+void plexus::senders::NOOP::Send(Server* server, bool mode)
{
- Uplink::Send(Me, "SJOIN", c->creation_time, c->name, "+" + c->GetModes(true, true), user->GetUID());
- if (status)
- {
- /* First save the channel status incase uc->Status == status */
- ChannelStatus cs = *status;
- /* If the user is internally on the channel with flags, kill them so that
- * the stacker will allow this.
- */
- ChanUserContainer *uc = c->FindUser(user);
- if (uc != NULL)
- uc->status.Clear();
-
- ServiceBot *setter = ServiceBot::Find(user->GetUID());
- for (size_t i = 0; i < cs.Modes().length(); ++i)
- c->SetMode(setter, ModeManager::FindChannelModeByChar(cs.Modes()[i]), user->GetUID(), false);
-
- if (uc != NULL)
- uc->status = cs;
- }
+ Uplink::Send("ENCAP", server->GetName(), "SVSNOOP", (mode ? "+" : "-"));
}
-void plexus::Proto::SendForceNickChange(User *u, const Anope::string &newnick, time_t when)
+void plexus::senders::Topic::Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter)
{
- Uplink::Send(Me, "ENCAP", u->server->GetName(), "SVSNICK", u->GetUID(), u->timestamp, newnick, when);
+ Uplink::Send(source, "ENCAP", "*", "TOPIC", channel->name, topic_setter, topic_ts, topic);
}
-void plexus::Proto::SendVhost(User *u, const Anope::string &ident, const Anope::string &host)
+void plexus::senders::SVSJoin::Send(const MessageSource& source, User* user, const Anope::string& chan, const Anope::string& key)
{
- if (!ident.empty())
- Uplink::Send(Me, "ENCAP", "*", "CHGIDENT", u->GetUID(), ident);
- Uplink::Send(Me, "ENCAP", "*", "CHGHOST", u->GetUID(), host);
- u->SetMode(Config->GetClient("HostServ"), "CLOAK");
+ Uplink::Send(source, "ENCAP", user->server->GetName(), "SVSJOIN", user->GetUID(), chan);
+}
+
+void plexus::senders::SVSNick::Send(User* u, const Anope::string& newnick, time_t ts)
+{
+ Uplink::Send(Me, "ENCAP", u->server->GetName(), "SVSNICK", u->GetUID(), u->timestamp, newnick, ts);
+}
+
+void plexus::senders::SVSPart::Send(const MessageSource& source, User* user, const Anope::string& chan, const Anope::string& reason)
+{
+ Uplink::Send(source, "ENCAP", user->server->GetName(), "SVSPART", user->GetUID(), chan);
}
-void plexus::Proto::SendVhostDel(User *u)
+void plexus::senders::VhostDel::Send(User* u)
{
u->RemoveMode(Config->GetClient("HostServ"), "CLOAK");
}
-void plexus::Proto::SendConnect()
+void plexus::senders::VhostSet::Send(User* u, const Anope::string& vident, const Anope::string& vhost)
+{
+ if (!vident.empty())
+ Uplink::Send(Me, "ENCAP", "*", "CHGIDENT", u->GetUID(), vident);
+ Uplink::Send(Me, "ENCAP", "*", "CHGHOST", u->GetUID(), vhost);
+ u->SetMode(Config->GetClient("HostServ"), "CLOAK");
+}
+
+plexus::Proto::Proto(Module *creator) : ts6::Proto(creator, "Plexus 4")
+{
+ DefaultPseudoclientModes = "+oiU";
+ CanSVSNick = true;
+ CanSVSJoin = true;
+ CanSetVHost = true;
+ CanSetVIdent = true;
+ CanSNLine = true;
+ CanSQLine = true;
+ CanSQLineChannel = true;
+ CanSVSHold = true;
+ CanCertFP = true;
+ RequiresID = true;
+ MaxModes = 4;
+}
+
+void plexus::Proto::Handshake()
{
Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "TS", 6, Me->GetSID());
@@ -115,7 +120,7 @@ void plexus::Proto::SendConnect()
Uplink::Send("CAPAB", "QS EX CHW IE EOB KLN UNKLN GLN HUB KNOCK TBURST PARA ENCAP SVS");
/* Make myself known to myself in the serverlist */
- SendServer(Me);
+ Uplink::Send("SERVER", Me->GetName(), Me->GetHops() + 1, Me->GetDescription());
/*
* SVINFO
@@ -128,42 +133,6 @@ void plexus::Proto::SendConnect()
Uplink::Send("SVINFO", 6, 6, 0, Anope::CurTime);
}
-void plexus::Proto::SendClientIntroduction(User *u)
-{
- Anope::string modes = "+" + u->GetModes();
- Uplink::Send(Me, "UID", u->nick, 1, u->timestamp, modes, u->GetIdent(), u->host, "255.255.255.255", u->GetUID(), 0, u->host, u->realname);
-}
-
-void plexus::Proto::SendMode(const MessageSource &source, User *u, const Anope::string &buf)
-{
- Uplink::Send(source, "ENCAP", "*", "SVSMODE", u->GetUID(), u->timestamp, buf);
-}
-
-void plexus::Proto::SendLogin(User *u, NickServ::Nick *na)
-{
- Uplink::Send(Me, "ENCAP", "*", "SU", u->GetUID(), na->GetAccount()->GetDisplay());
-}
-
-void plexus::Proto::SendLogout(User *u)
-{
- Uplink::Send(Me, "ENCAP", "*", "SU", u->GetUID(), "");
-}
-
-void plexus::Proto::SendTopic(const MessageSource &source, Channel *c)
-{
- Uplink::Send(source, "ENCAP", "*", "TOPIC", c->name, c->topic_setter, c->topic_ts, c->topic);
-}
-
-void plexus::Proto::SendSVSJoin(const MessageSource &source, User *user, const Anope::string &chan, const Anope::string &param)
-{
- Uplink::Send(source, "ENCAP", user->server->GetName(), "SVSJOIN", user->GetUID(), chan);
-}
-
-void plexus::Proto::SendSVSPart(const MessageSource &source, User *user, const Anope::string &chan, const Anope::string &param)
-{
- Uplink::Send(source, "ENCAP", user->server->GetName(), "SVSPART", user->GetUID(), chan);
-}
-
void plexus::Encap::Run(MessageSource &source, const std::vector<Anope::string> &params)
{
/*
@@ -269,8 +238,6 @@ void plexus::UID::Run(MessageSource &source, const std::vector<Anope::string> &p
class ProtoPlexus : public Module
{
- Module *m_hybrid;
-
plexus::Proto ircd_proto;
/* Core message handlers */
@@ -308,6 +275,46 @@ class ProtoPlexus : public Module
hybrid::TMode message_tmode;
plexus::UID message_uid;
+ /* Core message senders */
+ rfc1459::senders::Invite sender_invite;
+ rfc1459::senders::Kick sender_kick;
+ rfc1459::senders::Kill sender_svskill;
+ rfc1459::senders::ModeChannel sender_mode_chan;
+ rfc1459::senders::NickChange sender_nickchange;
+ rfc1459::senders::Notice sender_notice;
+ rfc1459::senders::Part sender_part;
+ rfc1459::senders::Ping sender_ping;
+ rfc1459::senders::Pong sender_pong;
+ rfc1459::senders::Privmsg sender_privmsg;
+ rfc1459::senders::Quit sender_quit;
+ rfc1459::senders::SQuit sender_squit;
+
+ hybrid::senders::Akill sender_akill;
+ hybrid::senders::AkillDel sender_akill_del;
+ hybrid::senders::MessageChannel sender_channel;
+ hybrid::senders::GlobalNotice sender_global_notice;
+ hybrid::senders::GlobalPrivmsg sender_global_privmsg;
+ hybrid::senders::Join sender_join;
+ hybrid::senders::MessageServer sender_server;
+ hybrid::senders::SQLine sender_sqline;
+ hybrid::senders::SQLineDel sender_sqline_del;
+ hybrid::senders::SVSHold sender_svshold;
+ hybrid::senders::SVSHoldDel sender_svsholddel;
+
+ ratbox::senders::Login sender_login;
+ ratbox::senders::Logout sender_logout;
+ ratbox::senders::Wallops sender_wallops;
+
+ plexus::senders::ModeUser sender_mode_user;
+ plexus::senders::NickIntroduction sender_nickintroduction;
+ plexus::senders::NOOP sender_noop;
+ plexus::senders::SVSJoin sender_svsjoin;
+ plexus::senders::SVSNick sender_svsnick;
+ plexus::senders::SVSPart sender_svspart;
+ plexus::senders::Topic sender_topic;
+ plexus::senders::VhostDel sender_vhost_del;
+ plexus::senders::VhostSet sender_vhost_set;
+
public:
ProtoPlexus(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR)
, ircd_proto(this)
@@ -343,7 +350,49 @@ class ProtoPlexus : public Module
, message_tburst(this)
, message_tmode(this)
, message_uid(this)
+
+ , sender_akill(this)
+ , sender_akill_del(this)
+ , sender_channel(this)
+ , sender_global_notice(this)
+ , sender_global_privmsg(this)
+ , sender_invite(this)
+ , sender_join(this)
+ , sender_kick(this)
+ , sender_svskill(this)
+ , sender_login(this)
+ , sender_logout(this)
+ , sender_mode_chan(this)
+ , sender_mode_user(this)
+ , sender_nickchange(this)
+ , sender_nickintroduction(this)
+ , sender_noop(this)
+ , sender_notice(this)
+ , sender_part(this)
+ , sender_ping(this)
+ , sender_pong(this)
+ , sender_privmsg(this)
+ , sender_quit(this)
+ , sender_server(this)
+ , sender_sqline(this)
+ , sender_sqline_del(this)
+ , sender_squit(this)
+ , sender_svshold(this)
+ , sender_svsholddel(this)
+ , sender_svsjoin(this)
+ , sender_svsnick(this)
+ , sender_svspart(this)
+ , sender_topic(this)
+ , sender_vhost_del(this)
+ , sender_vhost_set(this)
+ , sender_wallops(this)
+ {
+ IRCD = &ircd_proto;
+ }
+
+ ~ProtoPlexus()
{
+ IRCD = nullptr;
}
};
diff --git a/modules/protocol/ratbox.cpp b/modules/protocol/ratbox.cpp
index 592002578..0a20093e7 100644
--- a/modules/protocol/ratbox.cpp
+++ b/modules/protocol/ratbox.cpp
@@ -25,6 +25,72 @@
static Anope::string UplinkSID;
+void ratbox::senders::NickIntroduction::Send(User *user)
+{
+ Anope::string modes = "+" + user->GetModes();
+ Uplink::Send(Me, "UID", user->nick, 1, user->timestamp, modes, user->GetIdent(), user->host, 0, user->GetUID(), user->realname);
+}
+
+void ratbox::senders::Login::Send(User *u, NickServ::Nick *na)
+{
+ if (na->GetAccount()->IsUnconfirmed())
+ return;
+
+ Uplink::Send(Me, "ENCAP", "*", "SU", u->GetUID(), na->GetAccount()->GetDisplay());
+}
+
+void ratbox::senders::Logout::Send(User *u)
+{
+ Uplink::Send(Me, "ENCAP", "*", "SU", u->GetUID());
+}
+
+void ratbox::senders::SQLine::Send(User*, XLine* x)
+{
+ /* Calculate the time left before this would expire, capping it at 2 days */
+ time_t timeleft = x->GetExpires() - Anope::CurTime;
+
+ if (timeleft > 172800 || !x->GetExpires())
+ timeleft = 172800;
+
+#warning "find introduced"
+// Uplink::Send(FindIntroduced(), "ENCAP", "*", "RESV", timeleft, x->GetMask(), 0, x->GetReason());
+}
+
+void ratbox::senders::SQLineDel::Send(XLine* x)
+{
+ Uplink::Send(Config->GetClient("OperServ"), "ENCAP", "*", "UNRESV", x->GetMask());
+}
+
+void ratbox::senders::SVSNick::Send(User* u, const Anope::string& newnick, time_t ts)
+{
+ Uplink::Send(Me, "ENCAP", u->server->GetName(), "RSFNC", u->GetUID(),
+ newnick, ts, u->timestamp);
+}
+
+void ratbox::senders::Topic::Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter)
+{
+ ServiceBot *bi = source.GetBot();
+ bool needjoin = channel->FindUser(bi) == NULL;
+
+ if (needjoin)
+ {
+ ChannelStatus status;
+
+ status.AddMode('o');
+ bi->Join(channel, &status);
+ }
+
+ rfc1459::senders::Topic::Send(source, channel, topic, topic_ts, topic_setter);
+
+ if (needjoin)
+ bi->Part(channel);
+}
+
+void ratbox::senders::Wallops::Send(const MessageSource &source, const Anope::string &msg)
+{
+ Uplink::Send(source, "OPERWALL", msg);
+}
+
ServiceBot *ratbox::Proto::FindIntroduced()
{
ServiceBot *bi = Config->GetClient("OperServ");
@@ -45,10 +111,11 @@ ServiceBot *ratbox::Proto::FindIntroduced()
return NULL;
}
-ratbox::Proto::Proto(Module *creator) : IRCDProto(creator, "Ratbox 3.0+")
- , hybrid("hybrid")
+ratbox::Proto::Proto(Module *creator) : ts6::Proto(creator, "Ratbox 3.0+")
+ , hybrid(creator)
{
DefaultPseudoclientModes = "+oiS";
+ CanSVSNick = true;
CanSNLine = true;
CanSQLine = true;
CanSQLineChannel = true;
@@ -57,12 +124,7 @@ ratbox::Proto::Proto(Module *creator) : IRCDProto(creator, "Ratbox 3.0+")
MaxModes = 4;
}
-void ratbox::Proto::SendGlobops(const MessageSource &source, const Anope::string &buf)
-{
- Uplink::Send(source, "OPERWALL", buf);
-}
-
-void ratbox::Proto::SendConnect()
+void ratbox::Proto::Handshake()
{
Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password, "TS", 6, Me->GetSID());
@@ -79,7 +141,7 @@ void ratbox::Proto::SendConnect()
Uplink::Send("CAPAB", "QS EX CHW IE GLN TB ENCAP");
/* Make myself known to myself in the serverlist */
- SendServer(Me);
+ Uplink::Send("SERVER", Me->GetName(), Me->GetHops() + 1, Me->GetDescription());
/*
* SVINFO
@@ -92,60 +154,6 @@ void ratbox::Proto::SendConnect()
Uplink::Send("SVINFO", 6, 6, 0, Anope::CurTime);
}
-void ratbox::Proto::SendClientIntroduction(User *u)
-{
- Anope::string modes = "+" + u->GetModes();
- Uplink::Send(Me, "UID", u->nick, 1, u->timestamp, modes, u->GetIdent(), u->host, 0, u->GetUID(), u->realname);
-}
-
-void ratbox::Proto::SendLogin(User *u, NickServ::Nick *na)
-{
- if (na->GetAccount()->IsUnconfirmed())
- return;
-
- Uplink::Send(Me, "ENCAP", "*", "SU", u->GetUID(), na->GetAccount()->GetDisplay());
-}
-
-void ratbox::Proto::SendLogout(User *u)
-{
- Uplink::Send(Me, "ENCAP", "*", "SU", u->GetUID());
-}
-
-void ratbox::Proto::SendTopic(const MessageSource &source, Channel *c)
-{
- ServiceBot *bi = source.GetBot();
- bool needjoin = c->FindUser(bi) == NULL;
-
- if (needjoin)
- {
- ChannelStatus status;
-
- status.AddMode('o');
- bi->Join(c, &status);
- }
-
- IRCDProto::SendTopic(source, c);
-
- if (needjoin)
- bi->Part(c);
-}
-
-void ratbox::Proto::SendSQLine(User *, XLine *x)
-{
- /* Calculate the time left before this would expire, capping it at 2 days */
- time_t timeleft = x->GetExpires() - Anope::CurTime;
-
- if (timeleft > 172800 || !x->GetExpires())
- timeleft = 172800;
-
- Uplink::Send(FindIntroduced(), "ENCAP", "*", "RESV", timeleft, x->GetMask(), 0, x->GetReason());
-}
-
-void ratbox::Proto::SendSQLineDel(XLine *x)
-{
- Uplink::Send(Config->GetClient("OperServ"), "ENCAP", "*", "UNRESV", x->GetMask());
-}
-
// Debug: Received: :00BAAAAAB ENCAP * LOGIN Adam
void ratbox::Encap::Run(MessageSource &source, const std::vector<Anope::string> &params)
{
@@ -197,7 +205,7 @@ void ratbox::ServerMessage::Run(MessageSource &source, const std::vector<Anope::
if (params[1] != "1")
return;
new Server(source.GetServer() == NULL ? Me : source.GetServer(), params[0], 1, params[2], UplinkSID);
- IRCD->SendPing(Me->GetName(), params[0]);
+ IRCD->Send<messages::Ping>(Me->GetName(), params[0]);
}
/*
@@ -279,6 +287,40 @@ class ProtoRatbox : public Module
hybrid::TMode message_tmode;
ratbox::UID message_uid;
+ /* Core message senders */
+ rfc1459::senders::Invite sender_invite;
+ rfc1459::senders::Kick sender_kick;
+ rfc1459::senders::Kill sender_svskill;
+ rfc1459::senders::ModeChannel sender_mode_chan;
+ rfc1459::senders::NickChange sender_nickchange;
+ rfc1459::senders::Notice sender_notice;
+ rfc1459::senders::Part sender_part;
+ rfc1459::senders::Ping sender_ping;
+ rfc1459::senders::Pong sender_pong;
+ rfc1459::senders::Privmsg sender_privmsg;
+ rfc1459::senders::Quit sender_quit;
+ rfc1459::senders::SQuit sender_squit;
+
+ hybrid::senders::Akill sender_akill;
+ hybrid::senders::AkillDel sender_akill_del;
+ hybrid::senders::MessageChannel sender_channel;
+ hybrid::senders::GlobalNotice sender_global_notice;
+ hybrid::senders::GlobalPrivmsg sender_global_privmsg;
+ hybrid::senders::Join sender_join;
+ hybrid::senders::ModeUser sender_mode_user;
+ hybrid::senders::MessageServer sender_server;
+ hybrid::senders::SGLine sender_sgline;
+ hybrid::senders::SGLineDel sender_sgline_del;
+
+ ratbox::senders::Login sender_login;
+ ratbox::senders::Logout sender_logout;
+ ratbox::senders::NickIntroduction sender_nickintroduction;
+ ratbox::senders::SQLine sender_sqline;
+ ratbox::senders::SQLineDel sender_sqline_del;
+ ratbox::senders::SVSNick sender_svsnick;
+ ratbox::senders::Topic sender_topic;
+ ratbox::senders::Wallops sender_wallops;
+
public:
ProtoRatbox(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL | VENDOR)
, ircd_proto(this)
@@ -314,7 +356,44 @@ class ProtoRatbox : public Module
, message_tb(this)
, message_tmode(this)
, message_uid(this)
+
+ , sender_akill(this)
+ , sender_akill_del(this)
+ , sender_channel(this)
+ , sender_global_notice(this)
+ , sender_global_privmsg(this)
+ , sender_invite(this)
+ , sender_join(this)
+ , sender_kick(this)
+ , sender_svskill(this)
+ , sender_login(this)
+ , sender_logout(this)
+ , sender_mode_chan(this)
+ , sender_mode_user(this)
+ , sender_nickchange(this)
+ , sender_nickintroduction(this)
+ , sender_notice(this)
+ , sender_part(this)
+ , sender_ping(this)
+ , sender_pong(this)
+ , sender_privmsg(this)
+ , sender_quit(this)
+ , sender_server(this)
+ , sender_sgline(this)
+ , sender_sgline_del(this)
+ , sender_sqline(this)
+ , sender_sqline_del(this)
+ , sender_squit(this)
+ , sender_svsnick(this)
+ , sender_topic(this)
+ , sender_wallops(this)
+ {
+ IRCD = &ircd_proto;
+ }
+
+ ~ProtoRatbox()
{
+ IRCD = nullptr;
}
};
diff --git a/modules/protocol/rfc1459.cpp b/modules/protocol/rfc1459.cpp
index 1314f7d39..1405e121e 100644
--- a/modules/protocol/rfc1459.cpp
+++ b/modules/protocol/rfc1459.cpp
@@ -23,6 +23,146 @@
using namespace rfc1459;
+void senders::GlobalNotice::Send(const MessageSource &source, Server *dest, const Anope::string &msg)
+{
+ Uplink::Send(source, "NOTICE", "$" + dest->GetName(), msg);
+}
+
+void senders::GlobalPrivmsg::Send(const MessageSource& source, Server* dest, const Anope::string& msg)
+{
+ Uplink::Send(source, "PRIVMSG", "$" + dest->GetName(), msg);
+}
+
+void senders::Invite::Send(const MessageSource &source, Channel *chan, User *user)
+{
+ Uplink::Send(source, "INVITE", user->GetUID(), chan->name);
+}
+
+void senders::Join::Send(User* user, Channel* c, const ChannelStatus* status)
+{
+ Uplink::Send(user, "JOIN", c->name);
+
+ if (status)
+ {
+ /* First save the channel status incase uc->Status == status */
+ ChannelStatus cs = *status;
+ /* If the user is internally on the channel with flags, kill them so that
+ * the stacker will allow this.
+ */
+ ChanUserContainer *uc = c->FindUser(user);
+ if (uc != NULL)
+ uc->status.Clear();
+
+ ServiceBot *setter = ServiceBot::Find(user->GetUID());
+ for (size_t i = 0; i < cs.Modes().length(); ++i)
+ c->SetMode(setter, ModeManager::FindChannelModeByChar(cs.Modes()[i]), user->GetUID(), false);
+
+ if (uc != NULL)
+ uc->status = cs;
+ }
+}
+
+void senders::Kick::Send(const MessageSource &source, Channel *chan, User *user, const Anope::string &reason)
+{
+ if (!reason.empty())
+ Uplink::Send(source, "KICK", chan->name, user->GetUID(), reason);
+ else
+ Uplink::Send(source, "KICK", chan->name, user->GetUID());
+}
+
+void senders::Kill::Send(const MessageSource &source, const Anope::string &target, const Anope::string &reason)
+{
+ Uplink::Send(source, "KILL", target, reason);
+}
+
+void senders::Kill::Send(const MessageSource &source, User *user, const Anope::string &reason)
+{
+ Uplink::Send(source, "KILL", user->GetUID(), reason);
+ user->KillInternal(source, reason);
+}
+
+void senders::ModeChannel::Send(const MessageSource &source, Channel *channel, const Anope::string &modes)
+{
+ IRCMessage message(source, "MODE", channel->name);
+ message.TokenizeAndPush(modes);
+ Uplink::SendMessage(message);
+}
+
+void senders::ModeUser::Send(const MessageSource &source, User *user, const Anope::string &modes)
+{
+ IRCMessage message(source, "MODE", user->GetUID());
+ message.TokenizeAndPush(modes);
+ Uplink::SendMessage(message);
+}
+
+void senders::NickChange::Send(User *u, const Anope::string &newnick, time_t ts)
+{
+ /* this actually isn't rfc1459 which says NICK <nickname> <hopcount> */
+ Uplink::Send(u, "NICK", newnick, ts);
+}
+
+void senders::Notice::Send(const MessageSource &source, const Anope::string &dest, const Anope::string &msg)
+{
+ Uplink::Send(source, "NOTICE", dest, msg);
+}
+
+void senders::Part::Send(User *u, Channel *chan, const Anope::string &reason)
+{
+ if (!reason.empty())
+ Uplink::Send(u, "PART", chan->name, reason);
+ else
+ Uplink::Send(u, "PART", chan->name);
+}
+
+void senders::Ping::Send(const Anope::string &servname, const Anope::string &who)
+{
+ if (servname.empty())
+ Uplink::Send(Me, "PING", who);
+ else
+ Uplink::Send(Me, "PING", servname, who);
+}
+
+void senders::Pong::Send(const Anope::string &servname, const Anope::string &who)
+{
+ if (servname.empty())
+ Uplink::Send(Me, "PONG", who);
+ else
+ Uplink::Send(Me, "PONG", servname, who);
+}
+
+void senders::Privmsg::Send(const MessageSource &source, const Anope::string &dest, const Anope::string &msg)
+{
+ Uplink::Send(source, "PRIVMSG", dest, msg);
+}
+
+void senders::Quit::Send(User *user, const Anope::string &reason)
+{
+ if (!reason.empty())
+ Uplink::Send(user, "QUIT", reason);
+ else
+ Uplink::Send(user, "QUIT");
+}
+
+void senders::MessageServer::Send(Server* server)
+{
+ Uplink::Send("SERVER", server->GetName(), server->GetHops() + 1, server->GetDescription());
+}
+
+void senders::SQuit::Send(Server *s, const Anope::string &message)
+{
+ Uplink::Send("SQUIT", s->GetSID(), message);
+}
+
+void senders::Topic::Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter)
+{
+ Uplink::Send(source, "TOPIC", channel->name, topic);
+}
+
+void senders::Wallops::Send(const MessageSource &source, const Anope::string &msg)
+{
+ Uplink::Send(source, "WALLOPS", msg);
+}
+
void Away::Run(MessageSource &source, const std::vector<Anope::string> &params)
{
const Anope::string &msg = !params.empty() ? params[0] : "";
@@ -300,7 +440,7 @@ void Part::Run(MessageSource &source, const std::vector<Anope::string> &params)
void Ping::Run(MessageSource &source, const std::vector<Anope::string> &params)
{
- IRCD->SendPong(params.size() > 1 ? params[1] : Me->GetSID(), params[0]);
+ IRCD->Send<messages::Pong>(params.size() > 1 ? params[1] : Me->GetSID(), params[0]);
}
void Privmsg::Run(MessageSource &source, const std::vector<Anope::string> &params)
diff --git a/modules/protocol/ts6.cpp b/modules/protocol/ts6.cpp
new file mode 100644
index 000000000..888eebcd7
--- /dev/null
+++ b/modules/protocol/ts6.cpp
@@ -0,0 +1,71 @@
+/*
+ * 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/>.
+ */
+
+#include "module.h"
+#include "modules/protocol/ts6.h"
+
+static inline char nextID(int pos, Anope::string &buf)
+{
+ char &c = buf[pos];
+ if (c == 'Z')
+ c = '0';
+ else if (c != '9')
+ ++c;
+ else if (pos)
+ c = 'A';
+ else
+ c = '0';
+ return c;
+}
+
+Anope::string ts6::Proto::UID_Retrieve()
+{
+ if (!IRCD || !IRCD->RequiresID)
+ return "";
+
+ static Anope::string current_uid = "AAAAAA";
+ int current_len = current_uid.length() - 1;
+
+ do
+ {
+ while (current_len >= 0 && nextID(current_len--, current_uid) == 'A');
+ }
+ while (User::Find(Me->GetSID() + current_uid) != nullptr);
+
+ return Me->GetSID() + current_uid;
+}
+
+Anope::string ts6::Proto::SID_Retrieve()
+{
+ if (!IRCD || !IRCD->RequiresID)
+ return "";
+
+ static Anope::string current_sid = Config->GetBlock("serverinfo")->Get<Anope::string>("id");
+ if (current_sid.empty())
+ current_sid = "00A";
+
+ do
+ {
+ int current_len = current_sid.length() - 1;
+ while (current_len >= 0 && nextID(current_len--, current_sid) == 'A');
+ }
+ while (Server::Find(current_sid) != nullptr);
+
+ return current_sid;
+}
diff --git a/modules/protocol/unreal.cpp b/modules/protocol/unreal.cpp
index 4a4a0c4d0..f319268b7 100644
--- a/modules/protocol/unreal.cpp
+++ b/modules/protocol/unreal.cpp
@@ -17,7 +17,7 @@
* along with this program; if not, see see <http://www.gnu.org/licenses/>.
*/
-/* Dependencies: anope_protocol.rfc1459 */
+/* Dependencies: anope_protocol.rfc1459,anope_protocol.bahamut */
#include "module.h"
#include "modules/chanserv/mode.h"
@@ -25,75 +25,11 @@
#include "modules/operserv/stats.h"
#include "modules/protocol/rfc1459.h"
#include "modules/protocol/unreal.h"
+#include "modules/protocol/bahamut.h"
static Anope::string UplinkSID;
-unreal::Proto::Proto(Module *creator) : IRCDProto(creator, "UnrealIRCd 4")
-{
- DefaultPseudoclientModes = "+Soiq";
- CanSVSNick = true;
- CanSVSJoin = true;
- CanSetVHost = true;
- CanSetVIdent = true;
- CanSNLine = true;
- CanSQLine = true;
- CanSZLine = true;
- CanSVSHold = true;
- CanCertFP = true;
- RequiresID = true;
- MaxModes = 12;
-}
-
-/* SVSNOOP */
-void unreal::Proto::SendSVSNOOP(Server *server, bool set)
-{
- Uplink::Send("SVSNOOP", server->GetSID(), set ? "+" : "-");
-}
-
-void unreal::Proto::SendAkillDel(XLine *x)
-{
- if (x->IsRegex() || x->HasNickOrReal())
- return;
-
- /* ZLine if we can instead */
- if (x->GetUser() == "*")
- {
- cidr a(x->GetHost());
- if (a.valid())
- {
- IRCD->SendSZLineDel(x);
- return;
- }
- }
-
- Uplink::Send("TKL", "-", "G", x->GetUser(), x->GetHost(), x->GetBy());
-}
-
-void unreal::Proto::SendTopic(const MessageSource &source, Channel *c)
-{
- Uplink::Send(source, "TOPIC", c->name, c->topic_setter, c->topic_ts, c->topic);
-}
-
-void unreal::Proto::SendGlobalNotice(ServiceBot *bi, Server *dest, const Anope::string &msg)
-{
- Uplink::Send(bi, "NOTICE", "$" + dest->GetName(), msg);
-}
-
-void unreal::Proto::SendGlobalPrivmsg(ServiceBot *bi, Server *dest, const Anope::string &msg)
-{
- Uplink::Send(bi, "PRIVMSG", "$" + dest->GetName(), msg);
-}
-
-void unreal::Proto::SendVhostDel(User *u)
-{
- ServiceBot *HostServ = Config->GetClient("HostServ");
- u->RemoveMode(HostServ, "CLOAK");
- u->RemoveMode(HostServ, "VHOST");
- ModeManager::ProcessModes();
- u->SetMode(HostServ, "CLOAK");
-}
-
-void unreal::Proto::SendAkill(User *u, XLine *x)
+void unreal::senders::Akill::Send(User* u, XLine* x)
{
if (x->IsRegex() || x->HasNickOrReal())
{
@@ -102,7 +38,7 @@ void unreal::Proto::SendAkill(User *u, XLine *x)
/* No user (this akill was just added), and contains nick and/or realname. Find users that match and ban them */
for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
if (x->GetManager()->Check(it->second, x))
- this->SendAkill(it->second, x);
+ this->Send(it->second, x);
return;
}
@@ -131,7 +67,7 @@ void unreal::Proto::SendAkill(User *u, XLine *x)
cidr a(x->GetHost());
if (a.valid())
{
- IRCD->SendSZLine(u, x);
+ IRCD->Send<messages::SZLine>(u, x);
return;
}
}
@@ -143,37 +79,46 @@ void unreal::Proto::SendAkill(User *u, XLine *x)
Uplink::Send("TKL", "+", "G", x->GetUser(), x->GetHost(), x->GetBy(), Anope::CurTime + timeleft, x->GetCreated(), x->GetReason());
}
-void unreal::Proto::SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf)
+void unreal::senders::AkillDel::Send(XLine* x)
{
- Uplink::Send(source, "SVSKILL", user->GetUID(), buf);
- user->KillInternal(source, buf);
-}
+ if (x->IsRegex() || x->HasNickOrReal())
+ return;
-void unreal::Proto::SendMode(const MessageSource &source, User *u, const Anope::string &buf)
-{
- IRCMessage message(source, "SVS2MODE", u->GetUID());
- message.TokenizeAndPush(buf);
- Uplink::SendMessage(message);
-}
+ /* ZLine if we can instead */
+ if (x->GetUser() == "*")
+ {
+ cidr a(x->GetHost());
+ if (a.valid())
+ {
+ IRCD->Send<messages::SZLineDel>(x);
+ return;
+ }
+ }
-void unreal::Proto::SendClientIntroduction(User *u)
-{
- Anope::string modes = "+" + u->GetModes();
- Uplink::Send("UID", u->nick, 1, u->timestamp, u->GetIdent(), u->host, u->GetUID(), "*", modes, !u->vhost.empty() ? u->vhost : "*", !u->chost.empty() ? u->chost : "*", "*", u->realname);
+ Uplink::Send("TKL", "-", "G", x->GetUser(), x->GetHost(), x->GetBy());
}
-/* SERVER name hop descript */
-/* Unreal 3.2 actually sends some info about itself in the descript area */
-void unreal::Proto::SendServer(Server *server)
+void unreal::senders::MessageChannel::Send(Channel* c)
{
- if (!server->GetSID().empty() && server == Me)
- Uplink::Send("SERVER", server->GetName(), server->GetHops() + 1, server->GetDescription());
+ /* Unreal does not support updating a channels TS without actually joining a user,
+ * so we will join and part us now
+ */
+ ServiceBot *bi = c->ci->WhoSends();
+ if (!bi)
+ ;
+ else if (c->FindUser(bi) == NULL)
+ {
+ bi->Join(c);
+ bi->Part(c);
+ }
else
- Uplink::Send("SID", server->GetName(), server->GetHops() + 1, server->GetSID(), server->GetDescription());
+ {
+ bi->Part(c);
+ bi->Join(c);
+ }
}
-/* JOIN */
-void unreal::Proto::SendJoin(User *user, Channel *c, const ChannelStatus *status)
+void unreal::senders::Join::Send(User* user, Channel* c, const ChannelStatus* status)
{
Uplink::Send(Me, "SJOIN", c->creation_time, c->name, user->GetUID());
if (status)
@@ -196,83 +141,87 @@ void unreal::Proto::SendJoin(User *user, Channel *c, const ChannelStatus *status
}
}
-/* unsqline
-*/
-void unreal::Proto::SendSQLineDel(XLine *x)
+void unreal::senders::Kill::Send(const MessageSource &source, const Anope::string &target, const Anope::string &reason)
{
- Uplink::Send("UNSQLINE", x->GetMask());
+ Uplink::Send(source, "SVSKILL", target, reason);
}
-/* SQLINE */
-/*
-** - Unreal will translate this to TKL for us
-**
-*/
-void unreal::Proto::SendSQLine(User *, XLine *x)
+void unreal::senders::Kill::Send(const MessageSource &source, User *user, const Anope::string &reason)
{
- Uplink::Send("SQLINE", x->GetMask(), x->GetReason());
+ Uplink::Send(source, "SVSKILL", user->GetUID(), reason);
+ user->KillInternal(source, reason);
}
-/* Functions that use serval cmd functions */
+void unreal::senders::Login::Send(User *u, NickServ::Nick *na)
+{
+ /* 3.2.10.4+ treats users logged in with accounts as fully registered, even if -r, so we can not set this here. Just use the timestamp. */
+ if (Servers::Capab.count("ESVID") > 0 && !na->GetAccount()->IsUnconfirmed())
+ IRCD->SendMode(Config->GetClient("NickServ"), u, "+d {0}", na->GetAccount()->GetDisplay());
+ else
+ IRCD->SendMode(Config->GetClient("NickServ"), u, "+d {0}", u->signon);
+}
-void unreal::Proto::SendVhost(User *u, const Anope::string &vIdent, const Anope::string &vhost)
+void unreal::senders::Logout::Send(User *u)
{
- if (!vIdent.empty())
- Uplink::Send(Me, "CHGIDENT", u->GetUID(), vIdent);
- if (!vhost.empty())
- Uplink::Send(Me, "CHGHOST", u->GetUID(), vhost);
+ IRCD->SendMode(Config->GetClient("NickServ"), u, "+d 0");
}
-void unreal::Proto::SendConnect()
+void unreal::senders::ModeUser::Send(const MessageSource &source, User *user, const Anope::string &modes)
{
- /*
- NICKv2 = Nick Version 2
- VHP = Sends hidden host
- UMODE2 = sends UMODE2 on user modes
- NICKIP = Sends IP on NICK
- SJ3 = Supports SJOIN
- NOQUIT = No Quit
- TKLEXT = Extended TKL we don't use it but best to have it
- MLOCK = Supports the MLOCK server command
- VL = Version Info
- SID = SID/UID mode
- */
- Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password);
- Uplink::Send("PROTOCTL", "NICKv2", "VHP", "UMODE2", "NICKIP", "SJOIN", "SJOIN2", "SJ3", "NOQUIT", "TKLEXT", "MLOCK", "SID");
- Uplink::Send("PROTOCTL", "EAUTH=" + Me->GetName() + ",,,Anope-" + Anope::VersionShort());
- Uplink::Send("PROTOCTL", "SID=" + Me->GetSID());
- SendServer(Me);
+ IRCMessage message(source, "SVS2MODE", user->GetUID());
+ message.TokenizeAndPush(modes);
+ Uplink::SendMessage(message);
}
-/* SVSHOLD - set */
-void unreal::Proto::SendSVSHold(const Anope::string &nick, time_t t)
+void unreal::senders::NickIntroduction::Send(User *user)
{
- Uplink::Send("TKL", "+", "Q", "H", nick, Me->GetName(), Anope::CurTime + t, Anope::CurTime, "Being held for registered user");
+ Anope::string modes = "+" + user->GetModes();
+ Uplink::Send("UID", user->nick, 1, user->timestamp, user->GetIdent(), user->host, user->GetUID(), "*", modes, !user->vhost.empty() ? user->vhost : "*", !user->chost.empty() ? user->chost : "*", "*", user->realname);
}
-/* SVSHOLD - release */
-void unreal::Proto::SendSVSHoldDel(const Anope::string &nick)
+void unreal::senders::SASL::Send(const ::SASL::Message& message)
{
- Uplink::Send("TKL", "-", "Q", "*", nick, Me->GetName());
+ size_t p = message.target.find('!');
+ if (p == Anope::string::npos)
+ return;
+
+ if (!message.ext.empty())
+ Uplink::Send(ServiceBot::Find(message.source), "SASL", message.target.substr(0, p), message.target, message.type, message.data, message.ext);
+ else
+ Uplink::Send(ServiceBot::Find(message.source), "SASL", message.target.substr(0, p), message.target, message.type, message.data);
}
-/* UNSGLINE */
-/*
- * SVSNLINE - :realname mask
-*/
-void unreal::Proto::SendSGLineDel(XLine *x)
+void unreal::senders::MessageServer::Send(Server* server)
+{
+ Uplink::Send(Me, "SID", server->GetName(), server->GetHops() + 1, server->GetSID(), server->GetDescription());
+}
+
+void unreal::senders::SGLine::Send(User*, XLine* x)
+{
+ /*
+ * SVSNLINE + reason_where_is_space :realname mask with spaces
+ */
+ Anope::string edited_reason = x->GetReason();
+ edited_reason = edited_reason.replace_all_cs(" ", "_");
+ Uplink::Send("SVSNLINE", "+", edited_reason, x->GetMask());
+}
+
+void unreal::senders::SGLineDel::Send(XLine* x)
{
Uplink::Send("SVSNLINE", "-", x->GetMask());
}
-/* UNSZLINE */
-void unreal::Proto::SendSZLineDel(XLine *x)
+void unreal::senders::SQLine::Send(User*, XLine* x)
{
- Uplink::Send("TKL", "-", "Z", "*", x->GetHost(), x->GetBy());
+ Uplink::Send("SQLINE", x->GetMask(), x->GetReason());
}
-/* SZLINE */
-void unreal::Proto::SendSZLine(User *, XLine *x)
+void unreal::senders::SQLineDel::Send(XLine* x)
+{
+ Uplink::Send("UNSQLINE", x->GetMask());
+}
+
+void unreal::senders::SZLine::Send(User*, XLine* x)
{
// Calculate the time left before this would expire, capping it at 2 days
time_t timeleft = x->GetExpires() - Anope::CurTime;
@@ -281,15 +230,19 @@ void unreal::Proto::SendSZLine(User *, XLine *x)
Uplink::Send("TKL", "+", "Z", "*", x->GetHost(), x->GetBy(), Anope::CurTime + timeleft, x->GetCreated(), x->GetReason());
}
-/* SGLINE */
-/*
- * SVSNLINE + reason_where_is_space :realname mask with spaces
-*/
-void unreal::Proto::SendSGLine(User *, XLine *x)
+void unreal::senders::SZLineDel::Send(XLine* x)
{
- Anope::string edited_reason = x->GetReason();
- edited_reason = edited_reason.replace_all_cs(" ", "_");
- Uplink::Send("SVSNLINE", "+", edited_reason, x->GetMask());
+ Uplink::Send("TKL", "-", "Z", "*", x->GetHost(), x->GetBy());
+}
+
+void unreal::senders::SVSHold::Send(const Anope::string& nick, time_t t)
+{
+ Uplink::Send("TKL", "+", "Q", "H", nick, Me->GetName(), Anope::CurTime + t, Anope::CurTime, "Being held for registered user");
+}
+
+void unreal::senders::SVSHoldDel::Send(const Anope::string& nick)
+{
+ Uplink::Send("TKL", "-", "Q", "*", nick, Me->GetName());
}
/* svsjoin
@@ -298,105 +251,118 @@ void unreal::Proto::SendSGLine(User *, XLine *x)
parv[2] - channel to join
parv[3] - (optional) channel key(s)
*/
-void unreal::Proto::SendSVSJoin(const MessageSource &source, User *user, const Anope::string &chan, const Anope::string &param)
+void unreal::senders::SVSJoin::Send(const MessageSource& source, User* user, const Anope::string& chan, const Anope::string& key)
{
- if (!param.empty())
- Uplink::Send(source, "SVSJOIN", user->GetUID(), chan, param);
+ if (!key.empty())
+ Uplink::Send(source, "SVSJOIN", user->GetUID(), chan, key);
else
Uplink::Send(source, "SVSJOIN", user->GetUID(), chan);
}
-void unreal::Proto::SendSVSPart(const MessageSource &source, User *user, const Anope::string &chan, const Anope::string &param)
+void unreal::senders::SVSLogin::Send(const Anope::string& uid, const Anope::string& acc, const Anope::string& vident, const Anope::string& vhost)
{
- if (!param.empty())
- Uplink::Send(source, "SVSPART", user->GetUID(), chan, param);
+ size_t p = uid.find('!');
+ if (p == Anope::string::npos)
+ return;
+ Uplink::Send(Me, "SVSLOGIN", uid.substr(0, p), uid, acc);
+}
+
+void unreal::senders::SVSPart::Send(const MessageSource& source, User* user, const Anope::string& chan, const Anope::string& reason)
+{
+ if (!reason.empty())
+ Uplink::Send(source, "SVSPART", user->GetUID(), chan, reason);
else
Uplink::Send(source, "SVSPART", user->GetUID(), chan);
}
-void unreal::Proto::SendSWhois(const MessageSource &source, const Anope::string &who, const Anope::string &mask)
+void unreal::senders::SWhois::Send(const MessageSource& source, User *user, const Anope::string& swhois)
{
- Uplink::Send(source, "SWHOIS", who, mask);
+ Uplink::Send(source, "SWHOIS", user->GetUID(), swhois);
}
-void unreal::Proto::SendEOB()
+void unreal::senders::Topic::Send(const MessageSource &source, Channel *channel, const Anope::string &topic, time_t topic_ts, const Anope::string &topic_setter)
{
- Uplink::Send(Me, "EOS");
+ Uplink::Send(source, "TOPIC", channel->name, topic_setter, topic_ts, topic);
}
-bool unreal::Proto::IsNickValid(const Anope::string &nick)
+void unreal::senders::VhostDel::Send(User* u)
{
- if (nick.equals_ci("ircd") || nick.equals_ci("irc"))
- return false;
-
- return IRCDProto::IsNickValid(nick);
+ ServiceBot *HostServ = Config->GetClient("HostServ");
+ u->RemoveMode(HostServ, "CLOAK");
+ u->RemoveMode(HostServ, "VHOST");
+ ModeManager::ProcessModes();
+ u->SetMode(HostServ, "CLOAK");
}
-bool unreal::Proto::IsChannelValid(const Anope::string &chan)
+void unreal::senders::VhostSet::Send(User* u, const Anope::string& vident, const Anope::string& vhost)
{
- if (chan.find(':') != Anope::string::npos)
- return false;
-
- return IRCDProto::IsChannelValid(chan);
+ if (!vident.empty())
+ Uplink::Send(Me, "CHGIDENT", u->GetUID(), vident);
+ if (!vhost.empty())
+ Uplink::Send(Me, "CHGHOST", u->GetUID(), vhost);
}
-bool unreal::Proto:: IsExtbanValid(const Anope::string &mask)
+unreal::Proto::Proto(Module *creator) : IRCDProto(creator, "UnrealIRCd 4")
{
- return mask.length() >= 4 && mask[0] == '~' && mask[2] == ':';
+ DefaultPseudoclientModes = "+Soiq";
+ CanSVSNick = true;
+ CanSVSJoin = true;
+ CanSetVHost = true;
+ CanSetVIdent = true;
+ CanSNLine = true;
+ CanSQLine = true;
+ CanSZLine = true;
+ CanSVSHold = true;
+ CanCertFP = true;
+ RequiresID = true;
+ MaxModes = 12;
}
-void unreal::Proto::SendLogin(User *u, NickServ::Nick *na)
+void unreal::Proto::Handshake()
{
- /* 3.2.10.4+ treats users logged in with accounts as fully registered, even if -r, so we can not set this here. Just use the timestamp. */
- if (Servers::Capab.count("ESVID") > 0 && !na->GetAccount()->IsUnconfirmed())
- IRCD->SendMode(Config->GetClient("NickServ"), u, "+d {0}", na->GetAccount()->GetDisplay());
- else
- IRCD->SendMode(Config->GetClient("NickServ"), u, "+d {0}", u->signon);
+ /*
+ NICKv2 = Nick Version 2
+ VHP = Sends hidden host
+ UMODE2 = sends UMODE2 on user modes
+ NICKIP = Sends IP on NICK
+ SJ3 = Supports SJOIN
+ NOQUIT = No Quit
+ TKLEXT = Extended TKL we don't use it but best to have it
+ MLOCK = Supports the MLOCK server command
+ VL = Version Info
+ SID = SID/UID mode
+ */
+ Uplink::Send("PASS", Config->Uplinks[Anope::CurrentUplink].password);
+ Uplink::Send("PROTOCTL", "NICKv2", "VHP", "UMODE2", "NICKIP", "SJOIN", "SJOIN2", "SJ3", "NOQUIT", "TKLEXT", "MLOCK", "SID");
+ Uplink::Send("PROTOCTL", "EAUTH=" + Me->GetName() + ",,,Anope-" + Anope::VersionShort());
+ Uplink::Send("PROTOCTL", "SID=" + Me->GetSID());
+ Uplink::Send("SERVER", Me->GetName(), Me->GetHops() + 1, Me->GetDescription());
}
-void unreal::Proto::SendLogout(User *u)
+void unreal::Proto::SendEOB()
{
- IRCD->SendMode(Config->GetClient("NickServ"), u, "+d 0");
+ Uplink::Send(Me, "EOS");
}
-void unreal::Proto::SendChannel(Channel *c)
+bool unreal::Proto::IsNickValid(const Anope::string &nick)
{
- /* Unreal does not support updating a channels TS without actually joining a user,
- * so we will join and part us now
- */
- ServiceBot *bi = c->ci->WhoSends();
- if (!bi)
- ;
- else if (c->FindUser(bi) == NULL)
- {
- bi->Join(c);
- bi->Part(c);
- }
- else
- {
- bi->Part(c);
- bi->Join(c);
- }
+ if (nick.equals_ci("ircd") || nick.equals_ci("irc"))
+ return false;
+
+ return IRCDProto::IsNickValid(nick);
}
-void unreal::Proto::SendSASLMessage(const ::SASL::Message &message)
+bool unreal::Proto::IsChannelValid(const Anope::string &chan)
{
- size_t p = message.target.find('!');
- if (p == Anope::string::npos)
- return;
+ if (chan.find(':') != Anope::string::npos)
+ return false;
- if (!message.ext.empty())
- Uplink::Send(ServiceBot::Find(message.source), "SASL", message.target.substr(0, p), message.target, message.type, message.data, message.ext);
- else
- Uplink::Send(ServiceBot::Find(message.source), "SASL", message.target.substr(0, p), message.target, message.type, message.data);
+ return IRCDProto::IsChannelValid(chan);
}
-void unreal::Proto::SendSVSLogin(const Anope::string &uid, const Anope::string &acc, const Anope::string &vident, const Anope::string &vhost)
+bool unreal::Proto:: IsExtbanValid(const Anope::string &mask)
{
- size_t p = uid.find('!');
- if (p == Anope::string::npos)
- return;
- Uplink::Send(Me, "SVSLOGIN", uid.substr(0, p), uid, acc);
+ return mask.length() >= 4 && mask[0] == '~' && mask[2] == ':';
}
bool unreal::Proto::IsIdentValid(const Anope::string &ident)
@@ -889,7 +855,7 @@ void unreal::ServerMessage::Run(MessageSource &source, const std::vector<Anope::
new Server(source.GetServer(), params[0], hops, params[2]);
}
- IRCD->SendPing(Me->GetName(), params[0]);
+ IRCD->Send<messages::Ping>(Me->GetName(), params[0]);
}
void unreal::SID::Run(MessageSource &source, const std::vector<Anope::string> &params)
@@ -904,7 +870,7 @@ void unreal::SID::Run(MessageSource &source, const std::vector<Anope::string> &p
new Server(source.GetServer(), params[0], hops, params[3], params[2]);
- IRCD->SendPing(Me->GetName(), params[0]);
+ IRCD->Send<messages::Ping>(Me->GetName(), params[0]);
}
void unreal::SJoin::Run(MessageSource &source, const std::vector<Anope::string> &params)
@@ -1156,6 +1122,48 @@ class ProtoUnreal : public Module
unreal::UID message_uid;
unreal::Umode2 message_umode2;
+ rfc1459::senders::GlobalNotice sender_global_notice;
+ rfc1459::senders::GlobalPrivmsg sender_global_privmsg;
+ rfc1459::senders::Invite sender_invite;
+ rfc1459::senders::Kick sender_kick;
+ rfc1459::senders::ModeChannel sender_mode_chan;
+ rfc1459::senders::NickChange sender_nickchange;
+ rfc1459::senders::Notice sender_notice;
+ rfc1459::senders::Part sender_part;
+ rfc1459::senders::Ping sender_ping;
+ rfc1459::senders::Pong sender_pong;
+ rfc1459::senders::Privmsg sender_privmsg;
+ rfc1459::senders::Quit sender_quit;
+ rfc1459::senders::SQuit sender_squit;
+
+ bahamut::senders::NOOP sender_noop;
+ bahamut::senders::SVSNick sender_svsnick;
+ bahamut::senders::Wallops sender_wallops;
+
+ unreal::senders::Akill sender_akill;
+ unreal::senders::AkillDel sender_akill_del;
+ unreal::senders::MessageChannel sender_channel;
+ unreal::senders::Join sender_join;
+ unreal::senders::Kill sender_svskill;
+ unreal::senders::Login sender_login;
+ unreal::senders::Logout sender_logout;
+ unreal::senders::ModeUser sender_mode_user;
+ unreal::senders::NickIntroduction sender_nickintroduction;
+ unreal::senders::MessageServer sender_server;
+ unreal::senders::SASL sender_sasl;
+ unreal::senders::SGLine sender_sgline;
+ unreal::senders::SGLineDel sender_sgline_del;
+ unreal::senders::SQLine sender_sqline;
+ unreal::senders::SQLineDel sender_sqline_del;
+ unreal::senders::SVSHold sender_svshold;
+ unreal::senders::SVSHoldDel sender_svsholddel;
+ unreal::senders::SVSJoin sender_svsjoin;
+ unreal::senders::SVSPart sender_svspart;
+ unreal::senders::SWhois sender_swhois;
+ unreal::senders::Topic sender_topic;
+ unreal::senders::VhostDel sender_vhost_del;
+ unreal::senders::VhostSet sender_vhost_set;
+
bool use_server_side_mlock;
public:
@@ -1207,7 +1215,53 @@ class ProtoUnreal : public Module
, message_topic(this)
, message_uid(this)
, message_umode2(this)
+
+ , sender_akill(this)
+ , sender_akill_del(this)
+ , sender_channel(this)
+ , sender_global_notice(this)
+ , sender_global_privmsg(this)
+ , sender_invite(this)
+ , sender_join(this)
+ , sender_kick(this)
+ , sender_svskill(this)
+ , sender_login(this)
+ , sender_logout(this)
+ , sender_mode_chan(this)
+ , sender_mode_user(this)
+ , sender_nickchange(this)
+ , sender_nickintroduction(this)
+ , sender_noop(this)
+ , sender_notice(this)
+ , sender_part(this)
+ , sender_ping(this)
+ , sender_pong(this)
+ , sender_privmsg(this)
+ , sender_quit(this)
+ , sender_server(this)
+ , sender_sasl(this)
+ , sender_sgline(this)
+ , sender_sgline_del(this)
+ , sender_sqline(this)
+ , sender_sqline_del(this)
+ , sender_squit(this)
+ , sender_svshold(this)
+ , sender_svsholddel(this)
+ , sender_svsjoin(this)
+ , sender_svsnick(this)
+ , sender_svspart(this)
+ , sender_swhois(this)
+ , sender_topic(this)
+ , sender_vhost_del(this)
+ , sender_vhost_set(this)
+ , sender_wallops(this)
+ {
+ IRCD = &ircd_proto;
+ }
+
+ ~ProtoUnreal()
{
+ IRCD = nullptr;
}
void OnReload(Configuration::Conf *conf) override
@@ -1251,7 +1305,7 @@ class ProtoUnreal : public Module
{
u->RemoveModeInternal(Me, ModeManager::FindUserModeByName("REGISTERED"));
if (Servers::Capab.count("ESVID") == 0)
- IRCD->SendLogout(u);
+ sender_logout.Send(u);
}
void OnChannelSync(Channel *c) override
diff --git a/modules/sasl.cpp b/modules/sasl.cpp
index 9feb3ffa6..d8cd83dcf 100644
--- a/modules/sasl.cpp
+++ b/modules/sasl.cpp
@@ -231,7 +231,7 @@ class SASLService : public SASL::Service, public Timer
msg.type = mtype;
msg.data = data;
- IRCD->SendSASLMessage(msg);
+ IRCD->Send<messages::SASL>(msg);
}
void Succeed(Session *session, NickServ::Account *nc) override
@@ -246,8 +246,8 @@ class SASLService : public SASL::Service, public Timer
}
else
{
- HostServ::VHost *vhost = HostServ::FindVHost(na->GetAccount());
- IRCD->SendSVSLogin(session->uid, nc->GetDisplay(), vhost ? vhost->GetIdent() : "", vhost ? vhost->GetHost() : "");
+ HostServ::VHost *vhost = HostServ::FindVHost(nc);
+ IRCD->Send<messages::SVSLogin>(session->uid, nc->GetDisplay(), vhost ? vhost->GetIdent() : "", vhost ? vhost->GetHost() : "");
}
this->SendMessage(session, "D", "S");
}
@@ -348,7 +348,7 @@ class ModuleSASL : public Module
// If we are connected to the network then broadcast the mechlist.
if (Me && Me->IsSynced())
- IRCD->SendSASLMechanisms(mechs);
+ IRCD->Send<messages::SASLMechanisms>(mechs);
}
public:
@@ -386,7 +386,7 @@ class ModuleSASL : public Module
void OnPreUplinkSync(Server *) override
{
// We have not yet sent a mechanism list so always do it here.
- IRCD->SendSASLMechanisms(mechs);
+ IRCD->Send<messages::SASLMechanisms>(mechs);
}
};
diff --git a/src/bots.cpp b/src/bots.cpp
index 091caa12f..dfe46ea67 100644
--- a/src/bots.cpp
+++ b/src/bots.cpp
@@ -49,7 +49,7 @@ ServiceBot::ServiceBot(const Anope::string &nnick, const Anope::string &nuser, c
//XXX
//XLine x(this->nick, "Reserved for services");
//IRCD->SendSQLine(NULL, &x);
- IRCD->SendClientIntroduction(this);
+ IRCD->Send<messages::NickIntroduction>(this);
this->introduced = true;
}
}
@@ -92,11 +92,11 @@ void ServiceBot::OnKill()
{
this->introduced = false;
this->GenerateUID();
- IRCD->SendClientIntroduction(this);
+ IRCD->Send<messages::NickIntroduction>(this);
this->introduced = true;
for (User::ChanUserList::const_iterator cit = this->chans.begin(), cit_end = this->chans.end(); cit != cit_end; ++cit)
- IRCD->SendJoin(this, cit->second->chan, &cit->second->status);
+ IRCD->Send<messages::Join>(this, cit->second->chan, &cit->second->status);
}
void ServiceBot::SetNewNick(const Anope::string &newnick)
@@ -160,7 +160,7 @@ void ServiceBot::Join(Channel *c, ChannelStatus *status)
c->JoinUser(this, status);
if (IRCD)
- IRCD->SendJoin(this, c, status);
+ IRCD->Send<messages::Join>(this, c, status);
EventManager::Get()->Dispatch(&Event::JoinChannel::OnJoinChannel, this, c);
}
diff --git a/src/channels.cpp b/src/channels.cpp
index bb6bc3083..aed6c7b53 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -789,7 +789,7 @@ void Channel::ChangeTopic(const Anope::string &user, const Anope::string &newtop
this->topic_setter = user;
this->topic_ts = ts;
- IRCD->SendTopic(this->ci->WhoSends(), this);
+ IRCD->Send<messages::Topic>(this->ci->WhoSends(), this, newtopic, ts, user);
/* Now that the topic is set update the time set. This is *after* we set it so the protocol modules are able to tell the old last set time */
this->topic_time = Anope::CurTime;
diff --git a/src/command.cpp b/src/command.cpp
index f1cae4bb3..7a87b07f3 100644
--- a/src/command.cpp
+++ b/src/command.cpp
@@ -120,7 +120,7 @@ void CommandSource::Reply(const Anope::string &message)
this->reply->SendMessage(*this->service, tok);
}
-Command::Command(Module *o, const Anope::string &sname, size_t minparams, size_t maxparams) : Service(o, "Command", sname), max_params(maxparams), min_params(minparams), module(o)
+Command::Command(Module *o, const Anope::string &sname, size_t minparams, size_t maxparams) : Service(o, NAME, sname), max_params(maxparams), min_params(minparams), module(o)
{
allow_unregistered = require_user = false;
}
diff --git a/src/logger.cpp b/src/logger.cpp
index 4949860a3..2751382f6 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -321,7 +321,7 @@ void LogInfo::OpenLogFiles()
{
const Anope::string &target = this->targets[i];
- if (target.empty() || target[0] == '#' || target == "globops" || target.find(":") != Anope::string::npos)
+ if (target.empty() || target[0] == '#' || target == "opers" || target.find(":") != Anope::string::npos)
continue;
LogFile *lf = new LogFile(CreateLogName(target));
@@ -386,11 +386,11 @@ void LogInfo::ProcessMessage(const Log *l)
IRCD->SendPrivmsg(bi, c->name, buffer);
}
}
- else if (target == "globops")
+ else if (target == "opers")
{
if (UplinkSock && l->bi && l->type <= LOG_NORMAL && Me && Me->IsSynced())
{
- IRCD->SendGlobops(l->bi, buffer);
+ IRCD->SendWallops(l->bi, buffer);
}
}
}
@@ -406,7 +406,7 @@ void LogInfo::ProcessMessage(const Log *l)
{
const Anope::string &target = this->targets[i];
- if (target.empty() || target[0] == '#' || target == "globops" || target.find(":") != Anope::string::npos)
+ if (target.empty() || target[0] == '#' || target == "opers" || target.find(":") != Anope::string::npos)
continue;
Anope::string oldlog = CreateLogName(target, Anope::CurTime - 86400 * this->log_age);
diff --git a/src/protocol.cpp b/src/protocol.cpp
index 5bf474a21..e299d1c2f 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -28,18 +28,15 @@
#include "channels.h"
#include "numeric.h"
-IRCDProto *IRCD = NULL;
+IRCDProto *IRCD = nullptr;
-IRCDProto::IRCDProto(Module *creator, const Anope::string &p) : Service(creator, "IRCDProto", creator->name), proto_name(p)
+IRCDProto::IRCDProto(Module *creator, const Anope::string &p) : Service(creator, NAME, p)
+ , proto_name(p)
{
- if (IRCD == NULL)
- IRCD = this;
}
IRCDProto::~IRCDProto()
{
- if (IRCD == this)
- IRCD = NULL;
}
const Anope::string &IRCDProto::GetProtocolName() const
@@ -47,119 +44,6 @@ const Anope::string &IRCDProto::GetProtocolName() const
return this->proto_name;
}
-static inline char nextID(int pos, Anope::string &buf)
-{
- char &c = buf[pos];
- if (c == 'Z')
- c = '0';
- else if (c != '9')
- ++c;
- else if (pos)
- c = 'A';
- else
- c = '0';
- return c;
-}
-
-Anope::string IRCDProto::UID_Retrieve()
-{
- if (!IRCD || !IRCD->RequiresID)
- return "";
-
- static Anope::string current_uid = "AAAAAA";
-
- do
- {
- int current_len = current_uid.length() - 1;
- while (current_len >= 0 && nextID(current_len--, current_uid) == 'A');
- }
- while (User::Find(Me->GetSID() + current_uid) != NULL);
-
- return Me->GetSID() + current_uid;
-}
-
-Anope::string IRCDProto::SID_Retrieve()
-{
- if (!IRCD || !IRCD->RequiresID)
- return "";
-
- static Anope::string current_sid = Config->GetBlock("serverinfo")->Get<Anope::string>("id");
- if (current_sid.empty())
- current_sid = "00A";
-
- do
- {
- int current_len = current_sid.length() - 1;
- while (current_len >= 0 && nextID(current_len--, current_sid) == 'A');
- }
- while (Server::Find(current_sid) != NULL);
-
- return current_sid;
-}
-
-void IRCDProto::SendKill(const MessageSource &source, const Anope::string &target, const Anope::string &reason)
-{
- Uplink::Send(source, "KILL", target, reason);
-}
-
-void IRCDProto::SendSVSKill(const MessageSource &source, User *user, const Anope::string &buf)
-{
- Uplink::Send(source, "KILL", user->GetUID(), buf);
-}
-
-void IRCDProto::SendMode(const MessageSource &source, Channel *dest, const Anope::string &buf)
-{
- IRCMessage message(source, "MODE", dest->name);
- message.TokenizeAndPush(buf);
- Uplink::SendMessage(message);
-}
-
-void IRCDProto::SendMode(const MessageSource &source, User *dest, const Anope::string &buf)
-{
- IRCMessage message(source, "MODE", dest->GetUID());
- message.TokenizeAndPush(buf);
- Uplink::SendMessage(message);
-}
-
-void IRCDProto::SendKick(const MessageSource &source, Channel *c, User *u, const Anope::string &r)
-{
- if (!r.empty())
- Uplink::Send(source, "KICK", c->name, u->GetUID(), r);
- else
- Uplink::Send(source, "KICK", c->name, u->GetUID());
-}
-
-void IRCDProto::SendNotice(const MessageSource &source, const Anope::string &dest, const Anope::string &msg)
-{
- Uplink::Send(source, "NOTICE", dest, msg);
-}
-
-void IRCDProto::SendPrivmsg(const MessageSource &source, const Anope::string &dest, const Anope::string &buf)
-{
- Uplink::Send(source, "PRIVMSG", dest, buf);
-}
-
-void IRCDProto::SendQuit(User *u, const Anope::string &buf)
-{
- if (!buf.empty())
- Uplink::Send(u, "QUIT", buf);
- else
- Uplink::Send(u, "QUIT");
-}
-
-void IRCDProto::SendPart(User *u, Channel *chan, const Anope::string &buf)
-{
- if (!buf.empty())
- Uplink::Send(u, "PART", chan->name, buf);
- else
- Uplink::Send(u, "PART", chan->name);
-}
-
-void IRCDProto::SendGlobops(const MessageSource &source, const Anope::string &buf)
-{
- Uplink::Send(source, "GLOBOPS", buf);
-}
-
void IRCDProto::SendCTCPReply(const MessageSource &source, const Anope::string &dest, const Anope::string &buf)
{
Anope::string s = Anope::NormalizeBuffer(buf);
@@ -171,11 +55,6 @@ void IRCDProto::SendNumeric(int numeric, User *dest, IRCMessage &message)
Uplink::SendMessage(message);
}
-void IRCDProto::SendTopic(const MessageSource &source, Channel *c)
-{
- Uplink::Send(source, "TOPIC", c->name, c->topic);
-}
-
void IRCDProto::SendAction(const MessageSource &source, const Anope::string &dest, const Anope::string &message)
{
Anope::string actionbuf = "\1ACTION ";
@@ -185,42 +64,6 @@ void IRCDProto::SendAction(const MessageSource &source, const Anope::string &des
SendPrivmsg(source, dest, actionbuf);
}
-void IRCDProto::SendPing(const Anope::string &servname, const Anope::string &who)
-{
- if (servname.empty())
- Uplink::Send(Me, "PING", who);
- else
- Uplink::Send(Me, "PING", servname, who);
-}
-
-void IRCDProto::SendPong(const Anope::string &servname, const Anope::string &who)
-{
- if (servname.empty())
- Uplink::Send(Me, "PONG", who);
- else
- Uplink::Send(Me, "PONG", servname, who);
-}
-
-void IRCDProto::SendInvite(const MessageSource &source, Channel *c, User *u)
-{
- Uplink::Send(source, "INVITE", u->GetUID(), c->name);
-}
-
-void IRCDProto::SendSquit(Server *s, const Anope::string &message)
-{
- Uplink::Send("SQUIT", s->GetSID(), message);
-}
-
-void IRCDProto::SendNickChange(User *u, const Anope::string &newnick)
-{
- Uplink::Send(u, "NICK", newnick, Anope::CurTime);
-}
-
-void IRCDProto::SendForceNickChange(User *u, const Anope::string &newnick, time_t when)
-{
- Uplink::Send(u, "SVSNICK", u->GetUID(), newnick, when);
-}
-
bool IRCDProto::IsNickValid(const Anope::string &nick)
{
/**
@@ -236,7 +79,7 @@ bool IRCDProto::IsNickValid(const Anope::string &nick)
Anope::string special = "[]\\`_^{|}";
- for (unsigned i = 0; i < nick.length(); ++i)
+ for (unsigned int i = 0; i < nick.length(); ++i)
if (!(nick[i] >= 'A' && nick[i] <= 'Z') && !(nick[i] >= 'a' && nick[i] <= 'z')
&& special.find(nick[i]) == Anope::string::npos
&& (Config && Config->NickChars.find(nick[i]) == Anope::string::npos)
@@ -262,7 +105,7 @@ bool IRCDProto::IsIdentValid(const Anope::string &ident)
if (ident.empty() || ident.length() > Config->GetBlock("networkinfo")->Get<unsigned>("userlen"))
return false;
- for (unsigned i = 0; i < ident.length(); ++i)
+ for (unsigned int i = 0; i < ident.length(); ++i)
{
const char &c = ident[i];
@@ -289,7 +132,7 @@ bool IRCDProto::IsHostValid(const Anope::string &host)
return false;
int dots = 0;
- for (unsigned i = 0; i < host.length(); ++i)
+ for (unsigned int i = 0; i < host.length(); ++i)
{
if (host[i] == '.')
++dots;
@@ -300,12 +143,6 @@ bool IRCDProto::IsHostValid(const Anope::string &host)
return dots > 0 || Config->GetBlock("networkinfo")->Get<bool>("allow_undotted_vhosts");
}
-void IRCDProto::SendOper(User *u)
-{
- SendNumeric(RPL_YOUREOPER, u, "You are now an IRC operator (set by services)");
- u->SetMode(NULL, "OPER");
-}
-
unsigned int IRCDProto::GetMaxListFor(Channel *c)
{
return c->HasMode("LBAN") ? 0 : Config->GetBlock("networkinfo")->Get<int>("modelistsize");
@@ -376,7 +213,9 @@ Server *MessageSource::GetServer() const
return this->s;
}
-IRCDMessage::IRCDMessage(Module *o, const Anope::string &n, unsigned int p) : Service(o, "IRCDMessage", o->name + "/" + n.lower()), name(n), param_count(p)
+IRCDMessage::IRCDMessage(Module *o, const Anope::string &n, unsigned int p) : Service(o, NAME, o->name + "/" + n.lower())
+ , name(n)
+ , param_count(p)
{
}
diff --git a/src/servers.cpp b/src/servers.cpp
index 5f48a5e7c..a04e36ded 100644
--- a/src/servers.cpp
+++ b/src/servers.cpp
@@ -81,7 +81,7 @@ Server::~Server()
if (this->uplink)
this->uplink->DelLink(this);
- for (unsigned i = this->links.size(); i > 0; --i)
+ for (unsigned int i = this->links.size(); i > 0; --i)
this->links[i - 1]->Delete(this->quit_reason);
Servers::ByName.erase(this->name);
@@ -101,12 +101,12 @@ void Server::Burst()
{
IRCD->SendBOB();
- for (unsigned i = 0; i < Me->GetLinks().size(); ++i)
+ for (unsigned int i = 0; i < Me->GetLinks().size(); ++i)
{
Server *s = Me->GetLinks()[i];
if (s->juped)
- IRCD->SendServer(s);
+ IRCD->Send<messages::MessageServer>(s);
}
/* We make the bots go online */
@@ -117,11 +117,12 @@ void Server::Burst()
ServiceBot *bi = ServiceBot::Find(u->GetUID());
if (bi)
{
+#warning "xline on stack"
//XLine x(bi->nick, "Reserved for services");
//IRCD->SendSQLine(NULL, &x);
}
- IRCD->SendClientIntroduction(u);
+ IRCD->Send<messages::NickIntroduction>(u);
if (bi)
bi->introduced = true;
}
@@ -131,10 +132,10 @@ void Server::Burst()
Channel *c = it->second;
if (c->users.empty())
- IRCD->SendChannel(c);
+ IRCD->Send<messages::MessageChannel>(c);
else
for (Channel::ChanUserList::const_iterator cit = c->users.begin(), cit_end = c->users.end(); cit != cit_end; ++cit)
- IRCD->SendJoin(cit->second->user, c, &cit->second->status);
+ IRCD->Send<messages::Join>(cit->second->user, c, &cit->second->status);
for (Channel::ModeList::const_iterator it2 = c->GetModes().begin(); it2 != c->GetModes().end(); ++it2)
{
@@ -145,7 +146,7 @@ void Server::Burst()
}
if (!c->topic.empty() && !c->topic_setter.empty())
- IRCD->SendTopic(c->ci->WhoSends(), c);
+ IRCD->Send<messages::Topic>(c->ci->WhoSends(), c, c->topic, c->topic_ts, c->topic_setter);
c->syncing = true;
}
@@ -308,9 +309,9 @@ bool Server::IsQuitting() const
void Server::Notice(ServiceBot *source, const Anope::string &message)
{
if (Config->UsePrivmsg && Config->DefPrivmsg)
- IRCD->SendGlobalPrivmsg(source, this, message);
+ IRCD->Send<messages::GlobalPrivmsg>(source, this, message);
else
- IRCD->SendGlobalNotice(source, this, message);
+ IRCD->Send<messages::GlobalNotice>(source, this, message);
}
Server *Server::Find(const Anope::string &name, bool name_only)
diff --git a/src/service_manager.cpp b/src/service_manager.cpp
index abebd1c3d..4c8d2a072 100644
--- a/src/service_manager.cpp
+++ b/src/service_manager.cpp
@@ -21,6 +21,7 @@
#include "services.h"
#include "service.h"
#include "logger.h"
+#include "modules.h"
ServiceManager *ServiceManager::manager = nullptr;
@@ -79,7 +80,7 @@ void ServiceManager::Register(Service *service)
Service *s = FindService(service->GetType(), service->GetName());
if (s != nullptr)
- throw ModuleException("Service of type " + service->GetType() + " with name " + service->GetName() + " already exists");
+ throw ModuleException("Service of type " + service->GetType() + " with name " + service->GetName() + " already exists from " + service->GetOwner()->name);
}
Log(LOG_DEBUG_3) << "Service registered: " << service->GetType() << " " << service->GetName() << " address " << static_cast<void *>(this) << " by " << service->GetOwner();
diff --git a/src/uplink.cpp b/src/uplink.cpp
index c2b7579c5..1615eef9d 100644
--- a/src/uplink.cpp
+++ b/src/uplink.cpp
@@ -105,7 +105,7 @@ UplinkSocket::~UplinkSocket()
}
}
- IRCD->SendSquit(Me, Anope::QuitReason);
+ IRCD->Send<messages::SQuit>(Me, Anope::QuitReason);
this->ProcessWrite(); // Write out the last bit
}
@@ -155,7 +155,7 @@ bool UplinkSocket::ProcessRead()
void UplinkSocket::OnConnect()
{
Log(LOG_TERMINAL) << "Successfully connected to uplink #" << (Anope::CurrentUplink + 1) << " " << Config->Uplinks[Anope::CurrentUplink].host << ":" << Config->Uplinks[Anope::CurrentUplink].port;
- IRCD->SendConnect();
+ IRCD->Handshake();
EventManager::Get()->Dispatch(&Event::ServerConnect::OnServerConnect);
}
diff --git a/src/users.cpp b/src/users.cpp
index 33a4cdaf6..a9bb432b5 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -30,6 +30,7 @@
#include "sockets.h"
#include "uplink.h"
#include "event.h"
+#include "messages.h"
#include "modules/nickserv.h"
user_map UserListByNick;
@@ -105,7 +106,7 @@ static void CollideKill(User *target, const Anope::string &reason)
static void Collide(User *u, const Anope::string &id, const Anope::string &type)
{
// Kill incoming user
- IRCD->SendKill(Me, id, type);
+ IRCD->Send<messages::Kill>(Me, id, Me->GetName() + " (" + type + ")");
// Quit colliding user
CollideKill(u, type);
}
@@ -383,7 +384,7 @@ void User::Identify(NickServ::Nick *na)
na->SetLastSeen(Anope::CurTime);
}
- IRCD->SendLogin(this, na);
+ IRCD->Send<messages::Login>(this, na);
this->Login(na->GetAccount());
@@ -397,15 +398,12 @@ void User::Identify(NickServ::Nick *na)
{
this->SetModes(NULL, "%s", m.c_str());
this->SendMessage(Me, "Changing your usermodes to \002{0}\002", m.c_str());
- UserMode *um = ModeManager::FindUserModeByName("OPER");
- if (um && !this->HasMode("OPER") && m.find(um->mchar) != Anope::string::npos)
- IRCD->SendOper(this);
}
if (IRCD->CanSetVHost && !oper->GetVhost().empty())
{
this->SendMessage(Me, "Changing your vhost to \002{0}\002", oper->GetVhost());
this->SetDisplayedHost(oper->GetVhost());
- IRCD->SendVhost(this, "", oper->GetVhost());
+ IRCD->Send<messages::VhostSet>(this, "", oper->GetVhost());
}
}
}
@@ -571,15 +569,12 @@ void User::SetModeInternal(const MessageSource &source, UserMode *um, const Anop
{
this->SetModes(NULL, "%s", m.c_str());
this->SendMessage(Me, "Changing your usermodes to \002{0}\002", m);
- UserMode *oper = ModeManager::FindUserModeByName("OPER");
- if (oper && !this->HasMode("OPER") && m.find(oper->mchar) != Anope::string::npos)
- IRCD->SendOper(this);
}
if (IRCD->CanSetVHost && !oper->GetVhost().empty())
{
this->SendMessage(Me, "Changing your vhost to \002{0}\002", oper->GetVhost());
this->SetDisplayedHost(oper->GetVhost());
- IRCD->SendVhost(this, "", oper->GetVhost());
+ IRCD->Send<messages::VhostSet>(this, "", oper->GetVhost());
}
}
}
@@ -769,7 +764,7 @@ void User::Kill(const MessageSource &source, const Anope::string &reason)
{
Anope::string real_reason = source.GetName() + " (" + reason + ")";
- IRCD->SendSVSKill(source, this, real_reason);
+ IRCD->SendKill(source, this, real_reason);
}
void User::KillInternal(const MessageSource &source, const Anope::string &reason)
@@ -853,7 +848,7 @@ bool User::BadPassword()
User* User::Find(const Anope::string &name, bool nick_only)
{
- if (!nick_only && IRCD->RequiresID)
+ if (!nick_only && IRCD && IRCD->RequiresID)
{
uid_map::iterator it = UserListByUID.find(name);
if (it != UserListByUID.end())