/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2012-2015, 2018 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2012-2013, 2017-2018, 2020 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2012 Robby <robby@chatbelgie.be>
+ * Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
* Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
+ * Copyright (C) 2007-2008 Robin Burchell <robin+git@viroteck.net>
* Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- * Copyright (C) 2003, 2007 Craig Edwards <craigedwards@brainbox.cc>
+ * Copyright (C) 2003, 2006-2010 Craig Edwards <brain@inspircd.org>
*
* 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
class CoreExport CommandBase : public ServiceProvider
{
public:
- /** User flags needed to execute the command or 0
- */
- unsigned char flags_needed;
+ /** Encapsulates parameters to a command. */
+ class Params : public std::vector<std::string>
+ {
+ private:
+ /* IRCv3 message tags. */
+ ClientProtocol::TagMap tags;
+
+ public:
+ /** Initializes a new instance from parameter and tag references.
+ * @param paramsref Message parameters.
+ * @param tagsref IRCv3 message tags.
+ */
+ Params(const std::vector<std::string>& paramsref, const ClientProtocol::TagMap& tagsref)
+ : std::vector<std::string>(paramsref)
+ , tags(tagsref)
+ {
+ }
+
+ /** Initializes a new instance from parameter iterators.
+ * @param first The first element in the parameter array.
+ * @param last The last element in the parameter array.
+ */
+ template<typename Iterator>
+ Params(Iterator first, Iterator last)
+ : std::vector<std::string>(first, last)
+ {
+ }
+
+ /** Initializes a new empty instance. */
+ Params() { }
+
+ /** Retrieves the IRCv3 message tags. */
+ const ClientProtocol::TagMap& GetTags() const { return tags; }
+ ClientProtocol::TagMap& GetTags() { return tags; }
+ };
/** Minimum number of parameters command takes
*/
*/
const unsigned int max_params;
- /** used by /stats m
- */
- unsigned long use_count;
-
- /** True if the command is disabled to non-opers
- */
- bool disabled;
-
- /** True if the command can be issued before registering
- */
- bool works_before_reg;
-
/** True if the command allows an empty last parameter.
* When false and the last parameter is empty, it's popped BEFORE
* checking there are enough params, etc. (i.e. the handler won't
*/
bool allow_empty_last_param;
- /** Syntax string for the command, displayed if non-empty string.
- * This takes place of the text in the 'not enough parameters' numeric.
- */
- std::string syntax;
-
/** Translation type list for possible parameters, used to tokenize
* parameters into UIDs and SIDs etc.
*/
std::vector<TranslateType> translation;
- /** How many seconds worth of penalty does this command have?
- */
- unsigned int Penalty;
-
/** Create a new command.
* @param me The module which created this command.
* @param cmd Command name. This must be UPPER CASE.
* @param minpara Minimum parameters required for the command.
* @param maxpara Maximum number of parameters this command may have - extra parameters
- * will be tossed into one last space-seperated param.
+ * will be tossed into one last space-separated param.
*/
CommandBase(Module* me, const std::string& cmd, unsigned int minpara = 0, unsigned int maxpara = 0);
- virtual RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters);
+ virtual RouteDescriptor GetRouting(User* user, const CommandBase::Params& parameters);
/** Encode a parameter for server->server transmission.
* Used for parameters for which the translation type is TR_CUSTOM.
*/
virtual void EncodeParameter(std::string& parameter, unsigned int index);
- /** Disable or enable this command.
- * @param setting True to disable the command.
- */
- void Disable(bool setting)
- {
- disabled = setting;
- }
-
- /** Obtain this command's disable state.
- * @return true if the command is currently disabled
- * (disabled commands can be used only by operators)
- */
- bool IsDisabled()
- {
- return disabled;
- }
-
- /** @return true if the command works before registration.
- */
- bool WorksBeforeReg()
- {
- return works_before_reg;
- }
-
virtual ~CommandBase();
};
class CoreExport Command : public CommandBase
{
- public:
- /** If true, the command will not be forwarded by the linking module even if it comes via ENCAP.
- * Can be used to forward commands before their effects.
+ protected:
+ /** Initializes a new instance of the Command class.
+ * @param me The module which created this instance.
+ * @param cmd The name of the command.
+ * @param minpara The minimum number of parameters that the command accepts.
+ * @param maxpara The maximum number of parameters that the command accepts.
*/
+ Command(Module* me, const std::string& cmd, unsigned int minpara = 0, unsigned int maxpara = 0);
+
+ public:
+ /** Unregisters this command from the command parser. */
+ ~Command() CXX11_OVERRIDE;
+
+ /** The user modes required to be able to execute this command. */
+ unsigned char flags_needed;
+
+ /** Whether the command will not be forwarded by the linking module even if it comes via ENCAP. */
bool force_manual_route;
- Command(Module* me, const std::string& cmd, unsigned int minpara = 0, unsigned int maxpara = 0);
+ /** The number of seconds worth of penalty that executing this command gives. */
+ unsigned int Penalty;
+
+ /** The number of times this command has been executed. */
+ unsigned long use_count;
+
+ /** If non-empty then the syntax of the parameter for this command. */
+ std::string syntax;
+
+ /** Whether the command can be issued before registering. */
+ bool works_before_reg;
/** Handle the command from a user.
- * @param parameters The parameters for the command.
* @param user The user who issued the command.
- * @return Return CMD_SUCCESS on success, or CMD_FAILURE on failure.
+ * @param parameters The parameters for the command.
+ * @return Returns CMD_FAILURE on failure, CMD_SUCCESS on success, or CMD_INVALID
+ * if the command was malformed.
*/
- virtual CmdResult Handle(const std::vector<std::string>& parameters, User* user) = 0;
+ virtual CmdResult Handle(User* user, const Params& parameters) = 0;
- /** Register this object in the CommandParser
- */
+ /** Registers this command with the command parser. */
void RegisterService() CXX11_OVERRIDE;
- /** Destructor
- * Removes this command from the command parser
+ /** Tells the user they did not specify enough parameters.
+ * @param user The user who issued the command.
+ * @param parameters The parameters for the command.
+ */
+ virtual void TellNotEnoughParameters(LocalUser* user, const Params& parameters);
+
+ /** Tells the user they need to be registered to execute this command.
+ * @param user The user who issued the command.
+ * @param parameters The parameters for the command.
*/
- ~Command();
+ virtual void TellNotRegistered(LocalUser* user, const Params& parameters);
};
class CoreExport SplitCommand : public Command
{
+protected:
+ /** Initializes a new instance of the SplitCommand class.
+ * @param me The module which created this instance.
+ * @param cmd The name of the command.
+ * @param minpara The minimum number of parameters that the command accepts.
+ * @param maxpara The maximum number of parameters that the command accepts.
+ */
+ SplitCommand(Module* me, const std::string& cmd, unsigned int minpara = 0, unsigned int maxpara = 0);
+
public:
- SplitCommand(Module* me, const std::string &cmd, unsigned int minpara = 0, unsigned int maxpara = 0)
- : Command(me, cmd, minpara, maxpara) {}
- virtual CmdResult Handle(const std::vector<std::string>& parameters, User* user);
- virtual CmdResult HandleLocal(const std::vector<std::string>& parameters, LocalUser* user);
- virtual CmdResult HandleRemote(const std::vector<std::string>& parameters, RemoteUser* user);
- virtual CmdResult HandleServer(const std::vector<std::string>& parameters, FakeUser* user);
+ /** @copydoc Command::Handle */
+ CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE;
+
+ /** Handle the command from a local user.
+ * @param user The user who issued the command.
+ * @param parameters The parameters for the command.
+ * @return Returns CMD_FAILURE on failure, CMD_SUCCESS on success, or CMD_INVALID
+ * if the command was malformed.
+ */
+ virtual CmdResult HandleLocal(LocalUser* user, const Params& parameters);
+
+ /** Handle the command from a remote user.
+ * @param user The user who issued the command.
+ * @param parameters The parameters for the command.
+ * @return Returns CMD_FAILURE on failure, CMD_SUCCESS on success, or CMD_INVALID
+ * if the command was malformed.
+ */
+ virtual CmdResult HandleRemote(RemoteUser* user, const Params& parameters);
+
+ /** Handle the command from a server user.
+ * @param user The user who issued the command.
+ * @param parameters The parameters for the command.
+ * @return Returns CMD_FAILURE on failure, CMD_SUCCESS on success, or CMD_INVALID
+ * if the command was malformed.
+ */
+ virtual CmdResult HandleServer(FakeUser* user, const Params& parameters);
};
/** Shortcut macros for defining translation lists