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
145 inline std::string_view
format_as(QuotedString
const& qs)
146 {
147 return std::string_view(qs);
148 }
149
151 {
152 using value_type =
uint32;
153
154 operator uint32()
const {
return _id; }
155 operator std::string const& () const { return _name; }
156 operator std::string_view() const { return { _name }; }
157
158 uint32 GetID()
const {
return _id; }
159 std::string const& GetName() const { return _name; }
160
162
163 private:
165 std::string _name;
166 };
167
169 {
170 using value_type =
Player*;
171
172 PlayerIdentifier() : _name(), _guid(), _player(nullptr) {}
173 PlayerIdentifier(
Player& player);
174
176 operator std::string const&() const { return _name; }
177 operator std::string_view() const { return _name; }
178
179 std::string const& GetName() const { return _name; }
181 bool IsConnected() const { return (_player != nullptr); }
182 Player* GetConnectedPlayer()
const {
return _player; }
183
185
189 {
191 return fromTarget;
192 else
193 return FromSelf(handler);
194 }
195
196 private:
197 std::string _name;
200 };
201
202 template <typename linktag>
204 {
205 using value_type = typename linktag::value_type;
206 using storage_type = std::remove_cvref_t<value_type>;
207
208 operator value_type() const { return val; }
209 value_type operator*() const { return val; }
210 storage_type const* operator->() const { return &val; }
211
213 {
215
216 if (!info)
217 return std::nullopt;
218
219
220 if (info.
tag != linktag::tag())
221 return std::nullopt;
222
223
224 if (!linktag::StoreTo(val, info.
data))
226
227
229 if (token.empty())
230 return next;
231 else
233 }
234
235 private:
236 storage_type val;
237 };
238
239
241}
242
244{
245 template <typename T>
246 struct CastToVisitor
247 {
248 template <typename U>
250 };
251}
252
254{
255 template <typename T1, typename... Ts>
256 struct Variant : public std::variant<T1, Ts...>
257 {
258 using base = std::variant<T1, Ts...>;
259
262
263 template <bool C = have_operators>
264 std::enable_if_t<C, first_type>
operator*()
const
265 {
267 }
268
269 template <bool C = have_operators>
270 operator std::enable_if_t<C, first_type>() const
271 {
273 }
274
275 template<bool C = have_operators>
276 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
277 {
279 }
280
281 template <bool C = have_operators>
282 std::enable_if_t<C, bool>
operator!()
const {
return !**
this; }
283
284 template <typename T>
285 Variant&
operator=(T&& arg) { base::operator=(std::forward<T>(arg));
return *
this; }
286
287 template <std::size_t index>
288 constexpr decltype(
auto)
get() {
return std::get<index>(
static_cast<base&
>(*
this)); }
289 template <std::size_t index>
290 constexpr decltype(
auto)
get()
const {
return std::get<index>(
static_cast<base const&
>(*
this)); }
291 template <typename type>
292 constexpr decltype(
auto)
get() {
return std::get<type>(
static_cast<base&
>(*
this)); }
293 template <typename type>
294 constexpr decltype(
auto)
get()
const {
return std::get<type>(
static_cast<base const&
>(*
this)); }
295
296 template <typename T>
297 constexpr decltype(
auto)
visit(T&& arg) {
return std::visit(std::forward<T>(arg),
static_cast<base&
>(*
this)); }
298 template <typename T>
299 constexpr decltype(
auto)
visit(T&& arg)
const {
return std::visit(std::forward<T>(arg),
static_cast<base const&
>(*
this)); }
300
301 template <typename T>
302 constexpr bool holds_alternative()
const {
return std::holds_alternative<T>(
static_cast<base const&
>(*
this)); }
303
304 template <bool C = have_operators>
306 {
307 return (os << *v);
308 }
309 };
310}
311
312#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:1021
@ LANG_CMDPARSER_LINKDATA_INVALID
Definition Language.h:1010
@ LANG_CMDPARSER_INVALID_UTF8
Definition Language.h:1009
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
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:258
Variant & operator=(T &&arg)
Definition ChatCommandTags.h:286
constexpr decltype(auto) visit(T &&arg)
Definition ChatCommandTags.h:298
Acore::Impl::ChatCommands::tag_base_t< T1 > first_type
Definition ChatCommandTags.h:261
std::enable_if_t< C, bool > operator!() const
Definition ChatCommandTags.h:283
static constexpr bool have_operators
Definition ChatCommandTags.h:262
friend std::enable_if_t< C, std::ostream & > operator<<(std::ostream &os, Acore::ChatCommands::Variant< T1, Ts... > const &v)
Definition ChatCommandTags.h:306
std::variant< T1, Ts... > base
Definition ChatCommandTags.h:259
constexpr bool holds_alternative() const
Definition ChatCommandTags.h:303
std::enable_if_t< C, first_type > operator*() const
Definition ChatCommandTags.h:265
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:248
T operator()(U const &v) const
Definition ChatCommandTags.h:250
Definition ChatCommandHelpers.h:100
Definition ChatCommandTags.h:40
Definition ChatCommandHelpers.h:71