diff options
Diffstat (limited to 'src/server/game/Tickets/TicketMgr.cpp')
-rw-r--r-- | src/server/game/Tickets/TicketMgr.cpp | 410 |
1 files changed, 0 insertions, 410 deletions
diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp deleted file mode 100644 index 84dac6cc175..00000000000 --- a/src/server/game/Tickets/TicketMgr.cpp +++ /dev/null @@ -1,410 +0,0 @@ -/* - * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Common.h" -#include "TicketMgr.h" -#include "TicketPackets.h" -#include "DatabaseEnv.h" -#include "Log.h" -#include "Language.h" -#include "WorldPacket.h" -#include "WorldSession.h" -#include "Chat.h" -#include "World.h" -#include "Player.h" -#include "Opcodes.h" - -inline time_t GetAge(uint64 t) { return (time(NULL) - t) / DAY; } - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// GM ticket -GmTicket::GmTicket() : _id(0), _posX(0), _posY(0), _posZ(0), _mapId(0), _createTime(0), _lastModifiedTime(0), - _completed(false), _escalatedStatus(TICKET_UNASSIGNED), _viewed(false), - _needResponse(false), _needMoreHelp(false) { } - -GmTicket::GmTicket(Player* player) : _posX(0), _posY(0), _posZ(0), _mapId(0), _createTime(time(NULL)), _lastModifiedTime(time(NULL)), - _completed(false), _escalatedStatus(TICKET_UNASSIGNED), _viewed(false), - _needResponse(false), _needMoreHelp(false) -{ - _id = sTicketMgr->GenerateTicketId(); - _playerName = player->GetName(); - _playerGuid = player->GetGUID(); -} - -GmTicket::~GmTicket() { } - -bool GmTicket::LoadFromDB(Field* fields) -{ - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 - // ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, haveTicket - uint8 index = 0; - _id = fields[ index].GetUInt32(); - _playerGuid = ObjectGuid::Create<HighGuid::Player>(fields[++index].GetUInt64()); - _playerName = fields[++index].GetString(); - _message = fields[++index].GetString(); - _createTime = fields[++index].GetUInt32(); - _mapId = fields[++index].GetUInt16(); - _posX = fields[++index].GetFloat(); - _posY = fields[++index].GetFloat(); - _posZ = fields[++index].GetFloat(); - _lastModifiedTime = fields[++index].GetUInt32(); - int64 closedBy = fields[++index].GetInt64(); - if (closedBy < 0) - _closedBy.SetRawValue(0, uint64(closedBy)); - else - _closedBy = ObjectGuid::Create<HighGuid::Player>(uint64(closedBy)); - - _assignedTo = ObjectGuid::Create<HighGuid::Player>(fields[++index].GetUInt64()); - _comment = fields[++index].GetString(); - _response = fields[++index].GetString(); - _completed = fields[++index].GetBool(); - _escalatedStatus = GMTicketEscalationStatus(fields[++index].GetUInt8()); - _viewed = fields[++index].GetBool(); - _needMoreHelp = fields[++index].GetBool(); - return true; -} - -void GmTicket::SaveToDB(SQLTransaction& trans) const -{ - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - // ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed - uint8 index = 0; - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_TICKET); - stmt->setUInt32( index, _id); - stmt->setUInt64(++index, _playerGuid.GetCounter()); - stmt->setString(++index, _playerName); - stmt->setString(++index, _message); - stmt->setUInt32(++index, uint32(_createTime)); - stmt->setUInt16(++index, _mapId); - stmt->setFloat (++index, _posX); - stmt->setFloat (++index, _posY); - stmt->setFloat (++index, _posZ); - stmt->setUInt32(++index, uint32(_lastModifiedTime)); - stmt->setInt64 (++index, int64(_closedBy.GetCounter())); - stmt->setUInt64(++index, _assignedTo.GetCounter()); - stmt->setString(++index, _comment); - stmt->setString(++index, _response); - stmt->setBool (++index, _completed); - stmt->setUInt8 (++index, uint8(_escalatedStatus)); - stmt->setBool (++index, _viewed); - stmt->setBool (++index, _needMoreHelp); - - CharacterDatabase.ExecuteOrAppend(trans, stmt); -} - -void GmTicket::DeleteFromDB() -{ - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GM_TICKET); - stmt->setUInt32(0, _id); - CharacterDatabase.Execute(stmt); -} - -void GmTicket::SendResponse(WorldSession* session) const -{ - WorldPacket data(SMSG_GM_TICKET_RESPONSE); - data << uint32(1); // responseID - data << uint32(_id); // ticketID - data << _message.c_str(); - - size_t len = _response.size(); - char const* s = _response.c_str(); - - for (int i = 0; i < 4; i++) - { - if (len) - { - size_t writeLen = std::min<size_t>(len, 3999); - data.append(s, writeLen); - - len -= writeLen; - s += writeLen; - } - - data << uint8(0); - } - - session->SendPacket(&data); -} - -std::string GmTicket::FormatMessageString(ChatHandler& handler, bool detailed) const -{ - time_t curTime = time(NULL); - - std::stringstream ss; - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, _playerName.c_str()); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, true, false)).c_str()); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGE, (secsToTimeString(curTime - _lastModifiedTime, true, false)).c_str()); - - std::string name; - if (ObjectMgr::GetPlayerNameByGUID(_assignedTo, name)) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, name.c_str()); - - if (detailed) - { - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTMESSAGE, _message.c_str()); - if (!_comment.empty()) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTCOMMENT, _comment.c_str()); - if (!_response.empty()) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTRESPONSE, _response.c_str()); - } - return ss.str(); -} - -std::string GmTicket::FormatMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const -{ - std::stringstream ss; - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, _playerName.c_str()); - if (szClosedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETCLOSED, szClosedName); - if (szAssignedToName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, szAssignedToName); - if (szUnassignedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTUNASSIGNED, szUnassignedName); - if (szDeletedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETDELETED, szDeletedName); - if (szCompletedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETCOMPLETED, szCompletedName); - return ss.str(); -} - -void GmTicket::SetUnassigned() -{ - _assignedTo.Clear(); - switch (_escalatedStatus) - { - case TICKET_ASSIGNED: _escalatedStatus = TICKET_UNASSIGNED; break; - case TICKET_ESCALATED_ASSIGNED: _escalatedStatus = TICKET_IN_ESCALATION_QUEUE; break; - case TICKET_UNASSIGNED: - case TICKET_IN_ESCALATION_QUEUE: - default: - break; - } -} - -void GmTicket::SetPosition(uint32 mapId, float x, float y, float z) -{ - _mapId = mapId; - _posX = x; - _posY = y; - _posZ = z; -} - -void GmTicket::SetGmAction(uint32 needResponse, bool needMoreHelp) -{ - _needResponse = (needResponse == 17); // Requires GM response. 17 = true, 1 = false (17 is default) - _needMoreHelp = needMoreHelp; // Requests further GM interaction on a ticket to which a GM has already responded. Basically means "has a new ticket" -} - -void GmTicket::TeleportTo(Player* player) const -{ - player->TeleportTo(_mapId, _posX, _posY, _posZ, 0.0f, 0); -} - -void GmTicket::SetChatLog(std::list<uint32> time, std::string const& log) -{ - std::stringstream ss(log); - std::stringstream newss; - std::string line; - while (std::getline(ss, line) && !time.empty()) - { - newss << secsToTimeString(time.front()) << ": " << line << "\n"; - time.pop_front(); - } - - _chatLog = newss.str(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// Ticket manager -TicketMgr::TicketMgr() : _status(true), _lastTicketId(0), _lastSurveyId(0), _openTicketCount(0), - _lastChange(time(NULL)) { } - -TicketMgr::~TicketMgr() -{ - for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) - delete itr->second; -} - -void TicketMgr::Initialize() -{ - SetStatus(sWorld->getBoolConfig(CONFIG_TICKET_SYSTEM_STATUS)); -} - -void TicketMgr::ResetTickets() -{ - for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end();) - { - if (itr->second->IsClosed()) - { - uint32 ticketId = itr->second->GetId(); - ++itr; - sTicketMgr->RemoveTicket(ticketId); - } - else - ++itr; - } - - _lastTicketId = 0; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ALL_GM_TICKETS); - - CharacterDatabase.Execute(stmt); -} - -void TicketMgr::LoadTickets() -{ - uint32 oldMSTime = getMSTime(); - - for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) - delete itr->second; - _ticketList.clear(); - - _lastTicketId = 0; - _openTicketCount = 0; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GM_TICKETS); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (!result) - { - TC_LOG_INFO("server.loading", ">> Loaded 0 GM tickets. DB table `gm_tickets` is empty!"); - - return; - } - - uint32 count = 0; - do - { - Field* fields = result->Fetch(); - GmTicket* ticket = new GmTicket(); - if (!ticket->LoadFromDB(fields)) - { - delete ticket; - continue; - } - if (!ticket->IsClosed()) - ++_openTicketCount; - - // Update max ticket id if necessary - uint32 id = ticket->GetId(); - if (_lastTicketId < id) - _lastTicketId = id; - - _ticketList[id] = ticket; - ++count; - } while (result->NextRow()); - - TC_LOG_INFO("server.loading", ">> Loaded %u GM tickets in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - -} - -void TicketMgr::LoadSurveys() -{ - // we don't actually load anything into memory here as there's no reason to - _lastSurveyId = 0; - - uint32 oldMSTime = getMSTime(); - if (QueryResult result = CharacterDatabase.Query("SELECT MAX(surveyId) FROM gm_surveys")) - _lastSurveyId = (*result)[0].GetUInt32(); - - TC_LOG_INFO("server.loading", ">> Loaded GM Survey count from database in %u ms", GetMSTimeDiffToNow(oldMSTime)); - -} - -void TicketMgr::AddTicket(GmTicket* ticket) -{ - _ticketList[ticket->GetId()] = ticket; - if (!ticket->IsClosed()) - ++_openTicketCount; - SQLTransaction trans = SQLTransaction(NULL); - ticket->SaveToDB(trans); -} - -void TicketMgr::CloseTicket(uint32 ticketId, ObjectGuid source) -{ - if (GmTicket* ticket = GetTicket(ticketId)) - { - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetClosedBy(source); - if (!source.IsEmpty()) - --_openTicketCount; - ticket->SaveToDB(trans); - } -} - -void TicketMgr::RemoveTicket(uint32 ticketId) -{ - if (GmTicket* ticket = GetTicket(ticketId)) - { - ticket->DeleteFromDB(); - _ticketList.erase(ticketId); - delete ticket; - } -} - -void TicketMgr::ShowList(ChatHandler& handler, bool onlineOnly) const -{ - handler.SendSysMessage(onlineOnly ? LANG_COMMAND_TICKETSHOWONLINELIST : LANG_COMMAND_TICKETSHOWLIST); - for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) - if (!itr->second->IsClosed() && !itr->second->IsCompleted()) - if (!onlineOnly || itr->second->GetPlayer()) - handler.SendSysMessage(itr->second->FormatMessageString(handler).c_str()); -} - -void TicketMgr::ShowClosedList(ChatHandler& handler) const -{ - handler.SendSysMessage(LANG_COMMAND_TICKETSHOWCLOSEDLIST); - for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) - if (itr->second->IsClosed()) - handler.SendSysMessage(itr->second->FormatMessageString(handler).c_str()); -} - -void TicketMgr::ShowEscalatedList(ChatHandler& handler) const -{ - handler.SendSysMessage(LANG_COMMAND_TICKETSHOWESCALATEDLIST); - for (GmTicketList::const_iterator itr = _ticketList.begin(); itr != _ticketList.end(); ++itr) - if (!itr->second->IsClosed() && itr->second->GetEscalatedStatus() == TICKET_IN_ESCALATION_QUEUE) - handler.SendSysMessage(itr->second->FormatMessageString(handler).c_str()); -} - -void TicketMgr::SendTicket(WorldSession* session, GmTicket* ticket) const -{ - WorldPackets::Ticket::GMTicketGetTicketResponse response; - - if (ticket) - { - 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 - response.Result = GMTICKET_STATUS_DEFAULT; - - session->SendPacket(response.Write()); -} |