X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommands%2Fcmd_whowas.cpp;h=a973e44ccc20b9d66b3da00ebeff3a3ecf8292d2;hb=882084defcc43c876ecb10e30086b63ac074fcad;hp=21c30d742e457c3b714104e3eb0cb17b1b521636;hpb=fb3964d5c007900061e86e392ceb786bd47260c0;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/commands/cmd_whowas.cpp b/src/commands/cmd_whowas.cpp index 21c30d742..a973e44cc 100644 --- a/src/commands/cmd_whowas.cpp +++ b/src/commands/cmd_whowas.cpp @@ -1,33 +1,39 @@ -/* +------------------------------------+ - * | 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 + * Copyright (C) 2008 Thomas Stagner + * Copyright (C) 2008 Craig Edwards + * Copyright (C) 2007-2008 Robin Burchell * - * 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 . */ + #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 = "{,}"; Penalty = 2; - timer = new WhoWasMaintainTimer(3600); - ServerInstance->Timers->AddTimer(timer); } CmdResult CommandWhowas::Handle (const std::vector& 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; @@ -103,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; } @@ -118,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()) @@ -147,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; @@ -160,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; @@ -177,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; } @@ -210,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; @@ -236,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; @@ -248,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) @@ -263,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; } @@ -294,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(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, ""); + RangeCheck(NewMaxGroups, 0, 1000000, 10240, ""); + RangeCheck(NewMaxKeep, 3600, INT_MAX, 3600, ""); + + 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); } };