vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Auctioneer Addon for World of Warcraft(tm).
        Version: 3.9.0.1000 (Kangaroo)
        Revision: $Id: AHScanning.lua 970 2006-08-22 02:58:29Z mentalpower $

        AHScanning
        Functions for scanning the AH
        Thanks to Telo for the LootLink code from which this was based.

        License:
                This program is free software; you can redistribute it and/or
                modify it under the terms of the GNU General Public License
                as published by the Free Software Foundation; either version 2
                of the License, or (at your option) any later version.

                This program is distributed in the hope that it will be useful,
                but WITHOUT ANY WARRANTY; without even the implied warranty of
                MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                GNU General Public License for more details.

                You should have received a copy of the GNU General Public License
                along with this program(see GPL.txt); if not, write to the Free Software
                Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
]]

--Local function Prototypes
local nextIndex, stopAuctionScan, auctionSubmitQuery, auctionNextQuery, checkCompleteScan, queryAuctionItemsHook, scanAuction, canSendAuctionQuery, startAuctionScan, canScan, requestAuctionScan;

-- local variables
local isScanningRequested = false;
local lCurrentAuctionPage;
local lMajorAuctionCategories;
local lCurrentCategoryIndex;
local lIsPageScanned;
local lScanInProgress;
local lFullScan;
local lScanStartedAt;
local lPageStartedAt;

-- function hooks
local lOriginal_CanSendAuctionQuery;
local lOriginal_AuctionFrameBrowse_OnEvent;
local lOriginal_AuctionFrameBrowse_Update;

-- TODO: If all categories are selected, then we should do a complete scan rather than a one-by-one scan.

-- get the next category index to based on what categories have been configured to be scanned
function nextIndex() --Local
        if (lCurrentCategoryIndex == nil) then lCurrentCategoryIndex = 0 end
        for i = lCurrentCategoryIndex + 1, table.getn(lMajorAuctionCategories) do
                if tostring(Auctioneer.Command.GetFilterVal("scan-class"..i)) == "on" then
                        return i;
                end
        end

        return nil;
end

function stopAuctionScan()
        Auctioneer.Event.StopAuctionScan();

        -- Unhook the scanning functions
        if( lOriginal_CanSendAuctionQuery ) then
                CanSendAuctionQuery = lOriginal_CanSendAuctionQuery;
                lOriginal_CanSendAuctionQuery = nil;
        end

        if( lOriginal_AuctionFrameBrowse_OnEvent ) then
                AuctionFrameBrowse_OnEvent = lOriginal_AuctionFrameBrowse_OnEvent;
                lOriginal_AuctionFrameBrowse_OnEvent = nil;
        end

        if( lOriginal_AuctionFrameBrowse_Update ) then
                AuctionFrameBrowse_Update = lOriginal_AuctionFrameBrowse_Update;
                lOriginal_AuctionFrameBrowse_Update = nil;
        end

        Auctioneer.Scanning.IsScanningRequested = false;
        lScanInProgress = false;
        lCurrentCategoryIndex = 0;
        lPageStartedAt = nil;
        lCurrentAuctionPage = nil;

        -- Unprotect AuctionFrame if we should
        if (Auctioneer.Command.GetFilterVal('protect-window') == 1) then
                Auctioneer.Util.ProtectAuctionFrame(false);
        end
end

function auctionSubmitQuery() --Local
        if not lCurrentAuctionPage or lCurrentAuctionPage == 0 then
                if not lCurrentAuctionPage then lCurrentAuctionPage = 0 end
                if lFullScan then
                        BrowseNoResultsText:SetText(string.format(_AUCT('AuctionScanStart'), _AUCT('TextAuction')));
                else
                        BrowseNoResultsText:SetText(string.format(_AUCT('AuctionScanStart'), lMajorAuctionCategories[lCurrentCategoryIndex]));
                end
        end
        if (lFullScan) then
                QueryAuctionItems("", "", "", nil, nil, nil, lCurrentAuctionPage, nil, nil);
        else
                QueryAuctionItems("", "", "", nil, lCurrentCategoryIndex, nil, lCurrentAuctionPage, nil, nil);
        end
        lPageStartedAt = time();

        lIsPageScanned = false;
        Auctioneer.Event.AuctionQuery(lCurrentAuctionPage);
