diff options
author | Carbenium <keresztesschmidt@gmail.com> | 2015-02-03 18:11:38 +0100 |
---|---|---|
committer | Nayd <dnpd.dd@gmail.com> | 2015-02-04 20:48:12 +0000 |
commit | 6751ac29403c1e834ebff12255a1ff35b8be246e (patch) | |
tree | acf55552bf04e1f8d8c9272e72afb4b73a6f67b7 | |
parent | 19a09c2763e773fb700aad643f0af8e651087d86 (diff) |
Core/Packets: Add structure for CMSG_GM_TICKET_GET_CASE_STATUS, SMSG_GM_TICKET_CASE_STATUS, CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY and SMSG_GM_TICKET_RESPONSE_ERROR
Implement CMSG_GM_TICKET_GET_TICKET and SMSG_GM_TICKET_GET_TICKET_RESPONSE
Update SMSG_FEATURE_SYSTEM_STATUS to support customizable ticket system and add config options
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 47 | ||||
-rw-r--r-- | src/server/game/Handlers/TicketHandler.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TicketPackets.cpp | 56 | ||||
-rw-r--r-- | src/server/game/Server/Packets/TicketPackets.h | 89 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 7 | ||||
-rw-r--r-- | src/server/game/Tickets/TicketMgr.cpp | 52 | ||||
-rw-r--r-- | src/server/game/Tickets/TicketMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 8 | ||||
-rw-r--r-- | src/server/game/World/World.h | 4 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 27 |
11 files changed, 256 insertions, 59 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 16fb72c88a4..44f8ec9ea9c 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -868,23 +868,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) SendPacket(accountDataTimes.Write()); /// Send FeatureSystemStatus - { - WorldPackets::System::FeatureSystemStatus features; - - /// START OF DUMMY VALUES - features.ComplaintStatus = 2; - features.ScrollOfResurrectionRequestsRemaining = 1; - features.ScrollOfResurrectionMaxRequestsPerDay = 1; - features.CfgRealmID = 2; - features.CfgRealmRecID = 0; - features.VoiceEnabled = false; - /// END OF DUMMY VALUES - - features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED); - features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED); - - SendPacket(features.Write()); - } + SendFeatureSystemStatus(); // Send MOTD { @@ -1091,6 +1075,35 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) delete holder; } +void WorldSession::SendFeatureSystemStatus() +{ + WorldPackets::System::FeatureSystemStatus features; + + /// START OF DUMMY VALUES + features.ComplaintStatus = 2; + features.ScrollOfResurrectionRequestsRemaining = 1; + features.ScrollOfResurrectionMaxRequestsPerDay = 1; + features.CfgRealmID = 2; + features.CfgRealmRecID = 0; + features.VoiceEnabled = false; + features.BrowserEnabled = false; // Has to be false, otherwise client will crash if "Customer Support" is opened + + features.EuropaTicketSystemStatus.HasValue = true; + features.EuropaTicketSystemStatus.Value.ThrottleState.MaxTries = 5; + features.EuropaTicketSystemStatus.Value.ThrottleState.PerMilliseconds = 5; + features.EuropaTicketSystemStatus.Value.ThrottleState.TryCount = 0; + features.EuropaTicketSystemStatus.Value.ThrottleState.LastResetTimeBeforeNow = time(nullptr) - 5000; + /// END OF DUMMY VALUES + + features.EuropaTicketSystemStatus.Value.SubmitBugEnabled = sWorld->getBoolConfig(CONFIG_TICKET_SUBMIT_BUG); + features.EuropaTicketSystemStatus.Value.TicketSystemEnabled = sWorld->getBoolConfig(CONFIG_TICKET_SUBMIT_TICKET); + features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED); + features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED); + + SendPacket(features.Write()); + TC_LOG_DEBUG("misc", "SMSG_FEATURE_SYSTEM_STATUS [%s]", GetPlayerInfo().c_str()); +} + void WorldSession::HandleSetFactionAtWar(WorldPacket& recvData) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_SET_FACTION_AT_WAR"); diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp index 2e7560f3f2d..17592d15e0e 100644 --- a/src/server/game/Handlers/TicketHandler.cpp +++ b/src/server/game/Handlers/TicketHandler.cpp @@ -157,13 +157,21 @@ void WorldSession::HandleGMTicketDeleteOpcode(WorldPacket & /*recvData*/) } } -void WorldSession::HandleGMTicketGetTicketOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTicketGetCaseStatus& /*packet*/) { + //TODO: Implement GmCase and handle this packet correctly + TC_LOG_DEBUG("misc", "CMSG_GM_TICKET_GET_CASE_STATUS [%s]", GetPlayerInfo().c_str()); +} + +void WorldSession::HandleGMTicketGetTicketOpcode(WorldPackets::Ticket::GMTicketGetTicket& /*packet*/) +{ + TC_LOG_DEBUG("misc", "CMSG_GM_TICKET_GET_TICKET [%s]", GetPlayerInfo().c_str()); SendQueryTimeResponse(); if (GmTicket* ticket = sTicketMgr->GetTicketByPlayer(GetPlayer()->GetGUID())) { if (ticket->IsCompleted()) + //TODO: Update SMSG_GM_TICKET_RESPONSE ticket->SendResponse(this); else sTicketMgr->SendTicket(this, ticket); @@ -174,10 +182,13 @@ void WorldSession::HandleGMTicketGetTicketOpcode(WorldPacket & /*recvData*/) void WorldSession::HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTicketGetSystemStatus& /*packet*/) { + TC_LOG_DEBUG("misc", "CMSG_GM_TICKET_GET_SYSTEM_STATUS [%s]", GetPlayerInfo().c_str()); // Note: This only disables the ticket UI at client side and is not fully reliable + // Note: This disables the whole customer support UI after trying to send a ticket in disabled state (MessageBox: "GM Help Tickets are currently unavaiable."). UI remains disabled until the character relogs. WorldPackets::Ticket::GMTicketSystemStatus response; response.Status = sTicketMgr->GetStatus() ? GMTICKET_QUEUE_STATUS_ENABLED : GMTICKET_QUEUE_STATUS_DISABLED; SendPacket(response.Write()); + TC_LOG_DEBUG("misc", "SMSG_GM_TICKET_SYSTEM_STATUS [%s]", GetPlayerInfo().c_str()); } void WorldSession::HandleGMSurveySubmit(WorldPacket& recvData) diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp index 4643ec89d63..053efa606e4 100644 --- a/src/server/game/Server/Packets/TicketPackets.cpp +++ b/src/server/game/Server/Packets/TicketPackets.cpp @@ -23,3 +23,59 @@ WorldPacket const* WorldPackets::Ticket::GMTicketSystemStatus::Write() return &_worldPacket; } + + +WorldPacket const* WorldPackets::Ticket::GMTicketCaseStatus::Write() +{ + _worldPacket.AppendPackedTime(OldestTicketTime); + _worldPacket.AppendPackedTime(UpdateTime); + + _worldPacket << int32(Cases.size()); + + for (auto const& c : Cases) + { + _worldPacket << int32(c.CaseID); + _worldPacket << int32(c.CaseOpened); + _worldPacket << int32(c.CaseStatus); + _worldPacket << int16(c.CfgRealmID); + _worldPacket << int64(c.CharacterID); + _worldPacket << int32(c.WaitTimeOverrideMinutes); + + _worldPacket.WriteBits(c.Url.size(), 11); + _worldPacket.WriteBits(c.WaitTimeOverrideMessage.size(), 10); + } + + _worldPacket.FlushBits(); + return &_worldPacket; +} + +void WorldPackets::Ticket::GMTicketAcknowledgeSurvey::Read() +{ + _worldPacket >> CaseID; +} + +WorldPacket const* WorldPackets::Ticket::GMTicketGetTicketResponse::Write() +{ + _worldPacket << Result; + _worldPacket.WriteBit(Info.HasValue); + + if (Info.HasValue) + { + _worldPacket << int32(Info.Value.TicketID); + _worldPacket << uint8(Info.Value.Category); + _worldPacket.AppendPackedTime(Info.Value.TicketOpenTime); + _worldPacket.AppendPackedTime(Info.Value.OldestTicketTime); + _worldPacket.AppendPackedTime(Info.Value.UpdateTime); + _worldPacket << uint8(Info.Value.AssignedToGM); + _worldPacket << uint8(Info.Value.OpenedByGM); + _worldPacket << int32(Info.Value.WaitTimeOverrideMinutes); + + _worldPacket.WriteBits(Info.Value.TicketDescription.size(), 11); + _worldPacket.WriteBits(Info.Value.WaitTimeOverrideMessage.size(), 10); + + _worldPacket.WriteString(Info.Value.TicketDescription); + _worldPacket.WriteString(Info.Value.WaitTimeOverrideMessage); + } + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/TicketPackets.h b/src/server/game/Server/Packets/TicketPackets.h index 797e61d7c00..f80e77f15fb 100644 --- a/src/server/game/Server/Packets/TicketPackets.h +++ b/src/server/game/Server/Packets/TicketPackets.h @@ -41,6 +41,95 @@ namespace WorldPackets int32 Status = 0; }; + + class GMTicketGetCaseStatus final : public ClientPacket + { + public: + GMTicketGetCaseStatus(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_GET_CASE_STATUS, std::move(packet)) { } + + void Read() override { }; + }; + + class GMTicketCaseStatus final : public ServerPacket + { + public: + struct GMTicketCase + { + int32 CaseID = 0; + int32 CaseOpened = 0; + int32 CaseStatus = 0; + int16 CfgRealmID = 0; + int64 CharacterID = 0; + int32 WaitTimeOverrideMinutes = 0; + std::string Url; + std::string WaitTimeOverrideMessage; + + bool operator<(GMTicketCase const& right) const + { + return CaseID < right.CaseID; + } + }; + + GMTicketCaseStatus() : ServerPacket(SMSG_GM_TICKET_CASE_STATUS) { } + + WorldPacket const* Write() override; + + time_t OldestTicketTime = 0; + time_t UpdateTime = 0; + std::set<GMTicketCase> Cases; + }; + + class GMTicketGetTicket final : public ClientPacket + { + public: + GMTicketGetTicket(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_GET_TICKET, std::move(packet)) { } + + void Read() override { }; + }; + + class GMTicketGetTicketResponse final : public ServerPacket + { + public: + struct GMTicketInfo + { + int32 TicketID = 0; + std::string TicketDescription; + uint8 Category = 0; + time_t TicketOpenTime = 0; + time_t OldestTicketTime = 0; + time_t UpdateTime = 0; + uint8 AssignedToGM = 0; + uint8 OpenedByGM = 0; + std::string WaitTimeOverrideMessage; + int32 WaitTimeOverrideMinutes = 0; + }; + + GMTicketGetTicketResponse() : ServerPacket(SMSG_GM_TICKET_GET_TICKET_RESPONSE) { } + + WorldPacket const* Write() override; + + int32 Result = 0; + Optional<GMTicketInfo> Info; + + }; + + class GMTicketAcknowledgeSurvey final : public ClientPacket + { + public: + GMTicketAcknowledgeSurvey(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, std::move(packet)) { } + + void Read() override; + + int32 CaseID; + }; + + class GMTicketResponseError final : public ServerPacket + { + public: + GMTicketResponseError() : ServerPacket(SMSG_GM_TICKET_RESPONSE_ERROR, 0) { } + + WorldPacket const* Write() { return &_worldPacket; } + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 0dc843eaa0e..4f56cf8e44f 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -388,11 +388,13 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_SET_SECURITY_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_SURVEY_SUBMIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMSurveySubmit ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + //DEFINE_HANDLER(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketAcknowledgeSurvey, &WorldSession::HandleGMTicketAcknowledgeSurveyOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_CREATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketCreateOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_DELETE_TICKET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketDeleteOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode) - DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_GET_TICKET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketGetTicketOpcode ); + //DEFINE_HANDLER(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketGetCaseStatus, &WorldSession::HandleGMTicketGetCaseStatusOpcode); + DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode); + DEFINE_HANDLER(CMSG_GM_TICKET_GET_TICKET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetTicket, &WorldSession::HandleGMTicketGetTicketOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_RESPONSE_RESOLVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMResponseResolve ); DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_UPDATE_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketUpdateOpcode ); DEFINE_HANDLER(CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode); @@ -1277,8 +1279,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_MESSAGECHAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_REQUEST_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_GET_TICKET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_GET_TICKET_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESOLVE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESPONSE_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 4bf64a070f3..544bf122405 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -269,6 +269,9 @@ namespace WorldPackets namespace Ticket { class GMTicketGetSystemStatus; + class GMTicketGetCaseStatus; + class GMTicketGetTicket; + class GMTicketAcknowledgeSurvey; } namespace Trade @@ -514,6 +517,7 @@ class WorldSession void SendAuthWaitQue(uint32 position); void SendSetTimeZoneInformation(); + void SendFeatureSystemStatus(); void SendFeatureSystemStatusGlueScreen(); void SendNameQueryOpcode(ObjectGuid guid); @@ -740,7 +744,8 @@ class WorldSession void HandleGMTicketCreateOpcode(WorldPacket& recvPacket); void HandleGMTicketUpdateOpcode(WorldPacket& recvPacket); void HandleGMTicketDeleteOpcode(WorldPacket& recvPacket); - void HandleGMTicketGetTicketOpcode(WorldPacket& recvPacket); + void HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTicketGetCaseStatus& packet); + void HandleGMTicketGetTicketOpcode(WorldPackets::Ticket::GMTicketGetTicket& packet); void HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTicketGetSystemStatus& packet); void HandleGMSurveySubmit(WorldPacket& recvPacket); void HandleReportLag(WorldPacket& recvPacket); diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index 7cd27fdaa62..7999f0f26ba 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -18,6 +18,7 @@ #include "Common.h" #include "TicketMgr.h" +#include "TicketPackets.h" #include "DatabaseEnv.h" #include "Log.h" #include "Language.h" @@ -28,7 +29,7 @@ #include "Player.h" #include "Opcodes.h" -inline float GetAge(uint64 t) { return float(time(NULL) - t) / DAY; } +inline time_t GetAge(uint64 t) { return (time(NULL) - t) / DAY; } /////////////////////////////////////////////////////////////////////////////////////////////////// // GM ticket @@ -113,30 +114,6 @@ void GmTicket::DeleteFromDB() CharacterDatabase.Execute(stmt); } -void GmTicket::WritePacket(WorldPacket& data) const -{ - data << uint32(GMTICKET_STATUS_HASTEXT); - data << uint32(_id); - data << _message; - data << uint8(_needMoreHelp); - data << GetAge(_lastModifiedTime); - if (GmTicket* ticket = sTicketMgr->GetOldestOpenTicket()) - data << GetAge(ticket->GetLastModifiedTime()); - else - data << float(0); - - // I am not sure how blizzlike this is, and we don't really have a way to find out - data << GetAge(sTicketMgr->GetLastChange()); - - data << uint8(std::min(_escalatedStatus, TICKET_IN_ESCALATION_QUEUE)); // escalated data - data << uint8(_viewed ? GMTICKET_OPENEDBYGM_STATUS_OPENED : GMTICKET_OPENEDBYGM_STATUS_NOT_OPENED); // whether or not it has been viewed - - // TODO: implement these - std::string waitTimeOverrideMessage = ""; - data << waitTimeOverrideMessage; - data << uint32(0); // waitTimeOverrideMinutes -} - void GmTicket::SendResponse(WorldSession* session) const { WorldPacket data(SMSG_GM_TICKET_RESPONSE); @@ -267,7 +244,7 @@ TicketMgr::~TicketMgr() void TicketMgr::Initialize() { - SetStatus(sWorld->getBoolConfig(CONFIG_ALLOW_TICKETS)); + SetStatus(sWorld->getBoolConfig(CONFIG_TICKET_SYSTEM_STATUS)); } void TicketMgr::ResetTickets() @@ -408,12 +385,27 @@ void TicketMgr::ShowEscalatedList(ChatHandler& handler) const void TicketMgr::SendTicket(WorldSession* session, GmTicket* ticket) const { - WorldPacket data(SMSG_GM_TICKET_GET_TICKET_RESPONSE, (ticket ? (4 + 4 + 1 + 4 + 4 + 4 + 1 + 1) : 4)); + WorldPackets::Ticket::GMTicketGetTicketResponse response; if (ticket) - ticket->WritePacket(data); + { + response.Result = GMTICKET_STATUS_HASTEXT; + response.Info.HasValue = true; + + response.Info.Value.TicketID = ticket->GetId(); + response.Info.Value.TicketDescription = ticket->GetMessage(); + response.Info.Value.Category = ticket->GetNeedMoreHelp(); + response.Info.Value.TicketOpenTime = GetAge(ticket->GetLastModifiedTime()); + response.Info.Value.OldestTicketTime = sTicketMgr->GetOldestOpenTicket() ? GetAge(sTicketMgr->GetOldestOpenTicket()->GetLastModifiedTime()) : float(0); + response.Info.Value.UpdateTime = GetAge(sTicketMgr->GetLastChange()); + response.Info.Value.AssignedToGM = ticket->IsAssigned(); + response.Info.Value.OpenedByGM = ticket->IsViewed(); + response.Info.Value.WaitTimeOverrideMessage = ""; + response.Info.Value.WaitTimeOverrideMinutes = 0; + } else - data << uint32(GMTICKET_STATUS_DEFAULT); + response.Result = GMTICKET_STATUS_DEFAULT; - session->SendPacket(&data); + session->SendPacket(response.Write()); + TC_LOG_DEBUG("misc", "SMSG_GM_GET_TICKET_RESPONSE [%s]", session->GetPlayerInfo().c_str()); } diff --git a/src/server/game/Tickets/TicketMgr.h b/src/server/game/Tickets/TicketMgr.h index 4dd94cc1762..578d93bb128 100644 --- a/src/server/game/Tickets/TicketMgr.h +++ b/src/server/game/Tickets/TicketMgr.h @@ -90,11 +90,13 @@ public: bool IsAssigned() const { return !_assignedTo.IsEmpty(); } bool IsAssignedTo(ObjectGuid guid) const { return guid == _assignedTo; } bool IsAssignedNotTo(ObjectGuid guid) const { return IsAssigned() && !IsAssignedTo(guid); } + bool IsViewed() const { return _viewed; } uint32 GetId() const { return _id; } Player* GetPlayer() const { return ObjectAccessor::FindPlayer(_playerGuid); } std::string const& GetPlayerName() const { return _playerName; } std::string const& GetMessage() const { return _message; } + bool const GetNeedMoreHelp() const { return _needMoreHelp; } Player* GetAssignedPlayer() const { return ObjectAccessor::FindPlayer(_assignedTo); } ObjectGuid GetAssignedToGUID() const { return _assignedTo; } std::string GetAssignedToName() const diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index fe3c4b76167..7885819af9f 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -278,6 +278,7 @@ void World::AddSession_(WorldSession* s) s->SendAuthResponse(AUTH_OK, false); s->SendSetTimeZoneInformation(); + s->SendFeatureSystemStatus(); s->SendFeatureSystemStatusGlueScreen(); s->SendAddonsInfo(); @@ -377,6 +378,7 @@ bool World::RemoveQueuedPlayer(WorldSession* sess) pop_sess->SendAuthWaitQue(0); pop_sess->SendSetTimeZoneInformation(); + pop_sess->SendFeatureSystemStatus(); pop_sess->SendFeatureSystemStatusGlueScreen(); pop_sess->SendAddonsInfo(); @@ -428,7 +430,11 @@ void World::LoadConfigSettings(bool reload) SetMotd(sConfigMgr->GetStringDefault("Motd", "Welcome to a Trinity Core Server.")); ///- Read ticket system setting from the config file - m_bool_configs[CONFIG_ALLOW_TICKETS] = sConfigMgr->GetBoolDefault("AllowTickets", true); + m_bool_configs[CONFIG_TICKET_SYSTEM_STATUS] = sConfigMgr->GetBoolDefault("Ticket.SystemStatus", true); + if (reload) + sTicketMgr->SetStatus(m_bool_configs[CONFIG_TICKET_SYSTEM_STATUS]); + m_bool_configs[CONFIG_TICKET_SUBMIT_TICKET] = sConfigMgr->GetBoolDefault("Ticket.SubmitTicket", false); + m_bool_configs[CONFIG_TICKET_SUBMIT_BUG] = sConfigMgr->GetBoolDefault("Ticket.SubmitBug", false); ///- Get string for new logins (newly created characters) SetNewCharString(sConfigMgr->GetStringDefault("PlayerStart.String", "")); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 2526516d778..c30d4f6ca35 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -151,7 +151,9 @@ enum WorldBoolConfigs CONFIG_SHOW_MUTE_IN_WORLD, CONFIG_SHOW_BAN_IN_WORLD, CONFIG_AUTOBROADCAST, - CONFIG_ALLOW_TICKETS, + CONFIG_TICKET_SYSTEM_STATUS, + CONFIG_TICKET_SUBMIT_TICKET, + CONFIG_TICKET_SUBMIT_BUG, CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES, CONFIG_PRESERVE_CUSTOM_CHANNELS, CONFIG_PDUMP_NO_PATHS, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 9cb25475ecf..61790830993 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1060,12 +1060,31 @@ Server.LoginInfo = 0 Command.LookupMaxResults = 0 # -# AllowTickets -# Description: Allow/disallow sending new tickets. +# Ticket.SystemStatus +# Description: Enable/disable the ticket system. This disables the whole customer +# support UI after trying to send a ticket in disabled state +# (MessageBox: "GM Help Tickets are currently unavaiable."). +# UI remains disabled until the character relogs. # Default: 1 - (Enabled) -# 0 - (Disabled) +# 0 - (Disabled) 0 - (Disabled) + +Ticket.SystemStatus = 1 + +# +# Ticket.SubmitTicket +# Description: Allow/disallow opening new tickets. +# Default: 0 - (Disabled) +# 1 - (Enabled, Experimental) + +Ticket.SubmitTicket = 0 + +# +# Ticket.SubmitBug +# Description: Allow/disallow opening new bug reports. +# Default: 0 - (Disabled) +# 1 - (Enabled, Experimental) -AllowTickets = 1 +Ticket.SubmitBug = 0 # # DungeonFinder.OptionsMask |