vanilla-wow-addons – Rev 1
?pathlinks?
--[[
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.