added config to remove dangling expired/emptied auctions

This commit is contained in:
zeb
2025-10-07 15:51:37 -04:00
parent b1ed903c06
commit b59164c4a9
4 changed files with 57 additions and 3 deletions

View File

@@ -41,6 +41,7 @@ AuctionHouseBot::AuctionHouseBot() :
debug_Out_Filters(false),
SellingBotEnabled(false),
BuyingBotEnabled(false),
ReturnExpiredAuctionItemsToBot(false),
CyclesBetweenBuyActionMin(1),
CyclesBetweenBuyAction(1),
CyclesBetweenBuyActionMax(1),
@@ -1266,11 +1267,14 @@ void AuctionHouseBot::AddNewAuctionBuyerBotBid(std::vector<Player*> AHBPlayers,
void AuctionHouseBot::Update()
{
if ((SellingBotEnabled == false) && (BuyingBotEnabled == false))
return;
if (AHCharacters.empty() == true)
return;
CleanupExpiredAuctionItems();
if ((SellingBotEnabled == false) && (BuyingBotEnabled == false))
return;
LastBuyCycleCount++;
LastSellCycleCount++;
@@ -1369,6 +1373,7 @@ void AuctionHouseBot::InitializeConfiguration()
// Buyer & Seller core properties
SetCyclesBetweenBuyOrSell();
ReturnExpiredAuctionItemsToBot = sConfigMgr->GetOption<bool>("AuctionHouseBot.ReturnExpiredAuctionItemsToBot", false);
ItemsPerCycle = sConfigMgr->GetOption<uint32>("AuctionHouseBot.ItemsPerCycle", 75);
MaxBuyoutPriceInCopper = sConfigMgr->GetOption<uint32>("AuctionHouseBot.MaxBuyoutPriceInCopper", 1000000000);
BuyoutVariationReducePercent = sConfigMgr->GetOption<float>("AuctionHouseBot.BuyoutVariationReducePercent", 0.15f);
@@ -1645,6 +1650,10 @@ void AuctionHouseBot::EmptyAuctionHouses()
auction->DeleteFromDB(trans);
sAuctionMgr->RemoveAItem(auction->item_guid);
auctionHouse->RemoveAuction(auction);
// If we don't need to return the item to AHBot, delete it
if (!ReturnExpiredAuctionItemsToBot)
Item::DeleteFromDB(trans, auction->item_guid.GetCounter());
}
}
@@ -1937,3 +1946,33 @@ void AuctionHouseBot::PopulateVendorItemsPrices()
} while (result->NextRow());
}
}
void AuctionHouseBot::CleanupExpiredAuctionItems()
{
if (AHCharactersGUIDsForQuery.empty() ||
ReturnExpiredAuctionItemsToBot)
return;
// Delete item_instances that are not in the Auction Houses
std::string queryItemInstancesString = R"SQL(
SELECT guid
FROM item_instance
LEFT JOIN auctionhouse ON auctionhouse.itemguid = item_instance.guid
WHERE item_instance.owner_guid IN ({})
AND auctionhouse.id IS NULL
)SQL";
QueryResult queryItemInstancesResult = CharacterDatabase.Query(queryItemInstancesString, AHCharactersGUIDsForQuery);
if (!queryItemInstancesResult)
return;
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
do
{
uint32 guid = queryItemInstancesResult->Fetch()[0].Get<uint32>();
Item::DeleteFromDB(trans, guid);
} while (queryItemInstancesResult->NextRow());
CharacterDatabase.CommitTransaction(trans);
}