.ahbot empty respects player auctions and returns bids on cancelled items

This commit is contained in:
zeb
2025-10-04 23:49:22 -04:00
parent 762f53f180
commit a22f866e49

View File

@@ -1587,20 +1587,100 @@ void AuctionHouseBot::InitializeConfiguration()
void AuctionHouseBot::EmptyAuctionHouses()
{
vector<FactionSpecificAuctionHouseConfig> configs = { AllianceConfig, HordeConfig, NeutralConfig };
auto trans = CharacterDatabase.BeginTransaction();
vector<uint32> ahBotActiveAuctions;
// Get all auctions owned by AHBots which have no bidders
std::string queryString = "SELECT id FROM auctionhouse WHERE itemowner IN ({}) AND buyguid = 0";
QueryResult result = CharacterDatabase.Query(queryString, AHCharactersGUIDsForQuery);
auto trans = CharacterDatabase.BeginTransaction();
if (result && result->GetRowCount() > 0)
{
do
{
uint32 tmpdata = result->Fetch()->Get<uint32>();
ahBotActiveAuctions.push_back(tmpdata);
} while (result->NextRow());
// Remove bidder-less AHBot items from the AHs
for (FactionSpecificAuctionHouseConfig config : configs) {
AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(config.GetAHFID());
auto auctionEntryMap = auctionHouse->GetAuctions();
for (auto itr = auctionEntryMap.begin(); itr != auctionEntryMap.end();)
for (uint32 auctionID : ahBotActiveAuctions)
{
AuctionEntry* auction = itr->second;
vector<uint32>::iterator iter = ahBotActiveAuctions.begin();
AuctionEntry* auction = auctionHouse->GetAuction(*iter);
ahBotActiveAuctions.erase(iter);
auction->DeleteFromDB(trans);
sAuctionMgr->RemoveAItem(auction->item_guid);
auctionHouse->RemoveAuction(auction);
}
}
}
itr = auctionEntryMap.erase(itr);
// Get auctions owned by AHBots which DO have a bidder, return their deposits
std::vector<std::pair<uint32, uint32>> auctionsToRefund;
std::string refundQueryString = "SELECT id, buyguid FROM auctionhouse WHERE itemowner IN ({}) AND buyguid != 0";
QueryResult refundResult = CharacterDatabase.Query(refundQueryString, AHCharactersGUIDsForQuery);
if (refundResult && refundResult->GetRowCount() > 0)
{
do
{
Field* fields = refundResult->Fetch();
uint32 auctionID = fields[0].Get<uint32>();
uint32 buyGUID = fields[1].Get<uint32>();
auctionsToRefund.push_back({auctionID, buyGUID});
} while (refundResult->NextRow());
// Remove AHBot items with bidders from the AHs
for (FactionSpecificAuctionHouseConfig config : configs) {
AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(config.GetAHFID());
for (std::pair<uint32, uint32> p : auctionsToRefund)
{
uint32 auctionID = p.first;
uint32 buyGUID = p.second;
// Lookup accountID and accountName associated with bidder character
std::string accountIDQueryString = "SELECT account FROM characters WHERE guid = {}";
std::string accountNameQueryString = "SELECT username FROM acore_auth.account WHERE id = {}";
QueryResult accountIDQueryResult = CharacterDatabase.Query(accountIDQueryString, buyGUID);
if (!accountIDQueryResult)
continue;
uint32 bidderAccountID = accountIDQueryResult->Fetch()->Get<uint32>();
QueryResult accountNameQueryResult = LoginDatabase.Query(accountNameQueryString, bidderAccountID);
if (!accountNameQueryResult)
continue;
std::string bidderAccountName = accountNameQueryResult->Fetch()->Get<std::string>();
// Load Player information, and issue refund
auto session = std::make_unique<WorldSession>(
bidderAccountID, std::move(bidderAccountName), 0, nullptr,
SEC_PLAYER, sWorld->getIntConfig(CONFIG_EXPANSION), 0, LOCALE_enUS, 0, false, false, 0
);
auto player = std::make_unique<Player>(session.get());
if (!player)
continue;
player->Initialize(buyGUID);
auto iter = auctionsToRefund.begin();
AuctionEntry* auction = auctionHouse->GetAuction(iter->first);
if (!auction)
continue;
uint32 auctionCut = auction->GetAuctionCut();
sAuctionMgr->SendAuctionCancelledToBidderMail(auction, trans);
player->ModifyMoney(-int32(auctionCut)); // ModifyMoney() already handles negative check
// Remove item from the AH
auctionsToRefund.erase(iter);
auction->DeleteFromDB(trans);
sAuctionMgr->RemoveAItem(auction->item_guid);
auctionHouse->RemoveAuction(auction);
}
}
}