#include <stdio.h>
#include <iostream>
#include <map>
#include <algorithm>
#include <string>
#define PLUGIN_EXPORT
#define PLUGIN_CALL
//begin command library
//header
class Command
{
public:
virtual bool do_command(int playerid, std::string params) = 0;
};
#define CMD(name) \
class cmd ## name : public Command\
{\
public:\
cmd ## name() { ZCMD_COMMAND_LIBRARY_register_command(this, "/"#name); }\
bool do_command(int playerid, std::string params)
//M$ and clang have a mangled name limit of 2048 chars, g++ "unlimited" (well, limited by memory).
#define CMDEND(name) };cmd ## name ZCMD_COMMAND_LIBRARY_CMD_ ## name;
bool OnPlayerCommandReceived(int playerid,std::string command, std::string params);
void OnPlayerCommandExecuted(int playerid, std::string, std::string params, bool success);
//source
std::map<std::string, Command*> ZCMD_COMMAND_LIBRARY_command_map;
void ZCMD_COMMAND_LIBRARY_register_command(Command* cmd, std::string name)
{
std::string data(name);
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
ZCMD_COMMAND_LIBRARY_command_map[data] = cmd;
}
PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerCommandText(int playerid, const char *cmdtext)
{
std::string main(cmdtext);
std::string command;
std::string parameters;
size_t space = main.find(' ');
if(space == std::string::npos)
{
command.assign(main);
}
else
{
command.assign(main.begin(),main.begin()+space);
parameters.assign(main.begin()+(space+1),main.end());
}
std::transform(command.begin(), command.end(), command.begin(), ::tolower);
if(OnPlayerCommandReceived(playerid,command,parameters))
{
if(ZCMD_COMMAND_LIBRARY_command_map.find(command) != ZCMD_COMMAND_LIBRARY_command_map.end())
{
bool success = ZCMD_COMMAND_LIBRARY_command_map[command]->do_command(playerid,parameters);
OnPlayerCommandExecuted(playerid, command, parameters, success);
return success;
}
}
else
{
return false;
}
printf("Unknown command: %s\n",command.c_str());
return false;
}
//end command library
//end-user code
bool OnPlayerCommandReceived(int playerid,std::string command, std::string params)
{
return true;
}
void OnPlayerCommandExecuted(int playerid, std::string command, std::string params, bool success)
{
return;
}
CMD(start)
{
printf("start issued, params: '%s'\n",params.c_str());
return true;
}
CMDEND(start);
CMD(end)
{
printf("end issued, params: '%s'\n",params.c_str());
return false;
}
CMDEND(end);
//end commands
int main()
{
OnPlayerCommandText(0, "/start");
OnPlayerCommandText(0, "/StaRT");
OnPlayerCommandText(0, "/start ello lololol");
OnPlayerCommandText(0, "/kill");
OnPlayerCommandText(0, "/end");
OnPlayerCommandText(0, "/end 1234");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHN0cmluZz4KCiNkZWZpbmUgUExVR0lOX0VYUE9SVCAKI2RlZmluZSBQTFVHSU5fQ0FMTAoKLy9iZWdpbiBjb21tYW5kIGxpYnJhcnkKLy9oZWFkZXIKY2xhc3MgQ29tbWFuZAp7CnB1YmxpYzoKICAgdmlydHVhbCBib29sIGRvX2NvbW1hbmQoaW50IHBsYXllcmlkLCBzdGQ6OnN0cmluZyBwYXJhbXMpID0gMDsKfTsKCiNkZWZpbmUgQ01EKG5hbWUpIFwKY2xhc3MgY21kICMjIG5hbWUgOiBwdWJsaWMgQ29tbWFuZFwKICAgIHtcCgkJcHVibGljOlwKCQljbWQgIyMgbmFtZSgpIHsgWkNNRF9DT01NQU5EX0xJQlJBUllfcmVnaXN0ZXJfY29tbWFuZCh0aGlzLCAiLyIjbmFtZSk7IH1cCgkJYm9vbCBkb19jb21tYW5kKGludCBwbGF5ZXJpZCwgc3RkOjpzdHJpbmcgcGFyYW1zKQovL00kIGFuZCBjbGFuZyBoYXZlIGEgbWFuZ2xlZCBuYW1lIGxpbWl0IG9mIDIwNDggY2hhcnMsIGcrKyAidW5saW1pdGVkIiAod2VsbCwgbGltaXRlZCBieSBtZW1vcnkpLgojZGVmaW5lIENNREVORChuYW1lKSB9O2NtZCAjIyBuYW1lIFpDTURfQ09NTUFORF9MSUJSQVJZX0NNRF8gIyMgbmFtZTsKCmJvb2wgT25QbGF5ZXJDb21tYW5kUmVjZWl2ZWQoaW50IHBsYXllcmlkLHN0ZDo6c3RyaW5nIGNvbW1hbmQsIHN0ZDo6c3RyaW5nIHBhcmFtcyk7CnZvaWQgT25QbGF5ZXJDb21tYW5kRXhlY3V0ZWQoaW50IHBsYXllcmlkLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcgcGFyYW1zLCBib29sIHN1Y2Nlc3MpOwoKLy9zb3VyY2UKc3RkOjptYXA8c3RkOjpzdHJpbmcsIENvbW1hbmQqPiBaQ01EX0NPTU1BTkRfTElCUkFSWV9jb21tYW5kX21hcDsKdm9pZCBaQ01EX0NPTU1BTkRfTElCUkFSWV9yZWdpc3Rlcl9jb21tYW5kKENvbW1hbmQqIGNtZCwgc3RkOjpzdHJpbmcgbmFtZSkKewoJc3RkOjpzdHJpbmcgZGF0YShuYW1lKTsKCXN0ZDo6dHJhbnNmb3JtKGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgZGF0YS5iZWdpbigpLCA6OnRvbG93ZXIpOwoJWkNNRF9DT01NQU5EX0xJQlJBUllfY29tbWFuZF9tYXBbZGF0YV0gPSBjbWQ7Cn0KClBMVUdJTl9FWFBPUlQgYm9vbCBQTFVHSU5fQ0FMTCBPblBsYXllckNvbW1hbmRUZXh0KGludCBwbGF5ZXJpZCwgY29uc3QgY2hhciAqY21kdGV4dCkKewoJc3RkOjpzdHJpbmcgbWFpbihjbWR0ZXh0KTsKCXN0ZDo6c3RyaW5nIGNvbW1hbmQ7CglzdGQ6OnN0cmluZyBwYXJhbWV0ZXJzOwoKCXNpemVfdCBzcGFjZSA9IG1haW4uZmluZCgnICcpOwoKCWlmKHNwYWNlID09IHN0ZDo6c3RyaW5nOjpucG9zKQoJewoJCWNvbW1hbmQuYXNzaWduKG1haW4pOwoJfQoJZWxzZQoJewoJCWNvbW1hbmQuYXNzaWduKG1haW4uYmVnaW4oKSxtYWluLmJlZ2luKCkrc3BhY2UpOwoJCXBhcmFtZXRlcnMuYXNzaWduKG1haW4uYmVnaW4oKSsoc3BhY2UrMSksbWFpbi5lbmQoKSk7Cgl9CgoJc3RkOjp0cmFuc2Zvcm0oY29tbWFuZC5iZWdpbigpLCBjb21tYW5kLmVuZCgpLCBjb21tYW5kLmJlZ2luKCksIDo6dG9sb3dlcik7CgoJaWYoT25QbGF5ZXJDb21tYW5kUmVjZWl2ZWQocGxheWVyaWQsY29tbWFuZCxwYXJhbWV0ZXJzKSkKCXsKCQlpZihaQ01EX0NPTU1BTkRfTElCUkFSWV9jb21tYW5kX21hcC5maW5kKGNvbW1hbmQpICE9IFpDTURfQ09NTUFORF9MSUJSQVJZX2NvbW1hbmRfbWFwLmVuZCgpKQoJCXsKCQkJYm9vbCBzdWNjZXNzID0gWkNNRF9DT01NQU5EX0xJQlJBUllfY29tbWFuZF9tYXBbY29tbWFuZF0tPmRvX2NvbW1hbmQocGxheWVyaWQscGFyYW1ldGVycyk7CgkJCU9uUGxheWVyQ29tbWFuZEV4ZWN1dGVkKHBsYXllcmlkLCBjb21tYW5kLCBwYXJhbWV0ZXJzLCBzdWNjZXNzKTsKCQkJcmV0dXJuIHN1Y2Nlc3M7CgkJfQoJfQoJZWxzZQoJewoJCXJldHVybiBmYWxzZTsKCX0KCXByaW50ZigiVW5rbm93biBjb21tYW5kOiAlc1xuIixjb21tYW5kLmNfc3RyKCkpOwoJcmV0dXJuIGZhbHNlOwp9Ci8vZW5kIGNvbW1hbmQgbGlicmFyeQoKLy9lbmQtdXNlciBjb2RlCgpib29sIE9uUGxheWVyQ29tbWFuZFJlY2VpdmVkKGludCBwbGF5ZXJpZCxzdGQ6OnN0cmluZyBjb21tYW5kLCBzdGQ6OnN0cmluZyBwYXJhbXMpCnsKCXJldHVybiB0cnVlOwp9Cgp2b2lkIE9uUGxheWVyQ29tbWFuZEV4ZWN1dGVkKGludCBwbGF5ZXJpZCwgc3RkOjpzdHJpbmcgY29tbWFuZCwgc3RkOjpzdHJpbmcgcGFyYW1zLCBib29sIHN1Y2Nlc3MpCnsKCXJldHVybjsKfQoKQ01EKHN0YXJ0KQp7CglwcmludGYoInN0YXJ0IGlzc3VlZCwgcGFyYW1zOiAnJXMnXG4iLHBhcmFtcy5jX3N0cigpKTsKCXJldHVybiB0cnVlOwp9CkNNREVORChzdGFydCk7CgpDTUQoZW5kKQp7CglwcmludGYoImVuZCBpc3N1ZWQsIHBhcmFtczogJyVzJ1xuIixwYXJhbXMuY19zdHIoKSk7CglyZXR1cm4gZmFsc2U7Cn0KQ01ERU5EKGVuZCk7CgovL2VuZCBjb21tYW5kcwoKaW50IG1haW4oKQp7CglPblBsYXllckNvbW1hbmRUZXh0KDAsICIvc3RhcnQiKTsKCU9uUGxheWVyQ29tbWFuZFRleHQoMCwgIi9TdGFSVCIpOwoJT25QbGF5ZXJDb21tYW5kVGV4dCgwLCAiL3N0YXJ0IGVsbG8gbG9sb2xvbCIpOwoJT25QbGF5ZXJDb21tYW5kVGV4dCgwLCAiL2tpbGwiKTsKCU9uUGxheWVyQ29tbWFuZFRleHQoMCwgIi9lbmQiKTsKCU9uUGxheWVyQ29tbWFuZFRleHQoMCwgIi9lbmQgMTIzNCIpOwoJcmV0dXJuIDA7Cn0=