X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Ffjoin.cpp;h=2c3606db173295d748268e45388f69553596b064;hb=219993bc9018d9f0d9568330d7a972b68b785d27;hp=a245981e6266dd5be77e6841915649ed04d0df4d;hpb=de8be466941204bf47c9ed821b2e5a0a79ae64f1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/fjoin.cpp b/src/modules/m_spanningtree/fjoin.cpp index a245981e6..2c3606db1 100644 --- a/src/modules/m_spanningtree/fjoin.cpp +++ b/src/modules/m_spanningtree/fjoin.cpp @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * 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: * @@ -77,14 +77,16 @@ bool TreeSocket::ForceJoin(const std::string &source, std::deque &p if (created) { - ServerInstance->SNO->WriteToSnoMask('d', "Creation FJOIN recieved for %s, timestamp: %lu", chan->name.c_str(), (unsigned long)TS); chan = new Channel(ServerInstance, 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", chan->name.c_str(), (unsigned long)TS, (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) { @@ -95,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; @@ -109,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]); unsigned int idx = 2; std::vector modelist; @@ -122,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); + this->ServerInstance->SendMode(modelist, Utils->ServerUser); } /* Now, process every 'modes,nick' pair */ @@ -167,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(this->ServerInstance, who, channel.c_str(), true, "", route_back_again->bursting, TS); } else { @@ -180,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,9 +204,8 @@ 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); + parameterlist stackresult; + stackresult.push_back(c->name); for (char modeletter = 'A'; modeletter <= 'z'; ++modeletter) { @@ -225,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;