diff options
Diffstat (limited to 'src/protocol.cpp')
-rw-r--r-- | src/protocol.cpp | 102 |
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 |