From 2008d64e7b9e1d27d1e8c161a026d06a2f7b7e72 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Tue, 16 Jul 2024 03:22:23 +0200 Subject: [PATCH] fix(Scripts/Commands): Ticket response (#19406) * fix(Scripts/Commands): Ticket response * closes https://github.com/azerothcore/azerothcore-wotlk/issues/19390 * Implements two new commands * ticket response delete - Delete a ticket response * ticket response show - Show current ticket response * this better * English? * bette rlogic * Update cs_ticket.cpp --- .../rev_1721087507268967000.sql | 14 ++++ src/server/game/Miscellaneous/Language.h | 2 + src/server/game/Tickets/TicketMgr.h | 2 + src/server/scripts/Commands/cs_ticket.cpp | 71 ++++++++++++++++--- 4 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1721087507268967000.sql diff --git a/data/sql/updates/pending_db_world/rev_1721087507268967000.sql b/data/sql/updates/pending_db_world/rev_1721087507268967000.sql new file mode 100644 index 000000000..36683b102 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1721087507268967000.sql @@ -0,0 +1,14 @@ +-- +DELETE FROM `acore_string` WHERE `entry` IN (2031,2032); +INSERT INTO `acore_string` (`entry`, `content_default`) VALUES +(2031, '|cff00ff00Response Appended|r:|cff00ccff [%s]|r'), +(2032, '|cff00ff00Response deleted by|r:|cff00ccff %s|r'); + +UPDATE `command` SET `help` = 'Add a response to a new line.\n\nSyntax: ticket response appendln $ticketId $response' WHERE `name` = 'ticket response appendln'; +UPDATE `command` SET `help` = 'Add a response\n\nSyntax: ticket response append $ticketId $response' WHERE `name` = 'ticket response append'; + +DELETE FROM `command` WHERE `name` = 'ticket response delete'; +DELETE FROM `command` WHERE `name` = 'ticket response show'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('ticket response delete', 2, 'Delete a ticket response\n\nSyntax: ticket response delete $ticketId'), +('ticket response show', 2, 'Show a ticket response\n\nSyntax: ticket response show $ticketId'); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index f2ccc2724..d47db9bb6 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1070,6 +1070,8 @@ enum AcoreStrings LANG_COMMAND_TICKETRESET = 2028, LANG_COMMAND_TICKETLISTRESPONSE = 2029, LANG_COMMAND_TICKETCOMPLETED = 2030, + LANG_COMMAND_TICKETRESPONSEAPPENDED = 2031, + LANG_COMMAND_TICKETRESPONSEDELETED = 2032, // acore strings 5000-9999 LANG_COMMAND_FREEZE = 5000, diff --git a/src/server/game/Tickets/TicketMgr.h b/src/server/game/Tickets/TicketMgr.h index 0ed8de16a..aa2369bd7 100644 --- a/src/server/game/Tickets/TicketMgr.h +++ b/src/server/game/Tickets/TicketMgr.h @@ -138,6 +138,8 @@ public: void SetGmAction(uint32 needResponse, bool needMoreHelp); void AppendResponse(std::string const& response) { _response += response; } + std::string GetResponse() { return _response; } + void DeleteResponse() { _response = ""; } bool LoadFromDB(Field* fields); void SaveToDB(CharacterDatabaseTransaction trans) const; diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp index 51ce4234c..2eb69c7b3 100644 --- a/src/server/scripts/Commands/cs_ticket.cpp +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -42,7 +42,9 @@ public: static ChatCommandTable ticketResponseCommandTable = { { "append", HandleGMTicketResponseAppendCommand, SEC_GAMEMASTER, Console::Yes }, - { "appendln", HandleGMTicketResponseAppendLnCommand, SEC_GAMEMASTER, Console::Yes } + { "appendln", HandleGMTicketResponseAppendLnCommand, SEC_GAMEMASTER, Console::Yes }, + { "delete", HandleGMTicketResponseDeleteCommand, SEC_GAMEMASTER, Console::Yes }, + { "show", HandleGMTicketResponseShowCommand, SEC_GAMEMASTER, Console::Yes } }; static ChatCommandTable ticketCommandTable = { @@ -436,10 +438,9 @@ public: return true; } - static bool _HandleGMTicketResponseAppendCommand(uint32 ticketId, bool newLine, ChatHandler* handler) + static bool TicketResponseAppend(uint32 ticketId, bool newLine, ChatHandler* handler, std::string response) { - char* response = strtok(nullptr, "\n"); - if (!response) + if (response.empty()) return false; GmTicket* ticket = sTicketMgr->GetTicket(ticketId); @@ -459,22 +460,74 @@ public: } CharacterDatabaseTransaction trans = CharacterDatabaseTransaction(nullptr); - ticket->AppendResponse(response); if (newLine) ticket->AppendResponse("\n"); + ticket->AppendResponse(response); ticket->SaveToDB(trans); + sTicketMgr->UpdateLastChange(); + std::string msg = ticket->FormatMessageString(*handler, nullptr, nullptr, nullptr, nullptr); + msg += handler->PGetParseString(LANG_COMMAND_TICKETRESPONSEAPPENDED, response); + + handler->PSendSysMessage(msg.c_str()); return true; } - static bool HandleGMTicketResponseAppendCommand(ChatHandler* handler, uint32 ticketId) + static bool HandleGMTicketResponseAppendCommand(ChatHandler* handler, uint32 ticketId, Tail res) { - return _HandleGMTicketResponseAppendCommand(ticketId, false, handler); + return TicketResponseAppend(ticketId, false, handler, res.data()); } - static bool HandleGMTicketResponseAppendLnCommand(ChatHandler* handler, uint32 ticketId) + static bool HandleGMTicketResponseAppendLnCommand(ChatHandler* handler, uint32 ticketId, Tail res) { - return _HandleGMTicketResponseAppendCommand(ticketId, true, handler); + return TicketResponseAppend(ticketId, true, handler, res.data()); + } + + static bool HandleGMTicketResponseDeleteCommand(ChatHandler* handler, uint32 ticketId) + { + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + // Don't allow deleting response for a closed ticket. + if (!ticket || ticket->IsClosed()) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + // Cannot delete response for a ticket that is assigned to someone else. + //! Console excluded + Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr; + if (player && ticket->IsAssignedNotTo(player->GetGUID())) + { + handler->PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId()); + return true; + } + + CharacterDatabaseTransaction trans = CharacterDatabaseTransaction(nullptr); + ticket->DeleteResponse(); + ticket->SaveToDB(trans); + sTicketMgr->UpdateLastChange(); + + std::string msg = ticket->FormatMessageString(*handler, nullptr, nullptr, nullptr, nullptr); + msg += handler->PGetParseString(LANG_COMMAND_TICKETRESPONSEDELETED, player ? player->GetName() : "Console"); + + handler->SendGlobalGMSysMessage(msg.c_str()); + return true; + } + + static bool HandleGMTicketResponseShowCommand(ChatHandler* handler, uint32 ticketId) + { + GmTicket* ticket = sTicketMgr->GetTicket(ticketId); + if (!ticket) + { + handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); + return true; + } + + std::string msg = ticket->FormatMessageString(*handler, nullptr, nullptr, nullptr, nullptr); + msg += handler->PGetParseString(LANG_COMMAND_TICKETLISTRESPONSE, ticket->GetResponse()); + + handler->PSendSysMessage(msg.c_str()); + return true; } };