aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarbenium <keresztesschmidt@gmail.com>2015-02-03 18:11:38 +0100
committerNayd <dnpd.dd@gmail.com>2015-02-04 20:48:12 +0000
commit6751ac29403c1e834ebff12255a1ff35b8be246e (patch)
treeacf55552bf04e1f8d8c9272e72afb4b73a6f67b7
parent19a09c2763e773fb700aad643f0af8e651087d86 (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.cpp47
-rw-r--r--src/server/game/Handlers/TicketHandler.cpp13
-rw-r--r--src/server/game/Server/Packets/TicketPackets.cpp56
-rw-r--r--src/server/game/Server/Packets/TicketPackets.h89
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp10
-rw-r--r--src/server/game/Server/WorldSession.h7
-rw-r--r--src/server/game/Tickets/TicketMgr.cpp52
-rw-r--r--src/server/game/Tickets/TicketMgr.h2
-rw-r--r--src/server/game/World/World.cpp8
-rw-r--r--src/server/game/World/World.h4
-rw-r--r--src/server/worldserver/worldserver.conf.dist27
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