TrinityCore
cs_ticket.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19Name: ticket_commandscript
20%Complete: 100
21Comment: All ticket related commands
22Category: commandscripts
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "AccountMgr.h"
27#include "CharacterCache.h"
28#include "Chat.h"
29#include "ChatCommand.h"
30#include "Language.h"
31#include "ObjectMgr.h"
32#include "Player.h"
33#include "Realm.h"
34#include "SupportMgr.h"
35#include "World.h"
36#include "WorldSession.h"
37
38#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
39#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
40#endif
41
43{
44public:
45 ticket_commandscript() : CommandScript("ticket_commandscript") { }
46
47 template<typename T>
48 static bool HandleTicketAssignToCommand(ChatHandler* handler, char const* args);
49
50 template<typename T>
51 static bool HandleTicketCloseByIdCommand(ChatHandler* handler, char const* args);
52
53 template<typename T>
54 static bool HandleTicketCommentCommand(ChatHandler* handler, char const* args);
55
56 template<typename T>
57 static bool HandleTicketDeleteByIdCommand(ChatHandler* handler, char const* args);
58
59 template<typename T>
60 static bool HandleTicketListCommand(ChatHandler* handler, char const* /*args*/);
61
62 template<typename T>
63 static bool HandleTicketListClosedCommand(ChatHandler* handler, char const* /*args*/);
64
65 template<typename T>
66 static bool HandleTicketResetCommand(ChatHandler* handler, char const* /*args*/);
67
68 template<typename T>
69 static bool HandleTicketUnAssignCommand(ChatHandler* handler, char const* args);
70
71 template<typename T>
72 static bool HandleTicketGetByIdCommand(ChatHandler* handler, char const* args);
73
74 static bool HandleTicketResetAllCommand(ChatHandler* handler, char const* /*args*/)
75 {
76 if (sSupportMgr->GetOpenTicketCount<BugTicket>() || sSupportMgr->GetOpenTicketCount<ComplaintTicket>() || sSupportMgr->GetOpenTicketCount<SuggestionTicket>())
77 {
79 return true;
80 }
81 else
82 {
83 sSupportMgr->ResetTickets<BugTicket>();
84 sSupportMgr->ResetTickets<ComplaintTicket>();
85 sSupportMgr->ResetTickets<SuggestionTicket>();
87 }
88 return true;
89 }
90
91 static bool HandleToggleGMTicketSystem(ChatHandler* handler, char const* /*args*/)
92 {
93 if (!sWorld->getBoolConfig(CONFIG_SUPPORT_TICKETS_ENABLED))
94 {
96 return true;
97 }
98
99 bool status = !sSupportMgr->GetSupportSystemStatus();
100 sSupportMgr->SetSupportSystemStatus(status);
102 return true;
103 }
104
105 std::vector<ChatCommand> GetCommands() const override;
106};
107
108template<typename T>
110{
111 if (!*args)
112 return false;
113
114 char* ticketIdStr = strtok((char*)args, " ");
115 uint32 ticketId = atoi(ticketIdStr);
116
117 char* targetStr = strtok(nullptr, " ");
118 if (!targetStr)
119 return false;
120
121 std::string target(targetStr);
122 if (!normalizePlayerName(target))
123 return false;
124
125 T* ticket = sSupportMgr->GetTicket<T>(ticketId);
126 if (!ticket || ticket->IsClosed())
127 {
129 return true;
130 }
131
132 ObjectGuid targetGuid = sCharacterCache->GetCharacterGuidByName(target);
133 uint32 accountId = sCharacterCache->GetCharacterAccountIdByGuid(targetGuid);
134 // Target must exist and have administrative rights
136 {
138 return true;
139 }
140
141 // If already assigned, leave
142 if (ticket->IsAssignedTo(targetGuid))
143 {
144 handler->PSendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_B, ticket->GetId());
145 return true;
146 }
147
148 // If assigned to different player other than current, leave
150 Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr;
151 if (player && ticket->IsAssignedNotTo(player->GetGUID()))
152 {
153 handler->PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId());
154 return true;
155 }
156
157 // Assign ticket
158 ticket->SetAssignedTo(targetGuid);
159
160 ticket->SaveToDB();
161
162 std::string msg = ticket->FormatViewMessageString(*handler, nullptr, target.c_str(), nullptr, nullptr);
163 handler->SendGlobalGMSysMessage(msg.c_str());
164 return true;
165}
166
167template<typename T>
169{
170 if (!*args)
171 return false;
172
173 uint32 ticketId = atoi(args);
174 T* ticket = sSupportMgr->GetTicket<T>(ticketId);
175 if (!ticket || ticket->IsClosed())
176 {
178 return true;
179 }
180
181 // Ticket should be assigned to the player who tries to close it.
182 // Console can override though
183 Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr;
184 if (player && ticket->IsAssignedNotTo(player->GetGUID()))
185 {
186 handler->PSendSysMessage(LANG_COMMAND_TICKETCANNOTCLOSE, ticket->GetId());
187 return true;
188 }
189
190 ObjectGuid closedByGuid;
191 if (player)
192 closedByGuid = player->GetGUID();
193 else
194 closedByGuid.SetRawValue(0, uint64(-1));
195
196 sSupportMgr->CloseTicket<T>(ticket->GetId(), closedByGuid);
197
198 std::string msg = ticket->FormatViewMessageString(*handler, player ? player->GetName().c_str() : "Console", nullptr, nullptr, nullptr);
199 handler->SendGlobalGMSysMessage(msg.c_str());
200
201 return true;
202}
203
204template<typename T>
206{
207 if (!*args)
208 return false;
209
210 char* ticketIdStr = strtok((char*)args, " ");
211 uint32 ticketId = atoi(ticketIdStr);
212
213 char* comment = strtok(nullptr, "\n");
214 if (!comment)
215 return false;
216
217 T* ticket = sSupportMgr->GetTicket<T>(ticketId);
218 if (!ticket || ticket->IsClosed())
219 {
221 return true;
222 }
223
224 // Cannot comment ticket assigned to someone else
226 Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr;
227 if (player && ticket->IsAssignedNotTo(player->GetGUID()))
228 {
229 handler->PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId());
230 return true;
231 }
232
233 ticket->SetComment(comment);
234 ticket->SaveToDB();
235 sSupportMgr->UpdateLastChange();
236
237 std::string msg = ticket->FormatViewMessageString(*handler, nullptr, ticket->GetAssignedToName().c_str(), nullptr, nullptr);
238 msg += handler->PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName().c_str() : "Console", comment);
239 handler->SendGlobalGMSysMessage(msg.c_str());
240
241 return true;
242}
243
244template<typename T>
246{
247 sSupportMgr->ShowList<T>(*handler);
248 return true;
249}
250
251template<typename T>
253{
254 sSupportMgr->ShowClosedList<T>(*handler);
255 return true;
256}
257
258template<typename T>
260{
261 if (!*args)
262 return false;
263
264 uint32 ticketId = atoi(args);
265 T* ticket = sSupportMgr->GetTicket<T>(ticketId);
266 if (!ticket)
267 {
269 return true;
270 }
271
272 if (!ticket->IsClosed())
273 {
275 return true;
276 }
277
278 std::string msg = ticket->FormatViewMessageString(*handler, nullptr, nullptr, nullptr, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console");
279 handler->SendGlobalGMSysMessage(msg.c_str());
280
281 sSupportMgr->RemoveTicket<T>(ticket->GetId());
282
283 return true;
284}
285
286template<typename T>
288{
289 if (sSupportMgr->GetOpenTicketCount<T>())
290 {
292 return true;
293 }
294 else
295 {
296 sSupportMgr->ResetTickets<T>();
298 }
299 return true;
300}
301
302template<typename T>
304{
305 if (!*args)
306 return false;
307
308 uint32 ticketId = atoi(args);
309 T* ticket = sSupportMgr->GetTicket<T>(ticketId);
310 if (!ticket || ticket->IsClosed())
311 {
313 return true;
314 }
315 // Ticket must be assigned
316 if (!ticket->IsAssigned())
317 {
318 handler->PSendSysMessage(LANG_COMMAND_TICKETNOTASSIGNED, ticket->GetId());
319 return true;
320 }
321
322 // Get security level of player, whom this ticket is assigned to
323 uint32 security = SEC_PLAYER;
324 Player* assignedPlayer = ticket->GetAssignedPlayer();
325 if (assignedPlayer)
326 security = assignedPlayer->GetSession()->GetSecurity();
327 else
328 {
329 ObjectGuid guid = ticket->GetAssignedToGUID();
330 uint32 accountId = sCharacterCache->GetCharacterAccountIdByGuid(guid);
331 security = AccountMgr::GetSecurity(accountId, realm.Id.Realm);
332 }
333
334 // Check security
336 uint32 mySecurity = handler->GetSession() ? handler->GetSession()->GetSecurity() : SEC_CONSOLE;
337 if (security > mySecurity)
338 {
340 return true;
341 }
342
343 std::string assignedTo = ticket->GetAssignedToName(); // copy assignedto name because we need it after the ticket has been unnassigned
344 ticket->SetUnassigned();
345 ticket->SaveToDB();
346
347 std::string msg = ticket->FormatViewMessageString(*handler, nullptr, assignedTo.c_str(), handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", nullptr);
348 handler->SendGlobalGMSysMessage(msg.c_str());
349
350 return true;
351}
352
353template<typename T>
355{
356 if (!*args)
357 return false;
358
359 uint32 ticketId = atoi(args);
360 T* ticket = sSupportMgr->GetTicket<T>(ticketId);
361 if (!ticket || ticket->IsClosed())
362 {
364 return true;
365 }
366
367 handler->SendSysMessage(ticket->FormatViewMessageString(*handler, true).c_str());
368 return true;
369}
370
371std::vector<ChatCommand> ticket_commandscript::GetCommands() const
372{
373 static std::vector<ChatCommand> ticketBugCommandTable =
374 {
375 { "assign", rbac::RBAC_PERM_COMMAND_TICKET_BUG_ASSIGN, true, &HandleTicketAssignToCommand<BugTicket>, "" },
376 { "close", rbac::RBAC_PERM_COMMAND_TICKET_BUG_CLOSE, true, &HandleTicketCloseByIdCommand<BugTicket>, "" },
377 { "closedlist", rbac::RBAC_PERM_COMMAND_TICKET_BUG_CLOSEDLIST, true, &HandleTicketListClosedCommand<BugTicket>, "" },
378 { "comment", rbac::RBAC_PERM_COMMAND_TICKET_BUG_COMMENT, true, &HandleTicketCommentCommand<BugTicket>, "" },
379 { "delete", rbac::RBAC_PERM_COMMAND_TICKET_BUG_DELETE, true, &HandleTicketDeleteByIdCommand<BugTicket>, "" },
380 { "list", rbac::RBAC_PERM_COMMAND_TICKET_BUG_LIST, true, &HandleTicketListCommand<BugTicket>, "" },
381 { "unassign", rbac::RBAC_PERM_COMMAND_TICKET_BUG_UNASSIGN, true, &HandleTicketUnAssignCommand<BugTicket>, "" },
382 { "view", rbac::RBAC_PERM_COMMAND_TICKET_BUG_VIEW, true, &HandleTicketGetByIdCommand<BugTicket>, "" },
383 };
384 static std::vector<ChatCommand> ticketComplaintCommandTable =
385 {
386 { "assign", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT_ASSIGN, true, &HandleTicketAssignToCommand<ComplaintTicket>, "" },
387 { "close", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT_CLOSE, true, &HandleTicketCloseByIdCommand<ComplaintTicket>, "" },
388 { "closedlist", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT_CLOSEDLIST, true, &HandleTicketListClosedCommand<ComplaintTicket>, "" },
389 { "comment", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT_COMMENT, true, &HandleTicketCommentCommand<ComplaintTicket>, "" },
390 { "delete", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT_DELETE, true, &HandleTicketDeleteByIdCommand<ComplaintTicket>, "" },
391 { "list", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT_LIST, true, &HandleTicketListCommand<ComplaintTicket>, "" },
392 { "unassign", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT_UNASSIGN, true, &HandleTicketUnAssignCommand<ComplaintTicket>, "" },
393 { "view", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT_VIEW, true, &HandleTicketGetByIdCommand<ComplaintTicket>, "" },
394 };
395 static std::vector<ChatCommand> ticketSuggestionCommandTable =
396 {
397 { "assign", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION_ASSIGN, true, &HandleTicketAssignToCommand<SuggestionTicket>, "" },
398 { "close", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION_CLOSE, true, &HandleTicketCloseByIdCommand<SuggestionTicket>, "" },
399 { "closedlist", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION_CLOSEDLIST, true, &HandleTicketListClosedCommand<SuggestionTicket>, "" },
400 { "comment", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION_COMMENT, true, &HandleTicketCommentCommand<SuggestionTicket>, "" },
401 { "delete", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION_DELETE, true, &HandleTicketDeleteByIdCommand<SuggestionTicket>, "" },
402 { "list", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION_LIST, true, &HandleTicketListCommand<SuggestionTicket>, "" },
403 { "unassign", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION_UNASSIGN, true, &HandleTicketUnAssignCommand<SuggestionTicket>, "" },
404 { "view", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION_VIEW, true, &HandleTicketGetByIdCommand<SuggestionTicket>, "" },
405 };
406 static std::vector<ChatCommand> ticketResetCommandTable =
407 {
409 { "bug", rbac::RBAC_PERM_COMMAND_TICKET_RESET_BUG, true, &HandleTicketResetCommand<BugTicket>, "" },
410 { "complaint", rbac::RBAC_PERM_COMMAND_TICKET_RESET_COMPLAINT, true, &HandleTicketResetCommand<ComplaintTicket>, "" },
411 { "suggestion", rbac::RBAC_PERM_COMMAND_TICKET_RESET_SUGGESTION, true, &HandleTicketResetCommand<SuggestionTicket>, "" },
412 };
413 static std::vector<ChatCommand> ticketCommandTable =
414 {
415 { "bug", rbac::RBAC_PERM_COMMAND_TICKET_BUG, true, nullptr, "", ticketBugCommandTable },
416 { "complaint", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT, true, nullptr, "", ticketComplaintCommandTable },
417 { "reset", rbac::RBAC_PERM_COMMAND_TICKET_RESET, true, nullptr, "", ticketResetCommandTable },
418 { "suggestion", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION, true, nullptr, "", ticketSuggestionCommandTable },
420 };
421 static std::vector<ChatCommand> commandTable =
422 {
423 { "ticket", rbac::RBAC_PERM_COMMAND_TICKET, false, nullptr, "", ticketCommandTable },
424 };
425 return commandTable;
426}
427
429{
431}
#define sCharacterCache
@ SEC_PLAYER
Definition: Common.h:40
@ SEC_CONSOLE
Definition: Common.h:44
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
@ LANG_COMMAND_TICKETRESET
Definition: Language.h:1050
@ LANG_COMMAND_TICKETALREADYASSIGNED
Definition: Language.h:1029
@ LANG_ALLOW_TICKETS
Definition: Language.h:907
@ LANG_COMMAND_TICKETUNASSIGNSECURITY
Definition: Language.h:1037
@ LANG_DISALLOW_TICKETS_CONFIG
Definition: Language.h:994
@ LANG_COMMAND_TICKETCANNOTCLOSE
Definition: Language.h:1038
@ LANG_COMMAND_TICKETCLOSEFIRST
Definition: Language.h:1028
@ LANG_COMMAND_TICKETNOTASSIGNED
Definition: Language.h:1036
@ LANG_DISALLOW_TICKETS
Definition: Language.h:908
@ LANG_COMMAND_TICKETASSIGNERROR_B
Definition: Language.h:1035
@ LANG_COMMAND_TICKETPENDING
Definition: Language.h:1049
@ LANG_COMMAND_TICKETLISTADDCOMMENT
Definition: Language.h:1046
@ LANG_COMMAND_TICKETASSIGNERROR_A
Definition: Language.h:1034
@ LANG_COMMAND_TICKETNOTEXIST
Definition: Language.h:1027
bool normalizePlayerName(std::string &name)
Definition: ObjectMgr.cpp:154
#define sSupportMgr
Definition: SupportMgr.h:310
static uint32 GetSecurity(uint32 accountId, int32 realmId)
Definition: AccountMgr.cpp:298
static bool HasPermission(uint32 accountId, uint32 permission, uint32 realmId)
Definition: AccountMgr.cpp:577
void SendGlobalGMSysMessage(const char *str)
Definition: Chat.cpp:147
WorldSession * GetSession()
Definition: Chat.h:42
std::string PGetParseString(uint32 entry, Args &&... args) const
Definition: Chat.h:69
void PSendSysMessage(const char *fmt, Args &&... args)
Definition: Chat.h:57
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:113
void SetRawValue(std::vector< uint8 > const &guid)
Definition: ObjectGuid.cpp:584
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
WorldSession * GetSession() const
Definition: Player.h:2101
std::string const & GetName() const
Definition: Object.h:555
AccountTypes GetSecurity() const
Definition: WorldSession.h:999
Player * GetPlayer() const
static bool HandleTicketResetAllCommand(ChatHandler *handler, char const *)
Definition: cs_ticket.cpp:74
static bool HandleTicketResetCommand(ChatHandler *handler, char const *)
Definition: cs_ticket.cpp:287
static bool HandleTicketAssignToCommand(ChatHandler *handler, char const *args)
Definition: cs_ticket.cpp:109
static bool HandleTicketDeleteByIdCommand(ChatHandler *handler, char const *args)
Definition: cs_ticket.cpp:259
static bool HandleTicketGetByIdCommand(ChatHandler *handler, char const *args)
Definition: cs_ticket.cpp:354
static bool HandleTicketListClosedCommand(ChatHandler *handler, char const *)
Definition: cs_ticket.cpp:252
std::vector< ChatCommand > GetCommands() const override
Definition: cs_ticket.cpp:371
static bool HandleTicketListCommand(ChatHandler *handler, char const *)
Definition: cs_ticket.cpp:245
static bool HandleTicketCommentCommand(ChatHandler *handler, char const *args)
Definition: cs_ticket.cpp:205
static bool HandleTicketCloseByIdCommand(ChatHandler *handler, char const *args)
Definition: cs_ticket.cpp:168
static bool HandleToggleGMTicketSystem(ChatHandler *handler, char const *)
Definition: cs_ticket.cpp:91
static bool HandleTicketUnAssignCommand(ChatHandler *handler, char const *args)
Definition: cs_ticket.cpp:303
void AddSC_ticket_commandscript()
Definition: cs_ticket.cpp:428
#define sWorld
Definition: World.h:931
Realm realm
Definition: World.cpp:3966
@ CONFIG_SUPPORT_TICKETS_ENABLED
Definition: World.h:156
@ RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET
Definition: RBAC.h:85
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION_DELETE
Definition: RBAC.h:697
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT_CLOSEDLIST
Definition: RBAC.h:687
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT_ASSIGN
Definition: RBAC.h:685
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION_ASSIGN
Definition: RBAC.h:693
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT_UNASSIGN
Definition: RBAC.h:691
@ RBAC_PERM_COMMAND_TICKET_BUG_UNASSIGN
Definition: RBAC.h:683
@ RBAC_PERM_COMMAND_TICKET_BUG_DELETE
Definition: RBAC.h:681
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION_CLOSEDLIST
Definition: RBAC.h:695
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT_DELETE
Definition: RBAC.h:689
@ RBAC_PERM_COMMAND_TICKET_BUG_VIEW
Definition: RBAC.h:684
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT
Definition: RBAC.h:675
@ RBAC_PERM_COMMAND_TICKET_BUG_CLOSEDLIST
Definition: RBAC.h:679
@ RBAC_PERM_COMMAND_TICKET_TOGGLESYSTEM
Definition: RBAC.h:629
@ RBAC_PERM_COMMAND_TICKET_BUG
Definition: RBAC.h:674
@ RBAC_PERM_COMMAND_TICKET_BUG_CLOSE
Definition: RBAC.h:678
@ RBAC_PERM_COMMAND_TICKET_BUG_ASSIGN
Definition: RBAC.h:677
@ RBAC_PERM_COMMAND_TICKET_RESET_COMPLAINT
Definition: RBAC.h:704
@ RBAC_PERM_COMMAND_TICKET_BUG_LIST
Definition: RBAC.h:682
@ RBAC_PERM_COMMAND_TICKET
Definition: RBAC.h:614
@ RBAC_PERM_COMMAND_TICKET_RESET_ALL
Definition: RBAC.h:701
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT_COMMENT
Definition: RBAC.h:688
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT_LIST
Definition: RBAC.h:690
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION
Definition: RBAC.h:676
@ RBAC_PERM_COMMAND_TICKET_RESET
Definition: RBAC.h:625
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION_VIEW
Definition: RBAC.h:700
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION_COMMENT
Definition: RBAC.h:696
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION_CLOSE
Definition: RBAC.h:694
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT_CLOSE
Definition: RBAC.h:686
@ RBAC_PERM_COMMAND_TICKET_BUG_COMMENT
Definition: RBAC.h:680
@ RBAC_PERM_COMMAND_TICKET_RESET_BUG
Definition: RBAC.h:703
@ RBAC_PERM_COMMAND_TICKET_COMPLAINT_VIEW
Definition: RBAC.h:692
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION_LIST
Definition: RBAC.h:698
@ RBAC_PERM_COMMAND_TICKET_SUGGESTION_UNASSIGN
Definition: RBAC.h:699
@ RBAC_PERM_COMMAND_TICKET_RESET_SUGGESTION
Definition: RBAC.h:705
Battlenet::RealmHandle Id
Definition: Realm.h:82