fork download
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <algorithm>
  5. #include <string>
  6.  
  7. #define PLUGIN_EXPORT
  8. #define PLUGIN_CALL
  9.  
  10. //begin command library
  11. //header
  12. class Command
  13. {
  14. public:
  15. virtual bool do_command(int playerid, std::string params) = 0;
  16. };
  17.  
  18. #define CMD(name) \
  19. class cmd ## name : public Command\
  20.   {\
  21. public:\
  22. cmd ## name() { ZCMD_COMMAND_LIBRARY_register_command(this, "/"#name); }\
  23. bool do_command(int playerid, std::string params)
  24. //M$ and clang have a mangled name limit of 2048 chars, g++ "unlimited" (well, limited by memory).
  25. #define CMDEND(name) };cmd ## name ZCMD_COMMAND_LIBRARY_CMD_ ## name;
  26.  
  27. bool OnPlayerCommandReceived(int playerid,std::string command, std::string params);
  28. void OnPlayerCommandExecuted(int playerid, std::string, std::string params, bool success);
  29.  
  30. //source
  31. std::map<std::string, Command*> ZCMD_COMMAND_LIBRARY_command_map;
  32. void ZCMD_COMMAND_LIBRARY_register_command(Command* cmd, std::string name)
  33. {
  34. std::string data(name);
  35. std::transform(data.begin(), data.end(), data.begin(), ::tolower);
  36. ZCMD_COMMAND_LIBRARY_command_map[data] = cmd;
  37. }
  38.  
  39. PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerCommandText(int playerid, const char *cmdtext)
  40. {
  41. std::string main(cmdtext);
  42. std::string command;
  43. std::string parameters;
  44.  
  45. size_t space = main.find(' ');
  46.  
  47. if(space == std::string::npos)
  48. {
  49. command.assign(main);
  50. }
  51. else
  52. {
  53. command.assign(main.begin(),main.begin()+space);
  54. parameters.assign(main.begin()+(space+1),main.end());
  55. }
  56.  
  57. std::transform(command.begin(), command.end(), command.begin(), ::tolower);
  58.  
  59. if(OnPlayerCommandReceived(playerid,command,parameters))
  60. {
  61. if(ZCMD_COMMAND_LIBRARY_command_map.find(command) != ZCMD_COMMAND_LIBRARY_command_map.end())
  62. {
  63. bool success = ZCMD_COMMAND_LIBRARY_command_map[command]->do_command(playerid,parameters);
  64. OnPlayerCommandExecuted(playerid, command, parameters, success);
  65. return success;
  66. }
  67. }
  68. else
  69. {
  70. return false;
  71. }
  72. printf("Unknown command: %s\n",command.c_str());
  73. return false;
  74. }
  75. //end command library
  76.  
  77. //end-user code
  78.  
  79. bool OnPlayerCommandReceived(int playerid,std::string command, std::string params)
  80. {
  81. return true;
  82. }
  83.  
  84. void OnPlayerCommandExecuted(int playerid, std::string command, std::string params, bool success)
  85. {
  86. return;
  87. }
  88.  
  89. CMD(start)
  90. {
  91. printf("start issued, params: '%s'\n",params.c_str());
  92. return true;
  93. }
  94. CMDEND(start);
  95.  
  96. CMD(end)
  97. {
  98. printf("end issued, params: '%s'\n",params.c_str());
  99. return false;
  100. }
  101. CMDEND(end);
  102.  
  103. //end commands
  104.  
  105. int main()
  106. {
  107. OnPlayerCommandText(0, "/start");
  108. OnPlayerCommandText(0, "/StaRT");
  109. OnPlayerCommandText(0, "/start ello lololol");
  110. OnPlayerCommandText(0, "/kill");
  111. OnPlayerCommandText(0, "/end");
  112. OnPlayerCommandText(0, "/end 1234");
  113. return 0;
  114. }
Success #stdin #stdout 0s 2992KB
stdin
Standard input is empty
stdout
start issued, params: ''
start issued, params: ''
start issued, params: 'ello lololol'
Unknown command: /kill
end issued, params: ''
end issued, params: '1234'