112 lines
3.9 KiB
Lua
112 lines
3.9 KiB
Lua
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
local _, TSM = ...
|
|
local BuyoutSearch = TSM.Sniper:NewPackage("BuyoutSearch")
|
|
local L = TSM.Include("Locale").GetTable()
|
|
local Log = TSM.Include("Util.Log")
|
|
local Threading = TSM.Include("Service.Threading")
|
|
local ItemInfo = TSM.Include("Service.ItemInfo")
|
|
local private = {
|
|
scanThreadId = nil,
|
|
searchContext = nil,
|
|
itemList = {},
|
|
}
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Module Functions
|
|
-- ============================================================================
|
|
|
|
function BuyoutSearch.OnInitialize()
|
|
private.scanThreadId = Threading.New("SNIPER_BUYOUT_SEARCH", private.ScanThread)
|
|
private.searchContext = TSM.Sniper.SniperSearchContext(private.scanThreadId, private.MarketValueFunction, "BUYOUT")
|
|
end
|
|
|
|
function BuyoutSearch.GetSearchContext()
|
|
return private.searchContext
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Scan Thread
|
|
-- ============================================================================
|
|
|
|
function private.ScanThread(auctionScan)
|
|
local numQueries = auctionScan:GetNumQueries()
|
|
if numQueries == 0 then
|
|
if TSM.IsWowClassic() then
|
|
auctionScan:NewQuery()
|
|
:AddCustomFilter(private.QueryFilter)
|
|
:SetPage("LAST")
|
|
else
|
|
wipe(private.itemList)
|
|
if not TSM.Sniper.PopulateItemList(private.itemList) then
|
|
-- scan the entire AH
|
|
auctionScan:NewQuery()
|
|
:AddCustomFilter(private.QueryFilter)
|
|
elseif #private.itemList == 0 then
|
|
Log.PrintUser(L["Failed to start sniper. No groups have a Sniper operation applied."])
|
|
return false
|
|
else
|
|
-- scan for the list of items
|
|
auctionScan:AddItemListQueriesThreaded(private.itemList)
|
|
for _, query in auctionScan:QueryIterator() do
|
|
query:AddCustomFilter(private.QueryFilter)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
-- don't care if the scan fails for sniper since it's rerun constantly
|
|
auctionScan:ScanQueriesThreaded()
|
|
return true
|
|
end
|
|
|
|
function private.QueryFilter(_, subRow)
|
|
local baseItemString = subRow:GetBaseItemString()
|
|
local itemString = subRow:GetItemString()
|
|
local maxPrice = itemString and TSM.Operations.Sniper.GetBelowPrice(itemString) or nil
|
|
if itemString and not maxPrice then
|
|
-- no Shopping operation applies to this item, so filter it out
|
|
return true
|
|
end
|
|
local auctionBuyout, itemBuyout, minItemBuyout = subRow:GetBuyouts()
|
|
itemBuyout = itemBuyout or minItemBuyout
|
|
if not itemBuyout then
|
|
-- don't have buyout info yet, so don't filter
|
|
return false
|
|
elseif auctionBuyout == 0 then
|
|
-- no buyout, so filter it out
|
|
return true
|
|
elseif itemString then
|
|
-- filter if the buyout is too high
|
|
return itemBuyout > maxPrice
|
|
elseif not ItemInfo.CanHaveVariations(baseItemString) then
|
|
-- check the buyout against the base item
|
|
return itemBuyout > (TSM.Operations.Sniper.GetBelowPrice(baseItemString) or 0)
|
|
end
|
|
|
|
-- check if any variant of this item is in a group and could potentially be worth scnaning
|
|
local hasPotentialItem = false
|
|
for _, groupItemString in TSM.Groups.ItemByBaseItemStringIterator(baseItemString) do
|
|
hasPotentialItem = hasPotentialItem or itemBuyout < (TSM.Operations.Sniper.GetBelowPrice(groupItemString) or 0)
|
|
end
|
|
if hasPotentialItem then
|
|
return false
|
|
elseif not TSM.Operations.Sniper.HasOperation(baseItemString) then
|
|
-- no potential other variants we care about
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function private.MarketValueFunction(row)
|
|
local itemString = row:GetItemString()
|
|
return itemString and TSM.Operations.Sniper.GetBelowPrice(itemString) or nil
|
|
end
|