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.
230 lines
7.6 KiB
230 lines
7.6 KiB
|
4 years ago
|
-- ------------------------------------------------------------------------------ --
|
||
|
|
-- 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
|