67{
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 template <char... chars>
84 {
85 using value_type = void;
86
88 {
89 if (args.empty())
90 return std::nullopt;
91 std::string_view start = args.substr(0, _string.length());
93 {
95 if (remainingToken.empty())
96 return tail;
97 start = args.substr(0, _string.length() + remainingToken.length());
98 }
100 }
101
102 private:
103 static constexpr std::array<char, sizeof...(chars)> _storage = { chars... };
104 static_assert(!_storage.empty() && (_storage.back() == '\0'), "ExactSequence parameters must be null terminated! Use the EXACT_SEQUENCE macro to make this easier!");
105 static constexpr std::string_view _string = { _storage.data(), std::string_view::traits_type::length(_storage.data()) };
106 };
107
108#define EXACT_SEQUENCE(str) Acore::ChatCommands::ExactSequence<CHATCOMMANDS_IMPL_SPLIT_LITERAL(str)>
109
111 {
112 using value_type = std::string_view;
113
114 using std::string_view::operator=;
115
117 {
118 std::string_view::operator=(args);
119 return std::string_view();
120 }
121 };
122
124 {
125 using value_type = std::wstring;
126
127 using std::wstring::operator=;
128
130 {
132 return std::string_view();
133 else
135 }
136 };
137
139 {
140 using value_type = std::string;
141
143 };
144
146 {
147 using value_type =
uint32;
148
149 operator uint32()
const {
return _id; }
150 operator std::string const& () const { return _name; }
151 operator std::string_view() const { return { _name }; }
152
153 uint32 GetID()
const {
return _id; }
154 std::string
const&
GetName()
const {
return _name; }
155
157
158 private:
160 std::string _name;
161 };
162
164 {
165 using value_type =
Player*;
166
167 PlayerIdentifier() : _name(), _guid(), _player(nullptr) {}
168 PlayerIdentifier(
Player& player);
169
171 operator std::string const&() const { return _name; }
172 operator std::string_view() const { return _name; }
173
174 std::string
const&
GetName()
const {
return _name; }
176 bool IsConnected() const { return (_player != nullptr); }
177 Player* GetConnectedPlayer()
const {
return _player; }
178
180
184 {
186 return fromTarget;
187 else
188 return FromSelf(handler);
189 }
190
191 private:
192 std::string _name;
195 };
196
197 template <typename linktag>
199 {
200 using value_type = typename linktag::value_type;
201 using storage_type = std::remove_cvref_t<value_type>;
202
203 operator value_type() const { return val; }
204 value_type operator*() const { return val; }
205 storage_type const* operator->() const { return &val; }
206
208 {
210
211 if (!info)
212 return std::nullopt;
213
214
215 if (info.
tag != linktag::tag())
216 return std::nullopt;
217
218
219 if (!linktag::StoreTo(val, info.
data))
221
222
224 if (token.empty())
225 return next;
226 else
228 }
229
230 private:
231 storage_type val;
232 };
233
234
236}
237
239{
240 template <typename T>
241 struct CastToVisitor
242 {
243 template <typename U>
245 };
246}
247
249{
250 template <typename T1, typename... Ts>
251 struct Variant : public std::variant<T1, Ts...>
252 {
253 using base = std::variant<T1, Ts...>;
254
257
258 template <bool C = have_operators>
259 std::enable_if_t<C, first_type>
operator*()
const
260 {
262 }
263
264 template <bool C = have_operators>
265 operator std::enable_if_t<C, first_type>() const
266 {
268 }
269
270 template<bool C = have_operators>
271 operator std::enable_if_t<C && !std::is_same_v<first_type, std::size_t> && std::is_convertible_v<first_type, std::size_t>, std::size_t>() const
272 {
274 }
275
276 template <bool C = have_operators>
277 std::enable_if_t<C, bool>
operator!()
const {
return !**
this; }
278
279 template <typename T>
280 Variant&
operator=(T&& arg) { base::operator=(std::forward<T>(arg));
return *
this; }
281
282 template <std::size_t index>
283 constexpr decltype(
auto)
get() {
return std::get<index>(
static_cast<base&
>(*
this)); }
284 template <std::size_t index>
285 constexpr decltype(
auto)
get()
const {
return std::get<index>(
static_cast<base const&
>(*
this)); }
286 template <typename type>
287 constexpr decltype(
auto)
get() {
return std::get<type>(
static_cast<base&
>(*
this)); }
288 template <typename type>
289 constexpr decltype(
auto)
get()
const {
return std::get<type>(
static_cast<base const&
>(*
this)); }
290
291 template <typename T>
292 constexpr decltype(
auto)
visit(T&& arg) {
return std::visit(std::forward<T>(arg),
static_cast<base&
>(*
this)); }
293 template <typename T>
294 constexpr decltype(
auto)
visit(T&& arg)
const {
return std::visit(std::forward<T>(arg),
static_cast<base const&
>(*
this)); }
295
296 template <typename T>
297 constexpr bool holds_alternative()
const {
return std::holds_alternative<T>(
static_cast<base const&
>(*
this)); }
298
299 template <bool C = have_operators>
301 {
302 return (os << *v);
303 }
304 };
305}
306
307#endif
#define AC_GAME_API
Definition Define.h:94
std::uint32_t uint32
Definition Define.h:107
@ LANG_CMDPARSER_EXACT_SEQ_MISMATCH
Definition Language.h:1007
@ LANG_CMDPARSER_LINKDATA_INVALID
Definition Language.h:996
@ LANG_CMDPARSER_INVALID_UTF8
Definition Language.h:995
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:24
bool Utf8toWStr(char const *utf8str, std::size_t csize, wchar_t *wstr, std::size_t &wsize)
Definition Util.cpp:281
bool StringEqualI(std::string_view a, std::string_view b)
Definition Util.cpp:592
Definition ObjectGuid.h:118
bool GetName(uint32 accountId, std::string &name)
Definition AccountMgr.cpp:257
Definition ChatCommand.h:38
HyperlinkInfo AC_GAME_API ParseSingleHyperlink(std::string_view str)
Definition Hyperlinks.cpp:33
AC_GAME_API std::string GetAcoreString(ChatHandler const *handler, AcoreStrings which)
Definition ChatCommandHelpers.cpp:27
std::string FormatAcoreString(ChatHandler const *handler, AcoreStrings which, Ts &&... args)
Definition ChatCommandHelpers.h:125
typename tag_base< T >::type tag_base_t
Definition ChatCommandHelpers.h:46
TokenizeResult tokenize(std::string_view args)
Definition ChatCommandHelpers.h:54
Definition CryptoGenerics.h:29
Definition ChatCommandTags.h:253
Variant & operator=(T &&arg)
Definition ChatCommandTags.h:281
constexpr decltype(auto) visit(T &&arg)
Definition ChatCommandTags.h:293
Acore::Impl::ChatCommands::tag_base_t< T1 > first_type
Definition ChatCommandTags.h:256
std::enable_if_t< C, bool > operator!() const
Definition ChatCommandTags.h:278
static constexpr bool have_operators
Definition ChatCommandTags.h:257
friend std::enable_if_t< C, std::ostream & > operator<<(std::ostream &os, Acore::ChatCommands::Variant< T1, Ts... > const &v)
Definition ChatCommandTags.h:301
std::variant< T1, Ts... > base
Definition ChatCommandTags.h:254
constexpr bool holds_alternative() const
Definition ChatCommandTags.h:298
std::enable_if_t< C, first_type > operator*() const
Definition ChatCommandTags.h:260
Definition Hyperlinks.h:235
std::string_view const tail
Definition Hyperlinks.h:242
std::string_view const tag
Definition Hyperlinks.h:244
std::string_view const data
Definition Hyperlinks.h:245
Definition ChatCommandTags.h:243
T operator()(U const &v) const
Definition ChatCommandTags.h:245
Definition ChatCommandHelpers.h:100
Definition ChatCommandTags.h:40
Definition ChatCommandHelpers.h:71