#include "treesocket.h"
#include "resolvers.h"
#include "commandbuilder.h"
+#include "modules/server.h"
SpanningTreeUtilities* Utils = NULL;
ModResult ModuleSpanningTree::OnAcceptConnection(int newsock, ListenSocket* from, irc::sockets::sockaddrs* client, irc::sockets::sockaddrs* server)
{
- if (from->bind_tag->getString("type") != "servers")
+ if (!stdalgo::string::equalsci(from->bind_tag->getString("type"), "servers"))
return MOD_RES_PASSTHRU;
std::string incomingip = client->addr();
sock->Close();
}
- for(std::map<TreeSocket*, std::pair<std::string, int> >::iterator i = timeoutlist.begin(); i != timeoutlist.end(); ++i)
+ for(TimeoutList::iterator i = timeoutlist.begin(); i != timeoutlist.end(); ++i)
{
TreeSocket* s = i->first;
s->Close();
minrank = mh->GetPrefixRank();
}
+ TreeServer::ChildServers children = TreeRoot->GetChildren();
const Channel::MemberMap& ulist = c->GetUsers();
for (Channel::MemberMap::const_iterator i = ulist.begin(); i != ulist.end(); ++i)
{
{
TreeServer* best = TreeServer::Get(i->first);
list.insert(best->GetSocket());
+
+ TreeServer::ChildServers::iterator citer = std::find(children.begin(), children.end(), best);
+ if (citer != children.end())
+ children.erase(citer);
}
}
- return;
+
+ // Check whether the servers which do not have users in the channel might need this message. This
+ // is used to keep the chanhistory module synchronised between servers.
+ for (TreeServer::ChildServers::const_iterator i = children.begin(); i != children.end(); ++i)
+ {
+ ModResult result;
+ FIRST_MOD_RESULT_CUSTOM(Creator->GetEventProvider(), ServerEventListener, OnBroadcastMessage, result, (c, *i));
+ if (result == MOD_RES_ALLOW)
+ list.insert((*i)->GetSocket());
+ }
}
void SpanningTreeUtilities::DoOneToAllButSender(const CmdBuilder& params, TreeServer* omitroute)
ConfigTag* options = ServerInstance->Config->ConfValue("options");
FlatLinks = security->getBool("flatlinks");
HideULines = security->getBool("hideulines");
+ HideSplits = security->getBool("hidesplits");
AnnounceTSChange = options->getBool("announcets");
AllowOptCommon = options->getBool("allowmismatch");
quiet_bursts = ServerInstance->Config->ConfValue("performance")->getBool("quietbursts");
- PingWarnTime = options->getDuration("pingwarning");
- PingFreq = options->getDuration("serverpingfreq");
-
- if (PingFreq == 0)
- PingFreq = 60;
+ PingWarnTime = options->getDuration("pingwarning", 15);
+ PingFreq = options->getDuration("serverpingfreq", 60, 1);
- if (PingWarnTime < 0 || PingWarnTime > PingFreq - 1)
+ if (PingWarnTime >= PingFreq)
PingWarnTime = 0;
AutoconnectBlocks.clear();
L->AllowMasks.push_back(s);
L->IPAddr = tag->getString("ipaddr");
- L->Port = tag->getInt("port");
+ L->Port = tag->getUInt("port", 0);
L->SendPass = tag->getString("sendpass", tag->getString("password"));
L->RecvPass = tag->getString("recvpass", tag->getString("password"));
L->Fingerprint = tag->getString("fingerprint");
ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Configuration warning: Link block '" + L->Name + "' has no IP defined! This will allow any IP to connect as this server, and MAY not be what you want.");
}
- if (!L->Port)
+ if (!L->Port && L->IPAddr.find('/') == std::string::npos)
ServerInstance->Logs->Log(MODNAME, LOG_DEFAULT, "Configuration warning: Link block '" + L->Name + "' has no port defined, you will not be able to /connect it.");
L->Fingerprint.erase(std::remove(L->Fingerprint.begin(), L->Fingerprint.end(), ':'), L->Fingerprint.end());
return NULL;
}
-void SpanningTreeUtilities::SendChannelMessage(const std::string& prefix, Channel* target, const std::string& text, char status, const CUList& exempt_list, const char* message_type, TreeSocket* omit)
+void SpanningTreeUtilities::SendChannelMessage(const std::string& prefix, Channel* target, const std::string& text, char status, const ClientProtocol::TagMap& tags, const CUList& exempt_list, const char* message_type, TreeSocket* omit)
{
CmdBuilder msg(prefix, message_type);
+ msg.push_tags(tags);
msg.push_raw(' ');
if (status != 0)
msg.push_raw(status);
- msg.push_raw(target->name).push_last(text);
+ msg.push_raw(target->name);
+ if (!text.empty())
+ msg.push_last(text);
TreeSocketSet list;
this->GetListOfServersForChannel(target, list, status, exempt_list);