aboutsummaryrefslogtreecommitdiff
path: root/src/command_parse.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2023-05-08 12:52:08 +0100
committerGravatar Sadie Powell2023-05-08 12:52:51 +0100
commit863daf942cae8f294f32fed6e3db9d479c2fe8de (patch)
tree453d8f13e5be05cd7f3f74d394888f8ad4999800 /src/command_parse.cpp
parentMove CheckPassword to helperfuncs. (diff)
Move the contents of commands to command_parse.
Diffstat (limited to 'src/command_parse.cpp')
-rw-r--r--src/command_parse.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/command_parse.cpp b/src/command_parse.cpp
index f62400dd5..1707a173f 100644
--- a/src/command_parse.cpp
+++ b/src/command_parse.cpp
@@ -26,6 +26,16 @@
#include "inspircd.h"
+enum
+{
+ // From RFC 1459.
+ ERR_NOTREGISTERED = 451,
+ ERR_NEEDMOREPARAMS = 461,
+
+ // InspIRCd-specific.
+ RPL_SYNTAX = 650,
+};
+
bool CommandParser::LoopCall(User* user, Command* handler, const CommandBase::Params& parameters, unsigned int splithere, int extra, bool usemax)
{
if (splithere >= parameters.size())
@@ -405,3 +415,89 @@ void CommandParser::TranslateSingleParam(TranslateType to, const std::string& it
break;
}
}
+
+CommandBase::CommandBase(Module* mod, const std::string& cmd, unsigned int minpara, unsigned int maxpara)
+ : ServiceProvider(mod, cmd, SERVICE_COMMAND)
+ , min_params(minpara)
+ , max_params(maxpara)
+{
+}
+
+void CommandBase::EncodeParameter(std::string& parameter, unsigned int index)
+{
+}
+
+RouteDescriptor CommandBase::GetRouting(User* user, const Params& parameters)
+{
+ return ROUTE_LOCALONLY;
+}
+
+Command::Command(Module* mod, const std::string& cmd, unsigned int minpara, unsigned int maxpara)
+ : CommandBase(mod, cmd, minpara, maxpara)
+{
+}
+
+Command::~Command()
+{
+ ServerInstance->Parser.RemoveCommand(this);
+}
+
+void Command::RegisterService()
+{
+ if (!ServerInstance->Parser.AddCommand(this))
+ throw ModuleException(creator, "Command already exists: " + name);
+}
+
+void Command::TellNotEnoughParameters(LocalUser* user, const Params& parameters)
+{
+ user->WriteNumeric(ERR_NEEDMOREPARAMS, name, "Not enough parameters.");
+ if (ServerInstance->Config->SyntaxHints && user->IsFullyConnected())
+ {
+ for (const auto& syntaxline : this->syntax)
+ user->WriteNumeric(RPL_SYNTAX, name, syntaxline);
+ }
+}
+
+void Command::TellNotFullyConnected(LocalUser* user, const Params& parameters)
+{
+ user->WriteNumeric(ERR_NOTREGISTERED, name, "You must be fully connected to use this command.");
+}
+
+SplitCommand::SplitCommand(Module* me, const std::string& cmd, unsigned int minpara, unsigned int maxpara)
+ : Command(me, cmd, minpara, maxpara)
+{
+}
+
+CmdResult SplitCommand::Handle(User* user, const Params& parameters)
+{
+ switch (user->usertype)
+ {
+ case User::TYPE_LOCAL:
+ return HandleLocal(static_cast<LocalUser*>(user), parameters);
+
+ case User::TYPE_REMOTE:
+ return HandleRemote(static_cast<RemoteUser*>(user), parameters);
+
+ case User::TYPE_SERVER:
+ return HandleServer(static_cast<FakeUser*>(user), parameters);
+ }
+
+ ServerInstance->Logs.Debug("COMMAND", "Unknown user type {} in command (uuid={})!",
+ user->usertype, user->uuid);
+ return CmdResult::INVALID;
+}
+
+CmdResult SplitCommand::HandleLocal(LocalUser* user, const Params& parameters)
+{
+ return CmdResult::INVALID;
+}
+
+CmdResult SplitCommand::HandleRemote(RemoteUser* user, const Params& parameters)
+{
+ return CmdResult::INVALID;
+}
+
+CmdResult SplitCommand::HandleServer(FakeUser* user, const Params& parameters)
+{
+ return CmdResult::INVALID;
+}