diff options
author | Treeston <treeston.mmoc@gmail.com> | 2020-09-23 14:39:13 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-02-27 23:26:40 +0100 |
commit | a788e0c3e185dedcd87fe9d85a9f81e2e8ff1738 (patch) | |
tree | 11e37e4dca153173220b15838c98449095b35034 /src | |
parent | 20511e5f793cb0a929a1ffbe23d17a3ddb8554f4 (diff) |
Core/ChatCommand: Improve feedback for ambiguous commands
(cherry picked from commit a6d8a7ad1e5e507aacc90546982a7590b62d2d78)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Chat/ChatCommands/ChatCommand.cpp | 38 | ||||
-rw-r--r-- | src/server/game/Chat/ChatCommands/ChatCommand.h | 5 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Language.h | 2 |
3 files changed, 30 insertions, 15 deletions
diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.cpp b/src/server/game/Chat/ChatCommands/ChatCommand.cpp index 36f33b10de5..6d1ac20930a 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommand.cpp @@ -116,17 +116,23 @@ static ChatSubCommandMap COMMAND_MAP; } while (result->NextRow()); } - for (auto const& [name, cmd] : COMMAND_MAP) - cmd.AssertCommandHelp(name); + for (auto& [name, cmd] : COMMAND_MAP) + cmd.ResolveNames(std::string(name)); } -void Trinity::Impl::ChatCommands::ChatCommandNode::AssertCommandHelp(std::string_view name) const +void Trinity::Impl::ChatCommands::ChatCommandNode::ResolveNames(std::string name) { if (_invoker && std::holds_alternative<std::monostate>(_help)) - TC_LOG_WARN("sql.sql", "Table `command` is missing help text for (sub-)command '" STRING_VIEW_FMT "'.", STRING_VIEW_FMT_ARG(name)); + TC_LOG_WARN("sql.sql", "Table `command` is missing help text for command '" STRING_VIEW_FMT "'.", STRING_VIEW_FMT_ARG(name)); - for (auto const& [name, cmd] : _subCommands) - cmd.AssertCommandHelp(name); + _name = name; + for (auto& [subToken, cmd] : _subCommands) + { + std::string subName(name); + subName.push_back(COMMAND_DELIMITER); + subName.append(subToken); + cmd.ResolveNames(subName); + } } static void LogCommandUsage(WorldSession const& session, uint32 permission, std::string_view cmdStr) @@ -162,7 +168,8 @@ static void LogCommandUsage(WorldSession const& session, uint32 permission, std: void Trinity::Impl::ChatCommands::ChatCommandNode::SendCommandHelp(ChatHandler& handler) const { - if (IsInvokerVisible(handler)) + bool const hasInvoker = IsInvokerVisible(handler); + if (hasInvoker) { if (std::holds_alternative<TrinityStrings>(_help)) handler.SendSysMessage(std::get<TrinityStrings>(_help)); @@ -178,10 +185,12 @@ void Trinity::Impl::ChatCommands::ChatCommandNode::SendCommandHelp(ChatHandler& continue; if (!header) { + if (!hasInvoker) + handler.PSendSysMessage(LANG_CMD_HELP_GENERIC, STRING_VIEW_FMT_ARG(_name)); handler.SendSysMessage(LANG_SUBCMDS_LIST); header = true; } - handler.PSendSysMessage(subCommandHasSubCommand ? LANG_SUBCMDS_LIST_ENTRY_ELLIPSIS : LANG_SUBCMDS_LIST_ENTRY, STRING_VIEW_FMT_ARG(it->first)); + handler.PSendSysMessage(subCommandHasSubCommand ? LANG_SUBCMDS_LIST_ENTRY_ELLIPSIS : LANG_SUBCMDS_LIST_ENTRY, STRING_VIEW_FMT_ARG(it->second._name)); } } @@ -253,9 +262,10 @@ namespace Trinity::Impl::ChatCommands if (it2) { /* there are multiple matching subcommands - print possibilities and return */ if (cmd) - handler.PSendSysMessage(LANG_SUBCMD_AMBIGUOUS, STRING_VIEW_FMT_ARG(token)); + handler.PSendSysMessage(LANG_SUBCMD_AMBIGUOUS, STRING_VIEW_FMT_ARG(cmd->_name), COMMAND_DELIMITER, STRING_VIEW_FMT_ARG(token)); else handler.PSendSysMessage(LANG_CMD_AMBIGUOUS, STRING_VIEW_FMT_ARG(token)); + handler.PSendSysMessage(it1->second.HasVisibleSubCommands(handler) ? LANG_SUBCMDS_LIST_ENTRY_ELLIPSIS : LANG_SUBCMDS_LIST_ENTRY, STRING_VIEW_FMT_ARG(it1->first)); do { @@ -304,7 +314,7 @@ namespace Trinity::Impl::ChatCommands if (cmd) { cmd->SendCommandHelp(handler); - handler.PSendSysMessage(LANG_SUBCMD_INVALID, STRING_VIEW_FMT_ARG(token)); + handler.PSendSysMessage(LANG_SUBCMD_INVALID, STRING_VIEW_FMT_ARG(cmd->_name), COMMAND_DELIMITER, STRING_VIEW_FMT_ARG(token)); } else handler.PSendSysMessage(LANG_CMD_INVALID, STRING_VIEW_FMT_ARG(token)); @@ -318,7 +328,11 @@ namespace Trinity::Impl::ChatCommands if (it2) { /* there are multiple matching subcommands - print possibilities and return */ - handler.PSendSysMessage(cmd ? LANG_SUBCMD_AMBIGUOUS : LANG_CMD_AMBIGUOUS, STRING_VIEW_FMT_ARG(token)); + if (cmd) + handler.PSendSysMessage(LANG_SUBCMD_AMBIGUOUS, STRING_VIEW_FMT_ARG(cmd->_name), COMMAND_DELIMITER, STRING_VIEW_FMT_ARG(token)); + else + handler.PSendSysMessage(LANG_CMD_AMBIGUOUS, STRING_VIEW_FMT_ARG(token)); + handler.PSendSysMessage(it1->second.HasVisibleSubCommands(handler) ? LANG_SUBCMDS_LIST_ENTRY_ELLIPSIS : LANG_SUBCMDS_LIST_ENTRY, STRING_VIEW_FMT_ARG(it1->first)); do { @@ -343,7 +357,7 @@ namespace Trinity::Impl::ChatCommands handler.SendSysMessage(LANG_AVAILABLE_CMDS); do { - handler.PSendSysMessage(it->second.HasVisibleSubCommands(handler) ? LANG_SUBCMDS_LIST_ENTRY_ELLIPSIS : LANG_SUBCMDS_LIST_ENTRY, STRING_VIEW_FMT_ARG(it->first)); + handler.PSendSysMessage(it->second.HasVisibleSubCommands(handler) ? LANG_SUBCMDS_LIST_ENTRY_ELLIPSIS : LANG_SUBCMDS_LIST_ENTRY, STRING_VIEW_FMT_ARG(it->second._name)); } while (++it); } else diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.h b/src/server/game/Chat/ChatCommands/ChatCommand.h index fd0721f49fa..80490b5161d 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.h +++ b/src/server/game/Chat/ChatCommands/ChatCommand.h @@ -184,7 +184,7 @@ namespace Trinity::Impl::ChatCommands static void SendCommandHelpFor(ChatHandler& handler, std::string_view cmd); static std::vector<std::string> GetAutoCompletionsFor(ChatHandler const& handler, std::string_view cmd); - ChatCommandNode() : _invoker{}, _permission{}, _help{}, _subCommands{} {} + ChatCommandNode() : _name{}, _invoker {}, _permission{}, _help{}, _subCommands{} {} private: static std::map<std::string_view, ChatCommandNode, StringCompareLessI_T> const& GetTopLevelMap(); @@ -193,13 +193,14 @@ namespace Trinity::Impl::ChatCommands void LoadFromBuilder(ChatCommandBuilder const& builder); ChatCommandNode(ChatCommandNode&& other) = default; - void AssertCommandHelp(std::string_view name) const; + void ResolveNames(std::string name); void SendCommandHelp(ChatHandler& handler) const; bool IsVisible(ChatHandler const& who) const { return (IsInvokerVisible(who) || HasVisibleSubCommands(who)); } bool IsInvokerVisible(ChatHandler const& who) const; bool HasVisibleSubCommands(ChatHandler const& who) const; + std::string _name; CommandInvoker _invoker; CommandPermissions _permission; std::variant<std::monostate, TrinityStrings, std::string> _help; diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 1d718927ffd..993fff7aa79 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -236,7 +236,7 @@ enum TrinityStrings LANG_SUBCMDS_LIST_ENTRY_ELLIPSIS = 192, LANG_SUBCMD_INVALID = 193, LANG_CMD_AMBIGUOUS = 194, - LANG_CMD_HELP_GENERIC = 195, // 3.3.5 RESERVED + LANG_CMD_HELP_GENERIC = 195, LANG_CMD_NO_HELP_AVAILABLE = 196, // 3.3.5 RESERVED // Room for more level 1 197-199 not used |