/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* 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 .
*/
#include "TicketPackets.h"
#include "PacketOperators.h"
#include "SupportMgr.h"
namespace WorldPackets::Ticket
{
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketHeader& header)
{
data >> header.MapID;
data >> header.Position;
data >> header.Facing;
data >> header.Program;
return data;
}
WorldPacket const* GMTicketSystemStatus::Write()
{
_worldPacket << int32(Status);
return &_worldPacket;
}
WorldPacket const* GMTicketCaseStatus::Write()
{
_worldPacket << Size(Cases);
for (GMTicketCase const& c : Cases)
{
_worldPacket << int32(c.CaseID);
_worldPacket << c.CaseOpened;
_worldPacket << int32(c.CaseStatus);
_worldPacket << uint16(c.CfgRealmID);
_worldPacket << uint64(c.CharacterID);
_worldPacket << int32(c.WaitTimeOverrideMinutes);
_worldPacket << SizedString::BitsSize<11>(c.Url);
_worldPacket << SizedString::BitsSize<10>(c.WaitTimeOverrideMessage);
_worldPacket << SizedCString::BitsSize<24>(c.Title);
_worldPacket << SizedCString::BitsSize<24>(c.Description);
_worldPacket.FlushBits();
_worldPacket << SizedString::Data(c.Url);
_worldPacket << SizedString::Data(c.WaitTimeOverrideMessage);
_worldPacket << SizedCString::Data(c.Title);
_worldPacket << SizedCString::Data(c.Description);
}
return &_worldPacket;
}
void GMTicketAcknowledgeSurvey::Read()
{
_worldPacket >> CaseID;
}
void SubmitUserFeedback::Read()
{
_worldPacket >> Header;
_worldPacket >> SizedCString::BitsSize<24>(Note);
_worldPacket >> Bits<1>(IsSuggestion);
_worldPacket >> SizedCString::Data(Note);
}
SupportTicketChatLine::SupportTicketChatLine(time_t timestamp, std::string_view text)
: Timestamp(timestamp), Text(text) { }
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketChatLine& line)
{
data >> line.Timestamp;
data >> SizedString::BitsSize<12>(line.Text);
data >> SizedString::Data(line.Text);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketChatLog& chatlog)
{
data >> Size(chatlog.Lines);
data >> OptionalInit(chatlog.ReportLineIndex);
for (SupportTicketChatLine& line : chatlog.Lines)
data >> line;
if (chatlog.ReportLineIndex)
data >> *chatlog.ReportLineIndex;
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketHorusChatLine& line)
{
data >> line.Timestamp;
data >> line.PlayerGuid;
data >> OptionalInit(line.ClubID);
data >> OptionalInit(line.ChannelGuid);
data >> OptionalInit(line.WorldServer);
data >> OptionalInit(line.Cmd);
data >> SizedString::BitsSize<12>(line.Text);
if (line.ClubID)
data >> *line.ClubID;
if (line.ChannelGuid)
data >> *line.ChannelGuid;
if (line.WorldServer)
{
data >> line.WorldServer->Realm;
data >> line.WorldServer->Server;
data >> line.WorldServer->Type;
}
if (line.Cmd)
data >> *line.Cmd;
data >> SizedString::Data(line.Text);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketHorusChatLog& chatlog)
{
data >> Size(chatlog.Lines);
for (SupportTicketHorusChatLine& line : chatlog.Lines)
data >> line;
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketMailInfo& mail)
{
data >> mail.MailID;
data >> SizedString::BitsSize<13>(mail.MailBody);
data >> SizedString::BitsSize<9>(mail.MailSubject);
data >> SizedString::Data(mail.MailBody);
data >> SizedString::Data(mail.MailSubject);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketCalendarEventInfo& event)
{
data >> event.EventID;
data >> event.InviteID;
data >> SizedString::BitsSize<8>(event.EventTitle);
data >> SizedString::Data(event.EventTitle);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketPetInfo& pet)
{
data >> pet.PetID;
data >> SizedString::BitsSize<8>(pet.PetName);
data >> SizedString::Data(pet.PetName);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketGuildInfo& guild)
{
data.ResetBitPos();
data >> SizedString::BitsSize<7>(guild.GuildName);
data >> guild.GuildID;
data >> SizedString::Data(guild.GuildName);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketLFGListEntryInfo& lfgListSearchResult)
{
data >> lfgListSearchResult.Ticket;
data >> lfgListSearchResult.ActivityID;
data >> lfgListSearchResult.FactionID;
data >> lfgListSearchResult.LastTouchedName;
data >> lfgListSearchResult.LastTouchedComment;
data >> lfgListSearchResult.LastTouchedVoiceChat;
data >> lfgListSearchResult.LastTouchedAny;
data >> lfgListSearchResult.PartyGuid;
data >> SizedString::BitsSize<10>(lfgListSearchResult.Name);
data >> SizedString::BitsSize<11>(lfgListSearchResult.Comment);
data >> SizedString::BitsSize<8>(lfgListSearchResult.VoiceChat);
data >> SizedString::Data(lfgListSearchResult.Name);
data >> SizedString::Data(lfgListSearchResult.Comment);
data >> SizedString::Data(lfgListSearchResult.VoiceChat);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketLFGListApplicant& lfgListApplicant)
{
data >> lfgListApplicant.Ticket;
data >> SizedString::BitsSize<9>(lfgListApplicant.Comment);
data >> SizedString::Data(lfgListApplicant.Comment);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketClubFinderInfo& clubInfo)
{
data >> clubInfo.PostingID;
data >> clubInfo.ClubID;
data >> clubInfo.GuildID;
data >> SizedString::BitsSize<12>(clubInfo.PostingDescription);
data >> SizedString::Data(clubInfo.PostingDescription);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketArenaTeamInfo& arenaTeam)
{
data.ResetBitPos();
data >> SizedString::BitsSize<7>(arenaTeam.ArenaTeamName);
data >> arenaTeam.ArenaTeamID;
data >> SizedString::Data(arenaTeam.ArenaTeamName);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, SupportTicketHouseInfo& houseInfo)
{
data.ResetBitPos();
data >> SizedString::BitsSize<8>(houseInfo.NeighborhoodName);
data >> houseInfo.Unknown_1127_1;
data >> houseInfo.Unknown_1127_2;
data >> houseInfo.Unknown_1127_3;
data >> houseInfo.Unknown_1127_4;
data >> SizedString::Data(houseInfo.NeighborhoodName);
return data;
}
void SupportTicketSubmitComplaint::Read()
{
_worldPacket >> Header;
_worldPacket >> TargetCharacterGUID;
_worldPacket >> ReportType;
_worldPacket >> MajorCategory;
_worldPacket >> MinorCategoryFlags;
_worldPacket >> ChatLog;
_worldPacket >> SizedString::BitsSize<10>(Note);
_worldPacket >> OptionalInit(MailInfo);
_worldPacket >> OptionalInit(CalenderInfo);
_worldPacket >> OptionalInit(PetInfo);
_worldPacket >> OptionalInit(GuildInfo);
_worldPacket >> OptionalInit(LfgListEntryInfo);
_worldPacket >> OptionalInit(LfgListAppInfo);
_worldPacket >> OptionalInit(VoiceChatInfo);
_worldPacket >> OptionalInit(ClubFinderInfo);
_worldPacket >> OptionalInit(ArenaTeamInfo);
_worldPacket >> OptionalInit(HouseInfo);
if (VoiceChatInfo)
{
_worldPacket.ResetBitPos();
_worldPacket >> Bits<1>(VoiceChatInfo->TargetIsCurrentlyInVoiceChatWithPlayer);
}
_worldPacket >> HorusChatLog;
_worldPacket >> SizedString::Data(Note);
if (MailInfo)
_worldPacket >> *MailInfo;
if (CalenderInfo)
_worldPacket >> *CalenderInfo;
if (PetInfo)
_worldPacket >> *PetInfo;
if (GuildInfo)
_worldPacket >> *GuildInfo;
if (LfgListEntryInfo)
_worldPacket >> *LfgListEntryInfo;
if (LfgListAppInfo)
_worldPacket >> *LfgListAppInfo;
if (ClubFinderInfo)
_worldPacket >> *ClubFinderInfo;
if (ArenaTeamInfo)
_worldPacket >> *ArenaTeamInfo;
if (HouseInfo)
_worldPacket >> *HouseInfo;
}
ByteBuffer& operator>>(ByteBuffer& data, Complaint::ComplaintOffender& complaintOffender)
{
data >> complaintOffender.PlayerGuid;
data >> complaintOffender.RealmAddress;
data >> complaintOffender.TimeSinceOffence;
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, Complaint::ComplaintChat& chat)
{
data >> chat.Command;
data >> chat.ChannelID;
data >> SizedString::BitsSize<12>(chat.MessageLog);
data >> SizedString::Data(chat.MessageLog);
return data;
}
void Complaint::Read()
{
_worldPacket >> ComplaintType;
_worldPacket >> Offender;
switch (ComplaintType)
{
case SUPPORT_SPAM_TYPE_MAIL:
_worldPacket >> MailID;
break;
case SUPPORT_SPAM_TYPE_CHAT:
_worldPacket >> Chat;
break;
case SUPPORT_SPAM_TYPE_CALENDAR:
_worldPacket >> EventGuid;
_worldPacket >> InviteGuid;
break;
default:
break;
}
}
WorldPacket const* ComplaintResult::Write()
{
_worldPacket << uint32(ComplaintType);
_worldPacket << uint8(Result);
return &_worldPacket;
}
void BugReport::Read()
{
_worldPacket >> Bits<1>(Type);
_worldPacket >> SizedString::BitsSize<12>(DiagInfo);
_worldPacket >> SizedString::BitsSize<10>(Text);
_worldPacket >> SizedString::Data(DiagInfo);
_worldPacket >> SizedString::Data(Text);
}
}