diff --git a/buy.lua b/buy.lua index 141e71b..2e210ac 100644 --- a/buy.lua +++ b/buy.lua @@ -32,10 +32,14 @@ function AuxBuySearchButton_OnClick() Aux.scan.start{ query = search_query, on_start_page = function(i) - set_message('Scanning auctions: page ' .. i .. ' ...') + set_message('Scanning auctions: page ' .. i + 1 .. ' ...') end, on_read_auction = function(i) local auction_item = Aux.info.auction_item(i) + if not auction_item then + return + end + local stack_size = auction_item.charges or auction_item.count if auction_item.name == search_query.name then record_auction(auction_item.name, stack_size, auction_item.buyout_price, auction_item.quality, auction_item.owner, auction_item.itemlink) @@ -98,32 +102,39 @@ function AuxBuyBuySelectedButton_OnClick() Aux.scan.start{ query = search_query, on_start_page = function(i) - set_message('Scanning auctions: page ' .. i .. ' ...') + set_message('Scanning auctions: page ' .. i + 1 .. ' ...') end, on_read_auction = function(i) local auction_item = Aux.info.auction_item(i) + + if not auction_item then + return + end + + local stack_size = auction_item.charges or auction_item.count + + if not auction_item.name or not stack_size or not auction_item.buyout_price then + return + end - if auction_item.name and auction_item.count and auction_item.buyout_price then - local key = auction_item.name.."_"..auction_item.count.."_"..auction_item.buyout_price - if order[key] then + local key = auction_item.name.."_"..stack_size.."_"..auction_item.buyout_price + if order[key] then + + if GetMoney() >= auction_item.buyout_price then + PlaceAuctionBid("list", i, auction_item.buyout_price) + progress.auctions = progress.auctions + 1 + progress.units = progress.units + stack_size + progress.expense = progress.expense + auction_item.buyout_price + end - if GetMoney() >= auction_item.buyout_price then - PlaceAuctionBid("list", i, auction_item.buyout_price) - progress.auctions = progress.auctions + 1 - progress.units = progress.units + auction_item.count - progress.expense = progress.expense + auction_item.buyout_price - end - - if order[key] > 1 then - order[key] = order[key] - 1 - else - order[key] = nil - end + if order[key] > 1 then + order[key] = order[key] - 1 else - local stack_size = auction_item.charges or auction_item.count - if auction_item.name == search_query.name then - record_auction(auction_item.name, stack_size, auction_item.buyout_price, auction_item.quality, auction_item.owner, auction_item.itemlink) - end + order[key] = nil + end + else + if auction_item.name == search_query.name then + record_auction(auction_item.name, stack_size, auction_item.buyout_price, auction_item.quality, auction_item.owner, auction_item.itemlink) end end end, diff --git a/info.lua b/info.lua index 57374fd..938e7bd 100644 --- a/info.lua +++ b/info.lua @@ -47,6 +47,11 @@ end function Aux.info.auction_item(index) local itemlink = GetAuctionItemLink("list", index) + + if not itemlink then + return + end + local auction_item = itemlink_item(itemlink) local name, texture, count, quality, usable, level, min_bid, min_increment, buyout_price, bid_amount, high_bidder, owner, sale_status, id, has_all_info = GetAuctionItemInfo("list", index) diff --git a/scan.lua b/scan.lua index 6e4101f..7b2e244 100644 --- a/scan.lua +++ b/scan.lua @@ -1,41 +1,58 @@ Aux.scan = {} -local STATE_IDLE = 0 -local STATE_PREQUERY = 1 -local STATE_POSTQUERY = 2 -local STATE_PROCESSING = 3 -- doesn't avoid race conditions completely! - local NUM_AUCTION_ITEMS_PER_PAGE = 50 -local currentJob -local currentPage -local state = STATE_IDLE +local current_job +local current_page +local page_state -local timeOfLastUpdate = GetTime() +local last_query_request = GetTime() -- forward declaration of local functions -local submitQuery, processQueryResults +local submit_query, process_query_results ----------------------------------------- function Aux.scan.on_event() - if event == "AUCTION_ITEM_LIST_UPDATE" then - if state == STATE_POSTQUERY then - state = STATE_PROCESSING - processQueryResults() + if event == "AUCTION_ITEM_LIST_UPDATE" and current_job and not page_state then + local count, total_count = GetNumAuctionItems("list") + if current_job.on_start_page then + current_job.on_start_page(current_page) end + page_state = { + index = 1, + count = count, + total_count = total_count, + } end end ----------------------------------------- function Aux.scan.on_update() - if state == STATE_PREQUERY and GetTime() - timeOfLastUpdate > 0.5 then - - timeOfLastUpdate = GetTime() + if page_state then + if page_state.index <= page_state.count and current_job.on_read_auction then + current_job.on_read_auction(page_state.index) + end + + if page_state.index == page_state.count then + if page_state.index == NUM_AUCTION_ITEMS_PER_PAGE then + page_state = nil + current_page = current_page + 1 + else + Aux.scan.complete() + end + end + + if page_state then + page_state.index = page_state.index + 1 + end + + elseif current_job and GetTime() - last_query_request > 0.5 then + last_query_request = GetTime() if CanSendAuctionQuery() then - submitQuery() + submit_query() end end end @@ -43,47 +60,40 @@ end ----------------------------------------- function Aux.scan.idle() - return state == STATE_IDLE + return not current_job end ----------------------------------------- function Aux.scan.complete() - if state ~= STATE_IDLE then - if currentJob.on_complete then - currentJob.on_complete() - end - - currentJob = nil - currentPage = nil - state = STATE_IDLE + if current_job and current_job.on_complete then + current_job.on_complete() end + + current_job = nil + current_page = nil + page_state = nil end ----------------------------------------- function Aux.scan.abort() - if state ~= STATE_IDLE then - if currentJob and currentJob.on_abort then - currentJob.on_abort() - end - - currentJob = nil - currentPage = nil - state = STATE_IDLE + if current_job and current_job.on_abort then + current_job.on_abort() end + + current_job = nil + current_page = nil + page_state = nil end ----------------------------------------- function Aux.scan.start(job) - - if state ~= STATE_IDLE then - Aux.scan.abort() - end + Aux.scan.abort() - currentJob = job - state = STATE_PREQUERY + current_job = job + current_page = 0 end ----------------------------------------- @@ -109,41 +119,16 @@ end ----------------------------------------- -function submitQuery() +function submit_query() QueryAuctionItems( - currentJob.query.name, - currentJob.query.minLevel, - currentJob.query.maxLevel, - currentJob.query.invTypeIndex, - currentJob.query.classIndex, - currentJob.query.subclassIndex, - currentPage, - currentJob.query.isUsable, - currentJob.query.qualityIndex + current_job.query.name, + current_job.query.minLevel, + current_job.query.maxLevel, + current_job.query.invTypeIndex, + current_job.query.classIndex, + current_job.query.subclassIndex, + current_page, + current_job.query.isUsable, + current_job.query.qualityIndex ) - state = STATE_POSTQUERY - currentPage = currentPage and currentPage + 1 or 1 -end - ------------------------------------------ - -function processQueryResults() - - local numBatchAuctions, totalAuctions = GetNumAuctionItems("list") - - if currentJob.on_start_page then - currentJob.on_start_page(currentPage) - end - - for i = 1, numBatchAuctions do - if currentJob.on_read_auction then - currentJob.on_read_auction(i) - end - end - - if numBatchAuctions == NUM_AUCTION_ITEMS_PER_PAGE then - state = STATE_PREQUERY - else - Aux.scan.complete() - end end \ No newline at end of file diff --git a/sell.lua b/sell.lua index 98e2a69..c36f0a9 100644 --- a/sell.lua +++ b/sell.lua @@ -306,11 +306,11 @@ function Aux_RefreshEntries() subclassIndex = subclass_index, }, on_start_page = function(i) - set_message('Scanning auctions: page ' .. i .. ' ...') + set_message('Scanning auctions: page ' .. i + 1 .. ' ...') end, on_read_auction = function(i) local auction_item = Aux.info.auction_item(i) - if auction_item.name == name then + if auction_item and auction_item.name == name then local stack_size = auction_item.charges or auction_item.count record_auction(auction_item.name, stack_size, auction_item.buyout_price, auction_item.duration, auction_item.owner) end