]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree.cpp
Added User Counts to /map
[user/henk/code/inspircd.git] / src / modules / m_spanningtree.cpp
index fdcb0a43297c2e8c8d599f2d7cdba10befa9050a..ea5d0664afb981230167afe884559be31b740534 100644 (file)
@@ -334,6 +334,16 @@ class TreeServer
                return UserCount;
        }
 
+       void AddUserCount()
+       {
+               UserCount++;
+       }
+
+       void DelUserCount()
+       {
+               UserCount--;
+       }
+
        int GetOperCount()
        {
                return OperCount;
@@ -1054,6 +1064,13 @@ class TreeSocket : public InspSocket
                }
                params[7] = ":" + params[7];
                DoOneToAllButSender(source,"NICK",params,source);
+
+               // Increment the Source Servers User Count..
+               TreeServer* SourceServer = FindServer(source);
+               if (SourceServer) {
+                       SourceServer->AddUserCount();
+               }
+
                return true;
        }
 
@@ -1236,7 +1253,8 @@ class TreeSocket : public InspSocket
                                std::string ret = "";
                                while ((*line != '\n') && (strlen(line)))
                                {
-                                       ret = ret + *line;
+                                       if ((*line != '\r') && (*line != '\n'))
+                                               ret = ret + *line;
                                        line++;
                                }
                                if ((*line == '\n') || (*line == '\r'))
@@ -2349,7 +2367,22 @@ void ReadConfiguration(bool rebind)
                }
                else
                {
-                       log(DEFAULT,"m_spanningtree: Invalid configuration for server '%s', ignored!",L.Name.c_str());
+                       if (L.RecvPass == "")
+                       {
+                               log(DEFAULT,"Invalid configuration for server '%s', recvpass not defined!",L.Name.c_str());
+                       }
+                       else if (L.SendPass == "")
+                       {
+                               log(DEFAULT,"Invalid configuration for server '%s', sendpass not defined!",L.Name.c_str());
+                       }
+                       else if (L.Name == "")
+                       {
+                               log(DEFAULT,"Invalid configuration, link tag without a name!");
+                       }
+                       else if (!L.Port)
+                       {
+                               log(DEFAULT,"Invalid configuration for server '%s', no port specified!",L.Name.c_str());
+                       }
                }
        }
        delete Conf;
@@ -2427,7 +2460,28 @@ class ModuleSpanningTree : public Module
                        {
                                matrix[line][t] = ' ';
                        }
-                       strlcpy(&matrix[line][depth],Current->GetName().c_str(),80);
+
+                       // For Aligning, we need to work out exactly how deep this thing is, and produce
+                       // a 'Spacer' String to compensate.
+                       char spacer[40];
+
+                       memset(spacer,' ',40);
+                       if ((40 - Current->GetName().length() - depth) > 1) {
+                               spacer[40 - Current->GetName().length() - depth] = '\0';
+                       } else {
+                               spacer[5] = '\0';
+                       }
+
+                       float percent;
+                       char text[80];
+                       if (clientlist.size() == 0) {
+                               // If there are no users, WHO THE HELL DID THE /MAP?!?!?!
+                               percent = 0;
+                       } else {
+                               percent = ((float)Current->GetUserCount() / (float)clientlist.size()) * 100;
+                       }
+                       snprintf(text, 80, "%s %s%d [%.2f%%]", Current->GetName().c_str(), spacer, Current->GetUserCount(), percent);
+                       strlcpy(&matrix[line][depth],text,80);
                        line++;
                        for (unsigned int q = 0; q < Current->ChildCount(); q++)
                        {
@@ -2914,6 +2968,13 @@ class ModuleSpanningTree : public Module
                        params.push_back(user->ip);
                        params.push_back(":"+std::string(user->fullname));
                        DoOneToMany(Srv->GetServerName(),"NICK",params);
+
+                       // User is Local, change needs to be reflected!
+                       TreeServer* SourceServer = FindServer(user->server);
+                       if (SourceServer) {
+                               SourceServer->AddUserCount();
+                       }
+
                }
        }
 
@@ -2925,6 +2986,12 @@ class ModuleSpanningTree : public Module
                        params.push_back(":"+reason);
                        DoOneToMany(user->nick,"QUIT",params);
                }
+               // Regardless, We need to modify the user Counts..
+               TreeServer* SourceServer = FindServer(user->server);
+               if (SourceServer) {
+                       SourceServer->DelUserCount();
+               }
+
        }
 
        virtual void OnUserPostNick(userrec* user, std::string oldnick)