aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2022_02_27_40_world_2020_09_23_04_world.sql6
-rw-r--r--src/server/game/Chat/ChatCommands/ChatCommand.cpp38
-rw-r--r--src/server/game/Chat/ChatCommands/ChatCommand.h5
-rw-r--r--src/server/game/Miscellaneous/Language.h2
4 files changed, 36 insertions, 15 deletions
diff --git a/sql/updates/world/master/2022_02_27_40_world_2020_09_23_04_world.sql b/sql/updates/world/master/2022_02_27_40_world_2020_09_23_04_world.sql
new file mode 100644
index 00000000000..f3ae4647263
--- /dev/null
+++ b/sql/updates/world/master/2022_02_27_40_world_2020_09_23_04_world.sql
@@ -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 ...');
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