aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-09-27 00:51:52 +0200
committerShauren <shauren.trinity@gmail.com>2022-02-28 12:45:06 +0100
commit569b5d6f04548cd874cc161cb67a62dcad792fb0 (patch)
tree98b4cc4f720694c815b32c2da1b4387632dc75fb /src/server/game
parente7fc68d74b4fe146b37d14f1b73dbbed421b9214 (diff)
Core/Auction House: Eliminate blocking db queries for account permissions when expiring auctions that have offline bidders
(cherry picked from commit d0d0f51f325e4ae42c9bef7606fed4f4c00c98d6)
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp6
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.h9
-rw-r--r--src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp6
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp7
4 files changed, 22 insertions, 6 deletions
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index be9845258de..0fdd6d32117 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -631,6 +631,7 @@ void AuctionHouseMgr::LoadAuctions()
auction.BidAmount = fields[7].GetUInt64();
auction.StartTime = std::chrono::system_clock::from_time_t(fields[8].GetInt64());
auction.EndTime = std::chrono::system_clock::from_time_t(fields[9].GetInt64());
+ auction.ServerFlags = static_cast<AuctionPostingServerFlag>(fields[10].GetUInt8());
auto biddersItr = biddersByAuction.find(auction.Id);
if (biddersItr != biddersByAuction.end())
@@ -1003,6 +1004,7 @@ void AuctionHouseObject::AddAuction(CharacterDatabaseTransaction trans, AuctionP
stmt->setUInt64(7, auction.BidAmount);
stmt->setInt64(8, std::chrono::system_clock::to_time_t(auction.StartTime));
stmt->setInt64(9, std::chrono::system_clock::to_time_t(auction.EndTime));
+ stmt->setUInt8(10, auction.ServerFlags.AsUnderlyingType());
trans->Append(stmt);
for (Item* item : auction.Items)
@@ -1854,18 +1856,16 @@ void AuctionHouseObject::SendAuctionWon(AuctionPosting const* auction, Player* b
// data for gm.log
std::string bidderName;
- bool logGmTrade = false;
+ bool logGmTrade = auction->ServerFlags.HasFlag(AuctionPostingServerFlag::GmLogBuyer);
if (bidder)
{
bidderAccId = bidder->GetSession()->GetAccountId();
bidderName = bidder->GetName();
- logGmTrade = bidder->GetSession()->HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE);
}
else
{
bidderAccId = sCharacterCache->GetCharacterAccountIdByGuid(auction->Bidder);
- logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, realm.Id.Realm);
if (logGmTrade && !sCharacterCache->GetCharacterNameByGuid(auction->Bidder, bidderName))
bidderName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN);
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h
index 2d84bdb24a9..caa96909654 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.h
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h
@@ -222,6 +222,14 @@ struct AuctionsBucketData
class Sorter;
};
+enum class AuctionPostingServerFlag : uint8
+{
+ None = 0x0,
+ GmLogBuyer = 0x1 // write transaction to gm log file for buyer (optimization flag - avoids querying database for offline player permissions)
+};
+
+DEFINE_ENUM_FLAG(AuctionPostingServerFlag);
+
// This structure represents the result of a single C_AuctionHouse.PostItem/PostCommodity call
struct AuctionPosting
{
@@ -238,6 +246,7 @@ struct AuctionPosting
uint64 BidAmount = 0;
SystemTimePoint StartTime = SystemTimePoint::min();
SystemTimePoint EndTime = SystemTimePoint::min();
+ EnumFlag<AuctionPostingServerFlag> ServerFlags = AuctionPostingServerFlag::None;
GuidUnorderedSet BidderHistory;
diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
index bd7c156211d..684e9d452df 100644
--- a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
+++ b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp
@@ -439,12 +439,14 @@ void AuctionBotBuyer::PlaceBidToEntry(AuctionPosting* auction, AuctionHouseObjec
// Set bot as bidder and set new bid amount
auction->Bidder = newBidder;
auction->BidAmount = bidPrice;
+ auction->ServerFlags &= ~AuctionPostingServerFlag::GmLogBuyer;
// Update auction to DB
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID);
stmt->setUInt64(0, auction->Bidder.GetCounter());
- stmt->setUInt32(1, auction->BidAmount);
- stmt->setUInt32(2, auction->Id);
+ stmt->setUInt64(1, auction->BidAmount);
+ stmt->setUInt8(2, auction->ServerFlags.AsUnderlyingType());
+ stmt->setUInt32(3, auction->Id);
trans->Append(stmt);
// Run SQLs
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index 39f60749439..59ddbcbae8f 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -435,6 +435,10 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac
player->ModifyMoney(-int64(priceToPay));
auction->Bidder = player->GetGUID();
auction->BidAmount = placeBid.BidAmount;
+ if (HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE))
+ auction->ServerFlags |= AuctionPostingServerFlag::GmLogBuyer;
+ else
+ auction->ServerFlags &= ~AuctionPostingServerFlag::GmLogBuyer;
if (canBuyout && placeBid.BidAmount == auction->BuyoutOrUnitPrice)
{
@@ -450,7 +454,8 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID);
stmt->setUInt64(0, auction->Bidder.GetCounter());
stmt->setUInt64(1, auction->BidAmount);
- stmt->setUInt32(2, auction->Id);
+ stmt->setUInt8(2, auction->ServerFlags.AsUnderlyingType());
+ stmt->setUInt32(3, auction->Id);
trans->Append(stmt);
if (auction->BidderHistory.insert(player->GetGUID()).second)