Core/ChatCommand: Improve feedback for ambiguous commands

(cherry picked from commit a6d8a7ad1e)
This commit is contained in:
Treeston
2020-09-23 14:39:13 +02:00
committed by Shauren
parent 20511e5f79
commit a788e0c3e1
4 changed files with 36 additions and 15 deletions

View File

@@ -0,0 +1,6 @@
--
DELETE FROM `trinity_string` WHERE `entry` IN (7,193,195);
INSERT INTO `trinity_string` (`entry`,`content_default`) VALUES
( 7, 'Subcommand \'%.*s%c%.*s\' is ambiguous:'),
(193, 'Subcommand \'%.*s%c%.*s\' does not exist.'),
(195, '### USAGE: .%.*s ...');

View File

@@ -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

View File

@@ -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;

View File

@@ -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