]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/cmd_whowas.cpp
Add m_cycle: server-side equivilant of /hop, except it overrides +ilk. For the curiou...
[user/henk/code/inspircd.git] / src / cmd_whowas.cpp
index ee18b8079c4e17dcef7ffe00baa64b8cbffece25..7f78a22ac1a0c453ca2d5de01a5354fdb7d2eb5b 100644 (file)
  * ---------------------------------------------------
  */
 
+#include "inspircd.h"
 #include "configreader.h"
 #include "users.h"
 #include "commands/cmd_whowas.h"
 
-extern "C" command_t* init_command(InspIRCd* Instance)
+WhoWasMaintainTimer * timer;
+
+extern "C" DllExport command_t* init_command(InspIRCd* Instance)
 {
        return new cmd_whowas(Instance);
 }
@@ -24,7 +27,7 @@ cmd_whowas::cmd_whowas(InspIRCd* Instance)
 : command_t(Instance, "WHOWAS", 0, 1)
 {
        syntax = "<nick>{,<nick>}";
-       timer = new MaintainTimer(Instance, 3600);
+       timer = new WhoWasMaintainTimer(Instance, 3600);
        Instance->Timers->AddTimer(timer);
 }
 
@@ -36,27 +39,22 @@ CmdResult cmd_whowas::Handle (const char** parameters, int pcnt, userrec* user)
                user->WriteServ("421 %s %s :This command has been disabled.",user->nick,command.c_str());
                return CMD_FAILURE;
        }
-                        
-       whowas_users::iterator i = whowas.find(parameters[0]);
 
