Do a refactor of command parsing in lpxclient and lpxserver

This commit is contained in:
2024-02-28 18:24:36 -05:00
parent 4495ae7133
commit c2a94b5332
6 changed files with 240 additions and 183 deletions

View File

@@ -10,7 +10,7 @@
#include <memory>
class LpxClient : public DrivenEngine {
class LpxClient : public DrivenEngine, public CommonCommands {
public:
using StringVec = LuaConsole::StringVec;
UniqueWorld world_;
@@ -137,79 +137,70 @@ public:
}
}
void do_luainvoke_command(const StringVec &words) {
send_invocation(Invocation(Invocation::KIND_LUA, actor_id_, actor_id_, words[1]));
virtual void do_syntax_error(std::string_view error) override {
stdostream() << "Syntax error: " << error << std::endl;
}
void do_luaprobe_command(const StringVec &words) {
world_to_asynchronous();
stdostream() << world_->probe_lua(actor_id_, words[1]);
world_to_synchronous();
virtual void do_unknown_command(std::string_view name) override {
stdostream() << "Unknown command: " << name << std::endl;
}
void do_syntax_command(const StringVec &words) {
stdostream() << "Syntax Error: " << words[1] << std::endl;
virtual void do_choose_command(int64_t index) override {
eng::string action = gui_.get_action(index);
if (action == "") {
stdostream() << "Invalid menu item #" << index << std::endl;
return;
}
send_invocation(Invocation(Invocation::KIND_CHOOSE, actor_id_, gui_.place(), action));
}
void do_view_command(const StringVec &cmd) {
virtual void do_view_command() override {
stdostream() << world_->tangibles_near_debug_string(actor_id_, 1000);
}
void do_menu_command(const StringVec &cmd) {
virtual void do_moveto_command(int x, int y) override {
do_unknown_command("moveto");
}
virtual void do_menu_command(int64_t tanid) override {
world_to_asynchronous();
int64_t place = sv::to_int64(cmd[1], actor_id_);
world_->update_gui(actor_id_, place, &gui_);
world_->update_gui(actor_id_, (tanid==0) ? actor_id_ : tanid, &gui_);
stdostream() << gui_.menu_debug_string();
}
void do_choose_command(const StringVec &cmd) {
eng::string action = gui_.get_action(sv::to_int64(cmd[1]));
if (action == "") {
stdostream() << "Invalid menu item #" << std::endl;
return;
}
stdostream() << "Invoking plan: " << action << std::endl;
Invocation inv(Invocation::KIND_CHOOSE, actor_id_, gui_.place(), action);
send_invocation(inv);
}
void do_tick_command(const util::StringVec &words) {
send_invocation(Invocation(Invocation::KIND_TICK, actor_id_, actor_id_, ""));
}
void do_cpl_command(const util::StringVec &words) {
rescan_lua_source();
}
void do_work_command(const util::StringVec &words) {
// The 'work' command is a stub for sticking temporary debugging code in here.
}
void do_quit_command(const util::StringVec &words) {
virtual void do_quit_command() override {
abandon_server();
stop_driver();
}
void do_connect_command(const util::StringVec &words) {
set_initial_state_connect(util::ss("nocert:", words[1], ":8085"));
virtual void do_cpl_command() override {
rescan_lua_source();
}
void do_command(const util::StringVec &words) {
if (words.empty()) return;
else if (words[0] == "luainvoke") do_luainvoke_command(words);
else if (words[0] == "luaprobe") do_luaprobe_command(words);
else if (words[0] == "syntax") do_syntax_command(words);
else if (words[0] == "view") do_view_command(words);
else if (words[0] == "menu") do_menu_command(words);
else if (words[0] == "choose") do_choose_command(words);
else if (words[0] == "tick") do_tick_command(words);
else if (words[0] == "cpl") do_cpl_command(words);
else if (words[0] == "work") do_work_command(words);
else if (words[0] == "quit") do_quit_command(words);
else if (words[0] == "connect") do_connect_command(words);
else {
stdostream() << "Unsupported command: " << words[0] << std::endl;
}
virtual void do_work_command() override {
do_unknown_command("work");
}
virtual void do_display_command() override {
do_unknown_command("display");
}
virtual void do_aborthttp_command() override {
do_unknown_command("aborthttp");
}
virtual void do_connect_command(std::string_view hostname) override {
set_initial_state_connect(util::ss("nocert:", hostname, ":8085"));
}
virtual void do_luainvoke_command(std::string_view cmd) override {
send_invocation(Invocation(Invocation::KIND_LUA, actor_id_, actor_id_, cmd));
}
virtual void do_luaprobe_command(std::string_view cmd) override {
world_to_asynchronous();
stdostream() << world_->probe_lua(actor_id_, cmd);
world_to_synchronous();
}
void change_actor_id(int64_t actor_id) {