#include <stdio.h>
#include <iostream>
#include <map>
#include <string>
#define PLUGIN_EXPORT
#define PLUGIN_CALL
//begin command library
class Command
{
public:
virtual bool do_command(int playerid, std::string params) = 0;
};
class CommandCollection
{
public:
std::map<std::string, Command*> m_command_map;
void register_command(Command* cmd, std::string name)
{
m_command_map[name] = cmd;
}
};
CommandCollection Instance;
/*
* Concatenate preprocessor tokens A and B without expanding macro definitions
* (however, if invoked from a macro, macro arguments are expanded).
*/
#define PPCAT_NX(A, B) A ## B
/*
* Concatenate preprocessor tokens A and B after macro-expanding them.
*/
#define PPCAT(A, B) PPCAT_NX(A, B)
#define CMD(name) \
class PPCAT(cmd,name) : public Command\
{\
public:\
PPCAT(cmd,name)() { Instance.register_command(this, "/"#name); }\
bool do_command(int playerid, std::string params)
#define CMDEND(name) };PPCAT(cmd,name) PPCAT(ffx_cmd_instance_,name);
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)
{
space = main.length();
command.assign(main);
}
else
{
command.assign(main.begin(),main.begin()+space);
parameters.assign(main.begin()+(space+1),main.end());
}
if(Instance.m_command_map.find(command) != Instance.m_command_map.end())
return Instance.m_command_map[command]->do_command(playerid,parameters);
printf("Unknown command: %s\n",command.c_str());
return false;
}
//end command library
//commands
CMD(start)
{
printf("start issued, params: '%s'\n",params.c_str());
return true;
}
CMDEND(start);
CMD(end)
{
printf("end issued, params: '%s'",params.c_str());
return false;
}
CMDEND(end);
//end commands
//test run
int main()
{
OnPlayerCommandText(0, "/start");
OnPlayerCommandText(0, "/start ello lololol");
OnPlayerCommandText(0, "/kill");
OnPlayerCommandText(0, "/end");
OnPlayerCommandText(0, "/end 1234");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KCiNkZWZpbmUgUExVR0lOX0VYUE9SVCAKI2RlZmluZSBQTFVHSU5fQ0FMTAoKLy9iZWdpbiBjb21tYW5kIGxpYnJhcnkKY2xhc3MgQ29tbWFuZAp7CnB1YmxpYzoKICAgdmlydHVhbCBib29sIGRvX2NvbW1hbmQoaW50IHBsYXllcmlkLCBzdGQ6OnN0cmluZyBwYXJhbXMpID0gMDsKfTsKY2xhc3MgQ29tbWFuZENvbGxlY3Rpb24KewpwdWJsaWM6CiAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29tbWFuZCo+IG1fY29tbWFuZF9tYXA7Cgl2b2lkIHJlZ2lzdGVyX2NvbW1hbmQoQ29tbWFuZCogY21kLCBzdGQ6OnN0cmluZyBuYW1lKQoJewoJCW1fY29tbWFuZF9tYXBbbmFtZV0gPSBjbWQ7Cgl9Cn07CgpDb21tYW5kQ29sbGVjdGlvbiBJbnN0YW5jZTsKCi8qCiAqIENvbmNhdGVuYXRlIHByZXByb2Nlc3NvciB0b2tlbnMgQSBhbmQgQiB3aXRob3V0IGV4cGFuZGluZyBtYWNybyBkZWZpbml0aW9ucwogKiAoaG93ZXZlciwgaWYgaW52b2tlZCBmcm9tIGEgbWFjcm8sIG1hY3JvIGFyZ3VtZW50cyBhcmUgZXhwYW5kZWQpLgogKi8KI2RlZmluZSBQUENBVF9OWChBLCBCKSBBICMjIEIKLyoKICogQ29uY2F0ZW5hdGUgcHJlcHJvY2Vzc29yIHRva2VucyBBIGFuZCBCIGFmdGVyIG1hY3JvLWV4cGFuZGluZyB0aGVtLgogKi8KI2RlZmluZSBQUENBVChBLCBCKSBQUENBVF9OWChBLCBCKQoKI2RlZmluZSBDTUQobmFtZSkgXApjbGFzcyBQUENBVChjbWQsbmFtZSkgOiBwdWJsaWMgQ29tbWFuZFwKCXtcCgkJcHVibGljOlwKCQlQUENBVChjbWQsbmFtZSkoKSB7IEluc3RhbmNlLnJlZ2lzdGVyX2NvbW1hbmQodGhpcywgIi8iI25hbWUpOyB9XAoJCWJvb2wgZG9fY29tbWFuZChpbnQgcGxheWVyaWQsIHN0ZDo6c3RyaW5nIHBhcmFtcykKI2RlZmluZSBDTURFTkQobmFtZSkgfTtQUENBVChjbWQsbmFtZSkgUFBDQVQoZmZ4X2NtZF9pbnN0YW5jZV8sbmFtZSk7CgpQTFVHSU5fRVhQT1JUIGJvb2wgUExVR0lOX0NBTEwgT25QbGF5ZXJDb21tYW5kVGV4dChpbnQgcGxheWVyaWQsIGNvbnN0IGNoYXIgKmNtZHRleHQpCnsKCXN0ZDo6c3RyaW5nIG1haW4oY21kdGV4dCk7CglzdGQ6OnN0cmluZyBjb21tYW5kOwoJc3RkOjpzdHJpbmcgcGFyYW1ldGVyczsKCglzaXplX3Qgc3BhY2UgPSBtYWluLmZpbmQoJyAnKTsKCglpZihzcGFjZSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKCXsKCQlzcGFjZSA9IG1haW4ubGVuZ3RoKCk7CgkJY29tbWFuZC5hc3NpZ24obWFpbik7Cgl9CgllbHNlCgl7CgkJY29tbWFuZC5hc3NpZ24obWFpbi5iZWdpbigpLG1haW4uYmVnaW4oKStzcGFjZSk7CgkJcGFyYW1ldGVycy5hc3NpZ24obWFpbi5iZWdpbigpKyhzcGFjZSsxKSxtYWluLmVuZCgpKTsKCX0KCglpZihJbnN0YW5jZS5tX2NvbW1hbmRfbWFwLmZpbmQoY29tbWFuZCkgIT0gSW5zdGFuY2UubV9jb21tYW5kX21hcC5lbmQoKSkKCQlyZXR1cm4gSW5zdGFuY2UubV9jb21tYW5kX21hcFtjb21tYW5kXS0+ZG9fY29tbWFuZChwbGF5ZXJpZCxwYXJhbWV0ZXJzKTsKCXByaW50ZigiVW5rbm93biBjb21tYW5kOiAlc1xuIixjb21tYW5kLmNfc3RyKCkpOwoJcmV0dXJuIGZhbHNlOwp9Ci8vZW5kIGNvbW1hbmQgbGlicmFyeQoKLy9jb21tYW5kcwoKQ01EKHN0YXJ0KQp7CglwcmludGYoInN0YXJ0IGlzc3VlZCwgcGFyYW1zOiAnJXMnXG4iLHBhcmFtcy5jX3N0cigpKTsKCXJldHVybiB0cnVlOwp9CkNNREVORChzdGFydCk7CgpDTUQoZW5kKQp7CglwcmludGYoImVuZCBpc3N1ZWQsIHBhcmFtczogJyVzJyIscGFyYW1zLmNfc3RyKCkpOwoJcmV0dXJuIGZhbHNlOwp9CkNNREVORChlbmQpOwoKLy9lbmQgY29tbWFuZHMKCi8vdGVzdCBydW4KaW50IG1haW4oKQp7CglPblBsYXllckNvbW1hbmRUZXh0KDAsICIvc3RhcnQiKTsKCU9uUGxheWVyQ29tbWFuZFRleHQoMCwgIi9zdGFydCBlbGxvIGxvbG9sb2wiKTsKCU9uUGxheWVyQ29tbWFuZFRleHQoMCwgIi9raWxsIik7CglPblBsYXllckNvbW1hbmRUZXh0KDAsICIvZW5kIik7CglPblBsYXllckNvbW1hbmRUZXh0KDAsICIvZW5kIDEyMzQiKTsKCXJldHVybiAwOwp9