]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/commands/cmd_whowas.cpp
Channel::KickUser() and cmd_kick changes
[user/henk/code/inspircd.git] / src / commands / cmd_whowas.cpp
index c7cb8efb410922fb3c227820d183ffbb14e08cda..a973e44ccc20b9d66b3da00ebeff3a3ecf8292d2 100644 (file)
 #include "inspircd.h"
 #include "commands/cmd_whowas.h"
 
-WhoWasMaintainTimer * timer;
-
-CommandWhowas::CommandWhowas( Module* parent) : Command(parent, "WHOWAS", 1)
+CommandWhowas::CommandWhowas( Module* parent)
+       : Command(parent, "WHOWAS", 1), WhoWasGroupSize(0), WhoWasMaxGroups(0), WhoWasMaxKeep(0)
 {
        syntax = "<nick>{,<nick>}";
        Penalty = 2;
-       timer = new WhoWasMaintainTimer(3600);
-       ServerInstance->Timers->AddTimer(timer);
 }
 
 CmdResult CommandWhowas::Handle (const std::vector<std::string>& parameters, User* user)
 {
        /* if whowas disabled in config */
-       if (ServerInstance->Config->WhoWasGroupSize == 0 || ServerInstance->Config->WhoWasMaxGroups == 0)
+       if (this->WhoWasGroupSize == 0 || this->WhoWasMaxGroups == 0)
        {
                user->WriteNumeric(421, "%s %s :This command has been disabled.",user->nick.c_str(),name.c_str());
                return CMD_FAILURE;
@@ -112,7 +109,7 @@ std::string CommandWhowas::GetStats()
 void CommandWhowas::AddToWhoWas(User* user)
 {
        /* if whowas disabled */
-       if (ServerInstance->Config->WhoWasGroupSize == 0 || ServerInstance->Config->WhoWasMaxGroups == 0)
+       if (this->WhoWasGroupSize == 0 || this->WhoWasMaxGroups == 0)
        {
                return;
        }
@@ -127,7 +124,7 @@ void CommandWhowas::AddToWhoWas(User* user)
                whowas[user->nick.c_str()] = n;
                whowas_fifo.push_back(std::make_pair(ServerInstance->Time(),user->nick.c_str()));
 
-               if ((int)(whowas.size()) > ServerInstance->Config->WhoWasMaxGroups)
+               if ((int)(whowas.size()) > this->WhoWasMaxGroups)
                {
                        whowas_users::iterator iter2 = whowas.find(whowas_fifo[0].second);
                        if (iter2 != whowas.end())
@@ -156,7 +153,7 @@ void CommandWhowas::AddToWhoWas(User* user)
                WhoWasGroup *a = new WhoWasGroup(user);
                group->push_back(a);
 
-               if ((int)(group->size()) > ServerInstance->Config->WhoWasGroupSize)
+               if ((int)(group->size()) > this->WhoWasGroupSize)
                {
                        WhoWasGroup *a2 = (WhoWasGroup*)*(group->begin());
                        delete a2;
@@ -169,9 +166,9 @@ void CommandWhowas::AddToWhoWas(User* user)
 void CommandWhowas::PruneWhoWas(time_t t)
 {
        /* config values */
-       int groupsize = ServerInstance->Config->WhoWasGroupSize;
-       int maxgroups = ServerInstance->Config->WhoWasMaxGroups;
-       int maxkeep =   ServerInstance->Config->WhoWasMaxKeep;
+       int groupsize = this->WhoWasGroupSize;
+       int maxgroups = this->WhoWasMaxGroups;
+       int maxkeep =   this->WhoWasMaxKeep;
 
        /* first cut the list to new size (maxgroups) and also prune entries that are timed out. */
        whowas_users::iterator iter;
@@ -186,7 +183,7 @@ void CommandWhowas::PruneWhoWas(time_t t)
                        if (iter == whowas.end())
                        {
                                /* this should never happen, if it does maps are corrupt */
-                               ServerInstance->Logs->Log("WHOWAS",DEFAULT, "BUG: Whowas maps got corrupted! (1)");
+                               ServerInstance->Logs->Log("WHOWAS", LOG_DEFAULT, "BUG: Whowas maps got corrupted! (1)");
                                return;
                        }
 
@@ -219,7 +216,7 @@ void CommandWhowas::PruneWhoWas(time_t t)
                if (iter == whowas.end())
                {
                        /* this should never happen, if it does maps are corrupt */
-                       ServerInstance->Logs->Log("WHOWAS",DEFAULT, "BUG: Whowas maps got corrupted! (2)");
+                       ServerInstance->Logs->Log("WHOWAS", LOG_DEFAULT, "BUG: Whowas maps got corrupted! (2)");
                        return;
                }
                whowas_set* n = (whowas_set*)iter->second;
@@ -245,7 +242,7 @@ void CommandWhowas::MaintainWhoWas(time_t t)
                whowas_set* n = (whowas_set*)iter->second;
                if (n->size())
                {
-                       while ((n->begin() != n->end()) && ((*n->begin())->signon < t - ServerInstance->Config->WhoWasMaxKeep))
+                       while ((n->begin() != n->end()) && ((*n->begin())->signon < t - this->WhoWasMaxKeep))
                        {
                                WhoWasGroup *a = *(n->begin());
                                delete a;
@@ -257,11 +254,6 @@ void CommandWhowas::MaintainWhoWas(time_t t)
 
 CommandWhowas::~CommandWhowas()
 {
-       if (timer)
-       {
-               ServerInstance->Timers->DelTimer(timer);
-       }
-
        whowas_users::iterator iter;
        int fifosize;
        while ((fifosize = (int)whowas_fifo.size()) > 0)
@@ -272,7 +264,7 @@ CommandWhowas::~CommandWhowas()
                if (iter == whowas.end())
                {
                        /* this should never happen, if it does maps are corrupt */
-                       ServerInstance->Logs->Log("WHOWAS",DEFAULT, "BUG: Whowas maps got corrupted! (3)");
+                       ServerInstance->Logs->Log("WHOWAS", LOG_DEFAULT, "BUG: Whowas maps got corrupted! (3)");
                        return;
                }
 
@@ -303,48 +295,75 @@ WhoWasGroup::~WhoWasGroup()
 {
 }
 
-/* every hour, run this function which removes all entries older than Config->WhoWasMaxKeep */
-void WhoWasMaintainTimer::Tick(time_t)
+class ModuleWhoWas : public Module
 {
-       Module* whowas = ServerInstance->Modules->Find("cmd_whowas.so");
-       if (whowas)
+       CommandWhowas cmd;
+
+       void RangeCheck(int& value, int min, int max, int def, const char* msg)
        {
-               WhowasRequest(whowas, whowas, WhowasRequest::WHOWAS_MAINTAIN).Send();
+               // From ConfigReader
+               if (value >= min && value <= max)
+                       return;
+
+               ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "WARNING: %s value of %d is not between %d and %d; set to %d.", msg, value, min, max, def);
+               value = def;
        }
-}
 
-class ModuleWhoWas : public Module
-{
-       CommandWhowas cmd;
  public:
        ModuleWhoWas() : cmd(this)
        {
-               ServerInstance->AddCommand(&cmd);
        }
 
-       void OnRequest(Request& request)
+       void init()
        {
-               WhowasRequest& req = static_cast<WhowasRequest&>(request);
-               switch (req.type)
-               {
-                       case WhowasRequest::WHOWAS_ADD:
-                               cmd.AddToWhoWas(req.user);
-                               break;
-                       case WhowasRequest::WHOWAS_STATS:
-                               req.value = cmd.GetStats();
-                               break;
-                       case WhowasRequest::WHOWAS_PRUNE:
-                               cmd.PruneWhoWas(ServerInstance->Time());
-                               break;
-                       case WhowasRequest::WHOWAS_MAINTAIN:
-                               cmd.MaintainWhoWas(ServerInstance->Time());
-                               break;
-               }
+               ServerInstance->Modules->AddService(cmd);
+               Implementation eventlist[] = { I_OnGarbageCollect, I_OnUserQuit, I_OnStats, I_OnRehash };
+               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
+               OnRehash(NULL);
+       }
+
+       void OnGarbageCollect()
+       {
+               /* Removes all entries older than WhoWasMaxKeep */
+               cmd.MaintainWhoWas(ServerInstance->Time());
+       }
+
+       void OnUserQuit(User* user, const std::string& message, const std::string& oper_message)
+       {
+               cmd.AddToWhoWas(user);
+       }
+
+       ModResult OnStats(char symbol, User* user, string_list &results)
+       {
+               if (symbol == 'z')
+                       results.push_back(ServerInstance->Config->ServerName+" 249 "+user->nick+" :"+cmd.GetStats());
+
+               return MOD_RES_PASSTHRU;
+       }
+
+       void OnRehash(User* user)
+       {
+               ConfigTag* tag = ServerInstance->Config->ConfValue("whowas");
+               int NewGroupSize = tag->getInt("groupsize");
+               int NewMaxGroups = tag->getInt("maxgroups");
+               int NewMaxKeep = InspIRCd::Duration(tag->getString("maxkeep"));
+
+               RangeCheck(NewGroupSize, 0, 10000, 10, "<whowas:groupsize>");
+               RangeCheck(NewMaxGroups, 0, 1000000, 10240, "<whowas:maxgroups>");
+               RangeCheck(NewMaxKeep, 3600, INT_MAX, 3600, "<whowas:maxkeep>");
+
+               if ((NewGroupSize == cmd.WhoWasGroupSize) && (NewMaxGroups == cmd.WhoWasMaxGroups) && (NewMaxKeep == cmd.WhoWasMaxKeep))
+                       return;
+
+               cmd.WhoWasGroupSize = NewGroupSize;
+               cmd.WhoWasMaxGroups = NewMaxGroups;
+               cmd.WhoWasMaxKeep = NewMaxKeep;
+               cmd.PruneWhoWas(ServerInstance->Time());
        }
 
        Version GetVersion()
        {
-               return Version("WHOWAS Command", VF_VENDOR);
+               return Version("WHOWAS", VF_VENDOR);
        }
 };