diff options
| author | 2023-05-08 12:52:08 +0100 | |
|---|---|---|
| committer | 2023-05-08 12:52:51 +0100 | |
| commit | 863daf942cae8f294f32fed6e3db9d479c2fe8de (patch) | |
| tree | 453d8f13e5be05cd7f3f74d394888f8ad4999800 /src/command_parse.cpp | |
| parent | Move 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.cpp | 96 |
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; +} |