end

local lCheckPage = nil;
function auctionNextQuery() --Local
        lCheckPage = nil;
        if lCurrentAuctionPage then
                local numBatchAuctions, totalAuctions = GetNumAuctionItems("list");
                local maxPages = floor(totalAuctions / NUM_AUCTION_ITEMS_PER_PAGE);

                local auctionsPerSecond = ( Auctioneer.Core.Variables.TotalAuctionsScannedCount / ( GetTime() - lScanStartedAt ) );
                local auctionETA = ( ( totalAuctions - Auctioneer.Core.Variables.TotalAuctionsScannedCount ) / auctionsPerSecond );
                auctionsPerSecond = floor( auctionsPerSecond * 100 ) / 100;
                if ( type(auctionsPerSecond) ~= "number" ) then
                        auctionsPerSecond = "";
                else
                        auctionsPerSecond = tostring(auctionsPerSecond);
                end
                local ETAString = SecondsToTime(auctionETA);

                if( lCurrentAuctionPage < maxPages ) then
                        lPageStartedAt = time();
                        lCurrentAuctionPage = lCurrentAuctionPage + 1;
                        if lFullScan then
                                BrowseNoResultsText:SetText(string.format(_AUCT('AuctionPageN'), _AUCT('TextAuction'), lCurrentAuctionPage + 1, maxPages + 1, auctionsPerSecond, ETAString));
                        else
                                BrowseNoResultsText:SetText(string.format(_AUCT('AuctionPageN'), lMajorAuctionCategories[lCurrentCategoryIndex],lCurrentAuctionPage + 1, maxPages + 1, auctionsPerSecond, ETAString));
                        end
                elseif nextIndex() then
                        lPageStartedAt = time();
                        lCurrentCategoryIndex = nextIndex();
                        lCurrentAuctionPage = 0;
                else
                        stopAuctionScan();
                        if( totalAuctions > 0 ) then
                                BrowseNoResultsText:SetText(_AUCT('AuctionScanDone'));
                                Auctioneer.Event.FinishedAuctionScan();
                        end
                        return;
                end
        end
        auctionSubmitQuery();
end

local lCheckStartTime = nil;
function checkCompleteScan()
        lCheckStartTime = lCheckStartTime or time()
        if (time() - lCheckStartTime > 10) then
                -- Sometimes they never return an owner.
                return true
        end

        for index = 1, GetNumAuctionItems("list") do
                local _,_,_,_,_,_,_,_,_,_,_, owner = GetAuctionItemInfo("list", index);
                if (not owner) then
                        return false
                end
        end

        return true
end

function queryAuctionItemsHook()
        lCheckStartTime = nil;
end

function scanAuction(nonScanUpdate)
        local numBatchAuctions, totalAuctions = GetNumAuctionItems("list");
        local auctionid;

        if( numBatchAuctions > 0 ) then
                if (nonScanUpdate) then
                        for auctionid = 1, numBatchAuctions do
                                Auctioneer.Event.ScanAuction(nil, auctionid, nil, true);
                        end
                else
                        for auctionid = 1, numBatchAuctions do
                                Auctioneer.Event.ScanAuction(lCurrentAuctionPage, auctionid, lCurrentCategoryIndex);
                        end
                end
        end

        lIsPageScanned = true;
end

