From 22958daa261326ea3b6f7b5215368647a9f8bfa4 Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Tue, 27 May 2025 23:14:59 +0800 Subject: commands: use type safe optional for reason --- src/commands.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/commands.cpp b/src/commands.cpp index 544468d..53ec3ad 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -1,16 +1,19 @@ -#include "commands.hpp" #include "commandHandler.hpp" +#include "commands.hpp" #include "format.hpp" +#include "log.hpp" #include "sessionManager.hpp" +#define NOREASON "No reason specified"; + struct SKickArgs { - std::string target; - std::string reason; + std::string target; + std::optional reason; }; struct SMuteArgs { - std::string target; - std::string reason; + std::string target; + std::optional reason; }; void registerCommands() { @@ -22,13 +25,11 @@ void registerCommands() { 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 = "Kicked: No reason specified"; + std::optional reason = std::nullopt; 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()) @@ -40,8 +41,9 @@ void registerCommands() { 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}; }})); + const auto reason = data.reason ? *data.reason : NOREASON; + g_pSessionManager->kick(session, true, reason); + return {.result = "Kicked '" + data.target + "': " + reason, .good = true}; }})); g_pCommandHandler->registerCommand({.requireAdmin = false, .name = "list", .parser = [](const std::string &args) -> CCommandHandler::SParseResult { (void)args; @@ -57,13 +59,11 @@ void registerCommands() { g_pCommandHandler->registerCommand(CCommandHandler::makeCommand({.name = "mute", .parser = [](const std::string &args) -> std::pair { size_t pos = args.find(' '); std::string target = args; - std::string reason = "Muted: No reason specified"; + std::optional reason; if (pos != std::string::npos) { target = args.substr(0, pos); - reason = args.substr(pos + 1); - if (reason.empty()) - reason = "Muted: No reason specified"; + reason = args.substr(pos + 1); } if (target.empty()) @@ -74,9 +74,11 @@ void registerCommands() { if (!session) return {.result = "User '" + data.target + "' not found", .good = false}; + const auto reason = data.reason ? *data.reason : NOREASON; + session->setMuted(true); - session->write("You have been muted"); - return {.result = "Muted '" + data.target + "': " + data.reason, .good = true}; }})); + session->write("You have been muted for: {}", reason); + return {.result = "Muted '" + data.target + "': " + reason, .good = true}; }})); // TODO: use fmt g_pCommandHandler->registerCommand(CCommandHandler::makeCommand({.name = "unmute", .parser = [](const std::string &args) -> std::pair { if (args.empty()) -- cgit v1.2.3