From f25eec7a0ba4a8a868eb87c76ec8b88f76f3a124 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Thu, 20 Mar 2025 22:38:46 +0800 Subject: feat: inputManager and commandHandler (#7) server now have ability to send chat like any clients. can also run commands(registered in commands.cpp) --- src/commandHandler.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/commandHandler.cpp (limited to 'src/commandHandler.cpp') diff --git a/src/commandHandler.cpp b/src/commandHandler.cpp new file mode 100644 index 0000000..12b51dc --- /dev/null +++ b/src/commandHandler.cpp @@ -0,0 +1,58 @@ +#include "commandHandler.hpp" +#include "log.hpp" +#include + +CCommandHandler::CCommandHandler() { + log(LOG, "CommandHandler: initialized"); +} + +CCommandHandler::~CCommandHandler() { + log(SYS, "CommandHandler: bye"); + m_vCommands.clear(); +} + +bool CCommandHandler::isCommand(const std::string &str) const { + return !str.empty() && str.front() == '/'; +}; + +bool CCommandHandler::validCommand(const std::string &command) const { + return std::ranges::any_of(m_vCommands, [&command](const SCommand &cmd) { + return cmd.name == command; + }); +} + +bool CCommandHandler::registerCommand(const SCommand &command) { + if (command.name.empty() || !command.exe || !command.parser) + return false; + + m_vCommands.push_back(command); + return true; +} + +const CCommandHandler::SCommand *CCommandHandler::getCommand(const std::string &command) const { + auto it = std::ranges::find_if(m_vCommands, [&command](const SCommand &cmd) { return cmd.name == command; }); + + if (it != m_vCommands.end()) + return &*it; + + return nullptr; +} + +CCommandHandler::SResult CCommandHandler::exeCommand(const SCommand &command, const std::string &args) const { + const auto [parsed, good] = command.parser(args); + if (!good) + try { + return {.result = std::any_cast(parsed), .good = false}; + } catch (const std::bad_any_cast &) { + return {.result = "", .good = false}; + } + + return command.exe(parsed); +} + +CCommandHandler::SResult CCommandHandler::newCommand(const std::string &command, const std::string &args) const { + if (!validCommand(command)) + return {.result = "Invalid command", .good = false}; + + return exeCommand(*getCommand(command), args); +} -- cgit v1.2.3