Files
OctoAuctionator/AuctionatorBuy.lua
T

390 lines
9.1 KiB
Lua

local addonName, addonTable = "Auctionator", AtrNS;
local zc = addonTable.zc;
local ATR_BUY_NULL = 0;
local ATR_BUY_QUERY_SENT = 1;
local ATR_BUY_JUST_BOUGHT = 2;
local ATR_BUY_PROCESSING_QUERY_RESULTS = 3;
local ATR_BUY_WAITING_FOR_AH_CAN_SEND = 4;
local gBuyState = ATR_BUY_NULL;
-----------------------------------------
local gAtr_Buy_BuyoutPrice;
local gAtr_Buy_ItemName;
local gAtr_Buy_StackSize;
local gAtr_Buy_NumBought;
local gAtr_Buy_NumUserWants;
local gAtr_Buy_MaxCanBuy;
local gAtr_Buy_CurPage;
local gAtr_Buy_Waiting_Start;
local gAtr_Buy_Query;
local gAtr_Buy_Pass;
-----------------------------------------
function Atr_Buy_Debug1 (yellow)
if (gBuyState == ATR_BUY_NULL) then asstr = "ATR_BUY_NULL"; end;
if (gBuyState == ATR_BUY_QUERY_SENT) then asstr = "ATR_BUY_QUERY_SENT"; end;
if (gBuyState == ATR_BUY_PROCESSING_QUERY_RESULTS) then asstr = "ATR_BUY_PROCESSING_QUERY_RESULTS"; end;
if (gBuyState == ATR_BUY_JUST_BOUGHT) then asstr = "ATR_BUY_JUST_BOUGHT"; end;
if (gBuyState == ATR_BUY_WAITING_FOR_AH_CAN_SEND) then asstr = "ATR_BUY_WAITING_FOR_AH_CAN_SEND"; end;
if (gBuyState ~= ATR_BUY_NULL) then
if (yellow) then
zc.msg (asstr, "curpage: ", gAtr_Buy_CurPage, " gAtr_Buy_NumBought: ", gAtr_Buy_NumBought);
else
zc.msg_pink (asstr, "curpage: ", gAtr_Buy_CurPage, " gAtr_Buy_NumBought: ", gAtr_Buy_NumBought);
end
end
end
-----------------------------------------
function Atr_Buy_IsBusy ()
if (gBuyState == ATR_BUY_NULL) then
return false;
end
if (gBuyState == ATR_BUY_PROCESSING_QUERY_RESULTS and not Atr_Buy_Confirm_Frame:IsShown()) then
return false;
end
return true;
end
-----------------------------------------
function Atr_ClearBuyState()
gBuyState = ATR_BUY_NULL;
end
-----------------------------------------
function Atr_Buy1_Onclick ()
if (not Atr_ShowingCurrentAuctions()) then
return;
end
local searchPane = Atr_GetCurrentPane();
if (searchPane.activeSearch and searchPane.activeSearch:IsActive()) then
searchPane.activeSearch:Pause(); -- resumes when the purchase is over
end
gAtr_Buy_Query = Atr_NewQuery();
gAtr_Buy_NumUserWants = -1;
gAtr_Buy_NumBought = 0;
local currentPane = Atr_GetCurrentPane();
local scan = currentPane.activeScan;
local data = scan.sortedData[currentPane.currIndex];
gAtr_Buy_BuyoutPrice = data.buyoutPrice;
gAtr_Buy_ItemName = scan.itemName;
gAtr_Buy_StackSize = data.stackSize;
gAtr_Buy_MaxCanBuy = data.count;
gAtr_Buy_Pass = 1; -- - first pass
Atr_Buy_Confirm_ItemName:SetText (gAtr_Buy_ItemName.." x"..gAtr_Buy_StackSize);
Atr_Buy_Confirm_Numstacks:SetNumber (1);
Atr_Buy_Confirm_Max_Text:SetText (ZT("max")..": "..gAtr_Buy_MaxCanBuy);
Atr_Buy_Part1:Show();
Atr_Buy_Part2:Hide();
Atr_Buy_Confirm_OKBut:SetText (ZT("Buy"))
Atr_Buy_Confirm_OKBut:Disable();
Atr_Buy_Confirm_Frame:Show();
if (scan.searchWasExact and data.minpage ~= nil) then
Atr_Buy_QueueQuery(data.minpage);
else
Atr_Buy_QueueQuery(0);
end
end
-----------------------------------------
function Atr_Buy_QueueQuery (page)
gAtr_Buy_CurPage = page;
--zc.msg_pink ("Queuing query for page ", page);
gBuyState = ATR_BUY_WAITING_FOR_AH_CAN_SEND;
gAtr_Buy_Waiting_Start = time();
Atr_Buy_SendQuery(); -- give it a shot
end
-----------------------------------------
function Atr_Buy_SendQuery ()
if (Atr_CanSendAuctionQuery ()) then
gBuyState = ATR_BUY_QUERY_SENT;
local queryString = zc.UTF8_Truncate (gAtr_Buy_ItemName,63); -- attempting to reduce number of disconnects
Atr_QueryAuctionItems (queryString, "", "", nil, 0, 0, gAtr_Buy_CurPage, nil, nil);
end
end
-----------------------------------------
local prevBuyState;
-----------------------------------------
function Atr_Buy_Idle ()
if (gBuyState ~= prevBuyState) then
prevBuyState = gBuyState;
-- Atr_Buy_Debug1 (true);
end
if (gBuyState == ATR_BUY_WAITING_FOR_AH_CAN_SEND) then
-- zc.md ("WAITING_FOR_AH_CAN_SEND: ", time() - gAtr_Buy_Waiting_Start);
if (GetMoney() < gAtr_Buy_BuyoutPrice) then
Atr_Buy_Cancel (ZT("You do not have enough gold\n\nto make any more purchases."));
elseif (time() - gAtr_Buy_Waiting_Start > 10) then
Atr_Buy_Cancel (ZT("Auction House timed out"));
else
Atr_Buy_SendQuery ();
end
elseif (gBuyState == ATR_BUY_JUST_BOUGHT) then
-- zc.msg_pink ("ATR_BUY_JUST_BOUGHT: ", time() - gAtr_Buy_Waiting_Start);
local queueIf = (time() - gAtr_Buy_Waiting_Start > 2); -- wait a few seconds for Auction List to Update after buys
Atr_Buy_NextPage_Or_Cancel (queueIf);
end
end
-----------------------------------------
function Atr_Buy_OnAuctionUpdate()
-- Atr_Buy_Debug1();
if (gBuyState == ATR_BUY_QUERY_SENT) then
Atr_Buy_CheckForMatches ();
end
return (gBuyState ~= ATR_BUY_NULL);
end
-----------------------------------------
function Atr_Buy_CheckForMatches ()
gBuyState = ATR_BUY_PROCESSING_QUERY_RESULTS;
if (gAtr_Buy_Query:CheckForDuplicatePage(gAtr_Buy_CurPage)) then
Atr_Buy_QueueQuery (gAtr_Buy_CurPage);
return;
end
local isLastPage = gAtr_Buy_Query:IsLastPage(gAtr_Buy_CurPage);
local numMatches = Atr_Buy_CountMatches();
if (numMatches > 0) then -- update the confirmation screen
Atr_Buy_Confirm_OKBut:Enable();
if (gAtr_Buy_NumUserWants ~= -1) then
Atr_Buy_Continue_Text:SetText (string.format (ZT("%d of %d bought so far"), gAtr_Buy_NumBought, gAtr_Buy_NumUserWants));
Atr_Buy_Part1:Hide();
Atr_Buy_Part2:Show();
Atr_Buy_Confirm_OKBut:SetText (ZT("Continue"))
end
else
Atr_Buy_NextPage_Or_Cancel();
end
end
-----------------------------------------
function Atr_Buy_BuyMatches ()
return Atr_Buy_CountMatches (true);
end
-----------------------------------------
function Atr_Buy_CountMatches (andBuy)
local numMatches = 0;
local numBoughtThisPage = 0;
local i = 1;
while (true) do
local name, _, count, _, _, _, _, _, buyoutPrice, _ = GetAuctionItemInfo ("list", i);
if (name == nil) then
break;
end
if (zc.StringSame (name, gAtr_Buy_ItemName) and buyoutPrice == gAtr_Buy_BuyoutPrice and count == gAtr_Buy_StackSize) then
numMatches = numMatches + 1;
if (andBuy and gAtr_Buy_NumUserWants > gAtr_Buy_NumBought) then
PlaceAuctionBid("list", i, gAtr_Buy_BuyoutPrice);
numBoughtThisPage = numBoughtThisPage + 1;
gAtr_Buy_NumBought = gAtr_Buy_NumBought + 1;
end
end
i = i + 1;
end
return numMatches, numBoughtThisPage;
end
-----------------------------------------
function Atr_Buy_Confirm_Update ()
local num = Atr_Buy_Confirm_Numstacks:GetNumber();
if (num == 1) then
Atr_Buy_Confirm_Text2:SetText (ZT("stack for"));
else
Atr_Buy_Confirm_Text2:SetText (ZT("stacks for"));
end
MoneyFrame_Update ("Atr_Buy_Confirm_TotalPrice", gAtr_Buy_BuyoutPrice * num);
end
-----------------------------------------
function Atr_Buy_NextPage_Or_Cancel ( queueIf )
if (Atr_Buy_IsComplete()) then
Atr_Buy_Cancel();
elseif (queueIf == nil or queueIf == true) then
if (Atr_Buy_IsFirstPassComplete()) then
gAtr_Buy_Pass = 2;
Atr_Buy_QueueQuery(0);
else
Atr_Buy_QueueQuery(gAtr_Buy_CurPage + 1);
end
end
end
-----------------------------------------
function Atr_Buy_IsComplete ()
if (gAtr_Buy_NumUserWants ~= -1 and gAtr_Buy_NumUserWants <= gAtr_Buy_NumBought) then
return true;
end
if (gAtr_Buy_Query:IsLastPage(gAtr_Buy_CurPage) and gAtr_Buy_Pass == 2) then
return true;
end
return false;
end
-----------------------------------------
function Atr_Buy_IsFirstPassComplete ()
if (gAtr_Buy_Query:IsLastPage(gAtr_Buy_CurPage) and gAtr_Buy_Pass == 1) then
return true;
end
return false;
end
-----------------------------------------
function Atr_Buy_Confirm_OK ()
if (gAtr_Buy_NumUserWants == -1) then
local numToBuy = Atr_Buy_Confirm_Numstacks:GetNumber();
if (numToBuy > gAtr_Buy_MaxCanBuy) then
Atr_Error_Text:SetText (string.format (ZT("You can buy at most %d auctions"), gAtr_Buy_MaxCanBuy));
Atr_Error_Frame:Show ();
return;
end
gAtr_Buy_NumUserWants = numToBuy;
end
local _, numJustBought = Atr_Buy_BuyMatches ();
if (numJustBought > 0) then
--zc.msg (numJustBought, " from page ", gAtr_Buy_CurPage);
AuctionatorSubtractFromScan (gAtr_Buy_ItemName, gAtr_Buy_StackSize, gAtr_Buy_BuyoutPrice, gAtr_Buy_NumBought);
gBuyState = ATR_BUY_JUST_BOUGHT;
gAtr_Buy_Waiting_Start = time();
Atr_Buy_Confirm_OKBut:Disable();
else
Atr_Buy_NextPage_Or_Cancel();
end
end
-----------------------------------------
function Atr_Buy_Wait_For_Bought_To_Clear ()
zc.md ("Atr_Buy_Wait_For_Bought_To_Clear: ", time() - gAtr_Buy_Waiting_Start);
end
-----------------------------------------
function Atr_Buy_Cancel (msg)
gBuyState = ATR_BUY_NULL;
Atr_Buy_Confirm_Frame:Hide();
Atr_Error_Display(msg);
end