mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-08 08:47:17 +01:00
392 lines
14 KiB
C++
392 lines
14 KiB
C++
#ifndef _COMMAND_HPP_
|
|
#define _COMMAND_HPP_
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#include "Base/Shared.hpp"
|
|
#include "Base/Buffer.hpp"
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
namespace SqMod {
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
class CmdListener;
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Converts a command specifier to a string.
|
|
*/
|
|
CSStr CmdArgSpecToStr(Uint8 spec);
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
extern CmdManager * _Cmd;
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Manages command instances and processes executed commands.
|
|
*/
|
|
class CmdManager
|
|
{
|
|
// --------------------------------------------------------------------------------------------
|
|
friend class CmdListener;
|
|
|
|
private:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef std::map< String, CmdListener * > CmdList;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef std::vector< std::pair< Uint8, Object > > CmdArgs;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Default constructor.
|
|
*/
|
|
CmdManager();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor. (disabled)
|
|
*/
|
|
CmdManager(const CmdManager &);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator. (disabled)
|
|
*/
|
|
CmdManager & operator = (const CmdManager &);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Attach a command listener to a certain name.
|
|
*/
|
|
void Attach(const String & name, CmdListener * cmd)
|
|
{
|
|
m_Commands[name] = cmd;
|
|
}
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~CmdManager();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Singleton retriever.
|
|
*/
|
|
static CmdManager * Get()
|
|
{
|
|
if (!_Cmd)
|
|
{
|
|
_Cmd = new CmdManager();
|
|
}
|
|
|
|
return _Cmd;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Terminate current session.
|
|
*/
|
|
void Terminate();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Dettach a command listener from a certain name.
|
|
*/
|
|
void Detach(const String & name)
|
|
{
|
|
m_Commands.erase(name);
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the error callback.
|
|
*/
|
|
Function & GetOnError()
|
|
{
|
|
return m_OnError;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the error callback.
|
|
*/
|
|
void SetOnError(Object & env, Function & func)
|
|
{
|
|
m_OnError = Function(env.GetVM(), env, func.GetFunc());
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the authentication callback.
|
|
*/
|
|
Function & GetOnAuth()
|
|
{
|
|
return m_OnAuth;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Modify the authentication callback.
|
|
*/
|
|
void SetOnAuth(Object & env, Function & func)
|
|
{
|
|
m_OnAuth = Function(env.GetVM(), env, func.GetFunc());
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the identifier of the last invoker.
|
|
*/
|
|
Int32 GetInvoker() const
|
|
{
|
|
return m_Invoker;
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the last executed command.
|
|
*/
|
|
CSStr GetCommand() const
|
|
{
|
|
return m_Command.c_str();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Retrieve the argument of the last executed coommand.
|
|
*/
|
|
CSStr GetArgument() const
|
|
{
|
|
return m_Argument.c_str();
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Run a command under a speciffic player.
|
|
*/
|
|
Int32 Run(Int32 invoker, CSStr command);
|
|
|
|
protected:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Forward error message to the error callback.
|
|
*/
|
|
template < typename T > void SqError(Int32 type, CSStr msg, T data)
|
|
{
|
|
if (!m_OnError.IsNull())
|
|
{
|
|
m_OnError.Execute< Int32, CSStr, T >(type, msg, data);
|
|
}
|
|
}
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Attempt to execute the specified command.
|
|
*/
|
|
Int32 Exec();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Attempt to parse the specified argument.
|
|
*/
|
|
bool Parse();
|
|
|
|
private:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Buffer m_Buffer; /* Internal buffer used for parsing commands. */
|
|
CmdList m_Commands; /* List of attached commands. */
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Int32 m_Invoker; /* Current command invoker. */
|
|
String m_Command; /* Current command name. */
|
|
String m_Argument; /* Current command argument. */
|
|
CmdListener* m_Instance; /* Current command instance. */
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
CmdArgs m_Argv; /* Extracted command arguments. */
|
|
Uint32 m_Argc; /* Extracted arguments count. */
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Function m_OnError; /* Error handler. */
|
|
Function m_OnAuth; /* Authentication handler. */
|
|
};
|
|
|
|
/* ------------------------------------------------------------------------------------------------
|
|
* Attaches to a command name and listens for invocations.
|
|
*/
|
|
class CmdListener
|
|
{
|
|
// --------------------------------------------------------------------------------------------
|
|
friend class CmdManager;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy constructor. (disabled)
|
|
*/
|
|
CmdListener(const CmdListener &);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Copy assignment operator. (disabled)
|
|
*/
|
|
CmdListener & operator = (const CmdListener &);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Initialize the instance for the first time.
|
|
*/
|
|
void Init(CSStr name, CSStr spec, Array & tags, Uint8 min, Uint8 max);
|
|
|
|
public:
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Base constructors.
|
|
*/
|
|
CmdListener(CSStr name);
|
|
CmdListener(CSStr name, CSStr spec);
|
|
CmdListener(CSStr name, CSStr spec, Array & tags);
|
|
CmdListener(CSStr name, CSStr spec, Uint8 min, Uint8 max);
|
|
CmdListener(CSStr name, CSStr spec, Array & tags, Uint8 min, Uint8 max);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Destructor.
|
|
*/
|
|
~CmdListener();
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to compare two instances of this type.
|
|
*/
|
|
Int32 Cmp(const CmdListener & o) const;
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
* Used by the script engine to convert this instance to a string.
|
|
*/
|
|
CSStr ToString() const;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint8 GetArgFlags(Uint32 idx) const;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
CSStr GetName() const;
|
|
void SetName(CSStr name);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
CSStr GetSpec() const;
|
|
void SetSpec(CSStr spec);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Array GetArgTags() const;
|
|
void SetArgTags(Array & tags);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
CSStr GetHelp() const;
|
|
void SetHelp(CSStr help);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
CSStr GetInfo() const;
|
|
void SetInfo(CSStr info);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Int32 GetAuthority() const;
|
|
void SetAuthority(Int32 level);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool GetProtected() const;
|
|
void SetProtected(bool toggle);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool GetSuspended() const;
|
|
void SetSuspended(bool toggle);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool GetAssociate() const;
|
|
void SetAssociate(bool toggle);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint8 GetMinArgC() const;
|
|
void SetMinArgC(Uint8 val);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint8 GetMaxArgC() const;
|
|
void SetMaxArgC(Uint8 val);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool GetLocked() const;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Function & GetOnExec();
|
|
void SetOnExec(Object & env, Function & func);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Function & GetOnAuth();
|
|
void SetOnAuth(Object & env, Function & func);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Function & GetOnPost();
|
|
void SetOnPost(Object & env, Function & func);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Function & GetOnFail();
|
|
void SetOnFail(Object & env, Function & func);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
CSStr GetArgTag(Uint32 arg) const;
|
|
void SetArgTag(Uint32 arg, CSStr name);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
void GenerateInfo(bool full);
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool ArgCheck(Uint32 arg, Uint8 flag) const;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool AuthCheck(CPlayer & player);
|
|
bool AuthCheckID(Int32 id);
|
|
|
|
protected:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
typedef Uint8 ArgSpec[SQMOD_MAX_CMD_ARGS];
|
|
typedef String ArgTags[SQMOD_MAX_CMD_ARGS];
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
*
|
|
*/
|
|
SQInteger Execute(Object & invoker, Array & args);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
*
|
|
*/
|
|
SQInteger Execute(Object & invoker, Table & args);
|
|
|
|
/* --------------------------------------------------------------------------------------------
|
|
*
|
|
*/
|
|
bool ProcSpec(CSStr spec);
|
|
|
|
private:
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
String m_Name;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
ArgSpec m_ArgSpec;
|
|
ArgTags m_ArgTags;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Uint8 m_MinArgc;
|
|
Uint8 m_MaxArgc;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
String m_Spec;
|
|
String m_Help;
|
|
String m_Info;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Function m_OnExec;
|
|
Function m_OnAuth;
|
|
Function m_OnPost;
|
|
Function m_OnFail;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
Int32 m_Authority;
|
|
|
|
// --------------------------------------------------------------------------------------------
|
|
bool m_Protected;
|
|
bool m_Suspended;
|
|
bool m_Associate;
|
|
bool m_Locked;
|
|
};
|
|
|
|
} // Namespace:: SqMod
|
|
|
|
#endif // _COMMAND_HPP_
|