TradeSkillMaster/Core/Service/Shopping/DisenchantSearch.lua

105 lines
3.4 KiB
Lua

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local DisenchantSearch = TSM.Shopping:NewPackage("DisenchantSearch")
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 CustomPrice = TSM.Include("Service.CustomPrice")
local private = {
itemList = {},
scanThreadId = nil,
searchContext = nil,
}
-- ============================================================================
-- Module Functions
-- ============================================================================
function DisenchantSearch.OnInitialize()
-- initialize thread
private.scanThreadId = Threading.New("DISENCHANT_SEARCH", private.ScanThread)
private.searchContext = TSM.Shopping.ShoppingSearchContext(private.scanThreadId, private.MarketValueFunction)
end
function DisenchantSearch.GetSearchContext()
return private.searchContext:SetScanContext(L["Disenchant Search"], nil, nil, L["Disenchant Value"])
end
-- ============================================================================
-- Scan Thread
-- ============================================================================
function private.ScanThread(auctionScan)
if (TSM.AuctionDB.GetLastCompleteScanTime() or 0) < time() - 60 * 60 * 12 then
Log.PrintUser(L["No recent AuctionDB scan data found."])
return false
end
-- create the list of items
wipe(private.itemList)
for _, itemString, _, minBuyout in TSM.AuctionDB.LastScanIteratorThreaded() do
if minBuyout and private.ShouldInclude(itemString, minBuyout) then
tinsert(private.itemList, itemString)
end
Threading.Yield()
end
-- run the scan
auctionScan:AddItemListQueriesThreaded(private.itemList)
for _, query in auctionScan:QueryIterator() do
query:AddCustomFilter(private.QueryFilter)
end
if not auctionScan:ScanQueriesThreaded() then
Log.PrintUser(L["TSM failed to scan some auctions. Please rerun the scan."])
end
end
function private.ShouldInclude(itemString, minBuyout)
if not ItemInfo.IsDisenchantable(itemString) then
return false
end
local itemLevel = ItemInfo.GetItemLevel(itemString) or -1
if itemLevel < TSM.db.global.shoppingOptions.minDeSearchLvl or itemLevel > TSM.db.global.shoppingOptions.maxDeSearchLvl then
return false
end
if private.IsItemBuyoutTooHigh(itemString, minBuyout) then
return false
end
return true
end
function private.QueryFilter(_, row)
local itemString = row:GetItemString()
if not itemString then
return false
end
local _, itemBuyout = row:GetBuyouts()
if not itemBuyout then
return false
end
return private.IsItemBuyoutTooHigh(itemString, itemBuyout)
end
function private.IsItemBuyoutTooHigh(itemString, itemBuyout)
local disenchantValue = CustomPrice.GetItemPrice(itemString, "Destroy")
return not disenchantValue or itemBuyout > TSM.db.global.shoppingOptions.maxDeSearchPercent / 100 * disenchantValue
end
function private.MarketValueFunction(row)
return CustomPrice.GetItemPrice(row:GetItemString() or row:GetBaseItemString(), "Destroy")
end