]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/commands/cmd_whowas.cpp
Merge pull request #591 from SaberUK/master+config-tweaks
[user/henk/code/inspircd.git] / src / commands / cmd_whowas.cpp
index 6cd50f8b8d68c00b5fb9e29bc5b2593495e4ab65..8a1c9a820e7378d797a7f261a7a96eb1f2511f67 100644 (file)
@@ -1,35 +1,41 @@
-/*       +------------------------------------+
- *       | Inspire Internet Relay Chat Daemon |
- *       +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
  *
- *  InspIRCd: (C) 2002-2009 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ *   Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ *   Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc>
+ *   Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
  *
- * This program is free but copyrighted software; see
- *            the file COPYING for details.
+ * This file is part of InspIRCd.  InspIRCd is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation, version 2.
  *
- * ---------------------------------------------------
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+
 #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(),command.c_str());
+               user->WriteNumeric(421, "%s %s :This command has been disabled.",user->nick.c_str(),name.c_str());
                return CMD_FAILURE;
        }
 
@@ -65,8 +71,8 @@ CmdResult CommandWhowas::Handle (const std::vector<std::string>& parameters, Use
                                        user->WriteNumeric(379, "%s %s :was connecting from *@%s",
                                                user->nick.c_str(), parameters[0].c_str(), u->host.c_str());
 
-                               if (*ServerInstance->Config->HideWhoisServer && !user->HasPrivPermission("servers/auspex"))
-                                       user->WriteNumeric(312, "%s %s %s :%s",user->nick.c_str(),parameters[0].c_str(), ServerInstance->Config->HideWhoisServer, b);
+                               if (!ServerInstance->Config->HideWhoisServer.empty() && !user->HasPrivPermission("servers/auspex"))
+                                       user->WriteNumeric(312, "%s %s %s :%s",user->nick.c_str(),parameters[0].c_str(), ServerInstance->Config->HideWhoisServer.c_str(), b);
                                else
                                        user->WriteNumeric(312, "%s %s %s :%s",user->nick.c_str(),parameters[0].c_str(), u->server.c_str(), b);
                        }
@@ -97,14 +103,13 @@ std::string CommandWhowas::GetStats()
                        whowas_bytes += (sizeof(whowas_set) + ( sizeof(WhoWasGroup) * n->size() ) );
                }
        }
-       stats.assign("Whowas(MAPSETS) " +ConvToStr(whowas_size)+" ("+ConvToStr(whowas_bytes)+" bytes)");
-       return stats;
+       return "Whowas entries: " +ConvToStr(whowas_size)+" ("+ConvToStr(whowas_bytes)+" bytes)";
 }
 
 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;
        }
@@ -119,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())
@@ -148,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;
@@ -161,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;
@@ -178,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;
                        }
 
@@ -211,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;
@@ -237,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;
@@ -249,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)
@@ -264,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;
                }
 
@@ -295,49 +295,71 @@ 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);
        }
 
-       const char* 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;
-               }
-               return NULL;
+               ServerInstance->Modules->AddService(cmd);
+               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", 10, 0, 10000);
+               int NewMaxGroups = tag->getInt("maxgroups", 10240, 0, 1000000);
+               int NewMaxKeep = InspIRCd::Duration(tag->getString("maxkeep"));
+
+               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);
        }
 };