]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/main.cpp
m_spanningtree Remove duplicate code for sending channel messages from RouteCommand()
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / main.cpp
index 7bbe5fbad02850dacfbe207bf4d1812fc18802d4..316ed6e960b2a63fee697087fffddb56a41df3ba 100644 (file)
@@ -41,10 +41,14 @@ ModuleSpanningTree::ModuleSpanningTree()
 }
 
 SpanningTreeCommands::SpanningTreeCommands(ModuleSpanningTree* module)
-       : rconnect(module), rsquit(module),
+       : rconnect(module), rsquit(module), map(module),
        svsjoin(module), svspart(module), svsnick(module), metadata(module),
        uid(module), opertype(module), fjoin(module), ijoin(module), resync(module),
-       fmode(module), ftopic(module), fhost(module), fident(module), fname(module)
+       fmode(module), ftopic(module), fhost(module), fident(module), fname(module),
+       away(module), addline(module), delline(module), encap(module), idle(module),
+       nick(module), ping(module), pong(module), push(module), save(module),
+       server(module), squit(module), snonotice(module), version(module),
+       burst(module), endburst(module)
 {
 }
 
@@ -57,20 +61,7 @@ void ModuleSpanningTree::init()
        commands = new SpanningTreeCommands(this);
        ServerInstance->Modules->AddService(commands->rconnect);
        ServerInstance->Modules->AddService(commands->rsquit);
-       ServerInstance->Modules->AddService(commands->svsjoin);
-       ServerInstance->Modules->AddService(commands->svspart);
-       ServerInstance->Modules->AddService(commands->svsnick);
-       ServerInstance->Modules->AddService(commands->metadata);
-       ServerInstance->Modules->AddService(commands->uid);
-       ServerInstance->Modules->AddService(commands->opertype);
-       ServerInstance->Modules->AddService(commands->fjoin);
-       ServerInstance->Modules->AddService(commands->ijoin);
-       ServerInstance->Modules->AddService(commands->resync);
-       ServerInstance->Modules->AddService(commands->fmode);
-       ServerInstance->Modules->AddService(commands->ftopic);
-       ServerInstance->Modules->AddService(commands->fhost);
-       ServerInstance->Modules->AddService(commands->fident);
-       ServerInstance->Modules->AddService(commands->fname);
+       ServerInstance->Modules->AddService(commands->map);
 
        delete ServerInstance->PI;
        ServerInstance->PI = new SpanningTreeProtocolInterface(Utils);
@@ -114,16 +105,10 @@ void ModuleSpanningTree::ShowLinks(TreeServer* Current, User* user, int hops)
                        Current->GetDesc().c_str());
 }
 
-int ModuleSpanningTree::CountServs()
-{
-       return Utils->serverlist.size();
-}
-
 void ModuleSpanningTree::HandleLinks(const std::vector<std::string>& parameters, User* user)
 {
        ShowLinks(Utils->TreeRoot,user,0);
        user->WriteNumeric(365, "%s * :End of /LINKS list.",user->nick.c_str());
-       return;
 }
 
 std::string ModuleSpanningTree::TimeToStr(time_t secs)
