summaryrefslogtreecommitdiff
path: root/src/protocol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocol.cpp')
-rw-r--r--src/protocol.cpp102
1 files changed, 60 insertions, 42 deletions
diff --git a/src/protocol.cpp b/src/protocol.cpp
index c8320e25a..c5b555cad 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -1,12 +1,20 @@
/*
+ * Anope IRC Services
*
- * (C) 2003-2016 Anope Team
- * Contact us at team@anope.org
+ * Copyright (C) 2003-2016 Anope Team <team@anope.org>
*
- * Please read COPYING and README for further details.
+ * 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.
*
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
+ * 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 "services.h"
@@ -80,7 +88,7 @@ Anope::string IRCDProto::SID_Retrieve()
if (!IRCD || !IRCD->RequiresID)
return "";
- static Anope::string current_sid = Config->GetBlock("serverinfo")->Get<const Anope::string>("id");
+ static Anope::string current_sid = Config->GetBlock("serverinfo")->Get<Anope::string>("id");
if (current_sid.empty())
current_sid = "00A";
@@ -96,61 +104,65 @@ Anope::string IRCDProto::SID_Retrieve()
void IRCDProto::SendKill(const MessageSource &source, const Anope::string &target, const Anope::string &reason)
{
- UplinkSocket::Message(source) << "KILL " << target << " :" << reason;
+ Uplink::Send(source, "KILL", target, reason);
}
void IRCDProto::SendSVSKillInternal(const MessageSource &source, User *user, const Anope::string &buf)
{
- UplinkSocket::Message(source) << "KILL " << user->GetUID() << " :" << buf;
+ Uplink::Send(source, "KILL", user->GetUID(), buf);
}
void IRCDProto::SendModeInternal(const MessageSource &source, const Channel *dest, const Anope::string &buf)
{
- UplinkSocket::Message(source) << "MODE " << dest->name << " " << buf;
+ IRCMessage message(source, "MODE", dest->name);
+ message.TokenizeAndPush(buf);
+ Uplink::SendMessage(message);
}
void IRCDProto::SendModeInternal(const MessageSource &source, User *dest, const Anope::string &buf)
{
- UplinkSocket::Message(source) << "MODE " << dest->GetUID() << " " << buf;
+ IRCMessage message(source, "MODE", dest->GetUID());
+ message.TokenizeAndPush(buf);
+ Uplink::SendMessage(message);
}
void IRCDProto::SendKickInternal(const MessageSource &source, const Channel *c, User *u, const Anope::string &r)
{
if (!r.empty())
- UplinkSocket::Message(source) << "KICK " << c->name << " " << u->GetUID() << " :" << r;
+ Uplink::Send(source, "KICK", c->name, u->GetUID(), r);
else
- UplinkSocket::Message(source) << "KICK " << c->name << " " << u->GetUID();
+ Uplink::Send(source, "KICK", c->name, u->GetUID());
}
void IRCDProto::SendNoticeInternal(const MessageSource &source, const Anope::string &dest, const Anope::string &msg)
{
- UplinkSocket::Message(source) << "NOTICE " << dest << " :" << msg;
+ Uplink::Send(source, "NOTICE", dest, msg);
}
void IRCDProto::SendPrivmsgInternal(const MessageSource &source, const Anope::string &dest, const Anope::string &buf)
{
- UplinkSocket::Message(source) << "PRIVMSG " << dest << " :" << buf;
+ Uplink::Send(source, "PRIVMSG", dest, buf);
}
void IRCDProto::SendQuitInternal(User *u, const Anope::string &buf)
{
if (!buf.empty())
- UplinkSocket::Message(u) << "QUIT :" << buf;
+ Uplink::Send(u, "QUIT", buf);
else
- UplinkSocket::Message(u) << "QUIT";
+ Uplink::Send(u, "QUIT");
}
void IRCDProto::SendPartInternal(User *u, const Channel *chan, const Anope::string &buf)
{
if (!buf.empty())
- UplinkSocket::Message(u) << "PART " << chan->name << " :" << buf;
+ Uplink::Send(u, "PART", chan->name, buf);
else
- UplinkSocket::Message(u) << "PART " << chan->name;
+ Uplink::Send(u, "PART", chan->name);
}
void IRCDProto::SendGlobopsInternal(const MessageSource &source, const Anope::string &buf)
{
- UplinkSocket::Message(source) << "GLOBOPS :" << buf;
+ Uplink::Send(source, "GLOBOPS", buf);
}
void IRCDProto::SendCTCPInternal(const MessageSource &source, const Anope::string &dest, const Anope::string &buf)
@@ -166,12 +178,15 @@ void IRCDProto::SendNumericInternal(int numeric, const Anope::string &dest, cons
n = "0" + n;
if (numeric < 100)
n = "0" + n;
- UplinkSocket::Message(Me) << n << " " << dest << " " << buf;
+
+ IRCMessage message(Me, n, dest);
+ message.TokenizeAndPush(buf);
+ Uplink::SendMessage(message);
}
void IRCDProto::SendTopic(const MessageSource &source, Channel *c)
{
- UplinkSocket::Message(source) << "TOPIC " << c->name << " :" << c->topic;
+ Uplink::Send(source, "TOPIC", c->name, c->topic);
}
void IRCDProto::SendSVSKill(const MessageSource &source, User *user, const char *fmt, ...)
@@ -264,28 +279,22 @@ void IRCDProto::SendQuit(User *u, const char *fmt, ...)
void IRCDProto::SendPing(const Anope::string &servname, const Anope::string &who)
{
if (servname.empty())
- UplinkSocket::Message(Me) << "PING " << who;
+ Uplink::Send(Me, "PING", who);
else
- UplinkSocket::Message(Me) << "PING " << servname << " " << who;
+ Uplink::Send(Me, "PING", servname, who);
}
-/**
- * Send a PONG reply to a received PING.
- * servname should be left NULL 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.
- **/
void IRCDProto::SendPong(const Anope::string &servname, const Anope::string &who)
{
if (servname.empty())
- UplinkSocket::Message(Me) << "PONG " << who;
+ Uplink::Send(Me, "PONG", who);
else
- UplinkSocket::Message(Me) << "PONG " << servname << " " << who;
+ Uplink::Send(Me, "PONG", servname, who);
}
void IRCDProto::SendInvite(const MessageSource &source, const Channel *c, User *u)
{
- UplinkSocket::Message(source) << "INVITE " << u->GetUID() << " " << c->name;
+ Uplink::Send(source, "INVITE", u->GetUID(), c->name);
}
void IRCDProto::SendPart(User *user, const Channel *chan, const char *fmt, ...)
@@ -315,17 +324,17 @@ void IRCDProto::SendGlobops(const MessageSource &source, const char *fmt, ...)
void IRCDProto::SendSquit(Server *s, const Anope::string &message)
{
- UplinkSocket::Message() << "SQUIT " << s->GetSID() << " :" << message;
+ Uplink::Send("SQUIT", s->GetSID(), message);
}
void IRCDProto::SendNickChange(User *u, const Anope::string &newnick)
{
- UplinkSocket::Message(u) << "NICK " << newnick << " " << Anope::CurTime;
+ Uplink::Send(u, "NICK", newnick, Anope::CurTime);
}
void IRCDProto::SendForceNickChange(User *u, const Anope::string &newnick, time_t when)
{
- UplinkSocket::Message() << "SVSNICK " << u->GetUID() << " " << newnick << " " << when;
+ Uplink::Send(u, "SVSNICK", u->GetUID(), newnick, when);
}
void IRCDProto::SendCTCP(const MessageSource &source, const Anope::string &dest, const char *fmt, ...)
@@ -360,16 +369,16 @@ bool IRCDProto::IsNickValid(const Anope::string &nick)
if (nick.empty())
return false;
-
+
Anope::string special = "[]\\`_^{|}";
-
+
for (unsigned 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)
&& (!i || (!(nick[i] >= '0' && nick[i] <= '9') && nick[i] != '-')))
return false;
-
+
return true;
}
@@ -407,8 +416,8 @@ bool IRCDProto::IsHostValid(const Anope::string &host)
if (host.empty() || host.length() > Config->GetBlock("networkinfo")->Get<unsigned>("hostlen"))
return false;
- const Anope::string &vhostdisablebe = Config->GetBlock("networkinfo")->Get<const Anope::string>("disallow_start_or_end"),
- vhostchars = Config->GetBlock("networkinfo")->Get<const Anope::string>("vhost_chars");
+ const Anope::string &vhostdisablebe = Config->GetBlock("networkinfo")->Get<Anope::string>("disallow_start_or_end"),
+ vhostchars = Config->GetBlock("networkinfo")->Get<Anope::string>("vhost_chars");
if (vhostdisablebe.find_first_of(host[0]) != Anope::string::npos)
return false;
@@ -474,6 +483,15 @@ const Anope::string &MessageSource::GetName() const
return this->source;
}
+const Anope::string &MessageSource::GetUID() const
+{
+ if (this->s)
+ return this->s->GetSID();
+ if (this->u)
+ return this->u->GetUID();
+ return this->source;
+}
+
const Anope::string &MessageSource::GetSource() const
{
return this->source;
@@ -484,9 +502,9 @@ User *MessageSource::GetUser() const
return this->u;
}
-BotInfo *MessageSource::GetBot() const
+ServiceBot *MessageSource::GetBot() const
{
- return BotInfo::Find(this->GetName(), true);
+ return ServiceBot::Find(this->GetName(), true);
}
Server *MessageSource::GetServer() const