From b59164c4a9c8a50588ea8db6eb6f90aa9f0e6ae2 Mon Sep 17 00:00:00 2001 From: zeb <37308742+zeb139@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:51:37 -0400 Subject: [PATCH] added config to remove dangling expired/emptied auctions --- conf/mod_ahbot.conf.dist | 8 +++++++ src/AuctionHouseBot.cpp | 43 +++++++++++++++++++++++++++++++++-- src/AuctionHouseBot.h | 2 ++ src/AuctionHouseBotScript.cpp | 7 +++++- 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/conf/mod_ahbot.conf.dist b/conf/mod_ahbot.conf.dist index 9cbdea9..0c3a0fa 100644 --- a/conf/mod_ahbot.conf.dist +++ b/conf/mod_ahbot.conf.dist @@ -39,6 +39,13 @@ # Enable/Disable the part of AHBot that puts items up for auction # Default: false (disabled) # +# AuctionHouseBot.ReturnExpiredAuctionItemsToBot +# If enabled (true), returns expired auction items to the AH Bot(s) via +# mail. Note: if enabled, this can cause your bot's mailbox to fill up +# if you don't manage it manually. This can also cause the size of your +# acore_characters.item_instance database table to grow over time. +# Default: false (disabled) +# # AuctionHouseBot.GUIDs # These are the character GUIDS (from characters->characters table) that # will be used to create auctions and otherwise interact with auctions. @@ -68,6 +75,7 @@ AuctionHouseBot.DEBUG_FILTERS = false AuctionHouseBot.MinutesBetweenBuyCycle = 1 AuctionHouseBot.MinutesBetweenSellCycle = 1 AuctionHouseBot.EnableSeller = false +AuctionHouseBot.ReturnExpiredAuctionItemsToBot = false AuctionHouseBot.GUIDs = 0 AuctionHouseBot.ItemsPerCycle = 150 AuctionHouseBot.ListingExpireTimeInSecondsMin = 900 diff --git a/src/AuctionHouseBot.cpp b/src/AuctionHouseBot.cpp index 79adac2..7b52c5d 100644 --- a/src/AuctionHouseBot.cpp +++ b/src/AuctionHouseBot.cpp @@ -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 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("AuctionHouseBot.ReturnExpiredAuctionItemsToBot", false); ItemsPerCycle = sConfigMgr->GetOption("AuctionHouseBot.ItemsPerCycle", 75); MaxBuyoutPriceInCopper = sConfigMgr->GetOption("AuctionHouseBot.MaxBuyoutPriceInCopper", 1000000000); BuyoutVariationReducePercent = sConfigMgr->GetOption("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(); + Item::DeleteFromDB(trans, guid); + } while (queryItemInstancesResult->NextRow()); + + CharacterDatabase.CommitTransaction(trans); +} diff --git a/src/AuctionHouseBot.h b/src/AuctionHouseBot.h index 12f4935..0a25d97 100644 --- a/src/AuctionHouseBot.h +++ b/src/AuctionHouseBot.h @@ -128,6 +128,7 @@ private: bool SellingBotEnabled; bool BuyingBotEnabled; + bool ReturnExpiredAuctionItemsToBot; uint32 CyclesBetweenBuyActionMin; uint32 CyclesBetweenBuyAction; uint32 CyclesBetweenBuyActionMax; @@ -322,6 +323,7 @@ public: void AddNewAuctions(std::vector AHBPlayers, FactionSpecificAuctionHouseConfig* config); void AddNewAuctionBuyerBotBid(std::vector AHBPlayers, FactionSpecificAuctionHouseConfig* config); void PopulateVendorItemsPrices(); + void CleanupExpiredAuctionItems(); template void AddItemValuePairsToItemIDMap(std::unordered_map& workingValueToItemIDMap, std::string valueToItemIDMap); diff --git a/src/AuctionHouseBotScript.cpp b/src/AuctionHouseBotScript.cpp index 02297f7..cdd0206 100644 --- a/src/AuctionHouseBotScript.cpp +++ b/src/AuctionHouseBotScript.cpp @@ -62,7 +62,7 @@ public: } } - void OnBeforeAuctionHouseMgrSendAuctionExpiredMail(AuctionHouseMgr* /*auctionHouseMgr*/, AuctionEntry* /*auction*/, Player* owner, uint32& /*owner_accId*/, bool& sendNotification, bool& /*sendMail*/) override + void OnBeforeAuctionHouseMgrSendAuctionExpiredMail(AuctionHouseMgr* /*auctionHouseMgr*/, AuctionEntry* /*auction*/, Player* owner, uint32& /*owner_accId*/, bool& sendNotification, bool& sendMail) override { if (owner) { @@ -78,6 +78,11 @@ public: if (isAHBot == true) { sendNotification = false; + + if (sConfigMgr->GetOption("AuctionHouseBot.ReturnExpiredAuctionItemsToBot", false)) + sendMail = true; + else + sendMail = false; } } }