]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/main.cpp
Added ability to send and receive a challenge, dont do anything with it yet
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / main.cpp
index 9cf068f92956d865d384b02845e5db46a57d0131..9205077cf8e6ef6a9f147af97c8896eb4334213e 100644 (file)
@@ -50,6 +50,9 @@ ModuleSpanningTree::ModuleSpanningTree(InspIRCd* Me)
        }
        else
                SyncTimer = NULL;
+
+       RefreshTimer = new CacheRefreshTimer(ServerInstance, Utils);
+       ServerInstance->Timers->AddTimer(RefreshTimer);
 }
 
 void ModuleSpanningTree::ShowLinks(TreeServer* Current, userrec* user, int hops)
@@ -61,7 +64,7 @@ void ModuleSpanningTree::ShowLinks(TreeServer* Current, userrec* user, int hops)
        }
        for (unsigned int q = 0; q < Current->ChildCount(); q++)
        {
-               if ((Utils->HideULines) && (ServerInstance->ULine(Current->GetChild(q)->GetName().c_str())))
+               if ((Current->GetChild(q)->Hidden) || ((Utils->HideULines) && (ServerInstance->ULine(Current->GetChild(q)->GetName().c_str()))))
                {
                        if (*user->oper)
                        {
@@ -74,9 +77,16 @@ void ModuleSpanningTree::ShowLinks(TreeServer* Current, userrec* user, int hops)
                }
        }
        /* Don't display the line if its a uline, hide ulines is on, and the user isnt an oper */
-       if ((Utils->HideULines) && (ServerInstance->ULine(Current->GetName().c_str())) && (!*user->oper))
+       if ((Utils->HideULines) && (ServerInstance->ULine(Current->GetName().c_str())) && (!IS_OPER(user)))
+               return;
+       /* Or if the server is hidden and they're not an oper */
+       else if ((Current->Hidden) && (!IS_OPER(user)))
                return;
-       user->WriteServ("364 %s %s %s :%d %s",user->nick,Current->GetName().c_str(),(Utils->FlatLinks && (!*user->oper)) ? ServerInstance->Config->ServerName : Parent.c_str(),(Utils->FlatLinks && (!*user->oper)) ? 0 : hops,Current->GetDesc().c_str());
+
+       user->WriteServ("364 %s %s %s :%d %s",  user->nick,Current->GetName().c_str(),
+                       (Utils->FlatLinks && (!IS_OPER(user))) ? ServerInstance->Config->ServerName : Parent.c_str(),
+                       (Utils->FlatLinks && (!IS_OPER(user))) ? 0 : hops,
+                       Current->GetDesc().c_str());
 }
 
 int ModuleSpanningTree::CountLocalServs()
@@ -137,8 +147,23 @@ void ModuleSpanningTree::HandleLusers(const char** parameters, int pcnt, userrec
        return;
 }
 
+const std::string ModuleSpanningTree::MapOperInfo(TreeServer* Current)
+{
+       time_t secs_up = ServerInstance->Time() - Current->age;
+       time_t mins_up = secs_up / 60;
+       time_t hours_up = mins_up / 60;
+       time_t days_up = hours_up / 24;
+       secs_up = secs_up % 60;
+       mins_up = mins_up % 60;
+       hours_up = hours_up % 24;
+       return (" [Up: "+ (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]");
+}
+
 // WARNING: NOT THREAD SAFE - DONT GET ANY SMART IDEAS.
-void ModuleSpanningTree::ShowMap(TreeServer* Current, userrec* user, int depth, char matrix[128][80], float &totusers, float &totservers)
+void ModuleSpanningTree::ShowMap(TreeServer* Current, userrec* user, int depth, char matrix[128][128], float &totusers, float &totservers)
 {
        if (line < 128)
        {
@@ -158,7 +183,10 @@ void ModuleSpanningTree::ShowMap(TreeServer* Current, userrec* user, int depth,
                        spacer[5] = '\0';
                }
                float percent;
-               char text[80];
+               char text[128];
+               /* Neat and tidy default values, as we're dealing with a matrix not a simple string */
+               memset(text, 0, 128);
+
                if (ServerInstance->clientlist->size() == 0) {
                        // If there are no users, WHO THE HELL DID THE /MAP?!?!?!
                        percent = 0;
@@ -167,14 +195,15 @@ void ModuleSpanningTree::ShowMap(TreeServer* Current, userrec* user, int depth,
                {
                        percent = ((float)Current->GetUserCount() / (float)ServerInstance->clientlist->size()) * 100;
                }
-               snprintf(text, 80, "%s %s%5d [%5.2f%%]", Current->GetName().c_str(), spacer, Current->GetUserCount(), percent);
+               const std::string operdata = IS_OPER(user) ? MapOperInfo(Current) : "";
+               snprintf(text, 126, "%s %s%5d [%5.2f%%]%s", Current->GetName().c_str(), spacer, Current->GetUserCount(), percent, operdata.c_str());
                totusers += Current->GetUserCount();
                totservers++;
-               strlcpy(&matrix[line][depth],text,80);
+               strlcpy(&matrix[line][depth],text,126);
                line++;
                for (unsigned int q = 0; q < Current->ChildCount(); q++)
                {
-                       if ((Utils->HideULines) && (ServerInstance->ULine(Current->GetChild(q)->GetName().c_str())))
+                       if ((Current->GetChild(q)->Hidden) || ((Utils->HideULines) && (ServerInstance->ULine(Current->GetChild(q)->GetName().c_str()))))
                        {
                                if (*user->oper)
                                {
@@ -289,7 +318,7 @@ void ModuleSpanningTree::HandleMap(const char** parameters, int pcnt, userrec* u
        // client does not provide for a proper terminal.
        float totusers = 0;
        float totservers = 0;
-       char matrix[128][80];
+       char matrix[128][128];
        for (unsigned int t = 0; t < 128; t++)
        {
                matrix[t][0] = '\0';
@@ -433,6 +462,7 @@ void ModuleSpanningTree::DoPingChecks(time_t curtime)
                                {
                                        sock->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" PING "+serv->GetName());
                                        serv->SetNextPingTime(curtime + 60);
+                                       serv->LastPing = curtime;
                                }
                                else
                                {
@@ -1277,6 +1307,8 @@ ModuleSpanningTree::~ModuleSpanningTree()
        if (SyncTimer)
                ServerInstance->Timers->DelTimer(SyncTimer);
 
+       ServerInstance->Timers->DelTimer(RefreshTimer);
+
        ServerInstance->DoneWithInterface("InspSocketHook");
 }