-       ServerInstance->Log(DEBUG,"Entered cmd_whowas");
+       whowas_users::iterator i = whowas.find(parameters[0]);
 
        if (i == whowas.end())
        {
-               ServerInstance->Log(DEBUG,"No such nick in whowas");
                user->WriteServ("406 %s %s :There was no such nickname",user->nick,parameters[0]);
                user->WriteServ("369 %s %s :End of WHOWAS",user->nick,parameters[0]);
                return CMD_FAILURE;
        }
        else
        {
-               ServerInstance->Log(DEBUG,"Whowas set found");
                whowas_set* grp = i->second;
                if (grp->size())
                {
                        for (whowas_set::iterator ux = grp->begin(); ux != grp->end(); ux++)
                        {
-                               ServerInstance->Log(DEBUG,"Spool whowas entry");
                                WhoWasGroup* u = *ux;
                                time_t rawtime = u->signon;
                                tm *timeinfo;
@@ -70,10 +68,10 @@ CmdResult cmd_whowas::Handle (const char** parameters, int pcnt, userrec* user)
 
                                user->WriteServ("314 %s %s %s %s * :%s",user->nick,parameters[0],u->ident,u->dhost,u->gecos);
                                
-                               if(*user->oper)
+                               if (IS_OPER(user))
                                        user->WriteServ("379 %s %s :was connecting from *@%s", user->nick, parameters[0], u->host);
                                
-                               if(*ServerInstance->Config->HideWhoisServer && !(*user->oper))
+                               if (*ServerInstance->Config->HideWhoisServer && !IS_OPER(user))
                                        user->WriteServ("312 %s %s %s :%s",user->nick,parameters[0], ServerInstance->Config->HideWhoisServer, b);
                                else
                                        user->WriteServ("312 %s %s %s :%s",user->nick,parameters[0], u->server, b);
@@ -81,7 +79,6 @@ CmdResult cmd_whowas::Handle (const char** parameters, int pcnt, userrec* user)
                }
                else
                {
-                       ServerInstance->Log(DEBUG,"Oops, empty whowas set found");
                        user->WriteServ("406 %s %s :There was no such nickname",user->nick,parameters[0]);
                        user->WriteServ("369 %s %s :End of WHOWAS",user->nick,parameters[0]);
                        return CMD_FAILURE;
@@ -90,7 +87,7 @@ CmdResult cmd_whowas::Handle (const char** parameters, int pcnt, userrec* user)
 
        user->WriteServ("369 %s %s :End of WHOWAS",user->nick,parameters[0]);
        return CMD_SUCCESS;
-};
+}
 
 CmdResult cmd_whowas::HandleInternal(const unsigned int id, const std::deque<classbase*> &parameters)
 {
@@ -108,11 +105,15 @@ CmdResult cmd_whowas::HandleInternal(const unsigned int id, const std::deque<cla
                        PruneWhoWas(ServerInstance->Time());
                break;
 
+               case WHOWAS_MAINTAIN:
+                       MaintainWhoWas(ServerInstance->Time());
+               break;
+
                default:
                break;
        }
        return CMD_SUCCESS;
-};
+}
 
 void cmd_whowas::GetStats(Extensible* ext)
 {
@@ -141,12 +142,8 @@ void cmd_whowas::AddToWhoWas(userrec* user)
 
        whowas_users::iterator iter = whowas.find(user->nick);
 
-       ServerInstance->Log(DEBUG,"Add to whowas lists");
-
        if (iter == whowas.end())
        {
-               ServerInstance->Log(DEBUG,"Adding new whowas set for %s",user->nick);
-
                whowas_set* n = new whowas_set;
                WhoWasGroup *a = new WhoWasGroup(user);
                n->push_back(a);
@@ -155,8 +152,6 @@ void cmd_whowas::AddToWhoWas(userrec* user)
 
                if ((int)(whowas.size()) > ServerInstance->Config->WhoWasMaxGroups)
                {
-                       ServerInstance->Log(DEBUG,"Maxgroups of %d reached deleting oldest group '%s'",ServerInstance->Config->WhoWasMaxGroups, whowas_fifo[0].second.c_str());
-
                        whowas_users::iterator iter = whowas.find(whowas_fifo[0].second);
                        if (iter != whowas.end())
                        {
@@ -170,6 +165,7 @@ void cmd_whowas::AddToWhoWas(userrec* user)
                                                n->pop_front();
                                        }
                                }
+                               DELETE(n);
                                whowas.erase(iter);
                        }
                        whowas_fifo.pop_front();
@@ -178,15 +174,11 @@ void cmd_whowas::AddToWhoWas(userrec* user)
        else
        {
                whowas_set* group = (whowas_set*)iter->second;
-
-               ServerInstance->Log(DEBUG,"Using existing whowas group for %s",user->nick);
-
                WhoWasGroup *a = new WhoWasGroup(user);
                group->push_back(a);
 
                if ((int)(group->size()) > ServerInstance->Config->WhoWasGroupSize)
                {
-                       ServerInstance->Log(DEBUG,"Trimming existing group '%s' to %d entries",user->nick, ServerInstance->Config->WhoWasGroupSize);
                        WhoWasGroup *a = (WhoWasGroup*)*(group->begin());
                        DELETE(a);
                        group->pop_front();
@@ -214,7 +206,7 @@ void cmd_whowas::PruneWhoWas(time_t t)
                        if (iter == whowas.end())
                        {
                                /* this should never happen, if it does maps are corrupt */
-                               ServerInstance->Log(DEBUG, "Whowas maps got corrupted! (1)");
+                               ServerInstance->Log(DEBUG, "BUG: Whowas maps got corrupted! (1)");
                                return;
                        }
                        whowas_set* n = (whowas_set*)iter->second;
@@ -244,7 +236,7 @@ void cmd_whowas::PruneWhoWas(time_t t)
                if (iter == whowas.end())
                {
                        /* this should never happen, if it does maps are corrupt */
-                       ServerInstance->Log(DEBUG, "Whowas maps got corrupted! (2)");
+                       ServerInstance->Log(DEBUG, "BUG: Whowas maps got corrupted! (2)");
                        return;
                }
                whowas_set* n = (whowas_set*)iter->second;
@@ -262,6 +254,24 @@ void cmd_whowas::PruneWhoWas(time_t t)
        }
 }
 
+/* call maintain once an hour to remove expired nicks */
+void cmd_whowas::MaintainWhoWas(time_t t)
+{
+       for (whowas_users::iterator iter = whowas.begin(); iter != whowas.end(); iter++)
+       {
+               whowas_set* n = (whowas_set*)iter->second;
+               if (n->size())
+               {
+                       while ((n->begin() != n->end()) && ((*n->begin())->signon < t - ServerInstance->Config->WhoWasMaxKeep))
+                       {
+                               WhoWasGroup *a = *(n->begin());
+                               DELETE(a);
+                               n->erase(n->begin());
+                       }
+               }
+       }
+}
+
 cmd_whowas::~cmd_whowas()
 {
        if (timer)
@@ -278,7 +288,7 @@ cmd_whowas::~cmd_whowas()
                if (iter == whowas.end())
                {
                        /* this should never happen, if it does maps are corrupt */
-                       ServerInstance->Log(DEBUG, "Whowas maps got corrupted! (1)");
+                       ServerInstance->Log(DEBUG, "BUG: Whowas maps got corrupted! (3)");
                        return;
                }
                whowas_set* n = (whowas_set*)iter->second;
@@ -319,21 +329,12 @@ WhoWasGroup::~WhoWasGroup()
 }
 
 /* every hour, run this function which removes all entries older than Config->WhoWasMaxKeep */
-void MaintainTimer::Tick(time_t t)
+void WhoWasMaintainTimer::Tick(time_t t)
 {
-       for (whowas_users::iterator iter = whowas.begin(); iter != whowas.end(); iter++)
+       command_t* whowas_command = ServerInstance->Parser->GetHandler("WHOWAS");
+       if (whowas_command)
        {
-               whowas_set* n = (whowas_set*)iter->second;
-               if (n->size())
-               {
-                       while ((n->begin() != n->end()) && ((*n->begin())->signon < t - ServerInstance->Config->WhoWasMaxKeep))
-                       {
-                               WhoWasGroup *a = *(n->begin());
-                               DELETE(a);
-                               n->erase(n->begin());
-                       }
-               }
+               std::deque<classbase*> params;
+               whowas_command->HandleInternal(WHOWAS_MAINTAIN, params);
        }
-       timer = new MaintainTimer(ServerInstance, 3600);
-       ServerInstance->Timers->AddTimer(timer);
 }