#include <map>
#include <algorithm>
#include <string>
#include <sampgdk/plugin.h>
#include "zcmd.hpp"
namespace SAMPGDK
{
namespace ZCMD
{
namespace Internal
{
std:: map < std:: string , Command* > command_map;
void register_command( Command* cmd, std:: string name)
{
std:: string data( name) ;
//transform command to lower case so even command names are case insensetive
std:: transform ( data.begin ( ) , data.end ( ) , data.begin ( ) , :: tolower ) ;
command_map[ data] = cmd;
}
} ;
} ;
} ;
PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerCommandText( int playerid, const char * cmdtext)
{
//declare strings we need
std:: string main( cmdtext) ;
std:: string command;
std:: string parameters;
//find the space in the command
size_t space = main.find ( ' ' ) ;
if ( space == std:: string :: npos )
{
//if there is no space treat the whole string as the command
command.assign ( main) ;
}
else
{
//else split the input into a command and parameters, with the first space being the place to split, don't include first space into the parameters string
command.assign ( main.begin ( ) ,main.begin ( ) + space) ;
parameters.assign ( main.begin ( ) + ( space+ 1 ) ,main.end ( ) ) ;
}
//make command call lowercase characters so the command call is case-insensetive
std:: transform ( command.begin ( ) , command.end ( ) , command.begin ( ) , :: tolower ) ;
//check if the user wants the issued command to proceed for the player with the parameters
if ( OnPlayerCommandReceived( playerid,command,parameters) )
{
//try to find the command / check if the command exists
if ( SAMPGDK:: ZCMD :: Internal :: command_map .find ( command) ! = SAMPGDK:: ZCMD :: Internal :: command_map .end ( ) )
{
//execute the command and check if it succeeded or not by return value
bool success = SAMPGDK:: ZCMD :: Internal :: command_map [ command] - > do_command( playerid,parameters) ;
//notify callback
OnPlayerCommandExecuted( playerid, command, parameters, success) ;
//return to this callback
return success;
}
}
else
{
//end user doesn't want command to proceed
return false ;
}
//unknown command
return OnUnknownCommand( playerid,command,parameters) ;
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHN0cmluZz4KCiNpbmNsdWRlIDxzYW1wZ2RrL3BsdWdpbi5oPgoKI2luY2x1ZGUgInpjbWQuaHBwIgoKbmFtZXNwYWNlIFNBTVBHREsKewogICAgbmFtZXNwYWNlIFpDTUQKCXsKCQluYW1lc3BhY2UgSW50ZXJuYWwKCQl7CgkJCXN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDb21tYW5kKj4gY29tbWFuZF9tYXA7CgkJCXZvaWQgcmVnaXN0ZXJfY29tbWFuZChDb21tYW5kKiBjbWQsIHN0ZDo6c3RyaW5nIG5hbWUpCgkJCXsKCQkJCXN0ZDo6c3RyaW5nIGRhdGEobmFtZSk7CgkJCQkvL3RyYW5zZm9ybSBjb21tYW5kIHRvIGxvd2VyIGNhc2Ugc28gZXZlbiBjb21tYW5kIG5hbWVzIGFyZSBjYXNlIGluc2Vuc2V0aXZlCgkJCQlzdGQ6OnRyYW5zZm9ybShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksIGRhdGEuYmVnaW4oKSwgOjp0b2xvd2VyKTsKCQkJCWNvbW1hbmRfbWFwW2RhdGFdID0gY21kOwoJCQl9CgkJfTsKCX07Cn07CgpQTFVHSU5fRVhQT1JUIGJvb2wgUExVR0lOX0NBTEwgT25QbGF5ZXJDb21tYW5kVGV4dChpbnQgcGxheWVyaWQsIGNvbnN0IGNoYXIgKmNtZHRleHQpCnsKCS8vZGVjbGFyZSBzdHJpbmdzIHdlIG5lZWQKCXN0ZDo6c3RyaW5nIG1haW4oY21kdGV4dCk7CglzdGQ6OnN0cmluZyBjb21tYW5kOwoJc3RkOjpzdHJpbmcgcGFyYW1ldGVyczsKCgkvL2ZpbmQgdGhlIHNwYWNlIGluIHRoZSBjb21tYW5kCglzaXplX3Qgc3BhY2UgPSBtYWluLmZpbmQoJyAnKTsKCglpZihzcGFjZSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKCXsKCQkvL2lmIHRoZXJlIGlzIG5vIHNwYWNlIHRyZWF0IHRoZSB3aG9sZSBzdHJpbmcgYXMgdGhlIGNvbW1hbmQKCQljb21tYW5kLmFzc2lnbihtYWluKTsKCX0KCWVsc2UKCXsKCQkvL2Vsc2Ugc3BsaXQgdGhlIGlucHV0IGludG8gYSBjb21tYW5kIGFuZCBwYXJhbWV0ZXJzLCB3aXRoIHRoZSBmaXJzdCBzcGFjZSBiZWluZyB0aGUgcGxhY2UgdG8gc3BsaXQsIGRvbid0IGluY2x1ZGUgZmlyc3Qgc3BhY2UgaW50byB0aGUgcGFyYW1ldGVycyBzdHJpbmcKCQljb21tYW5kLmFzc2lnbihtYWluLmJlZ2luKCksbWFpbi5iZWdpbigpK3NwYWNlKTsKCQlwYXJhbWV0ZXJzLmFzc2lnbihtYWluLmJlZ2luKCkrKHNwYWNlKzEpLG1haW4uZW5kKCkpOwoJfQoKCS8vbWFrZSBjb21tYW5kIGNhbGwgbG93ZXJjYXNlIGNoYXJhY3RlcnMgc28gdGhlIGNvbW1hbmQgY2FsbCBpcyBjYXNlLWluc2Vuc2V0aXZlCglzdGQ6OnRyYW5zZm9ybShjb21tYW5kLmJlZ2luKCksIGNvbW1hbmQuZW5kKCksIGNvbW1hbmQuYmVnaW4oKSwgOjp0b2xvd2VyKTsKCgkvL2NoZWNrIGlmIHRoZSB1c2VyIHdhbnRzIHRoZSBpc3N1ZWQgY29tbWFuZCB0byBwcm9jZWVkIGZvciB0aGUgcGxheWVyIHdpdGggdGhlIHBhcmFtZXRlcnMKCWlmKE9uUGxheWVyQ29tbWFuZFJlY2VpdmVkKHBsYXllcmlkLGNvbW1hbmQscGFyYW1ldGVycykpCgl7CgkJLy90cnkgdG8gZmluZCB0aGUgY29tbWFuZCAvIGNoZWNrIGlmIHRoZSBjb21tYW5kIGV4aXN0cwoJCWlmKFNBTVBHREs6OlpDTUQ6OkludGVybmFsOjpjb21tYW5kX21hcC5maW5kKGNvbW1hbmQpICE9IFNBTVBHREs6OlpDTUQ6OkludGVybmFsOjpjb21tYW5kX21hcC5lbmQoKSkKCQl7CgkJCS8vZXhlY3V0ZSB0aGUgY29tbWFuZCBhbmQgY2hlY2sgaWYgaXQgc3VjY2VlZGVkIG9yIG5vdCBieSByZXR1cm4gdmFsdWUKCQkJYm9vbCBzdWNjZXNzID0gU0FNUEdESzo6WkNNRDo6SW50ZXJuYWw6OmNvbW1hbmRfbWFwW2NvbW1hbmRdLT5kb19jb21tYW5kKHBsYXllcmlkLHBhcmFtZXRlcnMpOwoJCQkvL25vdGlmeSBjYWxsYmFjawoJCQlPblBsYXllckNvbW1hbmRFeGVjdXRlZChwbGF5ZXJpZCwgY29tbWFuZCwgcGFyYW1ldGVycywgc3VjY2Vzcyk7CgkJCS8vcmV0dXJuIHRvIHRoaXMgY2FsbGJhY2sKCQkJcmV0dXJuIHN1Y2Nlc3M7CgkJfQoJfQoJZWxzZQoJewoJCS8vZW5kIHVzZXIgZG9lc24ndCB3YW50IGNvbW1hbmQgdG8gcHJvY2VlZAoJCXJldHVybiBmYWxzZTsKCX0KCS8vdW5rbm93biBjb21tYW5kCglyZXR1cm4gT25Vbmtub3duQ29tbWFuZChwbGF5ZXJpZCxjb21tYW5kLHBhcmFtZXRlcnMpOwp9