You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
7.6 KiB

-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster_AuctionDB --
-- http://www.curse.com/addons/wow/tradeskillmaster_auctiondb --
-- --
-- A TradeSkillMaster Addon (http://tradeskillmaster.com) --
-- All Rights Reserved* - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
-- load the parent file (TSM) into a local variable and register this file as a module
local TSM = select(2, ...)
local Scan = TSM:NewModule("Scan", "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("TradeSkillMaster_AuctionDB") -- loads the localization table
Scan.groupScanData = {}
Scan.filterList = {}
Scan.numFilters = 0
local function ScanCallback(event, ...)
if event == "SCAN_PAGE_UPDATE" then
local page, total = ...
TSM.GUI:UpdateStatus(format(L["Scanning page %s/%s"], page, total), page*100/total)
elseif event == "SCAN_COMPLETE" then
local data = ...
Scan:ProcessScanData(data)
Scan:DoneScanning()
elseif event == "INTERRUPTED" then
Scan:DoneScanning()
end
end
function Scan.ProcessGetAllScan(self)
local temp = 0
while true do
temp = min(temp + 1, 100)
self:Sleep(0.2)
if not Scan.isScanning then return end
if Scan.getAllLoaded then
break
end
TSM.GUI:UpdateStatus(L["Running query..."], nil, temp)
end
local data = {}
for i=1, Scan.getAllLoaded do
TSM.GUI:UpdateStatus(format(L["Scanning page %s/%s"], 1, 1), i*100/Scan.getAllLoaded)
if i % 100 == 0 then
self:Yield()
if GetNumAuctionItems("list") ~= Scan.getAllLoaded then
--TSM:Print(L["GetAll scan did not run successfully due to issues on Blizzard's end. Using the TSM application for your scans is recommended."])
TSM:Print("GetAll scan did not run successfully.")
Scan:DoneScanning()
return
end
end
local itemID = TSMAPI:GetItemID(GetAuctionItemLink("list", i))
--local _, _, count, _, _, _, _, _, _, buyout = GetAuctionItemInfo("list", i)
local _, _, count, _, _, _, _, _, buyout = GetAuctionItemInfo("list", i)
if itemID and buyout and buyout > 0 then
data[itemID] = data[itemID] or {records={}, minBuyout=math.huge, quantity=0}
data[itemID].minBuyout = min(data[itemID].minBuyout, floor(buyout/count))
data[itemID].quantity = data[itemID].quantity + count
for j=1, count do
tinsert(data[itemID].records, floor(buyout/count))
end
end
end
TSM.db.factionrealm.lastCompleteScan = time()
TSM.Data:ProcessData(data)
TSM.GUI:UpdateStatus(L["Processing data..."])
while TSM.processingData do
self:Sleep(0.2)
end
TSM:Print(L["It is strongly recommended that you reload your ui (type '/reload') after running a GetAll scan. Otherwise, any other scans (Post/Cancel/Search/etc) will be much slower than normal."])
end
function Scan:AUCTION_ITEM_LIST_UPDATE()
Scan:UnregisterEvent("AUCTION_ITEM_LIST_UPDATE")
local num, total = GetNumAuctionItems("list")
--if num ~= total or num == 0 then
if num == 0 then
--TSM:Print(L["GetAll scan did not run successfully due to issues on Blizzard's end. Using the TSM application for your scans is recommended."])
TSM:Print("GetAll scan did not run successfully.")
Scan:DoneScanning()
return
end
Scan.getAllLoaded = num
end
function Scan:GetAllScanQuery()
local canScan, canGetAll = CanSendAuctionQuery()
if not canGetAll then return TSM:Print(L["Can't run a GetAll scan right now."]) end
if not canScan then return TSMAPI:CreateTimeDelay(0.5, Scan.GetAllScanQuery) end
QueryAuctionItems("", nil, nil, nil, nil, nil, nil, nil, nil, true)
Scan:RegisterEvent("AUCTION_ITEM_LIST_UPDATE")
TSMAPI.Threading:Start(Scan.ProcessGetAllScan, 1, function() Scan:DoneScanning() end)
end
local function GroupScanCallback(event, ...)
if event == "QUERY_COMPLETE" then
local filterList = ...
local numItems = 0
for _, v in ipairs(filterList) do
numItems = numItems + #v.items
end
Scan.filterList = filterList
Scan.numFilters = #filterList
Scan:ScanNextGroupFilter()
elseif event == "QUERY_UPDATE" then
local current, total = ...
TSM.GUI:UpdateStatus(format(L["Preparing Filter %d / %d"], current, total))
elseif event == "SCAN_INTERRUPTED" then
Scan:DoneScanning()
elseif event == "SCAN_TIMEOUT" then
tremove(Scan.filterList, 1)
Scan:ScanNextGroupFilter()
elseif event == "SCAN_PAGE_UPDATE" then
local page, total = ...
TSM.GUI:UpdateStatus(format(L["Scanning %d / %d (Page %d / %d)"], Scan.numFilters-#Scan.filterList, Scan.numFilters, page+1, total), nil, page*100/total)
elseif event == "SCAN_COMPLETE" then
local data = ...
for _, itemString in ipairs(Scan.filterList[1].items) do
if not Scan.groupScanData[itemString] then
Scan.groupScanData[itemString] = data[itemString]
end
end
tremove(Scan.filterList, 1)
Scan:ScanNextGroupFilter()
end
end
function Scan:ScanNextGroupFilter(data)
if #Scan.filterList == 0 then
Scan:ProcessScanData(Scan.groupScanData)
Scan:DoneScanning()
return
end
TSM.GUI:UpdateStatus(format(L["Scanning %d / %d (Page %d / %d)"], Scan.numFilters-#Scan.filterList, Scan.numFilters, 1, 1), (Scan.numFilters-#Scan.filterList)*100/Scan.numFilters)
TSMAPI.AuctionScan:RunQuery(Scan.filterList[1], GroupScanCallback)
end
function Scan:StartGroupScan(items)
Scan.isScanning = "Group"
Scan.isBuggedGetAll = nil
Scan.groupItems = items
wipe(Scan.filterList)
wipe(Scan.groupScanData)
Scan.numFilters = 0
TSMAPI.AuctionScan:StopScan()
TSMAPI:GenerateQueries(items, GroupScanCallback)
TSM.GUI:UpdateStatus(L["Preparing Filters..."])
end
function Scan:StartFullScan()
Scan.isScanning = "Full"
TSM.GUI:UpdateStatus(L["Running query..."])
Scan.isBuggedGetAll = nil
Scan.groupItems = nil
TSMAPI.AuctionScan:StopScan()
TSMAPI.AuctionScan:RunQuery({name=""}, ScanCallback)
end
function Scan:StartGetAllScan()
TSM.db.profile.lastGetAll = time()
Scan.isScanning = "GetAll"
Scan.isBuggedGetAll = nil
Scan.groupItems = nil
TSMAPI.AuctionScan:StopScan()
Scan:GetAllScanQuery()
end
function Scan:DoneScanning()
TSM.GUI:UpdateStatus(L["Done Scanning"], 100)
Scan.isScanning = nil
Scan.getAllLoaded = nil
end
function Scan:ProcessScanData(scanData)
local data = {}
for itemString, obj in pairs(scanData) do
if TSMAPI:GetBaseItemString(itemString) == itemString then
local itemID = obj:GetItemID()
local quantity, minBuyout = 0, 0
local records = {}
for _, record in ipairs(obj.records) do
local itemBuyout = record:GetItemBuyout()
if itemBuyout and (itemBuyout < minBuyout or minBuyout == 0) then
minBuyout = itemBuyout
end
quantity = quantity + record.count
for i=1, record.count do
tinsert(records, itemBuyout)
end
end
data[itemID] = {records=records, minBuyout=minBuyout, quantity=quantity}
end
end
if Scan.isScanning ~= "group" then
TSM.db.factionrealm.lastCompleteScan = time()
end
TSM.Data:ProcessData(data, Scan.groupItems)
end
function Scan:ProcessImportedData(auctionData)
local data = {}
for itemID, auctions in pairs(auctionData) do
local quantity, minBuyout, records = 0, 0, {}
for _, auction in ipairs(auctions) do
local itemBuyout, count = unpack(auction)
if itemBuyout and (itemBuyout < minBuyout or minBuyout == 0) then
minBuyout = itemBuyout
end
quantity = quantity + count
for i=1, count do
tinsert(records, itemBuyout)
end
end
data[itemID] = {records=records, minBuyout=minBuyout, quantity=quantity}
end
TSM.db.factionrealm.lastCompleteScan = time()
TSM.Data:ProcessData(data)
end