summaryrefslogtreecommitdiff
path: root/include/commands.h
blob: 271e9c5515872ac2e12e5c6bef0eb3cab6e1b83d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* Declarations for command data.
 *
 * (C) 2003-2011 Anope Team
 * Contact us at team@anope.org
 *
 * Please read COPYING and README for further details.
 *
 * Based on the original code of Epona by Lara.
 * Based on the original code of Services by Andy Church.
 */

#ifndef COMMAND_H
#define COMMAND_H

#include "services.h"

class Module;
class BotInfo;
class Command;

enum CommandFlag
{
	CFLAG_ALLOW_UNREGISTERED,
	CFLAG_STRIP_CHANNEL
};

const Anope::string CommandFlagStrings[] = {
	"CFLAG_ALLOW_UNREGISTERED",
	"CFLAG_STRIP_CHANNEL",
	""
};

struct CommandInfo
{
	Anope::string name;
	Anope::string permission;
};

/* The source for a command */
struct CoreExport CommandSource
{
	/* User executing the command */
	User *u;
	/* Channel the command was executed on (fantasy) */
	Channel *c;
	/* The service this command is on */
	BotInfo *owner;
	/* The service the reply should come from, *not* necessarily the service the command is on */
	BotInfo *service;
	/* The actual name of the command being executed */
	Anope::string command;
	/* The permission of the command being executed */
	Anope::string permission;

	void Reply(const char *message, ...);
	void Reply(const Anope::string &message);
};

/** Every services command is a class, inheriting from Command.
 */
class CoreExport Command : public Service<Command>, public Flags<CommandFlag>
{
	Anope::string desc;
	std::vector<Anope::string> syntax;

 public:
 	/* Maximum paramaters accepted by this command */
	size_t MaxParams;
	/* Minimum parameters required to use this command */
	size_t MinParams;

	/* Module which owns us */
	Module *module;

	/** Create a new command.
	 * @param owner The owner of the command
	 * @param sname The command name
	 * @param min_params The minimum number of parameters the parser will require to execute this command
	 * @param max_params The maximum number of parameters the parser will create, after max_params, all will be combined into the last argument.
	 * NOTE: If max_params is not set (default), there is no limit to the max number of params.
	 */
	Command(Module *owner, const Anope::string &sname, size_t min_params, size_t max_params = 0);

	virtual ~Command();

 protected:
	void SetDesc(const Anope::string &d);

	void ClearSyntax();
	void SetSyntax(const Anope::string &s);
	void SendSyntax(CommandSource &);
	void SendSyntax(CommandSource &, const Anope::string &syntax);
 public:
 	/** Get the command description
	 * @return The commands description
	 */
 	const Anope::string &GetDesc() const;

	/** Execute this command.
	 * @param source The source
	 * @param params Command parameters
	 */
	virtual void Execute(CommandSource &source, const std::vector<Anope::string> &params) = 0;

	/** Called when HELP is requsted for the client this command is on.
	 * @param source The source
	 */
	virtual void OnServHelp(CommandSource &source);

	/** Requested when the user is requesting help on this command. Help on this command should be sent to the user.
	 * @param source The source
	 * @param subcommand The subcommand the user is requesting help on, or an empty string. (e.g. /ns help set foo bar lol gives a subcommand of "FOO BAR LOL")
	 * @return true if help was provided to the user, false otherwise.
	 */
	virtual bool OnHelp(CommandSource &source, const Anope::string &subcommand);

	/** Requested when the user provides bad syntax to this command (not enough params, etc).
	 * @param source The source
	 * @param subcommand The subcommand the user tried to use
	 */
	virtual void OnSyntaxError(CommandSource &source, const Anope::string &subcommand);
};

#endif // COMMANDS_H