aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Chat/ChatCommands
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-09-07 15:38:23 +0200
committerGitHub <noreply@github.com>2020-09-07 15:38:23 +0200
commit00dd337b5d2c91907424828d7eebe3191931b036 (patch)
tree42d673bef9a349bdc6313a7b27e3d99cea028b7d /src/server/game/Chat/ChatCommands
parent68a4085427a898046b4afb73f6c369640418b848 (diff)
Scripts/Commands: .character command conversion
Diffstat (limited to 'src/server/game/Chat/ChatCommands')
-rw-r--r--src/server/game/Chat/ChatCommands/ChatCommandTags.cpp62
-rw-r--r--src/server/game/Chat/ChatCommands/ChatCommandTags.h21
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);