summaryrefslogtreecommitdiff
path: root/src/commands.cpp
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-03-20 22:38:46 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-03-22 15:02:46 +0800
commitf25eec7a0ba4a8a868eb87c76ec8b88f76f3a124 (patch)
treea3f7c6e07b895327beee62d5f83602b6b083df33 /src/commands.cpp
parent45ca296a55332a4d79319f8a706f332aa8feb336 (diff)
feat: inputManager and commandHandler (#7)
server now have ability to send chat like any clients. can also run commands(registered in commands.cpp)
Diffstat (limited to 'src/commands.cpp')
-rw-r--r--src/commands.cpp46
1 files changed, 46 insertions, 0 deletions
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<const std::string &>(parsed);
+ g_pSessionManager->broadcast(data);
+ return {.result = "Broadcasted: " + data, .good = true}; }});
+
+ g_pCommandHandler->registerCommand(CCommandHandler::makeCommand<SKickArgs>({.name = "kick", .parser = [](const std::string &args) -> std::pair<SKickArgs, bool> {
+ 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}; }});
+}