X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Ffjoin.cpp;h=810cf23a54fe6f7f63f38e74554441e2bbf928ec;hb=dbf4d595433ecefeb61f1267ffa515a91c3ab548;hp=55c72c474e50571abe43f5e0e0ed0e03b500a087;hpb=b2688f6cdf45c70985754001edcc2b1916f5bcb4;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/fjoin.cpp b/src/modules/m_spanningtree/fjoin.cpp index 55c72c474..810cf23a5 100644 --- a/src/modules/m_spanningtree/fjoin.cpp +++ b/src/modules/m_spanningtree/fjoin.cpp @@ -3,7 +3,7 @@ * +------------------------------------+ * * InspIRCd: (C) 2002-2009 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -14,15 +14,15 @@ #include "inspircd.h" #include "xline.h" -#include "m_spanningtree/treesocket.h" -#include "m_spanningtree/treeserver.h" -#include "m_spanningtree/utils.h" +#include "treesocket.h" +#include "treeserver.h" +#include "utils.h" /* $ModDep: m_spanningtree/utils.h m_spanningtree/treeserver.h m_spanningtree/treesocket.h */ /** FJOIN, almost identical to TS6 SJOIN, except for nicklist handling. */ -bool TreeSocket::ForceJoin(const std::string &source, std::deque ¶ms) +bool TreeSocket::ForceJoin(const std::string &source, parameterlist ¶ms) { /* 1.1 FJOIN works as follows: * @@ -53,13 +53,13 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p if (params.size() < 3) return true; - irc::modestacker modestack(ServerInstance, true); /* Modes to apply from the users in the user list */ + irc::modestacker modestack(true); /* Modes to apply from the users in the user list */ User* who = NULL; /* User we are currently checking */ std::string channel = params[0]; /* Channel name, as a string */ time_t TS = atoi(params[1].c_str()); /* Timestamp given to us for remote side */ irc::tokenstream users((params.size() > 3) ? params[params.size() - 1] : ""); /* users from the user list */ bool apply_other_sides_modes = true; /* True if we are accepting the other side's modes */ - Channel* chan = this->ServerInstance->FindChan(channel); /* The channel we're sending joins to */ + Channel* chan = ServerInstance->FindChan(channel); /* The channel we're sending joins to */ bool created = !chan; /* True if the channel doesnt exist here yet */ std::string item; /* One item in the list of nicks */ @@ -77,15 +77,16 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p if (created) { - chan = new Channel(ServerInstance, channel, TS); + chan = new Channel(channel, TS); ServerInstance->SNO->WriteToSnoMask('d', "Creation FJOIN recieved for %s, timestamp: %lu", chan->name.c_str(), (unsigned long)TS); } else { time_t ourTS = chan->age; - ServerInstance->SNO->WriteToSnoMask('d', "Merge FJOIN recieved for %s, ourTS: %lu, TS: %lu, difference: %lu", - chan->name.c_str(), (unsigned long)ourTS, (unsigned long)TS, (unsigned long)ourTS - (unsigned long)TS); + if (TS != ourTS) + ServerInstance->SNO->WriteToSnoMask('d', "Merge FJOIN recieved for %s, ourTS: %lu, TS: %lu, difference: %lu", + chan->name.c_str(), (unsigned long)ourTS, (unsigned long)TS, (unsigned long)(ourTS - TS)); /* If our TS is less than theirs, we dont accept their modes */ if (ourTS < TS) { @@ -96,7 +97,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p { /* Our TS greater than theirs, clear all our modes from the channel, accept theirs. */ ServerInstance->SNO->WriteToSnoMask('d', "Removing our modes, accepting remote"); - std::deque param_list; + parameterlist param_list; if (Utils->AnnounceTSChange && chan) chan->WriteChannelWithServ(ServerInstance->Config->ServerName, "NOTICE %s :TS for %s changed from %lu to %lu", chan->name.c_str(), chan->name.c_str(), (unsigned long) ourTS, (unsigned long) TS); ourTS = TS; @@ -110,7 +111,6 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p /* First up, apply their modes if they won the TS war */ if (apply_other_sides_modes) { - ServerInstance->SNO->WriteToSnoMask('d', "Applying remote modestring for %s", params[0].c_str()); unsigned int idx = 2; std::vector modelist; @@ -123,7 +123,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p modelist.push_back(params[idx]); } - this->ServerInstance->SendMode(modelist, this->ServerInstance->FakeClient); + ServerInstance->SendMode(modelist, Utils->ServerUser); } /* Now, process every 'modes,nick' pair */ @@ -156,7 +156,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p usr++; /* Check the user actually exists */ - who = this->ServerInstance->FindUUID(usr); + who = ServerInstance->FindUUID(usr); if (who) { /* Check that the user's 'direction' is correct */ @@ -168,7 +168,7 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p for (std::string::iterator x = modes.begin(); x != modes.end(); ++x) modestack.Push(*x, who->nick); - Channel::JoinUser(this->ServerInstance, who, channel.c_str(), true, "", true, TS); + Channel::JoinUser(who, channel.c_str(), true, "", route_back_again->bursting, TS); } else { @@ -181,24 +181,20 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p /* Flush mode stacker if we lost the FJOIN or had equal TS */ if (apply_other_sides_modes) { - std::deque stackresult; - std::vector mode_junk; - mode_junk.push_back(channel); + parameterlist stackresult; + stackresult.push_back(channel); while (modestack.GetStackedLine(stackresult)) { - for (size_t j = 0; j < stackresult.size(); j++) - { - mode_junk.push_back(stackresult[j]); - } - ServerInstance->SendMode(mode_junk, ServerInstance->FakeClient); + ServerInstance->SendMode(stackresult, Utils->ServerUser); + stackresult.erase(stackresult.begin() + 1, stackresult.end()); } } return true; } -bool TreeSocket::RemoveStatus(const std::string &prefix, std::deque ¶ms) +bool TreeSocket::RemoveStatus(const std::string &prefix, parameterlist ¶ms) { if (params.size() < 1) return true; @@ -207,10 +203,9 @@ bool TreeSocket::RemoveStatus(const std::string &prefix, std::deque if (c) { - irc::modestacker stack(ServerInstance, false); - std::deque stackresult; - std::vector mode_junk; - mode_junk.push_back(c->name); + irc::modestacker stack(false); + parameterlist stackresult; + stackresult.push_back(c->name); for (char modeletter = 'A'; modeletter <= 'z'; ++modeletter) { @@ -226,10 +221,8 @@ bool TreeSocket::RemoveStatus(const std::string &prefix, std::deque while (stack.GetStackedLine(stackresult)) { - for (size_t j = 0; j < stackresult.size(); j++) - mode_junk.push_back(stackresult[j]); - - ServerInstance->SendMode(mode_junk, ServerInstance->FakeClient); + ServerInstance->SendMode(stackresult, Utils->ServerUser); + stackresult.erase(stackresult.begin() + 1, stackresult.end()); } } return true;