]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/main.cpp
We were already sending FMODE +nt after each channel creation to keep services happy...
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / main.cpp
index 4dc6eedc0e9d3d4e4cf0cb4a3875b205db6821a7..40d1bbcde6865dba85734fe578c848d841f8dba8 100644 (file)
@@ -13,6 +13,7 @@
 
 /* $ModDesc: Provides a spanning tree server link protocol */
 
+#include "inspircd.h"
 #include "configreader.h"
 #include "users.h"
 #include "channels.h"
@@ -20,7 +21,6 @@
 #include "commands/cmd_whois.h"
 #include "commands/cmd_stats.h"
 #include "socket.h"
-#include "inspircd.h"
 #include "wildcard.h"
 #include "xline.h"
 #include "transport.h"
@@ -37,7 +37,7 @@
 /* $ModDep: m_spanningtree/timesynctimer.h m_spanningtree/resolvers.h m_spanningtree/main.h m_spanningtree/utils.h m_spanningtree/treeserver.h m_spanningtree/link.h m_spanningtree/treesocket.h m_spanningtree/rconnect.h */
 
 ModuleSpanningTree::ModuleSpanningTree(InspIRCd* Me)
-       : Module::Module(Me), max_local(0), max_global(0)
+       : Module(Me), max_local(0), max_global(0)
 {
        ServerInstance->UseInterface("InspSocketHook");
        Utils = new SpanningTreeUtilities(Me, this);
@@ -147,19 +147,24 @@ void ModuleSpanningTree::HandleLusers(const char** parameters, int pcnt, userrec
        return;
 }
 
-const std::string ModuleSpanningTree::MapOperInfo(TreeServer* Current)
+std::string ModuleSpanningTree::TimeToStr(time_t secs)
 {
-       time_t secs_up = ServerInstance->Time() - Current->age;
-       time_t mins_up = secs_up / 60;
+       time_t mins_up = secs / 60;
        time_t hours_up = mins_up / 60;
        time_t days_up = hours_up / 24;
-       secs_up = secs_up % 60;
+       secs = secs % 60;
        mins_up = mins_up % 60;
        hours_up = hours_up % 24;
-       return (" [Up: "+ (days_up ? (ConvToStr(days_up) + "d") : std::string(""))
+       return ((days_up ? (ConvToStr(days_up) + "d") : std::string(""))
                        + (hours_up ? (ConvToStr(hours_up) + "h") : std::string(""))
                        + (mins_up ? (ConvToStr(mins_up) + "m") : std::string(""))
-                       + ConvToStr(secs_up) + "s Lag: "+ConvToStr(Current->rtt)+"s]");
+                       + ConvToStr(secs) + "s");
+}
+
+const std::string ModuleSpanningTree::MapOperInfo(TreeServer* Current)
+{
+       time_t secs_up = ServerInstance->Time() - Current->age;
+       return (" [Up: " + TimeToStr(secs_up) + " Lag: "+ConvToStr(Current->rtt)+"s]");
 }
 
 // WARNING: NOT THREAD SAFE - DONT GET ANY SMART IDEAS.
@@ -467,8 +472,7 @@ void ModuleSpanningTree::DoPingChecks(time_t curtime)
                                }
                                else
                                {
-                                       // they didnt answer, boot them
-                                       ServerInstance->SNO->WriteToSnoMask('l',"Server \002%s\002 pinged out",serv->GetName().c_str());
+                                       /* they didnt answer, boot them */
                                        sock->SendError("Ping timeout");
                                        sock->Squit(serv,"Ping timeout");
                                        ServerInstance->SE->DelFd(sock);
@@ -485,6 +489,12 @@ void ModuleSpanningTree::DoPingChecks(time_t curtime)
                        }
                }
        }
+
+       /* Cancel remote burst mode on any servers which still have it enabled due to latency/lack of data.
+        * This prevents lost REMOTECONNECT notices
+        */
+       for (server_hash::iterator i = Utils->serverlist.begin(); i != Utils->serverlist.end(); i++)
+               Utils->SetRemoteBursting(i->second, false);
 }
 
 void ModuleSpanningTree::ConnectServer(Link* x)
@@ -897,8 +907,7 @@ void ModuleSpanningTree::OnUserJoin(userrec* user, chanrec* channel, bool &silen
                        Utils->DoOneToMany(ServerInstance->Config->ServerName,"FJOIN",params);
                        /* First user in, sync the modes for the channel */
                        params.pop_back();
-                       /* This is safe, all inspircd servers default to +nt */
-                       params.push_back("+nt");
+                       params.push_back(channel->ChanModes());
                        Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",params);
                }
                else
@@ -1254,6 +1263,8 @@ void ModuleSpanningTree::OnEvent(Event* event)
                if (a)
                {
                        ourTS = a->age;
+                       Utils->DoOneToMany(ServerInstance->Config->ServerName,"MODE",*params);
+                       return;
                }
                else
                {
@@ -1261,10 +1272,10 @@ void ModuleSpanningTree::OnEvent(Event* event)
                        if (a)
                        {
                                ourTS = a->age;
+                               params->insert(params->begin() + 1,ConvToStr(ourTS));
+                               Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",*params);
                        }
                }
-               params->insert(params->begin() + 1,ConvToStr(ourTS));
-               Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",*params);
        }
        else if (event->GetEventID() == "send_mode_explicit")
        {
@@ -1367,7 +1378,7 @@ class ModuleSpanningTreeFactory : public ModuleFactory
 };
 
 
-extern "C" void * init_module( void )
+extern "C" DllExport void * init_module( void )
 {
        return new ModuleSpanningTreeFactory;
 }