diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2020-09-07 15:38:23 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-07 15:38:23 +0200 |
| commit | 00dd337b5d2c91907424828d7eebe3191931b036 (patch) | |
| tree | 42d673bef9a349bdc6313a7b27e3d99cea028b7d /src/server/game/Chat/ChatCommands | |
| parent | 68a4085427a898046b4afb73f6c369640418b848 (diff) | |
Scripts/Commands: .character command conversion
Diffstat (limited to 'src/server/game/Chat/ChatCommands')
| -rw-r--r-- | src/server/game/Chat/ChatCommands/ChatCommandTags.cpp | 62 | ||||
| -rw-r--r-- | src/server/game/Chat/ChatCommands/ChatCommandTags.h | 21 |
2 files changed, 73 insertions, 10 deletions
diff --git a/src/server/game/Chat/ChatCommands/ChatCommandTags.cpp b/src/server/game/Chat/ChatCommands/ChatCommandTags.cpp index 0f11f1cd66f..8c5917e086d 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandTags.cpp +++ b/src/server/game/Chat/ChatCommands/ChatCommandTags.cpp @@ -17,6 +17,7 @@ #include "ChatCommandTags.h" +#include "AccountMgr.h" #include "CharacterCache.h" #include "Chat.h" #include "ChatCommandArgs.h" @@ -55,22 +56,65 @@ Optional<std::string_view> Trinity::ChatCommands::QuotedString::TryConsume(std:: return std::nullopt; } -Optional<std::string_view> Trinity::ChatCommands::PlayerIdentifier::TryConsume(std::string_view args) +Optional<std::string_view> Trinity::ChatCommands::AccountIdentifier::TryConsume(std::string_view args) { - Variant<Hyperlink<player>, std::string_view> name; - Optional<std::string_view> next = Trinity::Impl::ChatCommands::ArgInfo<decltype(name)>::TryConsume(name, args); + std::string_view text; + Optional<std::string_view> next = Trinity::Impl::ChatCommands::ArgInfo<std::string_view>::TryConsume(text, args); if (!next) return std::nullopt; - _name = static_cast<std::string_view>(name); - normalizePlayerName(_name); + // first try parsing as account name + _name.assign(text); + if (!Utf8ToUpperOnlyLatin(_name)) + return std::nullopt; + _id = AccountMgr::GetId(_name); + if (_id) // account with name exists, we are done + return next; + + // try parsing as account id instead + Optional<uint32> id = Trinity::StringTo<uint32>(text, 10); + if (!id) + return std::nullopt; + _id = *id; + + if (AccountMgr::GetName(_id, _name)) + return next; + else + return std::nullopt; +} - if ((_player = ObjectAccessor::FindPlayerByName(_name))) - _guid = _player->GetGUID(); - else if (!(_guid = sCharacterCache->GetCharacterGuidByName(_name))) +Optional<std::string_view> Trinity::ChatCommands::PlayerIdentifier::TryConsume(std::string_view args) +{ + Variant<Hyperlink<player>, ObjectGuid::LowType, std::string_view> val; + Optional<std::string_view> next = Trinity::Impl::ChatCommands::ArgInfo<decltype(val)>::TryConsume(val, args); + if (!next) return std::nullopt; - return next; + if (val.holds_alternative<ObjectGuid::LowType>()) + { + _guid = ObjectGuid::Create<HighGuid::Player>(val.get<ObjectGuid::LowType>()); + if ((_player = ObjectAccessor::FindPlayerByLowGUID(_guid.GetCounter()))) + _name = _player->GetName(); + else if (!sCharacterCache->GetCharacterNameByGuid(_guid, _name)) + return std::nullopt; + return next; + } + else + { + if (val.holds_alternative<Hyperlink<player>>()) + _name.assign(static_cast<std::string_view>(val.get<Hyperlink<player>>())); + else + _name.assign(val.get<std::string_view>()); + + if (!normalizePlayerName(_name)) + return std::nullopt; + + if ((_player = ObjectAccessor::FindPlayerByName(_name))) + _guid = _player->GetGUID(); + else if (!(_guid = sCharacterCache->GetCharacterGuidByName(_name))) + return std::nullopt; + return next; + } } Trinity::ChatCommands::PlayerIdentifier::PlayerIdentifier(Player& player) diff --git a/src/server/game/Chat/ChatCommands/ChatCommandTags.h b/src/server/game/Chat/ChatCommands/ChatCommandTags.h index 84168a80d85..5e6bd112652 100644 --- a/src/server/game/Chat/ChatCommands/ChatCommandTags.h +++ b/src/server/game/Chat/ChatCommands/ChatCommandTags.h @@ -120,6 +120,24 @@ namespace Trinity::ChatCommands TC_GAME_API Optional<std::string_view> TryConsume(std::string_view args); }; + struct TC_GAME_API AccountIdentifier : Trinity::Impl::ChatCommands::ContainerTag + { + using value_type = uint32; + + operator uint32() const { return _id; } + operator std::string const& () const { return _name; } + operator std::string_view() const { return { _name }; } + + uint32 GetID() const { return _id; } + std::string const& GetName() const { return _name; } + + Optional<std::string_view> TryConsume(std::string_view args); + + private: + uint32 _id; + std::string _name; + }; + struct TC_GAME_API PlayerIdentifier : Trinity::Impl::ChatCommands::ContainerTag { using value_type = Player*; @@ -137,7 +155,8 @@ namespace Trinity::ChatCommands std::string const& GetName() { return _name; } ObjectGuid GetGUID() const { return _guid; } - Player* GetPlayer() const { return _player; } + bool IsConnected() const { return (_player != nullptr); } + Player* GetConnectedPlayer() const { return _player; } Optional<std::string_view> TryConsume(std::string_view args); |