@@ -153,60 +138,53 @@ restart:
        {
                TreeServer *s = i->second;
 
-               if (s->GetSocket() && s->GetSocket()->GetLinkState() == DYING)
+               // Skip myself
+               if (s->IsRoot())
+                       continue;
+
+               if (s->GetSocket()->GetLinkState() == DYING)
                {
                        s->GetSocket()->Close();
                        goto restart;
                }
 
-               // Fix for bug #792, do not ping servers that are not connected yet!
-               // Remote servers have Socket == NULL and local connected servers have
-               // Socket->LinkState == CONNECTED
-               if (s->GetSocket() && s->GetSocket()->GetLinkState() != CONNECTED)
+               // Do not ping servers that are not fully connected yet!
+               // Servers which are connected to us have IsLocal() == true and if they're fully connected
+               // then Socket->LinkState == CONNECTED. Servers that are linked to another server are always fully connected.
+               if (s->IsLocal() && s->GetSocket()->GetLinkState() != CONNECTED)
                        continue;
 
                // Now do PING checks on all servers
-               TreeServer *mts = Utils->BestRouteTo(s->GetID());
-
-               if (mts)
+               // Only ping if this server needs one
+               if (curtime >= s->NextPingTime())
                {
-                       // Only ping if this server needs one
-                       if (curtime >= s->NextPingTime())
+                       // And if they answered the last
+                       if (s->AnsweredLastPing())
                        {
-                               // And if they answered the last
-                               if (s->AnsweredLastPing())
-                               {
-                                       // They did, send a ping to them
-                                       s->SetNextPingTime(curtime + Utils->PingFreq);
-                                       TreeSocket *tsock = mts->GetSocket();
-
-                                       // ... if we can find a proper route to them
-                                       if (tsock)
-                                       {
-                                               tsock->WriteLine(":" + ServerInstance->Config->GetSID() + " PING " + s->GetID());
-                                               s->LastPingMsec = ts;
-                                       }
-                               }
-                               else
+                               // They did, send a ping to them
+                               s->SetNextPingTime(curtime + Utils->PingFreq);
+                               s->GetSocket()->WriteLine(":" + ServerInstance->Config->GetSID() + " PING " + s->GetID());
+                               s->LastPingMsec = ts;
+                       }
+                       else
+                       {
+                               // They didn't answer the last ping, if they are locally connected, get rid of them.
+                               if (s->IsLocal())
                                {
-                                       // They didn't answer the last ping, if they are locally connected, get rid of them.
-                                       TreeSocket *sock = s->GetSocket();
-                                       if (sock)
-                                       {
-                                               sock->SendError("Ping timeout");
-                                               sock->Close();
-                                               goto restart;
-                                       }
+                                       TreeSocket* sock = s->GetSocket();
+                                       sock->SendError("Ping timeout");
+                                       sock->Close();
+                                       goto restart;
                                }
                        }
+               }
 
-                       // If warn on ping enabled and not warned and the difference is sufficient and they didn't answer the last ping...
-                       if ((Utils->PingWarnTime) && (!s->Warned) && (curtime >= s->NextPingTime() - (Utils->PingFreq - Utils->PingWarnTime)) && (!s->AnsweredLastPing()))
-                       {
-                               /* The server hasnt responded, send a warning to opers */
-                               ServerInstance->SNO->WriteToSnoMask('l',"Server \002%s\002 has not responded to PING for %d seconds, high latency.", s->GetName().c_str(), Utils->PingWarnTime);
-                               s->Warned = true;
-                       }
+               // If warn on ping enabled and not warned and the difference is sufficient and they didn't answer the last ping...
+               if ((Utils->PingWarnTime) && (!s->Warned) && (curtime >= s->NextPingTime() - (Utils->PingFreq - Utils->PingWarnTime)) && (!s->AnsweredLastPing()))
+               {
+                       /* The server hasnt responded, send a warning to opers */
+                       ServerInstance->SNO->WriteToSnoMask('l',"Server \002%s\002 has not responded to PING for %d seconds, high latency.", s->GetName().c_str(), Utils->PingWarnTime);
+                       s->Warned = true;
                }
        }
 }
@@ -409,6 +387,11 @@ ModResult ModuleSpanningTree::HandleConnect(const std::vector<std::string>& para
        return MOD_RES_DENY;
 }
 
+void ModuleSpanningTree::On005Numeric(std::map<std::string, std::string>& tokens)
+{
+       tokens["MAP"];
+}
+
 void ModuleSpanningTree::OnGetServerDescription(const std::string &servername,std::string &description)
 {
        TreeServer* s = Utils->FindServer(servername);
@@ -442,12 +425,12 @@ void ModuleSpanningTree::OnPostTopicChange(User* user, Channel* chan, const std:
        Utils->DoOneToMany(user->uuid,"TOPIC",params);
 }
 
-void ModuleSpanningTree::LocalMessage(User* user, void* dest, int target_type, const std::string &text, char status, const CUList &exempt_list, const char* message_type)
+void ModuleSpanningTree::OnUserMessage(User* user, void* dest, int target_type, const std::string& text, char status, const CUList& exempt_list, MessageType msgtype)
 {
-       /* Server or remote origin, dest should always be non-null */
-       if ((!user) || (!IS_LOCAL(user)) || (!dest))
+       if (!IS_LOCAL(user))
                return;
 
+       const char* message_type = (msgtype == MSG_PRIVMSG ? "PRIVMSG" : "NOTICE");
        if (target_type == TYPE_USER)
        {
                User* d = (User*) dest;
@@ -473,11 +456,6 @@ void ModuleSpanningTree::LocalMessage(User* user, void* dest, int target_type, c
        }
 }
 
-void ModuleSpanningTree::OnUserMessage(User* user, void* dest, int target_type, const std::string& text, char status, const CUList& exempt_list, MessageType msgtype)
-{
-       LocalMessage(user, dest, target_type, text, status, exempt_list, (msgtype == MSG_PRIVMSG ? "PRIVMSG" : "NOTICE"));
-}
-
 void ModuleSpanningTree::OnBackgroundTimer(time_t curtime)
 {
        AutoConnectServers(curtime);
@@ -663,7 +641,7 @@ void ModuleSpanningTree::OnPreRehash(User* user, const std::string &parameter)
        {
                parameterlist params;
                params.push_back(parameter);
-               Utils->DoOneToAllButSender(user ? user->uuid : ServerInstance->Config->GetSID(), "REHASH", params, user ? user->server : ServerInstance->Config->ServerName);
+               Utils->DoOneToAllButSender(user ? user->uuid : ServerInstance->Config->GetSID(), "REHASH", params, user ? Utils->BestRouteTo(user->server) : NULL);
        }
 }
 
@@ -703,6 +681,8 @@ void ModuleSpanningTree::OnLoadModule(Module* mod)
 
 void ModuleSpanningTree::OnUnloadModule(Module* mod)
 {
+       if (!Utils)
+               return;
        ServerInstance->PI->SendMetaData(NULL, "modules", "-" + mod->ModuleSourceFile);
 
        unsigned int items = Utils->TreeRoot->ChildCount();