From 6dc35e7bebf357de7282ad29f6140613d84536b4 Mon Sep 17 00:00:00 2001 From: Treeston Date: Sat, 8 Sep 2018 19:46:12 +0200 Subject: Core/ChatCommands: Properly handle single-argument handlers (argument string discarded). Add special handling for on/off booleans. (cherry picked from commit 37489eda93b6fac53a6596979dfab08e04b04523) --- src/server/game/Chat/ChatCommands/ChatCommand.h | 14 +++++++------- src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp | 15 +++++++++++++++ src/server/game/Chat/ChatCommands/ChatCommandArgs.h | 7 +++++++ 3 files changed, 29 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/server/game/Chat/ChatCommands/ChatCommand.h b/src/server/game/Chat/ChatCommands/ChatCommand.h index b15e57582ff..7f35f906776 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommand.h +++ b/src/server/game/Chat/ChatCommands/ChatCommand.h @@ -118,7 +118,7 @@ struct CommandArgsConsumerMulti static char const* TryConsumeTo(Tuple& tuple, char const* args) { if (char const* next = CommandArgsConsumerSingle::TryConsumeTo(std::get(tuple), args)) - return CommandArgsConsumerNext::GoNext(tuple, next); + return CommandArgsConsumerNext::GoNext(tuple, next); else return nullptr; } @@ -133,11 +133,11 @@ struct CommandArgsConsumerMulti, offset> auto& myArg = std::get(tuple); myArg.emplace(); if (char const* next = CommandArgsConsumerSingle::TryConsumeTo(*(myArg.get_ptr()), args)) - if ((next = CommandArgsConsumerNext::GoNext(tuple, next))) + if ((next = CommandArgsConsumerNext::GoNext(tuple, next))) return next; // try again omitting the argument myArg = boost::none; - if (char const* next = CommandArgsConsumerNext::GoNext(tuple, args)) + if (char const* next = CommandArgsConsumerNext::GoNext(tuple, args)) return next; return nullptr; } @@ -148,13 +148,13 @@ struct CommandArgsConsumerNext, offset> { using tuple_type = std::tuple; - template + template static std::enable_if_t GoNext(tuple_type& tuple, char const* args) { - return CommandArgsConsumerMulti, offset + 1>::TryConsumeTo(tuple, args); + return CommandArgsConsumerMulti, offset>::TryConsumeTo(tuple, args); } - template + template static std::enable_if_t GoNext(tuple_type&, char const* args) { return args; @@ -192,7 +192,7 @@ class TC_GAME_API CommandArgs template bool TryConsumeToTuple(T& tuple) { - if (char const* next = CommandArgsConsumerMulti, offset>::TryConsumeTo(tuple, _args)) + if (char const* next = CommandArgsConsumerNext::GoNext(tuple, _args)) { _args = next; return true; diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp index 1efbc00dd46..16a750e1314 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.cpp @@ -35,3 +35,18 @@ char const* Trinity::ChatCommands::ArgInfo::TryConsume(GameTele data = boost::apply_visitor(GameTeleVisitor(), val); return args; } + +struct BoolVisitor +{ + using value_type = bool; + value_type operator()(uint32 i) const { return !!i; } + value_type operator()(ExactSequence<'o', 'n'>) const { return true; } + value_type operator()(ExactSequence<'o', 'f', 'f'>) const { return false; } +}; +char const* Trinity::ChatCommands::ArgInfo::TryConsume(bool& data, char const* args) +{ + Variant, ExactSequence<'o', 'f', 'f'>> val; + if ((args = CommandArgsConsumerSingle::TryConsumeTo(val, args))) + data = boost::apply_visitor(BoolVisitor(), val); + return args; +} diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h index 10aa141a4c3..811981e1244 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h @@ -115,6 +115,13 @@ struct TC_GAME_API ArgInfo static char const* TryConsume(GameTele const*&, char const*); }; +// bool from 1/0 or on/off +template <> +struct TC_GAME_API ArgInfo +{ + static char const* TryConsume(bool&, char const*); +}; + }} #endif -- cgit v1.2.3