/* * InspIRCd -- Internet Relay Chat Daemon * * Copyright (C) 2009 Daniel De Graaf * Copyright (C) 2008 Craig Edwards * * This file is part of InspIRCd. InspIRCd 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 . */ #include "inspircd.h" #include "utils.h" #include "treeserver.h" #include "protocolinterface.h" /* * For documentation on this class, see include/protocol.h. */ void SpanningTreeProtocolInterface::GetServerList(ProtoServerList &sl) { sl.clear(); for (server_hash::iterator i = Utils->serverlist.begin(); i != Utils->serverlist.end(); i++) { ProtoServer ps; ps.servername = i->second->GetName(); TreeServer* s = i->second->GetParent(); ps.parentname = s ? s->GetName() : ""; ps.usercount = i->second->UserCount; ps.opercount = i->second->OperCount; ps.gecos = i->second->GetDesc(); ps.latencyms = i->second->rtt; sl.push_back(ps); } } bool SpanningTreeProtocolInterface::SendEncapsulatedData(const parameterlist &encap) { if (encap[0].find_first_of("*?") != std::string::npos) { Utils->DoOneToMany(ServerInstance->Config->GetSID(), "ENCAP", encap); return true; } return Utils->DoOneToOne(ServerInstance->Config->GetSID(), "ENCAP", encap, encap[0]); } void SpanningTreeProtocolInterface::SendMetaData(Extensible* target, const std::string &key, const std::string &data) { parameterlist params; User* u = dynamic_cast(target); Channel* c = dynamic_cast(target); if (u) params.push_back(u->uuid); else if (c) { params.push_back(c->name); params.push_back(ConvToStr(c->age)); } else params.push_back("*"); params.push_back(key); params.push_back(":" + data); Utils->DoOneToMany(ServerInstance->Config->GetSID(),"METADATA",params); } void SpanningTreeProtocolInterface::SendTopic(Channel* channel, std::string &topic) { parameterlist params; params.push_back(channel->name); params.push_back(ConvToStr(channel->age)); params.push_back(ConvToStr(ServerInstance->Time())); params.push_back(ServerInstance->Config->ServerName); params.push_back(":" + topic); Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FTOPIC", params); } void SpanningTreeProtocolInterface::SendMode(User* source, User* u, Channel* c, const parameterlist& modedata, const std::vector& translate) { parameterlist params; if (u) { if (u->registered != REG_ALL) return; params.push_back(u->uuid); params.insert(params.end(), modedata.begin(), modedata.end()); Utils->DoOneToMany(source->uuid, "MODE", params); } else { params.push_back(c->name); params.push_back(ConvToStr(c->age)); params.push_back(CommandParser::TranslateUIDs(translate, modedata)); Utils->DoOneToMany(source->uuid, "FMODE", params); } } void SpanningTreeProtocolInterface::SendSNONotice(const std::string &snomask, const std::string &text) { parameterlist p; p.push_back(snomask); p.push_back(":" + text); Utils->DoOneToMany(ServerInstance->Config->GetSID(), "SNONOTICE", p); } void SpanningTreeProtocolInterface::PushToClient(User* target, const std::string &rawline) { parameterlist p; p.push_back(target->uuid); p.push_back(":" + rawline); Utils->DoOneToOne(ServerInstance->Config->GetSID(), "PUSH", p, target->server); } void SpanningTreeProtocolInterface::SendChannelPrivmsg(Channel* target, char status, const std::string &text) { CUList exempt_list; Utils->SendChannelMessage(ServerInstance->Config->GetSID(), target, text, status, exempt_list, "PRIVMSG"); } void SpanningTreeProtocolInterface::SendChannelNotice(Channel* target, char status, const std::string &text) { CUList exempt_list; Utils->SendChannelMessage(ServerInstance->Config->GetSID(), target, text, status, exempt_list, "NOTICE"); } void SpanningTreeProtocolInterface::SendUserPrivmsg(User* target, const std::string &text) { parameterlist p; p.push_back(target->uuid); p.push_back(":" + text); Utils->DoOneToOne(ServerInstance->Config->GetSID(), "PRIVMSG", p, target->server); } void SpanningTreeProtocolInterface::SendUserNotice(User* target, const std::string &text) { parameterlist p; p.push_back(target->uuid); p.push_back(":" + text); Utils->DoOneToOne(ServerInstance->Config->GetSID(), "NOTICE", p, target->server); }