CommandManager.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <cstring>
  2. #include <iostream>
  3. #include "common/network/Packets.h"
  4. #include "server/commands/CommandManager.h"
  5. #include "server/snuviscript/Snuvi.h"
  6. static void commandTest(ServerState&, const CommandArguments& args) {
  7. std::cout << "test command\n";
  8. for(int i = 0; i < args.getLength(); i++) {
  9. std::cout << " - " << args[i] << '\n';
  10. }
  11. }
  12. static void commandStop(ServerState& sc, const CommandArguments&) {
  13. sc.running = false;
  14. }
  15. static void commandSay(ServerState& sc, const CommandArguments& args) {
  16. StringBuffer<256> s;
  17. for(int i = 1; i < args.getLength(); i++) {
  18. s.append(args[i]);
  19. s.append(' ');
  20. }
  21. OutPacket out = OutPacket::reliable(260);
  22. out.writeU16(ServerPacket::CHAT);
  23. out.writeString(s);
  24. sc.server.send(out);
  25. std::cout << s << '\n';
  26. }
  27. static void helpScript() {
  28. std::cout << "/script start <script>\n";
  29. std::cout << "/script term\n";
  30. }
  31. static void commandScript(ServerState&, const CommandArguments& args) {
  32. if(args.getLength() < 2) {
  33. helpScript();
  34. } else if(strcmp(args[1], "start") == 0) {
  35. if(args.getLength() < 3) {
  36. std::cout << "/script start <script>\n";
  37. return;
  38. }
  39. Snuvi::start(args[2]);
  40. } else if(strcmp(args[1], "term") == 0) {
  41. Snuvi::termAll();
  42. std::cout << "all scripts were terminated\n";
  43. } else {
  44. helpScript();
  45. }
  46. }
  47. static CommandArguments commandArguments = RawCommand();
  48. static void getArguments(Script* sc) {
  49. int length = commandArguments.getLength();
  50. Pointer p;
  51. p.offset = 0;
  52. p.array = asAllocate(&sc->arrays, sizeof(Pointer), length);
  53. sPushPointer(sc, &p);
  54. SnuviArray* array = asGet(&sc->arrays, p.array);
  55. if(array == nullptr) {
  56. sError(sc, "cannot allocate string memory");
  57. return;
  58. }
  59. Pointer* texts = static_cast<Pointer*>(array->data);
  60. for(int i = 0; i < length; i++) {
  61. Pointer text = Snuvi::toString(sc, commandArguments[i]);
  62. memcpy(texts + i, &text, sizeof(Pointer));
  63. }
  64. }
  65. CommandManager::CommandManager() {
  66. commands.add("test", commandTest);
  67. commands.add("stop", commandStop);
  68. commands.add("say", commandSay);
  69. commands.add("script", commandScript);
  70. DataType type = dtText();
  71. dtDereference(&type);
  72. Snuvi::initFunction("getArguments", type, getArguments);
  73. Snuvi::addFunction();
  74. }
  75. void CommandManager::execute(ServerState& sc, const RawCommand& rawCommand) {
  76. CommandArguments args(rawCommand);
  77. if(args.getLength() == 0) {
  78. std::cout << "Invalid command syntax: '" << rawCommand << "'\n";
  79. return;
  80. }
  81. CommandName command(args[0]);
  82. Command* c = commands.search(command);
  83. if(c == nullptr) {
  84. commandArguments = args;
  85. Snuvi::callEvent(Snuvi::Event::COMMAND);
  86. std::cout << "Unknown command: '" << command << "'\n";
  87. return;
  88. }
  89. (*c)(sc, args);
  90. }