30using ChatSubCommandMap = std::map<std::string_view, Trinity::Impl::ChatCommands::ChatCommandNode, StringCompareLessI_T>;
38 if (invokerEntry->_help)
51 if (builder._name.empty())
53 ASSERT(blank,
"Empty name command at top level is not permitted.");
61 for (
size_t i = 0, n = (tokens.size() - 1); i < n; ++i)
62 subMap = &((*subMap)[tokens[i]]._subCommands);
63 ((*subMap)[tokens.back()]).LoadFromBuilder(builder);
85 Field* fields = result->Fetch();
93 auto it = map->find(key);
101 TC_LOG_ERROR(
"sql.sql",
"Table `command` contains data for non-existant command '{}'. Skipped.", name);
110 if (std::holds_alternative<std::string>(cmd->
_help))
111 TC_LOG_ERROR(
"sql.sql",
"Table `command` contains duplicate data for command '{}'. Skipped.", name);
113 if (std::holds_alternative<std::monostate>(cmd->
_help))
114 cmd->
_help.emplace<std::string>(help);
116 TC_LOG_ERROR(
"sql.sql",
"Table `command` contains legacy help text for command '{}', which uses `trinity_string`. Skipped.", name);
117 }
while (result->NextRow());
121 cmd.ResolveNames(std::string(name));
126 if (_invoker && std::holds_alternative<std::monostate>(_help))
127 TC_LOG_WARN(
"sql.sql",
"Table `command` is missing help text for command '{}'.", name);
130 for (
auto& [subToken, cmd] : _subCommands)
132 std::string subName(name);
134 subName.append(subToken);
135 cmd.ResolveNames(subName);
150 std::string areaName =
"Unknown";
151 std::string zoneName =
"Unknown";
155 areaName = area->AreaName[locale];
158 zoneName = zone->AreaName[locale];
161 sLog->OutCommand(session.
GetAccountId(),
"Command: {} [Player: {} ({}) (Account: {}) X: {} Y: {} Z: {} Map: {} ({}) Area: {} ({}) Zone: {} Selected: {} ({})]",
166 areaId, areaName, zoneName,
173 bool const hasInvoker = IsInvokerVisible(handler);
176 if (std::holds_alternative<TrinityStrings>(_help))
178 else if (std::holds_alternative<std::string>(_help))
188 for (
auto it = _subCommands.begin(); it != _subCommands.end(); ++it)
190 bool const subCommandHasSubCommand = it->second.HasVisibleSubCommands(handler);
191 if (!subCommandHasSubCommand && !it->second.IsInvokerVisible(handler))
215 decltype(
auto)
operator*()
const {
return _it.operator*(); }
216 decltype(
auto) operator->()
const {
return _it.operator->(); }
223 explicit operator bool()
const {
return (
_it !=
_end); }
224 bool operator!()
const {
return !
static_cast<bool>(*this); }
251 cmdStr.remove_prefix(1);
253 cmdStr.remove_suffix(1);
254 std::string_view oldTail = cmdStr;
255 while (!oldTail.empty())
258 auto [token, newTail] =
tokenize(oldTail);
359 else if (cmdStr.empty())
381 cmdStr.remove_prefix(1);
383 cmdStr.remove_suffix(1);
384 std::string_view oldTail = cmdStr;
385 while (!oldTail.empty())
388 auto [token, newTail] =
tokenize(oldTail);
401 std::vector<std::string> vec;
402 auto possibility = ([prefix = std::string_view(path), suffix = std::string_view(newTail)](std::string_view match)
410 vec.emplace_back(possibility(it1->first));
412 do vec.emplace_back(possibility(it2->first));
421 path.assign(it1->first);
431 if (!oldTail.empty())
444 auto possibility = ([prefix = std::string_view(path)](std::string_view match)
447 return std::string(match);
454 std::vector<std::string> vec;
456 vec.emplace_back(possibility(it->first));
472 for (
auto it = _subCommands.begin(); it != _subCommands.end(); ++it)
473 if (it->second.IsVisible(who))
static void LogCommandUsage(WorldSession const &session, uint32 permission, std::string_view cmdStr)
static ChatSubCommandMap COMMAND_MAP
std::map< std::string_view, Trinity::Impl::ChatCommands::ChatCommandNode, StringCompareLessI_T > ChatSubCommandMap
DB2Storage< AreaTableEntry > sAreaTableStore("AreaTable.db2", &AreaTableLoadInfo::Instance)
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
#define STRING_VIEW_FMT_ARG(str)
@ LANG_CMD_NO_HELP_AVAILABLE
@ LANG_SUBCMDS_LIST_ENTRY
@ LANG_SUBCMDS_LIST_ENTRY_ELLIPSIS
#define TC_LOG_WARN(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
bool StringEqualI(std::string_view a, std::string_view b)
bool StringStartsWithI(std::string_view haystack, std::string_view needle)
static bool IsPlayerAccount(uint32 gmlevel)
virtual bool HasPermission(uint32 permission) const
WorldSession * GetSession()
bool HasSentErrorMessage() const
void PSendSysMessage(const char *fmt, Args &&... args)
void SetSentErrorMessage(bool val)
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Class used to access individual fields of database query result.
std::string_view GetStringView() const
char const * GetMapName() const
std::string ToString() const
static ObjectGuid GetGUID(Object const *o)
Unit * GetSelectedUnit() const
void SendCommandHelp(ChatHandler &handler) const
std::map< std::string_view, ChatCommandNode, StringCompareLessI_T > _subCommands
std::variant< std::monostate, TrinityStrings, std::string > _help
static void LoadCommandMap()
bool HasVisibleSubCommands(ChatHandler const &who) const
static void SendCommandHelpFor(ChatHandler &handler, std::string_view cmd)
static void InvalidateCommandMap()
void LoadFromBuilder(ChatCommandBuilder const &builder)
static std::map< std::string_view, ChatCommandNode, StringCompareLessI_T > const & GetTopLevelMap()
static void LoadCommandsIntoMap(ChatCommandNode *blank, std::map< std::string_view, ChatCommandNode, StringCompareLessI_T > &map, Trinity::ChatCommands::ChatCommandTable const &commands)
void ResolveNames(std::string name)
CommandPermissions _permission
bool IsInvokerVisible(ChatHandler const &who) const
static std::vector< std::string > GetAutoCompletionsFor(ChatHandler const &handler, std::string_view cmd)
static bool TryExecuteCommand(ChatHandler &handler, std::string_view cmd)
ObjectGuid GetTarget() const
constexpr uint32 GetMapId() const
std::string const & GetName() const
Player session in the World.
AccountTypes GetSecurity() const
LocaleConstant GetSessionDbcLocale() const
Player * GetPlayer() const
uint32 GetAccountId() const
TC_GAME_API std::vector< std::string > GetAutoCompletionsFor(ChatHandler const &handler, std::string_view cmd)
TC_GAME_API void SendCommandHelpFor(ChatHandler &handler, std::string_view cmd)
std::vector< ChatCommandBuilder > ChatCommandTable
TC_GAME_API bool TryExecuteCommand(ChatHandler &handler, std::string_view cmd)
TC_GAME_API void InvalidateCommandMap()
TC_GAME_API void LoadCommandMap()
TokenizeResult tokenize(std::string_view args)
static constexpr char COMMAND_DELIMITER
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
constexpr float GetPositionX() const
constexpr float GetPositionY() const
constexpr float GetPositionZ() const
std::variant< InvokerEntry, SubCommandEntry > _data
rbac::RBACPermissions RequiredPermission
ChatSubCommandMap::const_iterator _it
FilteredCommandListIterator(ChatSubCommandMap const &map, ChatHandler const &handler, std::string_view token)
std::string_view const _token
ChatSubCommandMap::const_iterator _end
FilteredCommandListIterator & operator++()
ChatHandler const & _handler