105 lines
3.4 KiB
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
|