summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/commands/cmd_whowas.h41
-rw-r--r--include/ctables.h21
-rw-r--r--src/commands/cmd_nick.cpp25
-rw-r--r--src/commands/cmd_whowas.cpp75
-rw-r--r--src/configreader.cpp7
-rw-r--r--src/stats.cpp18
-rw-r--r--src/users.cpp12
7 files changed, 80 insertions, 119 deletions
diff --git a/include/commands/cmd_whowas.h b/include/commands/cmd_whowas.h
index b28f44e17..e4fc69533 100644
--- a/include/commands/cmd_whowas.h
+++ b/include/commands/cmd_whowas.h
@@ -13,20 +13,25 @@
#ifndef __CMD_WHOWAS_H__
#define __CMD_WHOWAS_H__
+#include "modules.h"
-
-// include the common header files
-
-#include "users.h"
-#include "channels.h"
-
-/* list of available internal commands */
-enum Internals
+struct WhowasRequest : public Request
{
- WHOWAS_ADD = 1,
- WHOWAS_STATS = 2,
- WHOWAS_PRUNE = 3,
- WHOWAS_MAINTAIN = 4
+ /* list of available internal commands */
+ enum Internals
+ {
+ WHOWAS_ADD = 1,
+ WHOWAS_STATS = 2,
+ WHOWAS_PRUNE = 3,
+ WHOWAS_MAINTAIN = 4
+ };
+
+ const Internals type;
+ std::string value;
+ User* user;
+
+ WhowasRequest(Module* src, Module* whowas, Internals Type) : Request(src, whowas, "WHOWAS"), type(Type)
+ {}
};
/* Forward ref for timer */
@@ -80,19 +85,11 @@ class CommandWhowas : public Command
* @return A value from CmdResult to indicate command success or failure.
*/
CmdResult Handle(const std::vector<std::string>& parameters, User *user);
- /** Handle an internal request from another command, the core, or a module
- * @param Command ID
- * @param Zero or more parameters, whos form is specified by the command ID.
- * @return Return CMD_SUCCESS on success, or CMD_FAILURE on failure.
- * If the command succeeds but should remain local to this server,
- * return CMD_LOCALONLY.
- */
- CmdResult HandleInternal(const unsigned int id, const std::deque<classbase*> &parameters);
void AddToWhoWas(User* user);
- void GetStats(Extensible* ext);
+ std::string GetStats();
void PruneWhoWas(time_t t);
void MaintainWhoWas(time_t t);
- virtual ~CommandWhowas();
+ ~CommandWhowas();
};
/** Used to hold WHOWAS information
diff --git a/include/ctables.h b/include/ctables.h
index b57a29b4d..d3baec041 100644
--- a/include/ctables.h
+++ b/include/ctables.h
@@ -179,27 +179,6 @@ class CoreExport Command : public Extensible
return ROUTE_LOCALONLY;
}
- /** Handle an internal request from another command, the core, or a module
- * @param Command ID
- * @param Zero or more parameters, whos form is specified by the command ID.
- * @return Return CMD_SUCCESS on success, or CMD_FAILURE on failure.
- */
- virtual CmdResult HandleInternal(const unsigned int /* id */, const std::deque<classbase*>& /* params */)
- {
- return CMD_INVALID;
- }
-
- /** Handle the command from a server.
- * Not currently used in this version of InspIRCd.
- * @param parameters The parameters given
- * @param servername The server name which issued the command
- * @return Return CMD_SUCCESS on success, or CMD_FAILURE on failure.
- */
- virtual CmdResult HandleServer(const std::vector<std::string>& /* parameters */, const std::string& /* servername */)
- {
- return CMD_INVALID;
- }
-
/** Encode a parameter for server->server transmission.
* Used for parameters for which the translation type is TR_CUSTOM.
* @param parameter The parameter to encode. Can be modified in place.
diff --git a/src/commands/cmd_nick.cpp b/src/commands/cmd_nick.cpp
index ecc254f17..3851b36e6 100644
--- a/src/commands/cmd_nick.cpp
+++ b/src/commands/cmd_nick.cpp
@@ -41,11 +41,10 @@
*/
class CommandNick : public Command
{
- bool allowinvalid;
public:
/** Constructor for nick.
*/
- CommandNick (InspIRCd* Instance, Module* parent) : Command(Instance,parent,"NICK", 0, 1, true, 3), allowinvalid(false) { syntax = "<newnick>"; }
+ CommandNick (InspIRCd* Instance, Module* parent) : Command(Instance,parent,"NICK", 0, 1, true, 3) { syntax = "<newnick>"; }
/** Handle command.
* @param parameters The parameters to the comamnd
* @param pcnt The number of parameters passed to teh command
@@ -53,13 +52,6 @@ class CommandNick : public Command
* @return A value from CmdResult to indicate command success or failure.
*/
CmdResult Handle(const std::vector<std::string>& parameters, User *user);
-
- /** Handle internal command
- * @param id Used to indicate if invalid nick changes are allowed.
- * Set to 1 to allow invalid nicks and 0 to deny them.
- * @param parameters Currently unused
- */
- CmdResult HandleInternal(const unsigned int id, const std::deque<classbase*> &parameters);
};
#endif
@@ -83,17 +75,16 @@ CmdResult CommandNick::Handle (const std::vector<std::string>& parameters, User
if (((!ServerInstance->IsNick(parameters[0].c_str(), ServerInstance->Config->Limits.NickMax))) && (IS_LOCAL(user)))
{
- if (!allowinvalid)
+ if (!user->GetExt("NICKForced"))
{
if (parameters[0] == "0")
{
// Special case, Fake a /nick UIDHERE. Useful for evading "ERR: NICK IN USE" on connect etc.
std::vector<std::string> p2;
- std::deque<classbase*> dummy;
p2.push_back(user->uuid);
- this->HandleInternal(1, dummy);
+ user->Extend("NICKForced");
this->Handle(p2, user);
- this->HandleInternal(0, dummy);
+ user->Shrink("NICKForced");
return CMD_SUCCESS;
}
@@ -136,7 +127,7 @@ CmdResult CommandNick::Handle (const std::vector<std::string>& parameters, User
* Also don't check Q:Lines for remote nickchanges, they should have our Q:Lines anyway to enforce themselves.
* -- w00t
*/
- if (!allowinvalid || !IS_LOCAL(user))
+ if (!IS_LOCAL(user))
{
XLine* mq = ServerInstance->XLines->MatchesLine("Q",parameters[0]);
if (mq)
@@ -251,11 +242,5 @@ CmdResult CommandNick::Handle (const std::vector<std::string>& parameters, User
}
-CmdResult CommandNick::HandleInternal(const unsigned int id, const std::deque<classbase*>&)
-{
- allowinvalid = (id != 0);
- return CMD_SUCCESS;
-}
-
COMMAND_INIT(CommandNick)
diff --git a/src/commands/cmd_whowas.cpp b/src/commands/cmd_whowas.cpp
index 5e77671a6..3df97086e 100644
--- a/src/commands/cmd_whowas.cpp
+++ b/src/commands/cmd_whowas.cpp
@@ -82,33 +82,7 @@ CmdResult CommandWhowas::Handle (const std::vector<std::string>& parameters, Use
return CMD_SUCCESS;
}
-CmdResult CommandWhowas::HandleInternal(const unsigned int id, const std::deque<classbase*> &parameters)
-{
- switch (id)
- {
- case WHOWAS_ADD:
- AddToWhoWas(static_cast<User*>(parameters[0]));
- break;
-
- case WHOWAS_STATS:
- GetStats(static_cast<Extensible*>(parameters[0]));
- break;
-
- case WHOWAS_PRUNE:
- PruneWhoWas(ServerInstance->Time());
- break;
-
- case WHOWAS_MAINTAIN:
- MaintainWhoWas(ServerInstance->Time());
- break;
-
- default:
- break;
- }
- return CMD_SUCCESS;
-}
-
-void CommandWhowas::GetStats(Extensible* ext)
+std::string CommandWhowas::GetStats()
{
int whowas_size = 0;
int whowas_bytes = 0;
@@ -123,7 +97,7 @@ void CommandWhowas::GetStats(Extensible* ext)
}
}
stats.assign("Whowas(MAPSETS) " +ConvToStr(whowas_size)+" ("+ConvToStr(whowas_bytes)+" bytes)");
- ext->Extend("stats", stats.c_str());
+ return stats;
}
void CommandWhowas::AddToWhoWas(User* user)
@@ -323,12 +297,47 @@ WhoWasGroup::~WhoWasGroup()
/* every hour, run this function which removes all entries older than Config->WhoWasMaxKeep */
void WhoWasMaintainTimer::Tick(time_t)
{
- Command* whowas_command = ServerInstance->Parser->GetHandler("WHOWAS");
- if (whowas_command)
+ Module* whowas = ServerInstance->Modules->Find("cmd_whowas.so");
+ if (whowas)
{
- std::deque<classbase*> params;
- whowas_command->HandleInternal(WHOWAS_MAINTAIN, params);
+ WhowasRequest(whowas, whowas, WhowasRequest::WHOWAS_MAINTAIN).Send();
}
}
-COMMAND_INIT(CommandWhowas)
+class ModuleWhoWas : public Module
+{
+ CommandWhowas cmd;
+ public:
+ ModuleWhoWas(InspIRCd *Me) : Module(Me), cmd(Me, this)
+ {
+ ServerInstance->AddCommand(&cmd);
+ }
+
+ const char* OnRequest(Request* request)
+ {
+ 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;
+ }
+
+ Version GetVersion()
+ {
+ return Version("WHOWAS Command", VF_VENDOR);
+ }
+};
+
+MODULE_INIT(ModuleWhoWas)
diff --git a/src/configreader.cpp b/src/configreader.cpp
index eaea3f006..a41e5d07f 100644
--- a/src/configreader.cpp
+++ b/src/configreader.cpp
@@ -442,11 +442,10 @@ static bool ValidateWhoWas(ServerConfig* conf, const char*, const char*, ValueIt
conf->GetInstance()->Logs->Log("CONFIG",DEFAULT,"WARNING: <whowas:maxkeep> value less than 3600, setting to default 3600");
}
- Command* whowas_command = conf->GetInstance()->Parser->GetHandler("WHOWAS");
- if (whowas_command)
+ Module* whowas = conf->GetInstance()->Modules->Find("cmd_whowas.so");
+ if (whowas)
{
- std::deque<classbase*> params;
- whowas_command->HandleInternal(WHOWAS_PRUNE, params);
+ WhowasRequest(NULL, whowas, WhowasRequest::WHOWAS_PRUNE).Send();
}
return true;
diff --git a/src/stats.cpp b/src/stats.cpp
index d385112c2..40ee40b18 100644
--- a/src/stats.cpp
+++ b/src/stats.cpp
@@ -157,19 +157,13 @@ void InspIRCd::DoStats(char statschar, User* user, string_list &results)
if (!this->Config->WhoWasGroupSize == 0 && !this->Config->WhoWasMaxGroups == 0)
{
- Command* whowas_command = this->Parser->GetHandler("WHOWAS");
- if (whowas_command)
+ Module* whowas = Modules->Find("cmd_whowas.so");
+ if (whowas)
{
- std::deque<classbase*> params;
- Extensible whowas_stats;
- params.push_back(&whowas_stats);
- whowas_command->HandleInternal(WHOWAS_STATS, params);
- if (whowas_stats.GetExt("stats"))
- {
- char* statc;
- whowas_stats.GetExt("stats", statc);
- results.push_back(sn+" 249 "+user->nick+" :"+ConvToStr(statc));
- }
+ WhowasRequest req(NULL, whowas, WhowasRequest::WHOWAS_STATS);
+ req.user = user;
+ req.Send();
+ results.push_back(sn+" 249 "+user->nick+" :"+req.value);
}
}
diff --git a/src/users.cpp b/src/users.cpp
index 192b4aace..22441a989 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -869,12 +869,12 @@ void User::UnOper()
/* adds or updates an entry in the whowas list */
void User::AddToWhoWas()
{
- Command* whowas_command = ServerInstance->Parser->GetHandler("WHOWAS");
- if (whowas_command)
+ Module* whowas = ServerInstance->Modules->Find("cmd_whowas.so");
+ if (whowas)
{
- std::deque<classbase*> params;
- params.push_back(this);
- whowas_command->HandleInternal(WHOWAS_ADD, params);
+ WhowasRequest req(NULL, whowas, WhowasRequest::WHOWAS_ADD);
+ req.user = this;
+ req.Send();
}
}
@@ -1045,12 +1045,10 @@ bool User::ForceNickChange(const char* newnick)
if (nickhandler) // wtfbbq, when would this not be here
{
std::vector<std::string> parameters;
- nickhandler->HandleInternal(1, dummy);
parameters.push_back(newnick);
this->Extend("NICKForced");
bool result = (ServerInstance->Parser->CallHandler("NICK", parameters, this) == CMD_SUCCESS);
this->Shrink("NICKForced");
- nickhandler->HandleInternal(0, dummy);
return result;
}