From c8e0bb0db0640fe17c5a188abe305e44f8e3c125 Mon Sep 17 00:00:00 2001 From: TAHuntling <38479763+TAHuntling@users.noreply.github.com> Date: Fri, 17 May 2024 00:02:30 -0500 Subject: [PATCH] feat: Command Sorting (#1580) * Update SlashCommandHandler.cpp * Update SlashCommandHandler.cpp * Update SlashCommandHandler.cpp * Update SlashCommandHandler.cpp * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update SlashCommandHandler.cpp * Update SlashCommandHandler.cpp * Update SlashCommandHandler.cpp * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update SlashCommandHandler.cpp * Update SlashCommandHandler.cpp * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update SlashCommandHandler.cpp * Update dGame/dUtilities/SlashCommandHandler.cpp Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> * Update SlashCommandHandler.cpp * Update SlashCommandHandler.cpp --------- Co-authored-by: David Markowitz <39972741+EmosewaMC@users.noreply.github.com> --- dGame/dUtilities/SlashCommandHandler.cpp | 46 ++++++++++-------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/dGame/dUtilities/SlashCommandHandler.cpp b/dGame/dUtilities/SlashCommandHandler.cpp index bf7e9eb4..3ba1ab38 100644 --- a/dGame/dUtilities/SlashCommandHandler.cpp +++ b/dGame/dUtilities/SlashCommandHandler.cpp @@ -19,7 +19,7 @@ #include "dServer.h" namespace { - std::vector CommandInfos; + std::map CommandInfos; std::map RegisteredCommands; } @@ -38,9 +38,8 @@ void SlashCommandHandler::RegisterCommand(Command command) { continue; } } - - CommandInfos.push_back(command); -}; + CommandInfos[command.aliases[0]] = command; +} void SlashCommandHandler::HandleChatCommand(const std::u16string& chat, Entity* entity, const SystemAddress& sysAddr) { auto input = GeneralUtils::UTF16ToWTF8(chat); @@ -74,38 +73,31 @@ void SlashCommandHandler::HandleChatCommand(const std::u16string& chat, Entity* } } -// This commands in here so we can access the CommandInfos to display info void GMZeroCommands::Help(Entity* entity, const SystemAddress& sysAddr, const std::string args) { std::ostringstream feedback; if (args.empty()) { feedback << "----- Commands -----"; - for (const auto& command : CommandInfos) { + for (const auto& [alias, command] : CommandInfos) { // TODO: Limit displaying commands based on GM level they require if (command.requiredLevel > entity->GetGMLevel()) continue; - LOG("Help command: %s", command.aliases[0].c_str()); - feedback << "\n/" << command.aliases[0] << ": " << command.help; + LOG("Help command: %s", alias.c_str()); + feedback << "\n/" << alias << ": " << command.help; } } else { - bool foundCommand = false; - for (const auto& command : CommandInfos) { - if (std::ranges::find(command.aliases, args) == command.aliases.end()) continue; - - if (entity->GetGMLevel() < command.requiredLevel) break; - foundCommand = true; - feedback << "----- " << command.aliases.at(0) << " -----\n"; - // info can be a localizable string - feedback << command.info; - if (command.aliases.size() == 1) break; - - feedback << "\nAliases: "; - for (size_t i = 0; i < command.aliases.size(); i++) { - if (i > 0) feedback << ", "; - feedback << command.aliases[i]; + auto it = CommandInfos.find(args); + if (it != CommandInfos.end() && entity->GetGMLevel() >= it->second.requiredLevel) { + feedback << "----- " << args << " -----\n"; + feedback << it->second.info; + if (it->second.aliases.size() > 1) { + feedback << "\nAliases: "; + for (size_t i = 0; i < it->second.aliases.size(); i++) { + if (i > 0) feedback << ", "; + feedback << it->second.aliases[i]; + } } + } else if (entity->GetGMLevel() > eGameMasterLevel::CIVILIAN) { + feedback << "Command " << std::quoted(args) << " does not exist!"; } - - // Let GameMasters know if the command doesn't exist - if (!foundCommand && entity->GetGMLevel() > eGameMasterLevel::CIVILIAN) feedback << "Command " << std::quoted(args) << " does not exist!"; } const auto feedbackStr = feedback.str(); if (!feedbackStr.empty()) GameMessages::SendSlashCommandFeedbackText(entity, GeneralUtils::ASCIIToUTF16(feedbackStr)); @@ -900,7 +892,7 @@ void SlashCommandHandler::Startup() { Command HelpCommand{ .help = "Display command info", - .info = "If a command is given, display detailed info on that command. Otherwise display a list of commands with short desctiptions.", + .info = "If a command is given, display detailed info on that command. Otherwise display a list of commands with short descriptions.", .aliases = { "help", "h"}, .handle = GMZeroCommands::Help, .requiredLevel = eGameMasterLevel::CIVILIAN