X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcmd_whowas.cpp;h=7f78a22ac1a0c453ca2d5de01a5354fdb7d2eb5b;hb=0306a4231e85baeb5029ef2b9b36d0b5d241d147;hp=ee18b8079c4e17dcef7ffe00baa64b8cbffece25;hpb=6b9eaeba4130acb818a63782640194c7e5bcc2fa;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/cmd_whowas.cpp b/src/cmd_whowas.cpp index ee18b8079..7f78a22ac 100644 --- a/src/cmd_whowas.cpp +++ b/src/cmd_whowas.cpp @@ -11,11 +11,14 @@ * --------------------------------------------------- */ +#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 = "{,}"; - 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 ¶meters) { @@ -108,11 +105,15 @@ CmdResult cmd_whowas::HandleInternal(const unsigned int id, const std::dequeTime()); 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 params; + whowas_command->HandleInternal(WHOWAS_MAINTAIN, params); } - timer = new MaintainTimer(ServerInstance, 3600); - ServerInstance->Timers->AddTimer(timer); }