aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/PetitionsHandler.cpp
diff options
context:
space:
mode:
authorxinef1 <w.szyszko2@gmail.com>2017-04-27 07:02:33 +0200
committerariel- <ariel-@users.noreply.github.com>2017-04-27 02:02:33 -0300
commita4aa95a5a39d75b9e38fe03aac57ceb7d9bba90f (patch)
tree47d9b2edab714e4403f5880ca364b2ddcbba24af /src/server/game/Handlers/PetitionsHandler.cpp
parenta82a12b5ef5c466496c314b5a1eb6838dc598b15 (diff)
Core/Misc: implemented petition manager (#19010)
- Implemented manager for petitions to perform all petition related tasks and synchronize data with database. - This kills ugly synchronous querys on packet handlers
Diffstat (limited to 'src/server/game/Handlers/PetitionsHandler.cpp')
-rw-r--r--src/server/game/Handlers/PetitionsHandler.cpp355
1 files changed, 89 insertions, 266 deletions
diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp
index 4481ed7505d..809237b72fd 100644
--- a/src/server/game/Handlers/PetitionsHandler.cpp
+++ b/src/server/game/Handlers/PetitionsHandler.cpp
@@ -29,6 +29,7 @@
#include "Guild.h"
#include "ArenaTeam.h"
#include "CharacterCache.h"
+#include "PetitionMgr.h"
#define CHARTER_DISPLAY_ID 16161
@@ -88,7 +89,7 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket& recvData)
uint32 charterid = 0;
uint32 cost = 0;
- uint32 type = 0;
+ CharterTypes type = CHARTER_TYPE_NONE;
if (creature->IsTabardDesigner())
{
// if tabard designer, then trying to buy a guild charter.
@@ -201,98 +202,57 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket& recvData)
// a petition is invalid, if both the owner and the type matches
// we checked above, if this player is in an arenateam, so this must be
// datacorruption
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_BY_OWNER);
- stmt->setUInt32(0, _player->GetGUID().GetCounter());
- stmt->setUInt8(1, type);
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
-
- std::ostringstream ssInvalidPetitionGUIDs;
-
- if (result)
+ CharacterDatabase.EscapeString(name);
+ if (Petition const* petition = sPetitionMgr->GetPetitionByOwnerWithType(_player->GetGUID(), type))
{
- do
- {
- Field* fields = result->Fetch();
- ssInvalidPetitionGUIDs << '\'' << fields[0].GetUInt32() << "', ";
- } while (result->NextRow());
+ // clear from petition store
+ sPetitionMgr->RemovePetition(petition->petitionGuid);
+ TC_LOG_DEBUG("network", "Invalid petition GUID: %u", petition->petitionGuid.GetCounter());
}
- // delete petitions with the same guid as this one
- ssInvalidPetitionGUIDs << '\'' << charter->GetGUID().GetCounter() << '\'';
-
- TC_LOG_DEBUG("network", "Invalid petition GUIDs: %s", ssInvalidPetitionGUIDs.str().c_str());
- CharacterDatabase.EscapeString(name);
- SQLTransaction trans = CharacterDatabase.BeginTransaction();
- trans->PAppend("DELETE FROM petition WHERE petitionguid IN (%s)", ssInvalidPetitionGUIDs.str().c_str());
- trans->PAppend("DELETE FROM petition_sign WHERE petitionguid IN (%s)", ssInvalidPetitionGUIDs.str().c_str());
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PETITION);
- stmt->setUInt32(0, _player->GetGUID().GetCounter());
- stmt->setUInt32(1, charter->GetGUID().GetCounter());
- stmt->setString(2, name);
- stmt->setUInt8(3, uint8(type));
- trans->Append(stmt);
-
- CharacterDatabase.CommitTransaction(trans);
+ // fill petition store
+ sPetitionMgr->AddPetition(charter->GetGUID(), _player->GetGUID(), name, type, false);
}
void WorldSession::HandlePetitionShowSignOpcode(WorldPacket& recvData)
{
TC_LOG_DEBUG("network", "Received opcode CMSG_PETITION_SHOW_SIGNATURES");
- uint8 signs = 0;
- ObjectGuid petitionguid;
- recvData >> petitionguid; // petition guid
-
- ObjectGuid::LowType petitionGuidLow = petitionguid.GetCounter();
-
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_TYPE);
-
- stmt->setUInt32(0, petitionGuidLow);
-
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
+ ObjectGuid petitionGuid;
+ recvData >> petitionGuid; // petition guid
- if (!result)
+ Petition const* petition = sPetitionMgr->GetPetition(petitionGuid);
+ if (!petition)
{
- TC_LOG_DEBUG("entities.player.items", "Petition %s is not found for player %u %s", petitionguid.ToString().c_str(), GetPlayer()->GetGUID().GetCounter(), GetPlayer()->GetName().c_str());
+ TC_LOG_DEBUG("entities.player.items", "Petition %s is not found for player %u %s", petitionGuid.ToString().c_str(), GetPlayer()->GetGUID().GetCounter(), GetPlayer()->GetName().c_str());
return;
}
- Field* fields = result->Fetch();
- uint32 type = fields[0].GetUInt8();
// if guild petition and has guild => error, return;
- if (type == GUILD_CHARTER_TYPE && _player->GetGuildId())
+ if (petition->petitionType == GUILD_CHARTER_TYPE && _player->GetGuildId())
return;
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURE);
-
- stmt->setUInt32(0, petitionGuidLow);
-
- result = CharacterDatabase.Query(stmt);
+ TC_LOG_DEBUG("network", "CMSG_PETITION_SHOW_SIGNATURES petition entry: '%u'", petitionGuid.GetCounter());
- // result == NULL also correct in case no sign yet
- if (result)
- signs = uint8(result->GetRowCount());
-
- TC_LOG_DEBUG("network", "CMSG_PETITION_SHOW_SIGNATURES petition entry: '%u'", petitionGuidLow);
+ SendPetitionSigns(petition, _player);
+}
- WorldPacket data(SMSG_PETITION_SHOW_SIGNATURES, (8+8+4+1+signs*12));
- data << uint64(petitionguid); // petition guid
- data << uint64(_player->GetGUID()); // owner guid
- data << uint32(petitionGuidLow); // guild guid
- data << uint8(signs); // sign's count
+void WorldSession::SendPetitionSigns(Petition const* petition, Player* sendTo)
+{
+ SignaturesVector const& signatures = petition->signatures;
+ WorldPacket data(SMSG_PETITION_SHOW_SIGNATURES, (8 + 8 + 4 + 1 + signatures.size() * 12));
+ data << uint64(petition->petitionGuid); // petition guid
+ data << uint64(petition->ownerGuid); // owner guid
+ data << uint32(petition->petitionGuid.GetCounter()); // guild guid
+ data << uint8(signatures.size()); // sign's count
- for (uint8 i = 1; i <= signs; ++i)
+ for (Signature const& signature : signatures)
{
- Field* fields2 = result->Fetch();
- ObjectGuid::LowType lowGuid = fields2[0].GetUInt32();
-
- data << ObjectGuid(HighGuid::Player, 0, lowGuid); // Player GUID
- data << uint32(0); // there 0 ...
-
- result->NextRow();
+ data << signature.second; // Player GUID
+ data << uint32(0); // there 0 ...
}
- SendPacket(&data);
+
+ sendTo->GetSession()->SendPacket(&data);
}
void WorldSession::HandlePetitionQueryOpcode(WorldPacket& recvData)
@@ -310,34 +270,20 @@ void WorldSession::HandlePetitionQueryOpcode(WorldPacket& recvData)
void WorldSession::SendPetitionQueryOpcode(ObjectGuid petitionguid)
{
- ObjectGuid ownerguid;
- uint32 type;
- std::string name = "NO_NAME_FOR_GUID";
-
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION);
-
- stmt->setUInt32(0, petitionguid.GetCounter());
-
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
-
- if (result)
- {
- Field* fields = result->Fetch();
- ownerguid = ObjectGuid(HighGuid::Player, fields[0].GetUInt32());
- name = fields[1].GetString();
- type = fields[2].GetUInt8();
- }
- else
+ Petition const* petition = sPetitionMgr->GetPetition(petitionguid);
+ if (!petition)
{
TC_LOG_DEBUG("network", "CMSG_PETITION_QUERY failed for petition (%s)", petitionguid.ToString().c_str());
return;
}
- WorldPacket data(SMSG_PETITION_QUERY_RESPONSE, (4+8+name.size()+1+1+4*12+2+10));
+ WorldPacket data(SMSG_PETITION_QUERY_RESPONSE, (4+8+petition->petitionName.size()+1+1+4*12+2+10));
data << uint32(petitionguid.GetCounter()); // guild/team guid (in Trinity always same as GUID_LOPART(petition guid)
- data << uint64(ownerguid); // charter owner guid
- data << name; // name (guild/arena team)
+ data << uint64(petition->ownerGuid); // charter owner guid
+ data << petition->petitionName; // name (guild/arena team)
data << uint8(0); // some string
+
+ CharterTypes type = petition->petitionType;
if (type == GUILD_CHARTER_TYPE)
{
uint32 needed = sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS);
@@ -375,7 +321,6 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket& recvData)
TC_LOG_DEBUG("network", "Received opcode MSG_PETITION_RENAME"); // ok
ObjectGuid petitionGuid;
- uint32 type;
std::string newName;
recvData >> petitionGuid; // guid
@@ -385,23 +330,14 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket& recvData)
if (!item)
return;
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_TYPE);
-
- stmt->setUInt32(0, petitionGuid.GetCounter());
-
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
-
- if (result)
- {
- Field* fields = result->Fetch();
- type = fields[0].GetUInt8();
- }
- else
+ Petition* petition = sPetitionMgr->GetPetition(petitionGuid);
+ if (!petition)
{
TC_LOG_DEBUG("network", "CMSG_PETITION_QUERY failed for petition %s", petitionGuid.ToString().c_str());
return;
}
+ CharterTypes type = petition->petitionType;
if (type == GUILD_CHARTER_TYPE)
{
if (sGuildMgr->GetGuildByName(newName))
@@ -429,12 +365,10 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket& recvData)
}
}
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_PETITION_NAME);
-
- stmt->setString(0, newName);
- stmt->setUInt32(1, petitionGuid.GetCounter());
+ CharacterDatabase.EscapeString(newName);
- CharacterDatabase.Execute(stmt);
+ // update petition storage
+ petition->UpdateName(newName);
TC_LOG_DEBUG("network", "Petition %s renamed to '%s'", petitionGuid.ToString().c_str(), newName.c_str());
WorldPacket data(MSG_PETITION_RENAME, (8+newName.size()+1));
@@ -447,32 +381,24 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket& recvData)
{
TC_LOG_DEBUG("network", "Received opcode CMSG_PETITION_SIGN"); // ok
- Field* fields;
ObjectGuid petitionGuid;
uint8 unk;
recvData >> petitionGuid; // petition guid
recvData >> unk;
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURES);
-
- stmt->setUInt32(0, petitionGuid.GetCounter());
- stmt->setUInt32(1, petitionGuid.GetCounter());
-
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
-
- if (!result)
+ Petition* petition = sPetitionMgr->GetPetition(petitionGuid);
+ if (!petition)
{
TC_LOG_ERROR("network", "Petition %s is not found for player %u %s", petitionGuid.ToString().c_str(), GetPlayer()->GetGUID().GetCounter(), GetPlayer()->GetName().c_str());
return;
}
- fields = result->Fetch();
- ObjectGuid ownerGuid(HighGuid::Player, fields[0].GetUInt32());
- uint64 signs = fields[1].GetUInt64();
- uint8 type = fields[2].GetUInt8();
+ ObjectGuid ownerGuid = petition->ownerGuid;
+ CharterTypes type = petition->petitionType;
+ uint8 signs = petition->signatures.size();
- ObjectGuid::LowType playerGuid = _player->GetGUID().GetCounter();
- if (ownerGuid == _player->GetGUID())
+ ObjectGuid playerGuid = _player->GetGUID();
+ if (ownerGuid == playerGuid)
return;
// not let enemies sign guild charter
@@ -493,7 +419,7 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket& recvData)
return;
}
- uint8 slot = ArenaTeam::GetSlotByType(type);
+ uint8 slot = ArenaTeam::GetSlotByType(static_cast<uint32>(type));
if (slot >= MAX_ARENA_SLOT)
return;
@@ -523,19 +449,13 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket& recvData)
}
}
- if (++signs > type) // client signs maximum
+ if (++signs > static_cast<uint8>(type)) // client signs maximum
return;
// Client doesn't allow to sign petition two times by one character, but not check sign by another character from same account
// not allow sign another player from already sign player account
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIG_BY_ACCOUNT);
-
- stmt->setUInt32(0, GetAccountId());
- stmt->setUInt32(1, petitionGuid.GetCounter());
-
- result = CharacterDatabase.Query(stmt);
-
- if (result)
+ bool isSigned = petition->IsPetitionSignedByAccount(GetAccountId());
+ if (isSigned)
{
WorldPacket data(SMSG_PETITION_SIGN_RESULTS, (8+8+4));
data << uint64(petitionGuid);
@@ -551,30 +471,17 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket& recvData)
return;
}
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PETITION_SIGNATURE);
+ // fill petition store
+ petition->AddSignature(petitionGuid, GetAccountId(), playerGuid, false);
- stmt->setUInt32(0, ownerGuid.GetCounter());
- stmt->setUInt32(1, petitionGuid.GetCounter());
- stmt->setUInt32(2, playerGuid);
- stmt->setUInt32(3, GetAccountId());
-
- CharacterDatabase.Execute(stmt);
-
- TC_LOG_DEBUG("network", "PETITION SIGN: %s by player: %s (GUID: %u Account: %u)", petitionGuid.ToString().c_str(), _player->GetName().c_str(), playerGuid, GetAccountId());
+ TC_LOG_DEBUG("network", "PETITION SIGN: %s by player: %s (GUID: %u Account: %u)", petitionGuid.ToString().c_str(), _player->GetName().c_str(), playerGuid.GetCounter(), GetAccountId());
WorldPacket data(SMSG_PETITION_SIGN_RESULTS, (8+8+4));
data << uint64(petitionGuid);
data << uint64(_player->GetGUID());
data << uint32(PETITION_SIGN_OK);
-
- // close at signer side
SendPacket(&data);
- // update signs count on charter, required testing...
- //Item* item = _player->GetItemByGuid(petitionguid));
- //if (item)
- // item->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1+1, signs);
-
// update for owner if online
if (Player* owner = ObjectAccessor::FindConnectedPlayer(ownerGuid))
owner->GetSession()->SendPacket(&data);
@@ -588,20 +495,12 @@ void WorldSession::HandlePetitionDeclineOpcode(WorldPacket& recvData)
recvData >> petitionguid; // petition guid
TC_LOG_DEBUG("network", "Petition %s declined by %u", petitionguid.ToString().c_str(), _player->GetGUID().GetCounter());
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_OWNER_BY_GUID);
-
- stmt->setUInt32(0, petitionguid.GetCounter());
-
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
-
- if (!result)
+ Petition const* petition = sPetitionMgr->GetPetition(petitionguid);
+ if (!petition)
return;
- Field* fields = result->Fetch();
- ObjectGuid ownerguid(HighGuid::Player, 0, fields[0].GetUInt32());
-
- Player* owner = ObjectAccessor::FindConnectedPlayer(ownerguid);
- if (owner) // petition owner online
+ // petition owner online
+ if (Player* owner = ObjectAccessor::FindConnectedPlayer(petition->ownerGuid))
{
WorldPacket data(MSG_PETITION_DECLINE, 8);
data << uint64(_player->GetGUID());
@@ -613,31 +512,23 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket& recvData)
{
TC_LOG_DEBUG("network", "Received opcode CMSG_OFFER_PETITION"); // ok
- uint8 signs = 0;
- ObjectGuid petitionguid, plguid;
- uint32 type, junk;
- Player* player;
+ ObjectGuid petitionGuid, offererGuid;
+ uint32 junk;
recvData >> junk; // this is not petition type!
- recvData >> petitionguid; // petition guid
- recvData >> plguid; // player guid
+ recvData >> petitionGuid; // petition guid
+ recvData >> offererGuid; // player guid
- player = ObjectAccessor::FindConnectedPlayer(plguid);
+ Player* player = ObjectAccessor::FindConnectedPlayer(offererGuid);
if (!player)
return;
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_TYPE);
-
- stmt->setUInt32(0, petitionguid.GetCounter());
-
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
-
- if (!result)
+ Petition const* petition = sPetitionMgr->GetPetition(petitionGuid);
+ if (!petition)
return;
- Field* fields = result->Fetch();
- type = fields[0].GetUInt8();
+ CharterTypes type = petition->petitionType;
- TC_LOG_DEBUG("network", "OFFER PETITION: type %u, %s, to %s", type, petitionguid.ToString().c_str(), plguid.ToString().c_str());
+ TC_LOG_DEBUG("network", "OFFER PETITION: type %u, %s, to %s", static_cast<uint32>(type), petitionGuid.ToString().c_str(), offererGuid.ToString().c_str());
if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && GetPlayer()->GetTeam() != player->GetTeam())
{
@@ -657,7 +548,7 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket& recvData)
return;
}
- uint8 slot = ArenaTeam::GetSlotByType(type);
+ uint8 slot = ArenaTeam::GetSlotByType(static_cast<uint32>(type));
if (slot >= MAX_ARENA_SLOT)
return;
@@ -689,33 +580,7 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket& recvData)
}
}
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURE);
-
- stmt->setUInt32(0, petitionguid.GetCounter());
-
- result = CharacterDatabase.Query(stmt);
-
- // result == NULL also correct charter without signs
- if (result)
- signs = uint8(result->GetRowCount());
-
- WorldPacket data(SMSG_PETITION_SHOW_SIGNATURES, (8+8+4+signs+signs*12));
- data << uint64(petitionguid); // petition guid
- data << uint64(_player->GetGUID()); // owner guid
- data << uint32(petitionguid.GetCounter()); // guild guid
- data << uint8(signs); // sign's count
-
- for (uint8 i = 1; i <= signs; ++i)
- {
- Field* fields2 = result->Fetch();
- data << uint64(ObjectGuid(HighGuid::Player, fields2[0].GetUInt32())); // Player GUID
- data << uint32(0); // there 0 ...
-
- result->NextRow();
- }
-
- player->GetSession()->SendPacket(&data);
+ SendPetitionSigns(petition, player);
}
void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData)
@@ -735,30 +600,18 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData)
TC_LOG_DEBUG("network", "Petition %s turned in by %u", petitionGuid.ToString().c_str(), _player->GetGUID().GetCounter());
- // Get petition data from db
- ObjectGuid::LowType ownerguidlo;
- uint32 type;
- std::string name;
-
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION);
- stmt->setUInt32(0, petitionGuid.GetCounter());
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
-
- if (result)
- {
- Field* fields = result->Fetch();
- ownerguidlo = fields[0].GetUInt32();
- name = fields[1].GetString();
- type = fields[2].GetUInt8();
- }
- else
+ Petition const* petition = sPetitionMgr->GetPetition(petitionGuid);
+ if (!petition)
{
TC_LOG_ERROR("entities.player.cheat", "Player %s (guid: %u) tried to turn in petition (%s) that is not present in the database", _player->GetName().c_str(), _player->GetGUID().GetCounter(), petitionGuid.ToString().c_str());
return;
}
+ CharterTypes type = petition->petitionType;
+ std::string const name = petition->petitionName; // we need a copy, it will be removed on guild/arena remove
+
// Only the petition owner can turn in the petition
- if (_player->GetGUID().GetCounter() != ownerguidlo)
+ if (_player->GetGUID() != petition->ownerGuid)
return;
// Petition type (guild/arena) specific checks
@@ -783,7 +636,7 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData)
else
{
// Check for valid arena bracket (2v2, 3v3, 5v5)
- uint8 slot = ArenaTeam::GetSlotByType(type);
+ uint8 slot = ArenaTeam::GetSlotByType(static_cast<uint32>(type));
if (slot >= MAX_ARENA_SLOT)
return;
@@ -802,26 +655,13 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData)
}
}
- // Get petition signatures from db
- uint8 signatures;
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURE);
- stmt->setUInt32(0, petitionGuid.GetCounter());
- result = CharacterDatabase.Query(stmt);
-
- if (result)
- signatures = uint8(result->GetRowCount());
- else
- signatures = 0;
-
- uint32 requiredSignatures;
+ SignaturesVector const signatures = petition->signatures; // we need a copy, it will be removed on guild/arena remove
+ uint32 requiredSignatures = static_cast<uint32>(type) - 1;
if (type == GUILD_CHARTER_TYPE)
requiredSignatures = sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS);
- else
- requiredSignatures = type-1;
// Notify player if signatures are missing
- if (signatures < requiredSignatures)
+ if (signatures.size() < requiredSignatures)
{
data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4);
data << (uint32)PETITION_TURN_NEED_MORE_SIGNATURES;
@@ -854,12 +694,8 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData)
SQLTransaction trans = CharacterDatabase.BeginTransaction();
// Add members from signatures
- for (uint8 i = 0; i < signatures; ++i)
- {
- Field* fields = result->Fetch();
- guild->AddMember(trans, ObjectGuid(HighGuid::Player, fields[0].GetUInt32()));
- result->NextRow();
- }
+ for (Signature const& signature : signatures)
+ guild->AddMember(trans, signature.second);
CharacterDatabase.CommitTransaction(trans);
}
@@ -884,27 +720,14 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData)
TC_LOG_DEBUG("network", "PetitonsHandler: Arena team (guid: %u) added to ObjectMgr", arenaTeam->GetId());
// Add members
- for (uint8 i = 0; i < signatures; ++i)
+ for (Signature const& signature : signatures)
{
- Field* fields = result->Fetch();
- ObjectGuid memberGUID(HighGuid::Player, fields[0].GetUInt32());
- TC_LOG_DEBUG("network", "PetitionsHandler: Adding arena team (guid: %u) member %s", arenaTeam->GetId(), memberGUID.ToString().c_str());
- arenaTeam->AddMember(memberGUID);
- result->NextRow();
+ TC_LOG_DEBUG("network", "PetitionsHandler: Adding arena team (guid: %u) member %s", arenaTeam->GetId(), signature.second.ToString().c_str());
+ arenaTeam->AddMember(signature.second);
}
}
- SQLTransaction trans = CharacterDatabase.BeginTransaction();
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_BY_GUID);
- stmt->setUInt32(0, petitionGuid.GetCounter());
- trans->Append(stmt);
-
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_GUID);
- stmt->setUInt32(0, petitionGuid.GetCounter());
- trans->Append(stmt);
-
- CharacterDatabase.CommitTransaction(trans);
+ sPetitionMgr->RemovePetition(petitionGuid);
// created
TC_LOG_DEBUG("network", "Player %s (%s) turning in petition %s", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), petitionGuid.ToString().c_str());