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/commands.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/commands.cpp (limited to 'src/commands.cpp') diff --git a/src/commands.cpp b/src/commands.cpp new file mode 100644 index 0000000..1db5d43 --- /dev/null +++ b/src/commands.cpp @@ -0,0 +1,46 @@ +#include "commands.hpp" +#include "commandHandler.hpp" +#include "sessionManager.hpp" + +struct SKickArgs { + std::string target; + std::string reason; +}; + +void registerCommands() { + g_pCommandHandler->registerCommand({.name = "raw", .parser = [](const std::string &args) -> CCommandHandler::SParseResult { return {.data = args, .good = true}; }, .exe = [](const std::any &parsed) -> CCommandHandler::SResult { + const std::string &data = std::any_cast(parsed); + g_pSessionManager->broadcast(data); + return {.result = "Broadcasted: " + data, .good = true}; }}); + + g_pCommandHandler->registerCommand(CCommandHandler::makeCommand({.name = "kick", .parser = [](const std::string &args) -> std::pair { + size_t pos = args.find(' '); + std::string target = args; + std::string reason = "No reason specified"; + + if (pos != std::string::npos) { + target = args.substr(0, pos); + reason = args.substr(pos + 1); + if (reason.empty()) + reason = "Kicked: No reason specified"; + } + + if (target.empty()) + return {SKickArgs{}, false}; + + return { + SKickArgs{.target=target, .reason=reason}, true}; }, .exe = [](const SKickArgs &data) -> CCommandHandler::SResult { + const auto session = g_pSessionManager->getByName(data.target); + if (!session) + return {.result = "User '" + data.target + "' not found", .good = false}; + + g_pSessionManager->kick(session, true, data.reason); + return {.result = "Kicked '" + data.target + "': " + data.reason, .good = true}; }})); + + g_pCommandHandler->registerCommand({.name = "list", .parser = [](const std::string &args) -> CCommandHandler::SParseResult { return {.good = true}; }, .exe = [](const std::any &parsed) -> CCommandHandler::SResult { + std::string result = "Clients:\n"; + for (const auto &session : g_pSessionManager->getSessions()) + result += session->getName() + "\t" + session->getIp() + "\n"; + + return {.result = result, .good = true}; }}); +} -- cgit v1.2.3