diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/Chat/ChatCommands/ChatCommandArgs.h | 15 | ||||
| -rw-r--r-- | src/server/game/Chat/Hyperlinks.h | 34 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_battlenet_account.cpp | 28 |
3 files changed, 28 insertions, 49 deletions
diff --git a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h index 271d4850f2a..e2270c0259f 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandArgs.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandArgs.h @@ -21,6 +21,7 @@ #include "ChatCommandHelpers.h" #include "ChatCommandTags.h" #include "SmartEnum.h" +#include "StringConvert.h" #include "Util.h" #include <charconv> #include <map> @@ -55,20 +56,10 @@ struct ArgInfo<T, std::enable_if_t<std::is_integral_v<T>>> char const* next = args; std::string_view token(args, Trinity::Impl::ChatCommands::tokenize(next)); - if (!token.length()) - return nullptr; - - std::from_chars_result result; - if (StringStartsWith(token, "0x")) - result = std::from_chars(token.data() + 2, token.data() + token.length(), val, 16); - else if (StringStartsWith(token, "0b")) - result = std::from_chars(token.data() + 2, token.data() + token.length(), val, 2); + if (Optional<T> v = StringTo<T>(token, 0)) + val = *v; else - result = std::from_chars(token.data(), token.data() + token.length(), val, 10); - - if ((token.data() + token.length()) != result.ptr) return nullptr; - return next; } }; diff --git a/src/server/game/Chat/Hyperlinks.h b/src/server/game/Chat/Hyperlinks.h index 960c6a10338..2085a27c4e5 100644 --- a/src/server/game/Chat/Hyperlinks.h +++ b/src/server/game/Chat/Hyperlinks.h @@ -19,7 +19,7 @@ #define TRINITY_HYPERLINKS_H #include "ObjectGuid.h" -#include "Optional.h" +#include "StringConvert.h" #include <string> #include <type_traits> #include <utility> @@ -220,26 +220,28 @@ namespace Trinity::Hyperlinks return true; } - static bool StoreTo(ObjectGuid& val, char const* pos, size_t len) - { - val = ObjectGuid::FromString(std::string(pos, len)); - return true; - } - template <typename T> - static std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>, bool> StoreTo(T& val, char const* pos, size_t len) + static std::enable_if_t<std::is_integral_v<T>, bool> StoreTo(T& val, char const* pos, size_t len) { - try { val = std::stoull(std::string(pos, len)); } - catch (...) { return false; } - return true; + if (Optional<T> res = Trinity::StringTo<T>(std::string_view(pos, len))) + { + val = *res; + return true; + } + else + return false; } - template <typename T> - static std::enable_if_t<std::is_integral_v<T> && std::is_signed_v<T>, bool> StoreTo(T& val, char const* pos, size_t len) + static bool StoreTo(ObjectGuid& val, char const* pos, size_t len) { - try { val = std::stoll(std::string(pos, len)); } - catch (...) { return false; } - return true; + ObjectGuid parsed = ObjectGuid::FromString(std::string(pos, len)); + if (parsed != ObjectGuid::FromStringFailed) + { + val = parsed; + return true; + } + else + return false; } }; diff --git a/src/server/scripts/Commands/cs_battlenet_account.cpp b/src/server/scripts/Commands/cs_battlenet_account.cpp index 748cfbe1aee..c4f0dff6c01 100644 --- a/src/server/scripts/Commands/cs_battlenet_account.cpp +++ b/src/server/scripts/Commands/cs_battlenet_account.cpp @@ -68,45 +68,31 @@ public: } /// Create an account - static bool HandleAccountCreateCommand(ChatHandler* handler, char const* args) + static bool HandleAccountCreateCommand(ChatHandler* handler, std::string const& accountName, std::string const& password, Optional<bool> createGameAccount) { - if (!*args) - return false; - - ///- %Parse the command line arguments - char* accountName = strtok((char*)args, " "); - char* password = strtok(nullptr, " "); - if (!accountName || !password) - return false; - - if (!strchr(accountName, '@')) + if (accountName.find('@') == std::string::npos) { handler->SendSysMessage(LANG_ACCOUNT_INVALID_BNET_NAME); handler->SetSentErrorMessage(true); return false; } - char* createGameAccountParam = strtok(nullptr, " "); - bool createGameAccount = true; - if (createGameAccountParam) - createGameAccount = StringToBool(createGameAccountParam); - std::string gameAccountName; - switch (Battlenet::AccountMgr::CreateBattlenetAccount(std::string(accountName), std::string(password), createGameAccount, &gameAccountName)) + switch (Battlenet::AccountMgr::CreateBattlenetAccount(accountName, password, createGameAccount.value_or(true), &gameAccountName)) { case AccountOpResult::AOR_OK: { - if (createGameAccount) - handler->PSendSysMessage(LANG_ACCOUNT_CREATED_BNET_WITH_GAME, accountName, gameAccountName.c_str()); + if (createGameAccount == true) + handler->PSendSysMessage(LANG_ACCOUNT_CREATED_BNET_WITH_GAME, accountName.c_str(), gameAccountName.c_str()); else - handler->PSendSysMessage(LANG_ACCOUNT_CREATED_BNET, accountName); + handler->PSendSysMessage(LANG_ACCOUNT_CREATED_BNET, accountName.c_str()); if (handler->GetSession()) { TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Character:[%s] (%s) created Battle.net account %s%s%s", handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUID().ToString().c_str(), - accountName, createGameAccount ? " with game account " : "", createGameAccount ? gameAccountName.c_str() : ""); + accountName.c_str(), createGameAccount == true ? " with game account " : "", createGameAccount == true ? gameAccountName.c_str() : ""); } break; } |