local retryCount = 0
function canSendAuctionQuery() --Local
        local value = lOriginal_CanSendAuctionQuery();
        if (value and lIsPageScanned) or (retryCount >= 3) then
                auctionNextQuery();
                retryCount = 0
                return nil;
        end
        if (lPageStartedAt) then
                local pageElapsed = time() - lPageStartedAt;
                if (pageElapsed > 20) then
                        if (Auctioneer.Command.GetFilter('show-warning')) then
                                Auctioneer.Util.ChatPrint(string.format(_AUCT('AuctionScanRedo'), 20));
                        end
                        auctionSubmitQuery();
                        retryCount = retryCount  + 1;
                        return nil;
                end
                return false;
        end
end

Auctioneer.AuctionFrameBrowse = {
        OnEvent = function()
                -- Intentionally empty; don't allow the auction UI to update while we're scanning
        end,
        Update = function()
                -- Intentionally empty; don't allow the auction UI to update while we're scanning
        end
};

function startAuctionScan()
        lMajorAuctionCategories = {GetAuctionItemClasses()};

        lFullScan = true;
        for i = 1, table.getn(lMajorAuctionCategories) do
                if tostring(Auctioneer.Command.GetFilterVal("scan-class"..i)) ~= "on" then
                        lFullScan = false;
                end
        end

        if (lFullScan) then
                lCurrentCategoryIndex = table.getn(lMajorAuctionCategories);
        else
                -- first make sure that we have at least one category to scan
                lCurrentCategoryIndex = nextIndex();
                if not lCurrentCategoryIndex then
                        lCurrentCategoryIndex = 0;
                        Auctioneer.Util.ChatPrint(_AUCT('AuctionScanNocat'));
                        return;
                end
        end

        -- Start with the first page
        lCurrentAuctionPage = nil;
        lScanInProgress = true;

        -- Hook the functions that we need for the scan
        if( not lOriginal_CanSendAuctionQuery ) then
                lOriginal_CanSendAuctionQuery = CanSendAuctionQuery;
                CanSendAuctionQuery = canSendAuctionQuery;
        end

        if( not lOriginal_AuctionFrameBrowse_OnEvent ) then
                lOriginal_AuctionFrameBrowse_OnEvent = AuctionFrameBrowse_OnEvent;
                AuctionFrameBrowse_OnEvent = Auctioneer.AuctionFrameBrowse.OnEvent;
        end

        if( not lOriginal_AuctionFrameBrowse_Update ) then
                lOriginal_AuctionFrameBrowse_Update = AuctionFrameBrowse_Update;
                AuctionFrameBrowse_Update = Auctioneer.AuctionFrameBrowse.Update;
        end

        Auctioneer.Event.StartAuctionScan();

        lScanStartedAt = GetTime();
        auctionNextQuery();
end

function canScan()
        if (lScanInProgress) then
                return false;
        end
        if (not CanSendAuctionQuery()) then
                return false;
        end
        if (AucBidManager.IsProcessingRequest()) then
                return false;
        end
        return true;
end

function requestAuctionScan(chatPrint)
        Auctioneer.Scanning.IsScanningRequested = true;
        if (AuctionFrame and AuctionFrame:IsVisible()) then
                local iButton;
                local button;

                -- Hide the UI from any current results, show the no results text so we can use it
                BrowseNoResultsText:Show();
                for iButton = 1, NUM_BROWSE_TO_DISPLAY do
                        button = getglobal("BrowseButton"..iButton);
                        button:Hide();
                end
                BrowsePrevPageButton:Hide();
                BrowseNextPageButton:Hide();
                BrowseSearchCountText:Hide();

                startAuctionScan();
        else
                if (chatPrint) then
                        Auctioneer.Util.ChatPrint(_AUCT('AuctionScanNexttime'));
                end
        end
end

Auctioneer.Scanning = {
        IsScanningRequested = isScanningRequested,
        StopAuctionScan = stopAuctionScan,
        CheckCompleteScan = checkCompleteScan,
        QueryAuctionItemsHook = queryAuctionItemsHook,
        ScanAuction = scanAuction,
        StartAuctionScan = startAuctionScan,
        CanScan = canScan,
        RequestAuctionScan = requestAuctionScan,
}

Generated by GNU Enscript 1.6.5.90.