Fix for 'page' defaulting to nil pointer value error. See https://octowow.st/forum/viewtopic.php?t=2815
4359 lines
104 KiB
Lua
4359 lines
104 KiB
Lua
AuctionatorVersion = "???"; -- set from toc upon loading
|
|
AuctionatorAuthor = "Zirco";
|
|
|
|
local AuctionatorLoaded = false;
|
|
local AuctionatorInited = false;
|
|
|
|
local addonName, addonTable = "Auctionator", AtrNS;
|
|
local zc = addonTable.zc;
|
|
|
|
gAtrZC = addonTable.zc; -- share with AuctionatorDev
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
local recommendElements = {};
|
|
|
|
AUCTIONATOR_ENABLE_ALT = 1;
|
|
AUCTIONATOR_OPEN_ALL_BAGS = 1;
|
|
AUCTIONATOR_SHOW_ST_PRICE = 0;
|
|
AUCTIONATOR_SHOW_TIPS = 1;
|
|
AUCTIONATOR_DEF_DURATION = "N"; -- none
|
|
AUCTIONATOR_V_TIPS = 1;
|
|
AUCTIONATOR_A_TIPS = 1;
|
|
AUCTIONATOR_D_TIPS = 1;
|
|
AUCTIONATOR_SHIFT_TIPS = 1;
|
|
AUCTIONATOR_DE_DETAILS_TIPS = 4; -- off by default
|
|
AUCTIONATOR_DEFTAB = 1;
|
|
|
|
AUCTIONATOR_OPEN_FIRST = 0; -- obsolete - just needed for migration
|
|
AUCTIONATOR_OPEN_BUY = 0; -- obsolete - just needed for migration
|
|
|
|
local SELL_TAB = 1;
|
|
local MORE_TAB = 2;
|
|
local BUY_TAB = 3;
|
|
|
|
local MODE_LIST_ACTIVE = 1;
|
|
local MODE_LIST_ALL = 2;
|
|
|
|
|
|
-- saved variables - amounts to undercut
|
|
|
|
local auctionator_savedvars_defaults =
|
|
{
|
|
["_5000000"] = 10000; -- amount to undercut buyouts over 500 gold
|
|
["_1000000"] = 2500;
|
|
["_200000"] = 1000;
|
|
["_50000"] = 500;
|
|
["_10000"] = 200;
|
|
["_2000"] = 100;
|
|
["_500"] = 5;
|
|
["STARTING_DISCOUNT"] = 5; -- PERCENT
|
|
};
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
local auctionator_orig_AuctionFrameTab_OnClick;
|
|
local auctionator_orig_ContainerFrameItemButton_OnClick;
|
|
local auctionator_orig_AuctionFrameAuctions_Update;
|
|
local auctionator_orig_CanShowRightUIPanel;
|
|
local auctionator_orig_ChatEdit_InsertLink;
|
|
local auctionator_orig_ChatFrame_OnEvent;
|
|
local auctionator_orig_FriendsFrame_OnEvent;
|
|
|
|
local gForceMsgAreaUpdate = true;
|
|
local gAtr_ClickAuctionSell = false;
|
|
|
|
local gOpenAllBags = AUCTIONATOR_OPEN_ALL_BAGS;
|
|
local gTimeZero;
|
|
local gTimeTightZero;
|
|
|
|
local cslots = {};
|
|
local gEmptyBScached = nil;
|
|
|
|
local gAutoSingleton = 0;
|
|
|
|
local gJustPosted_ItemName = nil; -- set to the last item posted, even after the posting so that message and icon can be displayed
|
|
local gJustPosted_ItemLink;
|
|
local gJustPosted_BuyoutPrice;
|
|
local gJustPosted_StackSize;
|
|
local gJustPosted_NumInBagsAtStart;
|
|
local gJustPosted_NumStacks;
|
|
|
|
local auctionator_pending_message = nil;
|
|
|
|
local kBagIDs = {};
|
|
|
|
local Atr_Confirm_Proc_Yes = nil;
|
|
|
|
local gStartingTime = time();
|
|
local gHentryTryAgain = nil;
|
|
local gCondensedThisSession = {};
|
|
|
|
local ITEM_HIST_NUM_LINES = 20;
|
|
|
|
local gActiveAuctions = {};
|
|
|
|
local gHlistNeedsUpdate = false;
|
|
|
|
local gSellPane;
|
|
local gMorePane;
|
|
local gActivePane;
|
|
local gShopPane;
|
|
|
|
local gCurrentPane;
|
|
|
|
local gHistoryItemList = {};
|
|
|
|
local ATR_CACT_NULL = 0;
|
|
local ATR_CACT_READY = 1;
|
|
local ATR_CACT_PROCESSING = 2;
|
|
local ATR_CACT_WAITING_ON_CANCEL_CONFIRM = 3;
|
|
|
|
|
|
local gItemPostingInProgress = false;
|
|
local gQuietWho = 0;
|
|
local gSendZoneMsgs = false;
|
|
|
|
gAtr_ptime = nil; -- a more precise timer but may not be updated very frequently
|
|
|
|
gAtr_ScanDB = nil;
|
|
gAtr_PriceHistDB = nil;
|
|
|
|
-----------------------------------------
|
|
|
|
ATR_SK_GLYPHS = "*_glyphs";
|
|
ATR_SK_GEMS_CUT = "*_gemscut";
|
|
ATR_SK_GEMS_UNCUT = "*_gemsuncut";
|
|
ATR_SK_ITEM_ENH = "*_itemenh";
|
|
ATR_SK_POT_ELIX = "*_potelix";
|
|
ATR_SK_FLASKS = "*_flasks";
|
|
ATR_SK_HERBS = "*_herbs";
|
|
|
|
-----------------------------------------
|
|
|
|
local roundPriceDown, ToTightTime, FromTightTime, monthDay;
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_RegisterEvents(self)
|
|
|
|
self:RegisterEvent("VARIABLES_LOADED");
|
|
self:RegisterEvent("ADDON_LOADED");
|
|
|
|
self:RegisterEvent("AUCTION_ITEM_LIST_UPDATE");
|
|
self:RegisterEvent("AUCTION_OWNED_LIST_UPDATE");
|
|
|
|
self:RegisterEvent("AUCTION_MULTISELL_START");
|
|
self:RegisterEvent("AUCTION_MULTISELL_UPDATE");
|
|
self:RegisterEvent("AUCTION_MULTISELL_FAILURE");
|
|
|
|
self:RegisterEvent("AUCTION_HOUSE_SHOW");
|
|
self:RegisterEvent("AUCTION_HOUSE_CLOSED");
|
|
|
|
self:RegisterEvent("NEW_AUCTION_UPDATE");
|
|
self:RegisterEvent("PLAYER_ENTERING_WORLD");
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_EventHandler()
|
|
|
|
-- zc.md (event);
|
|
|
|
if (event == "VARIABLES_LOADED") then Atr_OnLoad(); end;
|
|
if (event == "ADDON_LOADED") then Atr_OnAddonLoaded(); end;
|
|
if (event == "AUCTION_ITEM_LIST_UPDATE") then Atr_OnAuctionUpdate(); end;
|
|
if (event == "AUCTION_OWNED_LIST_UPDATE") then Atr_OnAuctionOwnedUpdate(); end;
|
|
|
|
if (event == "AUCTION_MULTISELL_START") then Atr_OnAuctionMultiSellStart(); end;
|
|
if (event == "AUCTION_MULTISELL_UPDATE") then Atr_OnAuctionMultiSellUpdate(); end;
|
|
if (event == "AUCTION_MULTISELL_FAILURE") then Atr_OnAuctionMultiSellFailure(); end;
|
|
|
|
if (event == "AUCTION_HOUSE_SHOW") then Atr_OnAuctionHouseShow(); end;
|
|
if (event == "AUCTION_HOUSE_CLOSED") then Atr_OnAuctionHouseClosed(); end;
|
|
if (event == "NEW_AUCTION_UPDATE") then Atr_OnNewAuctionUpdate(); end;
|
|
if (event == "CHAT_MSG_ADDON") then Atr_OnChatMsgAddon(); end;
|
|
if (event == "WHO_LIST_UPDATE") then Atr_OnWhoListUpdate(); end;
|
|
if (event == "PLAYER_ENTERING_WORLD") then Atr_OnPlayerEnteringWorld(); end;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetupHookFunctionsEarly ()
|
|
|
|
Atr_Hook_OnTooltipAddMoney ();
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetupHookFunctions ()
|
|
|
|
auctionator_orig_AuctionFrameTab_OnClick = AuctionFrameTab_OnClick;
|
|
AuctionFrameTab_OnClick = Atr_AuctionFrameTab_OnClick;
|
|
|
|
-- 1.12 has no OnModifiedClick: the bag button's OnClick handler gets the button and modifier state instead
|
|
auctionator_orig_ContainerFrameItemButton_OnClick = ContainerFrameItemButton_OnClick;
|
|
ContainerFrameItemButton_OnClick = Atr_ContainerFrameItemButton_OnClick;
|
|
|
|
auctionator_orig_AuctionFrameAuctions_Update = AuctionFrameAuctions_Update;
|
|
AuctionFrameAuctions_Update = Atr_AuctionFrameAuctions_Update;
|
|
|
|
auctionator_orig_ChatFrame_OnEvent = ChatFrame_OnEvent;
|
|
ChatFrame_OnEvent = auctionator_ChatFrame_OnEvent;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
local gItemLinkCache = {};
|
|
local gA2IC_prevName = "";
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_AddToItemLinkCache (itemName, itemLink)
|
|
|
|
if (itemName == gA2IC_prevName) then -- for performance reasons only
|
|
return;
|
|
end
|
|
|
|
gA2IC_prevName = itemName;
|
|
|
|
gItemLinkCache[string.lower(itemName)] = itemLink;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_GetItemLink (itemName)
|
|
if (itemName == nil or itemName == "") then
|
|
return nil;
|
|
end
|
|
|
|
local itemLink = gItemLinkCache[string.lower(itemName)];
|
|
|
|
if (itemLink == nil) then
|
|
_, itemLink = Atr_GetItemInfo (itemName);
|
|
if (itemLink) then
|
|
Atr_AddToItemLinkCache (itemName, itemLink);
|
|
end
|
|
end
|
|
|
|
return itemLink;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
local checkVerString = nil;
|
|
local versionReminderCalled = false; -- make sure we don't bug user more than once
|
|
|
|
-----------------------------------------
|
|
|
|
local function CheckVersion (verString)
|
|
|
|
if (checkVerString == nil) then
|
|
checkVerString = AuctionatorVersion;
|
|
end
|
|
|
|
local a,b,c = Atr_strsplit (".", verString);
|
|
|
|
if (tonumber(a) == nil or tonumber(b) == nil or tonumber(c) == nil) then
|
|
return false;
|
|
end
|
|
|
|
if (verString > checkVerString) then
|
|
checkVerString = verString;
|
|
return true; -- out of date
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_VersionReminder ()
|
|
if (not versionReminderCalled) then
|
|
versionReminderCalled = true;
|
|
|
|
zc.msg_atr (ZT("There is a more recent version of Auctionator: VERSION").." "..checkVerString);
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
local VREQ_sent = 0;
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SendAddon_VREQ (type, target)
|
|
|
|
VREQ_sent = time();
|
|
|
|
SendAddonMessage ("ATR", "VREQ_"..AuctionatorVersion, type, target);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnChatMsgAddon ()
|
|
|
|
local prefix = arg1;
|
|
local msg = arg2;
|
|
local distribution = arg3;
|
|
local sender = arg4;
|
|
|
|
-- local s = string.format ("%s %s |cff88ffff %s |cffffffaa %s|r", prefix, distribution, sender, msg);
|
|
-- zc.md (s);
|
|
|
|
if (arg1 == "ATR") then
|
|
|
|
if (zc.StringStartsWith (msg, "VREQ_")) then
|
|
SendAddonMessage ("ATR", "V_"..AuctionatorVersion, "WHISPER", sender);
|
|
end
|
|
|
|
if (zc.StringStartsWith (msg, "V_") and time() - VREQ_sent < 5) then
|
|
|
|
local herVerString = string.sub (msg, 3);
|
|
zc.md ("version found:", herVerString, " ", sender, " delta", time() - VREQ_sent);
|
|
local outOfDate = CheckVersion (herVerString);
|
|
if (outOfDate) then
|
|
zc.AddDeferredCall (3, "Atr_VersionReminder", nil, nil, "VR");
|
|
end
|
|
end
|
|
end
|
|
|
|
if (Atr_OnChatMsgAddon_Dev) then
|
|
Atr_OnChatMsgAddon_Dev (prefix, msg, distribution, sender);
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
local function Atr_GetAuctionatorMemString(msg)
|
|
|
|
UpdateAddOnMemoryUsage();
|
|
|
|
local mem = GetAddOnMemoryUsage("OctoAuctionator");
|
|
return string.format ("%6i KB", math.floor(mem));
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
local function Atr_SlashCmdFunction(msg)
|
|
|
|
local cmd, param1u, param2u, param3u = zc.words (msg);
|
|
|
|
if (cmd == nil or type (cmd) ~= "string") then
|
|
return;
|
|
end
|
|
|
|
cmd = cmd and string.lower(cmd) or nil;
|
|
local param1 = param1u and string.lower(param1u) or nil;
|
|
local param2 = param2u and string.lower(param2u) or nil;
|
|
local param3 = param3u and string.lower(param3u) or nil;
|
|
|
|
if (cmd == "mem") then
|
|
|
|
UpdateAddOnMemoryUsage();
|
|
|
|
for i = 1, GetNumAddOns() do
|
|
local mem = GetAddOnMemoryUsage(i);
|
|
local name = GetAddOnInfo(i);
|
|
if (mem > 0) then
|
|
local s = string.format ("%6i KB %s", math.floor(mem), name);
|
|
zc.msg_yellow (s);
|
|
end
|
|
end
|
|
|
|
elseif (cmd == "locale") then
|
|
Atr_PickLocalizationTable (param1u);
|
|
|
|
elseif (cmd == "clear") then
|
|
|
|
zc.msg_atr ("memory usage: "..Atr_GetAuctionatorMemString());
|
|
|
|
if (param1 == "fullscandb") then
|
|
gAtr_ScanDB = nil;
|
|
AUCTIONATOR_PRICE_DATABASE = nil;
|
|
Atr_InitScanDB();
|
|
zc.msg_atr (ZT("full scan database cleared"));
|
|
|
|
elseif (param1 == "posthistory") then
|
|
AUCTIONATOR_PRICING_HISTORY = {};
|
|
zc.msg_atr (ZT("pricing history cleared"));
|
|
end
|
|
|
|
collectgarbage ("collect");
|
|
|
|
zc.msg_atr ("memory usage: "..Atr_GetAuctionatorMemString());
|
|
|
|
elseif (Atr_HandleDevCommands and Atr_HandleDevCommands (cmd, param1, param2)) then
|
|
-- do nothing
|
|
else
|
|
zc.msg_atr (ZT("unrecognized command"));
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_InitScanDB()
|
|
|
|
local faction = UnitFactionGroup ("player");
|
|
|
|
if (faction == nil or GetRealmName() == nil) then -- 1.12: not known yet at VARIABLES_LOADED
|
|
if (gAtr_ScanDB == nil) then
|
|
gAtr_ScanDB = {};
|
|
end
|
|
gAtr_ScanDB_Pending = true;
|
|
return;
|
|
end
|
|
|
|
local realm_Faction = GetRealmName().."_"..faction;
|
|
|
|
if (AUCTIONATOR_PRICE_DATABASE and AUCTIONATOR_PRICE_DATABASE["__dbversion"] == nil) then -- see if we need to migrate
|
|
|
|
local temp = zc.CopyDeep (AUCTIONATOR_PRICE_DATABASE);
|
|
|
|
AUCTIONATOR_PRICE_DATABASE = {};
|
|
AUCTIONATOR_PRICE_DATABASE["__dbversion"] = 2;
|
|
|
|
AUCTIONATOR_PRICE_DATABASE[realm_Faction] = zc.CopyDeep (temp);
|
|
|
|
temp = {};
|
|
end
|
|
|
|
if (AUCTIONATOR_PRICE_DATABASE == nil) then
|
|
AUCTIONATOR_PRICE_DATABASE = {};
|
|
AUCTIONATOR_PRICE_DATABASE["__dbversion"] = 2;
|
|
end
|
|
|
|
if (AUCTIONATOR_PRICE_DATABASE[realm_Faction] == nil) then
|
|
AUCTIONATOR_PRICE_DATABASE[realm_Faction] = {};
|
|
end
|
|
|
|
local db = AUCTIONATOR_PRICE_DATABASE[realm_Faction];
|
|
|
|
if (gAtr_ScanDB_Pending and gAtr_ScanDB and gAtr_ScanDB ~= db) then -- keep prices learned before the faction was known
|
|
for a,v in pairs (gAtr_ScanDB) do
|
|
db[a] = v;
|
|
end
|
|
end
|
|
|
|
gAtr_ScanDB_Pending = nil;
|
|
gAtr_ScanDB = db;
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnLoad()
|
|
|
|
AuctionatorVersion = Atr_GetVersion();
|
|
|
|
gTimeZero = time({year=2000, month=1, day=1, hour=0});
|
|
gTimeTightZero = time({year=2008, month=8, day=1, hour=0});
|
|
|
|
local x;
|
|
for x = 0, NUM_BAG_SLOTS do
|
|
kBagIDs[x+1] = x;
|
|
end
|
|
|
|
kBagIDs[NUM_BAG_SLOTS+2] = KEYRING_CONTAINER;
|
|
|
|
AuctionatorLoaded = true;
|
|
|
|
SlashCmdList["Auctionator"] = Atr_SlashCmdFunction;
|
|
|
|
SLASH_Auctionator1 = "/auctionator";
|
|
SLASH_Auctionator2 = "/atr";
|
|
|
|
Atr_InitScanDB ();
|
|
|
|
if (AUCTIONATOR_PRICING_HISTORY == nil) then -- the old history of postings
|
|
AUCTIONATOR_PRICING_HISTORY = {};
|
|
end
|
|
|
|
if (AUCTIONATOR_TOONS == nil) then
|
|
AUCTIONATOR_TOONS = {};
|
|
end
|
|
|
|
if (AUCTIONATOR_STACKING_PREFS == nil) then
|
|
Atr_StackingPrefs_Init();
|
|
end
|
|
|
|
|
|
local playerName = UnitName("player");
|
|
|
|
if (playerName and not AUCTIONATOR_TOONS[playerName]) then
|
|
AUCTIONATOR_TOONS[playerName] = {};
|
|
AUCTIONATOR_TOONS[playerName].firstSeen = time();
|
|
AUCTIONATOR_TOONS[playerName].firstVersion = AuctionatorVersion;
|
|
end
|
|
|
|
-- (no UnitGUID on 1.12)
|
|
|
|
if (AUCTIONATOR_SCAN_MINLEVEL == nil) then
|
|
AUCTIONATOR_SCAN_MINLEVEL = 1; -- poor (all) items
|
|
end
|
|
|
|
if (AUCTIONATOR_SHOW_TIPS == 0) then -- migrate old option to new ones
|
|
AUCTIONATOR_V_TIPS = 0;
|
|
AUCTIONATOR_A_TIPS = 0;
|
|
AUCTIONATOR_D_TIPS = 0;
|
|
|
|
AUCTIONATOR_SHOW_TIPS = 2;
|
|
end
|
|
|
|
if (AUCTIONATOR_OPEN_FIRST < 2) then -- set to 2 to indicate it's been migrated
|
|
if (AUCTIONATOR_OPEN_FIRST == 1) then AUCTIONATOR_DEFTAB = 1;
|
|
elseif (AUCTIONATOR_OPEN_BUY == 1) then AUCTIONATOR_DEFTAB = 2;
|
|
else AUCTIONATOR_DEFTAB = 0; end;
|
|
|
|
AUCTIONATOR_OPEN_FIRST = 2;
|
|
end
|
|
|
|
|
|
Atr_SetupHookFunctionsEarly();
|
|
|
|
------------------
|
|
|
|
CreateFrame( "GameTooltip", "AtrScanningTooltip", nil, "GameTooltipTemplate" );
|
|
AtrScanningTooltip:SetOwner( WorldFrame, "ANCHOR_NONE" );
|
|
|
|
------------------
|
|
|
|
Atr_InitDETable();
|
|
|
|
if ( IsAddOnLoaded("Blizzard_AuctionUI") ) then -- need this for AH_QuickSearch since that mod forces Blizzard_AuctionUI to load at a startup
|
|
Atr_Init();
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
local gPrevTime = 0;
|
|
|
|
function Atr_OnAddonLoaded()
|
|
|
|
local addonName = arg1;
|
|
|
|
if (zc.StringSame (addonName, "blizzard_auctionui")) then
|
|
Atr_Init();
|
|
end
|
|
|
|
if (zc.StringSame (addonName, "lilsparkysWorkshop")) then
|
|
|
|
local LSW_version = GetAddOnMetadata("lilsparkysWorkshop", "Version");
|
|
|
|
if (LSW_version and (LSW_version == "0.72" or LSW_version == "0.90" or LSW_version == "0.91")) then
|
|
|
|
if (LSW_itemPrice) then
|
|
zc.msg ("** |cff00ffff"..ZT("Auctionator provided an auction module to LilSparky's Workshop."), 0, 1, 0);
|
|
zc.msg ("** |cff00ffff"..ZT("Ignore any ERROR message to the contrary below."), 0, 1, 0);
|
|
LSW_itemPrice = Atr_LSW_itemPriceGetAuctionBuyout;
|
|
end
|
|
end
|
|
end
|
|
|
|
Atr_Check_For_Conflicts (addonName);
|
|
|
|
local now = time();
|
|
|
|
-- zc.md (addonName.." time: "..now - gStartingTime);
|
|
|
|
gPrevTime = now;
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnPlayerEnteringWorld()
|
|
|
|
if (gAtr_ScanDB_Pending or gAtr_ScanDB == nil) then
|
|
Atr_InitScanDB();
|
|
end
|
|
|
|
Atr_InitOptionsPanels();
|
|
|
|
-- Atr_MakeOptionsFrameOpaque();
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_LSW_itemPriceGetAuctionBuyout(link)
|
|
|
|
sellPrice = Atr_GetAuctionBuyout(link)
|
|
if sellPrice then
|
|
return sellPrice, false
|
|
else
|
|
return 0, true
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Init()
|
|
|
|
if (AuctionatorInited) then
|
|
return;
|
|
end
|
|
|
|
-- zc.msg("Auctionator Initialized");
|
|
|
|
AuctionatorInited = true;
|
|
|
|
-- in case Atr_OnLoad was cut short
|
|
if (AUCTIONATOR_PRICING_HISTORY == nil) then AUCTIONATOR_PRICING_HISTORY = {}; end
|
|
if (AUCTIONATOR_TOONS == nil) then AUCTIONATOR_TOONS = {}; end
|
|
if (AUCTIONATOR_STACKING_PREFS == nil) then Atr_StackingPrefs_Init(); end
|
|
if (AUCTIONATOR_SCAN_MINLEVEL == nil) then AUCTIONATOR_SCAN_MINLEVEL = 1; end
|
|
if (gAtr_ScanDB_Pending or gAtr_ScanDB == nil) then
|
|
Atr_InitScanDB();
|
|
end
|
|
|
|
if (AUCTIONATOR_SAVEDVARS == nil) then
|
|
Atr_ResetSavedVars();
|
|
end
|
|
|
|
|
|
if (AUCTIONATOR_SHOPPING_LISTS == nil) then
|
|
AUCTIONATOR_SHOPPING_LISTS = {};
|
|
Atr_SList.create (ZT("Recent Searches"), true);
|
|
|
|
if (zc.IsEnglishLocale()) then
|
|
local slist = Atr_SList.create ("Sample Shopping List #1");
|
|
slist:AddItem ("Greater Cosmic Essence");
|
|
slist:AddItem ("Infinite Dust");
|
|
slist:AddItem ("Dream Shard");
|
|
slist:AddItem ("Abyss Crystal");
|
|
end
|
|
else
|
|
Atr_ShoppingListsInit();
|
|
end
|
|
|
|
gShopPane = Atr_AddSellTab (ZT("Buy"), BUY_TAB);
|
|
gSellPane = Atr_AddSellTab (ZT("Sell"), SELL_TAB);
|
|
gMorePane = Atr_AddSellTab (ZT("More").."...", MORE_TAB);
|
|
|
|
Atr_AddMainPanel ();
|
|
|
|
Atr_SetupHookFunctions ();
|
|
|
|
recommendElements[1] = getglobal ("Atr_Recommend_Text");
|
|
recommendElements[2] = getglobal ("Atr_RecommendPerItem_Text");
|
|
recommendElements[3] = getglobal ("Atr_RecommendPerItem_Price");
|
|
recommendElements[4] = getglobal ("Atr_RecommendPerStack_Text");
|
|
recommendElements[5] = getglobal ("Atr_RecommendPerStack_Price");
|
|
recommendElements[6] = getglobal ("Atr_Recommend_Basis_Text");
|
|
recommendElements[7] = getglobal ("Atr_RecommendItem_Tex");
|
|
|
|
-- create the lines that appear in the item history scroll pane
|
|
|
|
local line, n;
|
|
|
|
for n = 1, ITEM_HIST_NUM_LINES do
|
|
local y = -5 - ((n-1)*16);
|
|
line = CreateFrame("BUTTON", "AuctionatorHEntry"..n, Atr_Hlist, "Atr_HEntryTemplate");
|
|
line:SetPoint("TOPLEFT", 0, y);
|
|
end
|
|
|
|
Atr_ShowHide_StartingPrice();
|
|
|
|
Atr_LocalizeFrames();
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowHide_StartingPrice()
|
|
|
|
if (AUCTIONATOR_SHOW_ST_PRICE == 1) then
|
|
Atr_StartingPriceText:Show();
|
|
Atr_StartingPrice:Show();
|
|
Atr_StartingPriceDiscountText:Hide();
|
|
Atr_Duration_Text:SetPoint ("TOPLEFT", 10, -307);
|
|
else
|
|
Atr_StartingPriceText:Hide();
|
|
Atr_StartingPrice:Hide();
|
|
Atr_StartingPriceDiscountText:Show();
|
|
Atr_Duration_Text:SetPoint ("TOPLEFT", 10, -304);
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_GetSellItemInfo ()
|
|
|
|
local auctionItemName, auctionTexture, auctionCount = GetAuctionSellItemInfo();
|
|
|
|
if (auctionItemName == nil) then
|
|
auctionItemName = "";
|
|
auctionCount = 0;
|
|
end
|
|
|
|
local auctionItemLink = nil;
|
|
|
|
if (auctionItemName ~= "") then
|
|
-- this server returns the item link as the 8th value; otherwise fall back to what we have seen
|
|
auctionItemLink = Atr_SellSlotLink();
|
|
|
|
if (auctionItemLink == nil) then
|
|
return "",0,nil;
|
|
else
|
|
Atr_AddToItemLinkCache (auctionItemName, auctionItemLink);
|
|
end
|
|
|
|
end
|
|
|
|
return auctionItemName, auctionCount, auctionItemLink;
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ResetSavedVars ()
|
|
AUCTIONATOR_SAVEDVARS = zc.CopyDeep (auctionator_savedvars_defaults);
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- don't reference these directly; use the function below instead
|
|
|
|
local _AUCTIONATOR_SELL_TAB_INDEX = 0;
|
|
local _AUCTIONATOR_MORE_TAB_INDEX = 0;
|
|
local _AUCTIONATOR_BUY_TAB_INDEX = 0;
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function Atr_FindTabIndex (whichTab)
|
|
|
|
if (_AUCTIONATOR_SELL_TAB_INDEX == 0) then
|
|
|
|
local i = 4;
|
|
while (true) do
|
|
local tab = getglobal('AuctionFrameTab'..i);
|
|
if (tab == nil) then
|
|
break;
|
|
end
|
|
|
|
if (tab.auctionatorTab) then
|
|
if (tab.auctionatorTab == SELL_TAB) then _AUCTIONATOR_SELL_TAB_INDEX = i; end;
|
|
if (tab.auctionatorTab == MORE_TAB) then _AUCTIONATOR_MORE_TAB_INDEX = i; end;
|
|
if (tab.auctionatorTab == BUY_TAB) then _AUCTIONATOR_BUY_TAB_INDEX = i; end;
|
|
end
|
|
|
|
i = i + 1;
|
|
end
|
|
end
|
|
|
|
if (whichTab == SELL_TAB) then return _AUCTIONATOR_SELL_TAB_INDEX ; end;
|
|
if (whichTab == MORE_TAB) then return _AUCTIONATOR_MORE_TAB_INDEX; end;
|
|
if (whichTab == BUY_TAB) then return _AUCTIONATOR_BUY_TAB_INDEX; end;
|
|
|
|
return 0;
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
|
|
function Atr_AuctionFrameTab_OnClick (index)
|
|
|
|
if ( index == nil or type(index) == "string") then
|
|
index = this:GetID();
|
|
end
|
|
|
|
getglobal("Atr_Main_Panel"):Hide();
|
|
|
|
gBuyState = ATR_BUY_NULL; -- just in case
|
|
gItemPostingInProgress = false; -- just in case
|
|
|
|
auctionator_orig_AuctionFrameTab_OnClick (index);
|
|
|
|
if (not Atr_IsAuctionatorTab(index)) then
|
|
gForceMsgAreaUpdate = true;
|
|
Atr_HideAllDialogs();
|
|
AuctionFrameMoneyFrame:Show();
|
|
|
|
if (AP_Bid_MoneyFrame) then -- for the addon 'Auction Profit'
|
|
if (AP_ShowBid) then AP_ShowHide_Bid_Button(1); end;
|
|
if (AP_ShowBO) then AP_ShowHide_BO_Button(1); end;
|
|
end
|
|
|
|
|
|
elseif (Atr_IsAuctionatorTab(index)) then
|
|
|
|
AuctionFrameAuctions:Hide();
|
|
AuctionFrameBrowse:Hide();
|
|
AuctionFrameBid:Hide();
|
|
PlaySound("igCharacterInfoTab");
|
|
|
|
PanelTemplates_SetTab(AuctionFrame, index);
|
|
|
|
-- AuctionFrameTopLeft:SetTexture ("Interface\\AuctionFrame\\UI-AuctionFrame-Auction-TopLeft");
|
|
AuctionFrameTopLeft:SetTexture ("Interface\\AddOns\\OctoAuctionator\\Images\\Atr_topleft.tga");
|
|
AuctionFrameBotLeft:SetTexture ("Interface\\AddOns\\OctoAuctionator\\Images\\Atr_botleft.tga");
|
|
AuctionFrameTop:SetTexture ("Interface\\AddOns\\OctoAuctionator\\Images\\Atr_top.tga");
|
|
AuctionFrameTopRight:SetTexture ("Interface\\AddOns\\OctoAuctionator\\Images\\Atr_topright.tga");
|
|
AuctionFrameBot:SetTexture ("Interface\\AddOns\\OctoAuctionator\\Images\\Atr_bot.tga");
|
|
AuctionFrameBotRight:SetTexture ("Interface\\AddOns\\OctoAuctionator\\Images\\Atr_botright.tga");
|
|
|
|
if (index == Atr_FindTabIndex(SELL_TAB)) then gCurrentPane = gSellPane; end;
|
|
if (index == Atr_FindTabIndex(BUY_TAB)) then gCurrentPane = gShopPane; end;
|
|
if (index == Atr_FindTabIndex(MORE_TAB)) then gCurrentPane = gMorePane; end;
|
|
|
|
if (index == Atr_FindTabIndex(SELL_TAB)) then AuctionatorTitle:SetText ("Auctionator - "..ZT("Sell")); end;
|
|
if (index == Atr_FindTabIndex(BUY_TAB)) then AuctionatorTitle:SetText ("Auctionator - "..ZT("Buy")); end;
|
|
if (index == Atr_FindTabIndex(MORE_TAB)) then AuctionatorTitle:SetText ("Auctionator - "..ZT("More").."..."); end;
|
|
|
|
Atr_ClearHlist();
|
|
Atr_SellControls:Hide();
|
|
Atr_Hlist:Hide();
|
|
Atr_Hlist_ScrollFrame:Hide();
|
|
Atr_Search_Box:Hide();
|
|
Atr_Search_Button:Hide();
|
|
Atr_AddToSListButton:Hide();
|
|
Atr_RemFromSListButton:Hide();
|
|
Atr_NewSListButton:Hide();
|
|
Atr_DelSListButton:Hide();
|
|
Atr_DropDown1:Hide();
|
|
Atr_DropDownSL:Hide();
|
|
Atr_CheckActiveButton:Hide();
|
|
Atr_Back_Button:Hide()
|
|
|
|
AuctionFrameMoneyFrame:Hide();
|
|
|
|
if (index == Atr_FindTabIndex(SELL_TAB)) then
|
|
Atr_SellControls:Show();
|
|
else
|
|
Atr_Hlist:Show();
|
|
Atr_Hlist_ScrollFrame:Show();
|
|
if (gJustPosted_ItemName) then
|
|
gJustPosted_ItemName = nil;
|
|
gSellPane:ClearSearch ();
|
|
end
|
|
end
|
|
|
|
|
|
if (index == Atr_FindTabIndex(MORE_TAB)) then
|
|
FauxScrollFrame_SetOffset (Atr_Hlist_ScrollFrame, gCurrentPane.hlistScrollOffset);
|
|
Atr_DisplayHlist();
|
|
Atr_DropDown1:Show();
|
|
|
|
if (UIDropDownMenu_GetSelectedValue(Atr_DropDown1) == MODE_LIST_ACTIVE) then
|
|
Atr_CheckActiveButton:Show();
|
|
end
|
|
end
|
|
|
|
|
|
if (index == Atr_FindTabIndex(BUY_TAB)) then
|
|
Atr_Search_Box:Show();
|
|
Atr_Search_Button:Show();
|
|
AuctionFrameMoneyFrame:Show();
|
|
Atr_BuildGlobalHistoryList(true);
|
|
Atr_AddToSListButton:Show();
|
|
Atr_RemFromSListButton:Show();
|
|
Atr_NewSListButton:Show();
|
|
Atr_DelSListButton:Show();
|
|
Atr_DropDownSL:Show();
|
|
Atr_Hlist:SetHeight (252);
|
|
Atr_Hlist_ScrollFrame:SetHeight (252);
|
|
else
|
|
Atr_Hlist:SetHeight (335);
|
|
Atr_Hlist_ScrollFrame:SetHeight (335);
|
|
end
|
|
|
|
if (index == Atr_FindTabIndex(BUY_TAB) or index == Atr_FindTabIndex(SELL_TAB)) then
|
|
Atr_Buy1_Button:Show();
|
|
Atr_Buy1_Button:Disable();
|
|
end
|
|
|
|
Atr_HideElems (recommendElements);
|
|
|
|
getglobal("Atr_Main_Panel"):Show();
|
|
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
|
|
if (gOpenAllBags == 1) then
|
|
OpenAllBags(true);
|
|
gOpenAllBags = 0;
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_StackSize ()
|
|
return Atr_Batch_Stacksize:GetNumber();
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetStackSize (n)
|
|
return Atr_Batch_Stacksize:SetText(n);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SelectPane (whichTab)
|
|
|
|
local index = Atr_FindTabIndex(whichTab);
|
|
local tab = getglobal('AuctionFrameTab'..index);
|
|
|
|
Atr_AuctionFrameTab_OnClick (index);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_IsModeCreateAuction ()
|
|
return (Atr_IsTabSelected(SELL_TAB));
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_IsModeBuy ()
|
|
return (Atr_IsTabSelected(BUY_TAB));
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_IsModeActiveAuctions ()
|
|
return (Atr_IsTabSelected(MORE_TAB) and UIDropDownMenu_GetSelectedValue(Atr_DropDown1) == MODE_LIST_ACTIVE);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ClickAuctionSellItemButton (self, button)
|
|
|
|
gAtr_ClickAuctionSell = true;
|
|
ClickAuctionSellItemButton();
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnDropItem (self, button)
|
|
|
|
if (not CursorHasItem()) then
|
|
return;
|
|
end
|
|
|
|
if (not Atr_IsTabSelected(SELL_TAB)) then
|
|
Atr_SelectPane (SELL_TAB); -- then fall through
|
|
end
|
|
|
|
Atr_ClickAuctionSellItemButton (self, button);
|
|
ClearCursor();
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SellItemButton_OnClick (self, button)
|
|
|
|
Atr_ClickAuctionSellItemButton (self, button);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SellItemButton_OnEvent (self, event)
|
|
|
|
if ( event == "NEW_AUCTION_UPDATE") then
|
|
local name, texture, count, quality, canUse, price = GetAuctionSellItemInfo();
|
|
Atr_SellControls_Tex:SetNormalTexture(texture);
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
local function Atr_LoadContainerItemToSellPane()
|
|
|
|
local bagID = this:GetParent():GetID();
|
|
local slotID = this:GetID();
|
|
|
|
if (not Atr_IsTabSelected(SELL_TAB)) then
|
|
Atr_SelectPane (SELL_TAB);
|
|
end
|
|
|
|
if (IsControlKeyDown()) then
|
|
gAutoSingleton = time();
|
|
end
|
|
|
|
PickupContainerItem(bagID, slotID);
|
|
|
|
if (CursorHasItem()) then
|
|
Atr_ClearAll();
|
|
Atr_ClickAuctionSellItemButton ();
|
|
ClearCursor();
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ContainerFrameItemButton_OnClick (button, ignoreModifiers)
|
|
|
|
if (button == "LeftButton" and AUCTIONATOR_ENABLE_ALT ~= 0 and AuctionFrame and AuctionFrame:IsShown() and IsAltKeyDown() and not CursorHasItem()) then
|
|
|
|
Atr_LoadContainerItemToSellPane();
|
|
return;
|
|
end
|
|
|
|
return auctionator_orig_ContainerFrameItemButton_OnClick (button, ignoreModifiers);
|
|
end
|
|
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CreateAuction_OnClick ()
|
|
|
|
gJustPosted_ItemName = gCurrentPane.activeScan.itemName;
|
|
gJustPosted_ItemLink = gCurrentPane.activeScan.itemLink;
|
|
gJustPosted_BuyoutPrice = MoneyInputFrame_GetCopper(Atr_StackPrice);
|
|
gJustPosted_StackSize = Atr_StackSize();
|
|
gJustPosted_NumInBagsAtStart = Atr_GetNumItemInBags(gJustPosted_ItemName);
|
|
gJustPosted_NumStacks = Atr_Batch_NumAuctions:GetNumber();
|
|
|
|
local duration = UIDropDownMenu_GetSelectedValue(Atr_Duration);
|
|
local stackStartingPrice = MoneyInputFrame_GetCopper(Atr_StartingPrice);
|
|
local stackBuyoutPrice = MoneyInputFrame_GetCopper(Atr_StackPrice);
|
|
|
|
if (gJustPosted_StackSize == 1 and gCurrentPane.fullStackSize > 1) then
|
|
|
|
local scan = gCurrentPane.activeScan;
|
|
|
|
if (scan and scan.numYourSingletons + gJustPosted_NumStacks > 40) then
|
|
local s = ZT("You may have at most 40 single-stack (x1)\nauctions posted for this item.\n\nYou already have %d such auctions and\nyou are trying to post %d more.");
|
|
Atr_Error_Display (string.format (s, scan.numYourSingletons, gJustPosted_NumStacks));
|
|
return;
|
|
end
|
|
end
|
|
|
|
Atr_Memorize_Stacking_If();
|
|
|
|
Atr_StartAuction (stackStartingPrice, stackBuyoutPrice, duration, gJustPosted_StackSize, gJustPosted_NumStacks);
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
local gMS_stacksPrev;
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnAuctionMultiSellStart()
|
|
|
|
gMS_stacksPrev = 0;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnAuctionMultiSellUpdate()
|
|
local stacksSoFar = arg1;
|
|
local stacksTotal = arg2;
|
|
|
|
local delta = stacksSoFar - gMS_stacksPrev;
|
|
|
|
--zc.md ("stacksSoFar: ", stacksSoFar, "stacksTotal: ", stacksTotal, "delta: ", delta);
|
|
|
|
gMS_stacksPrev = stacksSoFar;
|
|
|
|
Atr_AddToScan (gJustPosted_ItemName, gJustPosted_StackSize, gJustPosted_BuyoutPrice, delta);
|
|
|
|
if (stacksSoFar == stacksTotal) then
|
|
Atr_LogMsg (gJustPosted_ItemLink, gJustPosted_StackSize, gJustPosted_BuyoutPrice, stacksTotal);
|
|
Atr_AddHistoricalPrice (gJustPosted_ItemName, gJustPosted_BuyoutPrice / gJustPosted_StackSize, gJustPosted_StackSize, gJustPosted_ItemLink);
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnAuctionMultiSellFailure()
|
|
|
|
-- add one more. no good reason other than it just seems to work
|
|
Atr_AddToScan (gJustPosted_ItemName, gJustPosted_StackSize, gJustPosted_BuyoutPrice, 1);
|
|
|
|
Atr_LogMsg (gJustPosted_ItemLink, gJustPosted_StackSize, gJustPosted_BuyoutPrice, gMS_stacksPrev + 1);
|
|
Atr_AddHistoricalPrice (gJustPosted_ItemName, gJustPosted_BuyoutPrice / gJustPosted_StackSize, gJustPosted_StackSize, gJustPosted_ItemLink);
|
|
|
|
if (gCurrentPane.activeScan) then
|
|
gCurrentPane.activeScan.whenScanned = 0;
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_AuctionFrameAuctions_Update()
|
|
-- Vanilla AuctionUI expects this field to be initialized.
|
|
if AuctionFrameAuctions and AuctionFrameAuctions.page == nil then
|
|
AuctionFrameAuctions.page = 0
|
|
end
|
|
|
|
auctionator_orig_AuctionFrameAuctions_Update()
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_LogMsg (itemlink, itemcount, price, numstacks)
|
|
|
|
local logmsg = string.format (ZT("Auction created for %s"), itemlink);
|
|
|
|
if (numstacks > 1) then
|
|
logmsg = string.format (ZT("%d auctions created for %s"), numstacks, itemlink);
|
|
end
|
|
|
|
|
|
if (itemcount > 1) then
|
|
logmsg = logmsg.."|cff00ddddx"..itemcount.."|r";
|
|
end
|
|
|
|
logmsg = logmsg.." "..zc.priceToString(price);
|
|
|
|
if (numstacks > 1 and itemcount > 1) then
|
|
logmsg = logmsg.." per stack";
|
|
end
|
|
|
|
|
|
zc.msg_yellow (logmsg);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnAuctionOwnedUpdate ()
|
|
|
|
gItemPostingInProgress = false;
|
|
|
|
if (Atr_IsModeActiveAuctions()) then
|
|
gHlistNeedsUpdate = true;
|
|
end
|
|
|
|
if (not Atr_IsTabSelected()) then
|
|
Atr_ClearScanCache(); -- if not our tab, we have no idea what happened so must flush all caches
|
|
return;
|
|
end;
|
|
|
|
gActiveAuctions = {}; -- always flush this cache
|
|
|
|
if (gJustPosted_ItemName) then
|
|
|
|
if (gJustPosted_NumStacks == 1) then
|
|
Atr_LogMsg (gJustPosted_ItemLink, gJustPosted_StackSize, gJustPosted_BuyoutPrice, 1);
|
|
Atr_AddHistoricalPrice (gJustPosted_ItemName, gJustPosted_BuyoutPrice / gJustPosted_StackSize, gJustPosted_StackSize, gJustPosted_ItemLink);
|
|
Atr_AddToScan (gJustPosted_ItemName, gJustPosted_StackSize, gJustPosted_BuyoutPrice, 1);
|
|
end
|
|
end
|
|
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ResetDuration()
|
|
|
|
if (AUCTIONATOR_DEF_DURATION == "S") then UIDropDownMenu_SetSelectedValue(Atr_Duration, 1); end;
|
|
if (AUCTIONATOR_DEF_DURATION == "M") then UIDropDownMenu_SetSelectedValue(Atr_Duration, 2); end;
|
|
if (AUCTIONATOR_DEF_DURATION == "L") then UIDropDownMenu_SetSelectedValue(Atr_Duration, 3); end;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_AddToScan (itemName, stackSize, buyoutPrice, numAuctions)
|
|
|
|
local scan = Atr_FindScan (itemName);
|
|
|
|
scan:AddScanItem (itemName, stackSize, buyoutPrice, UnitName("player"), numAuctions);
|
|
|
|
scan:CondenseAndSort ();
|
|
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function AuctionatorSubtractFromScan (itemName, stackSize, buyoutPrice, howMany)
|
|
|
|
if (howMany == nil) then
|
|
howMany = 1;
|
|
end
|
|
|
|
local scan = Atr_FindScan (itemName);
|
|
|
|
local x;
|
|
for x = 1, howMany do
|
|
scan:SubtractScanItem (itemName, stackSize, buyoutPrice);
|
|
end
|
|
|
|
scan:CondenseAndSort ();
|
|
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function auctionator_ChatFrame_OnEvent(event)
|
|
|
|
if (event == "CHAT_MSG_SYSTEM") then
|
|
if (arg1 == ERR_AUCTION_STARTED) then -- absorb the Auction Created message
|
|
return;
|
|
end
|
|
if (arg1 == ERR_AUCTION_REMOVED) then -- absorb the Auction Cancelled message
|
|
return;
|
|
end
|
|
end
|
|
|
|
return auctionator_orig_ChatFrame_OnEvent (event);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_AddMainPanel ()
|
|
|
|
local frame = CreateFrame("FRAME", "Atr_Main_Panel", AuctionFrame, "Atr_Sell_Template");
|
|
frame:Hide();
|
|
|
|
UIDropDownMenu_SetWidth (150, Atr_DropDownSL);
|
|
UIDropDownMenu_JustifyText ("CENTER", Atr_DropDownSL);
|
|
|
|
UIDropDownMenu_SetWidth (95, Atr_Duration);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_AddSellTab (tabtext, whichTab)
|
|
|
|
local n = AuctionFrame.numTabs+1;
|
|
|
|
local framename = "AuctionFrameTab"..n;
|
|
|
|
local frame = CreateFrame("Button", framename, AuctionFrame, "AuctionTabTemplate");
|
|
|
|
frame:SetID(n);
|
|
frame:SetText(tabtext);
|
|
|
|
local orange = getglobal("AtrFontOrange");
|
|
if (orange and frame.SetTextFontObject) then
|
|
frame:SetTextFontObject(orange);
|
|
end
|
|
|
|
frame.auctionatorTab = whichTab;
|
|
|
|
frame:SetPoint("LEFT", getglobal("AuctionFrameTab"..n-1), "RIGHT", -8, 0);
|
|
|
|
pcall (PanelTemplates_TabResize, 0, frame);
|
|
PanelTemplates_SetNumTabs (AuctionFrame, n);
|
|
PanelTemplates_EnableTab (AuctionFrame, n);
|
|
|
|
return AtrPane.create (whichTab);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_HideElems (tt)
|
|
|
|
if (not tt) then
|
|
return;
|
|
end
|
|
|
|
for i,x in ipairs(tt) do
|
|
x:Hide();
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowElems (tt)
|
|
|
|
for i,x in ipairs(tt) do
|
|
x:Show();
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnAuctionUpdate ()
|
|
|
|
if (gAtr_FullScanState == ATR_FS_STARTED) then
|
|
Atr_FullScanAnalyze();
|
|
return;
|
|
end
|
|
|
|
if (not Atr_IsTabSelected()) then
|
|
Atr_ClearScanCache(); -- if not our tab, we have no idea what happened so must flush all caches
|
|
return;
|
|
end;
|
|
|
|
if (Atr_Buy_OnAuctionUpdate()) then
|
|
return;
|
|
end
|
|
|
|
if (gCurrentPane.activeSearch and gCurrentPane.activeSearch.processing_state == KM_POSTQUERY) then
|
|
|
|
local search = gCurrentPane.activeSearch;
|
|
|
|
if (Atr_PageHasMissingNames()) then -- 1.12: names of items not seen yet arrive a moment later
|
|
if (search.namesWaitStart == nil) then
|
|
search.namesWaitStart = GetTime();
|
|
end
|
|
if (GetTime() - search.namesWaitStart < 2) then
|
|
return;
|
|
end
|
|
end
|
|
|
|
search.namesWaitStart = nil;
|
|
|
|
local isDup = gCurrentPane.activeSearch:CheckForDuplicatePage ();
|
|
|
|
if (not isDup) then
|
|
|
|
local done = gCurrentPane.activeSearch:AnalyzeResultsPage();
|
|
|
|
if (done) then
|
|
gCurrentPane.activeSearch:Finish();
|
|
Atr_OnSearchComplete ();
|
|
else
|
|
gCurrentPane.activeSearch:UpdatePartial();
|
|
Atr_OnSearchPartial ();
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_PickKey (scan, idx)
|
|
|
|
if (scan and idx and scan.sortedData and scan.sortedData[idx]) then
|
|
local d = scan.sortedData[idx];
|
|
return d.stackSize.."_"..d.buyoutPrice.."_"..tostring(d.yours).."_"..tostring(d.type);
|
|
end
|
|
|
|
return nil;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_FindPickKey (scan, key)
|
|
|
|
if (scan and key and scan.sortedData) then
|
|
local i;
|
|
for i = 1, getn(scan.sortedData) do
|
|
if (Atr_PickKey (scan, i) == key) then
|
|
return i;
|
|
end
|
|
end
|
|
end
|
|
|
|
return nil;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnSearchPartial ()
|
|
|
|
local search = gCurrentPane.activeSearch;
|
|
|
|
if (gCurrentPane:IsScanEmpty() and search:NumScans() == 1) then -- the item asked for: show its auctions right away
|
|
local scn = search:GetFirstScan();
|
|
if (scn and zc.StringSame (scn.itemName, search.searchText)) then
|
|
gCurrentPane.activeScan = scn;
|
|
end
|
|
end
|
|
|
|
if (gCurrentPane.pickKey) then
|
|
gCurrentPane.currIndex = Atr_FindPickKey (gCurrentPane.activeScan, gCurrentPane.pickKey);
|
|
if (gCurrentPane.currIndex == nil) then
|
|
gCurrentPane.pickKey = nil;
|
|
end
|
|
end
|
|
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SearchProgressText ()
|
|
|
|
local search = gCurrentPane.activeSearch;
|
|
local page = search.current_page or 0;
|
|
|
|
if (page < 1) then
|
|
page = 1;
|
|
end
|
|
|
|
if (search.totalPages and search.totalPages > 1) then
|
|
if (page > search.totalPages) then
|
|
page = search.totalPages;
|
|
end
|
|
return string.format (ZT("Scanning auctions: page %d"), page).." / "..search.totalPages;
|
|
end
|
|
|
|
return string.format (ZT("Scanning auctions: page %d"), page);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnSearchComplete ()
|
|
|
|
gCurrentPane.sortedHist = nil;
|
|
|
|
local count = gCurrentPane.activeSearch:NumScans();
|
|
if (count == 1) then
|
|
gCurrentPane.activeScan = gCurrentPane.activeSearch:GetFirstScan();
|
|
end
|
|
|
|
if (Atr_IsModeCreateAuction()) then
|
|
|
|
gCurrentPane:SetToShowCurrent();
|
|
|
|
if (getn(gCurrentPane.activeScan.scanData) == 0) then
|
|
gCurrentPane.hints = Atr_BuildHints (gCurrentPane.activeScan.itemName);
|
|
if (getn(gCurrentPane.hints) > 0) then
|
|
gCurrentPane:SetToShowHints();
|
|
gCurrentPane.hintsIndex = 1;
|
|
end
|
|
|
|
end
|
|
|
|
if (gCurrentPane:ShowCurrent()) then
|
|
Atr_FindBestCurrentAuction ();
|
|
end
|
|
|
|
Atr_UpdateRecommendation(true);
|
|
else
|
|
if (Atr_IsModeActiveAuctions()) then
|
|
Atr_DisplayHlist();
|
|
end
|
|
|
|
Atr_FindBestCurrentAuction ();
|
|
end
|
|
|
|
if (Atr_IsModeBuy()) then
|
|
Atr_Shop_OnFinishScan ();
|
|
end
|
|
|
|
Atr_CheckingActive_OnSearchComplete();
|
|
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ClearTop ()
|
|
Atr_HideElems (recommendElements);
|
|
|
|
if (AuctionatorMessageFrame) then
|
|
AuctionatorMessageFrame:Hide();
|
|
AuctionatorMessage2Frame:Hide();
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ClearList ()
|
|
|
|
Atr_Col1_Heading:Hide();
|
|
Atr_Col3_Heading:Hide();
|
|
Atr_Col4_Heading:Hide();
|
|
|
|
Atr_Col1_Heading_Button:Hide();
|
|
Atr_Col3_Heading_Button:Hide();
|
|
|
|
local line; -- 1 through 12 of our window to scroll
|
|
|
|
FauxScrollFrame_Update (AuctionatorScrollFrame, 0, 12, 16);
|
|
|
|
for line = 1,12 do
|
|
local lineEntry = getglobal ("AuctionatorEntry"..line);
|
|
lineEntry:Hide();
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ClearAll ()
|
|
|
|
if (AuctionatorMessageFrame) then -- just to make sure xml has been loaded
|
|
|
|
Atr_ClearTop();
|
|
Atr_ClearList();
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetMessage (msg)
|
|
Atr_HideElems (recommendElements);
|
|
|
|
if (gCurrentPane.activeSearch.searchText) then
|
|
|
|
Atr_ShowItemNameAndTexture (gCurrentPane.activeSearch.searchText);
|
|
|
|
AuctionatorMessage2Frame:SetText (msg);
|
|
AuctionatorMessage2Frame:Show();
|
|
|
|
else
|
|
AuctionatorMessageFrame:SetText (msg);
|
|
AuctionatorMessageFrame:Show();
|
|
AuctionatorMessage2Frame:Hide();
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowItemNameAndTexture(itemName)
|
|
|
|
AuctionatorMessageFrame:Hide();
|
|
AuctionatorMessage2Frame:Hide();
|
|
|
|
local scn = gCurrentPane.activeScan;
|
|
|
|
local color = "";
|
|
if (scn and not scn:IsNil()) then
|
|
color = "|cff"..zc.RGBtoHEX (scn.itemTextColor[1], scn.itemTextColor[2], scn.itemTextColor[3]);
|
|
itemName = scn.itemName;
|
|
end
|
|
|
|
Atr_Recommend_Text:Show ();
|
|
Atr_Recommend_Text:SetText (color..itemName);
|
|
|
|
Atr_SetTextureButton ("Atr_RecommendItem_Tex", 1, gCurrentPane.activeScan.itemLink);
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SortHistoryData (x, y)
|
|
|
|
return x.when > y.when;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function BuildHtag (type, y, m, d)
|
|
|
|
local t = time({year=y, month=m, day=d, hour=0});
|
|
|
|
return tostring (ToTightTime(t))..":"..type;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function ParseHtag (tag)
|
|
local when, type = Atr_strsplit (":", tag);
|
|
|
|
if (type == nil) then
|
|
type = "hx";
|
|
end
|
|
|
|
when = FromTightTime (tonumber (when));
|
|
|
|
return when, type;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function ParseHist (tag, hist)
|
|
|
|
local when, type = ParseHtag(tag);
|
|
|
|
local price, count = Atr_strsplit (":", hist);
|
|
|
|
price = tonumber (price);
|
|
|
|
local stacksize, numauctions;
|
|
|
|
if (type == "hx") then
|
|
stacksize = tonumber (count);
|
|
numauctions = 1;
|
|
else
|
|
stacksize = 0;
|
|
numauctions = tonumber (count);
|
|
end
|
|
|
|
return when, type, price, stacksize, numauctions;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function CalcAbsTimes (when, whent)
|
|
|
|
local absYear = whent.year - 2000;
|
|
local absMonth = (absYear * 12) + whent.month;
|
|
local absDay = floor ((when - gTimeZero) / (60*60*24));
|
|
|
|
return absYear, absMonth, absDay;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Condense_History (itemname)
|
|
|
|
if (AUCTIONATOR_PRICING_HISTORY[itemname] == nil) then
|
|
return;
|
|
end
|
|
|
|
local tempHistory = {};
|
|
|
|
local now = time();
|
|
local nowt = date("*t", now);
|
|
|
|
local absNowYear, absNowMonth, absNowDay = CalcAbsTimes (now, nowt);
|
|
|
|
local n = 1;
|
|
local tag, hist, newtag, stacksize, numauctions;
|
|
for tag, hist in pairs (AUCTIONATOR_PRICING_HISTORY[itemname]) do
|
|
if (tag ~= "is") then
|
|
|
|
local when, type, price, stacksize, numauctions = ParseHist (tag, hist);
|
|
|
|
local whnt = date("*t", when);
|
|
|
|
local absYear, absMonth, absDay = CalcAbsTimes (when, whnt);
|
|
|
|
if (absNowYear - absYear >= 3) then
|
|
newtag = BuildHtag ("hy", whnt.year, 1, 1);
|
|
elseif (absNowMonth - absMonth >= 2) then
|
|
newtag = BuildHtag ("hm", whnt.year, whnt.month, 1);
|
|
elseif (absNowDay - absDay >= 2) then
|
|
newtag = BuildHtag ("hd", whnt.year, whnt.month, whnt.day);
|
|
else
|
|
newtag = tag;
|
|
end
|
|
|
|
tempHistory[n] = {};
|
|
tempHistory[n].price = price;
|
|
tempHistory[n].numauctions = numauctions;
|
|
tempHistory[n].stacksize = stacksize;
|
|
tempHistory[n].when = when;
|
|
tempHistory[n].newtag = newtag;
|
|
n = n + 1;
|
|
end
|
|
end
|
|
|
|
-- clear all the existing history
|
|
|
|
local is = AUCTIONATOR_PRICING_HISTORY[itemname]["is"];
|
|
|
|
AUCTIONATOR_PRICING_HISTORY[itemname] = {};
|
|
AUCTIONATOR_PRICING_HISTORY[itemname]["is"] = is;
|
|
|
|
-- repopulate the history
|
|
|
|
local x;
|
|
|
|
for x = 1,getn(tempHistory) do
|
|
|
|
local thist = tempHistory[x];
|
|
local newtag = thist.newtag;
|
|
|
|
if (AUCTIONATOR_PRICING_HISTORY[itemname][newtag] == nil) then
|
|
|
|
local when, type = ParseHtag (newtag);
|
|
|
|
local count = thist.numauctions;
|
|
if (type == "hx") then
|
|
count = thist.stacksize;
|
|
end
|
|
|
|
AUCTIONATOR_PRICING_HISTORY[itemname][newtag] = tostring(thist.price)..":"..tostring(count);
|
|
|
|
else
|
|
|
|
local hist = AUCTIONATOR_PRICING_HISTORY[itemname][newtag];
|
|
|
|
local when, type, price, stacksize, numauctions = ParseHist (newtag, hist);
|
|
|
|
local newNumAuctions = numauctions + thist.numauctions;
|
|
local newPrice = ((price * numauctions) + (thist.price * thist.numauctions)) / newNumAuctions;
|
|
|
|
AUCTIONATOR_PRICING_HISTORY[itemname][newtag] = tostring(newPrice)..":"..tostring(newNumAuctions);
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Process_Historydata ()
|
|
|
|
-- Condense the data if needed - only once per session for each item
|
|
|
|
if (gCurrentPane:IsScanEmpty()) then
|
|
return;
|
|
end
|
|
|
|
local itemName = gCurrentPane.activeScan.itemName;
|
|
|
|
if (gCondensedThisSession[itemName] == nil) then
|
|
|
|
gCondensedThisSession[itemName] = true;
|
|
|
|
Atr_Condense_History(itemName);
|
|
end
|
|
|
|
-- build the sorted history list
|
|
|
|
gCurrentPane.sortedHist = {};
|
|
|
|
if (AUCTIONATOR_PRICING_HISTORY[itemName]) then
|
|
local n = 1;
|
|
local tag, hist;
|
|
for tag, hist in pairs (AUCTIONATOR_PRICING_HISTORY[itemName]) do
|
|
if (tag ~= "is") then
|
|
local when, type, price, stacksize, numauctions = ParseHist (tag, hist);
|
|
|
|
if (stacksize == 0) then
|
|
stacksize = numauctions;
|
|
end
|
|
|
|
gCurrentPane.sortedHist[n] = {};
|
|
gCurrentPane.sortedHist[n].itemPrice = price;
|
|
gCurrentPane.sortedHist[n].buyoutPrice = price * stacksize;
|
|
gCurrentPane.sortedHist[n].stackSize = stacksize;
|
|
gCurrentPane.sortedHist[n].when = when;
|
|
gCurrentPane.sortedHist[n].yours = true;
|
|
gCurrentPane.sortedHist[n].type = type;
|
|
|
|
n = n + 1;
|
|
end
|
|
end
|
|
end
|
|
|
|
table.sort (gCurrentPane.sortedHist, Atr_SortHistoryData);
|
|
|
|
if (getn(gCurrentPane.sortedHist) > 0) then
|
|
return gCurrentPane.sortedHist[1].itemPrice;
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_GetMostRecentSale (itemName)
|
|
|
|
local recentPrice;
|
|
local recentWhen = 0;
|
|
|
|
if (AUCTIONATOR_PRICING_HISTORY and AUCTIONATOR_PRICING_HISTORY[itemName]) then
|
|
local n = 1;
|
|
local tag, hist;
|
|
for tag, hist in pairs (AUCTIONATOR_PRICING_HISTORY[itemName]) do
|
|
if (tag ~= "is") then
|
|
local when, type, price = ParseHist (tag, hist);
|
|
|
|
if (when > recentWhen) then
|
|
recentPrice = price;
|
|
recentWhen = when;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return recentPrice;
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowingSearchSummary ()
|
|
|
|
if (gCurrentPane.activeSearch and gCurrentPane.activeSearch.searchText ~= "" and gCurrentPane:IsScanEmpty() and gCurrentPane.activeSearch:NumScans() > 0) then
|
|
return true;
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowingCurrentAuctions ()
|
|
if (gCurrentPane) then
|
|
return gCurrentPane:ShowCurrent();
|
|
end
|
|
|
|
return true;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowingHistory ()
|
|
if (gCurrentPane) then
|
|
return gCurrentPane:ShowHistory();
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowingHints ()
|
|
if (gCurrentPane) then
|
|
return gCurrentPane:ShowHints();
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_UpdateRecommendation (updatePrices)
|
|
|
|
if (gCurrentPane == gSellPane and gJustPosted_ItemLink and GetAuctionSellItemInfo() == nil) then
|
|
return;
|
|
end
|
|
|
|
local basedata;
|
|
|
|
if (Atr_ShowingSearchSummary()) then
|
|
|
|
elseif (Atr_ShowingCurrentAuctions()) then
|
|
|
|
if (gCurrentPane:GetProcessingState() ~= KM_NULL_STATE) then
|
|
return;
|
|
end
|
|
|
|
if (getn(gCurrentPane.activeScan.sortedData) == 0) then
|
|
Atr_SetMessage (ZT("No current auctions found"));
|
|
return;
|
|
end
|
|
|
|
if (not gCurrentPane.currIndex) then
|
|
if (gCurrentPane.activeScan.numMatches == 0) then
|
|
Atr_SetMessage (ZT("No current auctions found\n\n(related auctions shown)"));
|
|
elseif (gCurrentPane.activeScan.numMatchesWithBuyout == 0) then
|
|
Atr_SetMessage (ZT("No current auctions with buyouts found"));
|
|
else
|
|
Atr_SetMessage ("");
|
|
end
|
|
return;
|
|
end
|
|
|
|
basedata = gCurrentPane.activeScan.sortedData[gCurrentPane.currIndex];
|
|
|
|
elseif (Atr_ShowingHistory()) then
|
|
|
|
basedata = zc.GetArrayElemOrFirst (gCurrentPane.sortedHist, gCurrentPane.histIndex);
|
|
|
|
if (basedata == nil) then
|
|
Atr_SetMessage (ZT("Auctionator has yet to record any auctions for this item"));
|
|
return;
|
|
end
|
|
|
|
else -- hints
|
|
|
|
local data = zc.GetArrayElemOrFirst (gCurrentPane.hints, gCurrentPane.hintsIndex);
|
|
|
|
if (data) then
|
|
basedata = {};
|
|
basedata.itemPrice = data.price;
|
|
basedata.buyoutPrice = data.price;
|
|
basedata.stackSize = 1;
|
|
basedata.sourceText = data.text;
|
|
basedata.yours = true; -- so no discounting
|
|
end
|
|
end
|
|
|
|
if (Atr_StackSize() == 0) then
|
|
return;
|
|
end
|
|
|
|
local new_Item_BuyoutPrice;
|
|
|
|
if (gItemPostingInProgress and gCurrentPane.itemLink == gJustPosted_ItemLink) then -- handle the unusual case where server is still in the process of creating the last auction
|
|
|
|
new_Item_BuyoutPrice = gJustPosted_BuyoutPrice / gJustPosted_StackSize;
|
|
|
|
elseif (basedata) then -- the normal case
|
|
|
|
new_Item_BuyoutPrice = basedata.itemPrice;
|
|
|
|
if (not basedata.yours and not basedata.altname) then
|
|
new_Item_BuyoutPrice = Atr_CalcUndercutPrice (new_Item_BuyoutPrice);
|
|
end
|
|
end
|
|
|
|
if (new_Item_BuyoutPrice == nil) then
|
|
return;
|
|
end
|
|
|
|
local new_Item_StartPrice = Atr_CalcStartPrice (new_Item_BuyoutPrice);
|
|
|
|
Atr_ShowElems (recommendElements);
|
|
AuctionatorMessageFrame:Hide();
|
|
AuctionatorMessage2Frame:Hide();
|
|
|
|
Atr_Recommend_Text:SetText (ZT("Recommended Buyout Price"));
|
|
Atr_RecommendPerStack_Text:SetText (string.format (ZT("for your stack of %d"), Atr_StackSize()));
|
|
|
|
Atr_SetTextureButton ("Atr_RecommendItem_Tex", Atr_StackSize(), gCurrentPane.activeScan.itemLink);
|
|
|
|
MoneyFrame_Update ("Atr_RecommendPerItem_Price", zc.round(new_Item_BuyoutPrice));
|
|
MoneyFrame_Update ("Atr_RecommendPerStack_Price", zc.round(new_Item_BuyoutPrice * Atr_StackSize()));
|
|
|
|
if (updatePrices) then
|
|
MoneyInputFrame_SetCopper (Atr_StackPrice, new_Item_BuyoutPrice * Atr_StackSize());
|
|
MoneyInputFrame_SetCopper (Atr_StartingPrice, new_Item_StartPrice * Atr_StackSize());
|
|
MoneyInputFrame_SetCopper (Atr_ItemPrice, new_Item_BuyoutPrice);
|
|
end
|
|
|
|
local cheapestStack = gCurrentPane.activeScan.bestPrices[Atr_StackSize()];
|
|
|
|
Atr_Recommend_Basis_Text:SetTextColor (1,1,1);
|
|
|
|
if (Atr_ShowingHints()) then
|
|
Atr_Recommend_Basis_Text:SetTextColor (.8,.8,1);
|
|
Atr_Recommend_Basis_Text:SetText ("("..ZT("based on").." "..basedata.sourceText..")");
|
|
elseif (gCurrentPane.activeScan.absoluteBest and basedata.stackSize == gCurrentPane.activeScan.absoluteBest.stackSize and basedata.buyoutPrice == gCurrentPane.activeScan.absoluteBest.buyoutPrice) then
|
|
Atr_Recommend_Basis_Text:SetText ("("..ZT("based on cheapest current auction")..")");
|
|
elseif (cheapestStack and basedata.stackSize == cheapestStack.stackSize and basedata.buyoutPrice == cheapestStack.buyoutPrice) then
|
|
Atr_Recommend_Basis_Text:SetText ("("..ZT("based on cheapest stack of the same size")..")");
|
|
else
|
|
Atr_Recommend_Basis_Text:SetText ("("..ZT("based on selected auction")..")");
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_StackPriceChangedFunc ()
|
|
|
|
local new_Stack_BuyoutPrice = MoneyInputFrame_GetCopper (Atr_StackPrice);
|
|
local new_Item_BuyoutPrice = math.floor (new_Stack_BuyoutPrice / Atr_StackSize());
|
|
local new_Item_StartPrice = Atr_CalcStartPrice (new_Item_BuyoutPrice);
|
|
|
|
local calculatedStackPrice = MoneyInputFrame_GetCopper(Atr_ItemPrice) * Atr_StackSize();
|
|
|
|
-- check to prevent looping
|
|
|
|
if (calculatedStackPrice ~= new_Stack_BuyoutPrice) then
|
|
MoneyInputFrame_SetCopper (Atr_ItemPrice, new_Item_BuyoutPrice);
|
|
MoneyInputFrame_SetCopper (Atr_StartingPrice, new_Item_StartPrice * Atr_StackSize());
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ItemPriceChangedFunc ()
|
|
|
|
local new_Item_BuyoutPrice = MoneyInputFrame_GetCopper (Atr_ItemPrice);
|
|
local new_Item_StartPrice = Atr_CalcStartPrice (new_Item_BuyoutPrice);
|
|
|
|
local calculatedItemPrice = math.floor (MoneyInputFrame_GetCopper (Atr_StackPrice) / Atr_StackSize());
|
|
|
|
-- check to prevent looping
|
|
|
|
if (calculatedItemPrice ~= new_Item_BuyoutPrice) then
|
|
MoneyInputFrame_SetCopper (Atr_StackPrice, new_Item_BuyoutPrice * Atr_StackSize());
|
|
MoneyInputFrame_SetCopper (Atr_StartingPrice, new_Item_StartPrice * Atr_StackSize());
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_StackSizeChangedFunc ()
|
|
|
|
local item_BuyoutPrice = MoneyInputFrame_GetCopper (Atr_ItemPrice);
|
|
local new_Item_StartPrice = Atr_CalcStartPrice (item_BuyoutPrice);
|
|
|
|
MoneyInputFrame_SetCopper (Atr_StackPrice, item_BuyoutPrice * Atr_StackSize());
|
|
MoneyInputFrame_SetCopper (Atr_StartingPrice, new_Item_StartPrice * Atr_StackSize());
|
|
|
|
-- Atr_MemorizeButton:Show();
|
|
|
|
gSellPane.UINeedsUpdate = true;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_NumAuctionsChangedFunc (x)
|
|
|
|
-- Atr_MemorizeButton:Show();
|
|
|
|
gSellPane.UINeedsUpdate = true;
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetTextureButton (elementName, count, itemlink)
|
|
|
|
local texture = Atr_GetItemIcon (itemlink);
|
|
|
|
local textureElement = getglobal (elementName);
|
|
|
|
if (texture) then
|
|
textureElement:Show();
|
|
textureElement:SetNormalTexture (texture);
|
|
Atr_SetTextureButtonCount (elementName, count);
|
|
else
|
|
Atr_SetTextureButtonCount (elementName, 0);
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetTextureButtonCount (elementName, count)
|
|
|
|
local countElement = getglobal (elementName.."Count");
|
|
|
|
if (count > 1) then
|
|
countElement:SetText (count);
|
|
countElement:Show();
|
|
else
|
|
countElement:Hide();
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowRecTooltip ()
|
|
|
|
local link = gCurrentPane.activeScan.itemLink;
|
|
local num = Atr_StackSize();
|
|
|
|
if (not link) then
|
|
link = gJustPosted_ItemLink;
|
|
num = gJustPosted_StackSize;
|
|
end
|
|
|
|
if (link) then
|
|
if (num < 1) then num = 1; end;
|
|
|
|
GameTooltip:SetOwner(Atr_RecommendItem_Tex, "ANCHOR_RIGHT");
|
|
GameTooltip:SetHyperlink (link, num);
|
|
gCurrentPane.tooltipvisible = true;
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_HideRecTooltip ()
|
|
|
|
gCurrentPane.tooltipvisible = nil;
|
|
GameTooltip:Hide();
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnAuctionHouseShow()
|
|
|
|
gOpenAllBags = AUCTIONATOR_OPEN_ALL_BAGS;
|
|
|
|
if (AUCTIONATOR_DEFTAB == 1) then Atr_SelectPane (SELL_TAB); end
|
|
if (AUCTIONATOR_DEFTAB == 2) then Atr_SelectPane (BUY_TAB); end
|
|
if (AUCTIONATOR_DEFTAB == 3) then Atr_SelectPane (MORE_TAB); end
|
|
|
|
Atr_ResetDuration();
|
|
|
|
gJustPosted_ItemName = nil;
|
|
gSellPane:ClearSearch();
|
|
|
|
if (gCurrentPane) then
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnAuctionHouseClosed()
|
|
|
|
Atr_HideAllDialogs();
|
|
|
|
Atr_CheckingActive_Finish ();
|
|
|
|
Atr_ClearScanCache();
|
|
|
|
gSellPane:ClearSearch();
|
|
gShopPane:ClearSearch();
|
|
gMorePane:ClearSearch();
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_HideAllDialogs()
|
|
|
|
Atr_CheckActives_Frame:Hide();
|
|
Atr_Error_Frame:Hide();
|
|
Atr_Buy_Confirm_Frame:Hide();
|
|
Atr_FullScanFrame:Hide();
|
|
Atr_Mask:Hide();
|
|
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_BasicOptionsUpdate(self, elapsed)
|
|
|
|
self.TimeSinceLastUpdate = (self.TimeSinceLastUpdate or 0) + elapsed;
|
|
|
|
if (self.TimeSinceLastUpdate > 0.25) then
|
|
|
|
self.TimeSinceLastUpdate = 0;
|
|
|
|
if (AuctionatorOption_Def_Duration_CB:GetChecked()) then
|
|
AuctionatorOption_Durations:Show();
|
|
else
|
|
AuctionatorOption_Durations:Hide();
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnWhoListUpdate()
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_PageHasMissingNames ()
|
|
|
|
local n = GetNumAuctionItems ("list");
|
|
local i;
|
|
|
|
for i = 1, n do
|
|
local name = GetAuctionItemInfo ("list", i);
|
|
if (name == nil or name == "") then
|
|
return true;
|
|
end
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_QueryPoll ()
|
|
|
|
if (gAtr_FullScanState == ATR_FS_STARTED) then
|
|
Atr_FullScanFrameIdle();
|
|
end
|
|
|
|
if (gCurrentPane == nil or gCurrentPane.activeSearch == nil or not Atr_IsTabSelected()) then
|
|
return;
|
|
end
|
|
|
|
local search = gCurrentPane.activeSearch;
|
|
|
|
if (search.processing_state == KM_PREQUERY) then
|
|
if (not gHentryTryAgain and not Atr_Buy_IsBusy()) then
|
|
search:Continue();
|
|
end
|
|
elseif (search.processing_state == KM_POSTQUERY and search.namesWaitStart) then
|
|
if (not Atr_PageHasMissingNames() or GetTime() - search.namesWaitStart >= 2) then
|
|
Atr_OnAuctionUpdate();
|
|
end
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnUpdate(self, elapsed)
|
|
|
|
-- update the global "precision" timer
|
|
|
|
gAtr_ptime = gAtr_ptime and gAtr_ptime + elapsed or 0;
|
|
|
|
|
|
-- next auction page as soon as possible
|
|
|
|
Atr_QueryPoll ();
|
|
|
|
-- check deferred call queue
|
|
|
|
if (zc.periodic (self, "dcq_lastUpdate", 0.05, elapsed)) then
|
|
zc.CheckDeferredCall();
|
|
end
|
|
|
|
-- make sure all dusts and essences are in the local cache
|
|
|
|
if (gAtr_dustCacheIndex > 0 and zc.periodic (self, "dust_lastUpdate", 0.1, elapsed)) then
|
|
Atr_GetNextDustIntoCache();
|
|
end
|
|
|
|
-- the core Idle routine
|
|
|
|
if (zc.periodic (self, "idle_lastUpdate", 0.2, elapsed)) then
|
|
Atr_Idle (self, elapsed);
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
local verCheckMsgState = 0;
|
|
-----------------------------------------
|
|
|
|
function Atr_Idle(self, elapsed)
|
|
|
|
|
|
if (gCurrentPane and gCurrentPane.tooltipvisible) then
|
|
Atr_ShowRecTooltip();
|
|
end
|
|
|
|
|
|
if (gAtr_FullScanState ~= ATR_FS_NULL) then
|
|
Atr_FullScanFrameIdle();
|
|
end
|
|
|
|
|
|
|
|
if (not Atr_IsTabSelected() or AuctionatorMessageFrame == nil) then
|
|
return;
|
|
end
|
|
|
|
if (gHentryTryAgain) then
|
|
Atr_HEntryOnClick();
|
|
return;
|
|
end
|
|
|
|
if (gCurrentPane.activeSearch and gCurrentPane.activeSearch.processing_state == KM_PREQUERY and not Atr_Buy_IsBusy()) then ------- check whether to send a new auction query to get the next page -------
|
|
gCurrentPane.activeSearch:Continue();
|
|
end
|
|
|
|
Atr_UpdateUI ();
|
|
|
|
Atr_CheckingActiveIdle();
|
|
|
|
Atr_Buy_Idle();
|
|
|
|
if (gHideAPFrameCheck == nil) then -- for the addon 'Auction Profit' (flags for efficiency so we only check one time)
|
|
gHideAPFrameCheck = true;
|
|
if (AP_Bid_MoneyFrame) then
|
|
AP_Bid_MoneyFrame:Hide();
|
|
AP_Buy_MoneyFrame:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
local gPrevSellItemLink;
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_OnNewAuctionUpdate()
|
|
|
|
if (not gAtr_ClickAuctionSell) then
|
|
gPrevSellItemLink = nil;
|
|
return;
|
|
end
|
|
|
|
-- zc.md ("gAtr_ClickAuctionSell:", gAtr_ClickAuctionSell);
|
|
|
|
gAtr_ClickAuctionSell = false;
|
|
|
|
local auctionItemName, auctionCount, auctionLink = Atr_GetSellItemInfo();
|
|
|
|
if (gPrevSellItemLink ~= auctionLink) then
|
|
|
|
gPrevSellItemLink = auctionLink;
|
|
|
|
if (auctionLink) then
|
|
gJustPosted_ItemName = nil;
|
|
Atr_AddToItemLinkCache (auctionItemName, auctionLink);
|
|
Atr_ClearList(); -- better UE
|
|
gSellPane:SetToShowCurrent();
|
|
end
|
|
|
|
MoneyInputFrame_SetCopper (Atr_StackPrice, 0);
|
|
MoneyInputFrame_SetCopper (Atr_StartingPrice, 0);
|
|
Atr_ResetDuration();
|
|
|
|
if (gJustPosted_ItemName == nil) then
|
|
local cacheHit = gSellPane:DoSearch (auctionItemName, true, 20);
|
|
|
|
gSellPane.totalItems = Atr_GetNumItemInBags (auctionItemName);
|
|
gSellPane.fullStackSize = Atr_ItemStackSize (auctionLink);
|
|
|
|
local prefNumStacks, prefStackSize = Atr_GetSellStacking (auctionLink, auctionCount, gSellPane.totalItems);
|
|
|
|
if (time() - gAutoSingleton < 5) then
|
|
Atr_SetInitialStacking (1, 1);
|
|
else
|
|
Atr_SetInitialStacking (prefNumStacks, prefStackSize);
|
|
end
|
|
|
|
if (cacheHit) then
|
|
Atr_OnSearchComplete ();
|
|
end
|
|
|
|
Atr_SetTextureButton ("Atr_SellControls_Tex", Atr_StackSize(), auctionLink);
|
|
Atr_SellControls_TexName:SetText (auctionItemName);
|
|
else
|
|
Atr_SetTextureButton ("Atr_SellControls_Tex", 0, nil);
|
|
Atr_SellControls_TexName:SetText ("");
|
|
end
|
|
|
|
elseif (Atr_StackSize() ~= auctionCount) then
|
|
|
|
local prefNumStacks, prefStackSize = Atr_GetSellStacking (auctionLink, auctionCount, gSellPane.totalItems);
|
|
|
|
Atr_SetInitialStacking (prefNumStacks, prefStackSize);
|
|
|
|
Atr_SetTextureButton ("Atr_SellControls_Tex", Atr_StackSize(), auctionLink);
|
|
|
|
Atr_FindBestCurrentAuction();
|
|
Atr_ResetDuration();
|
|
end
|
|
|
|
gSellPane.UINeedsUpdate = true;
|
|
|
|
end
|
|
|
|
---------------------------------------------------------
|
|
|
|
function Atr_UpdateUI ()
|
|
|
|
local needsUpdate = gCurrentPane.UINeedsUpdate;
|
|
|
|
if (gCurrentPane.UINeedsUpdate) then
|
|
|
|
gCurrentPane.UINeedsUpdate = false;
|
|
|
|
if (Atr_ShowingSearchSummary()) then
|
|
Atr_ShowSearchSummary();
|
|
elseif (gCurrentPane:ShowCurrent()) then
|
|
PanelTemplates_SetTab(Atr_ListTabs, 1);
|
|
Atr_ShowCurrentAuctions();
|
|
elseif (gCurrentPane:ShowHistory()) then
|
|
PanelTemplates_SetTab(Atr_ListTabs, 2);
|
|
Atr_ShowHistory();
|
|
else
|
|
PanelTemplates_SetTab(Atr_ListTabs, 3);
|
|
Atr_ShowHints();
|
|
end
|
|
|
|
if (gCurrentPane:IsScanEmpty()) then
|
|
Atr_ListTabs:Hide();
|
|
else
|
|
Atr_ListTabs:Show();
|
|
end
|
|
|
|
Atr_SetMessage ("");
|
|
local scn = gCurrentPane.activeScan;
|
|
|
|
if (Atr_IsModeCreateAuction()) then
|
|
|
|
Atr_UpdateRecommendation (false);
|
|
else
|
|
Atr_HideElems (recommendElements);
|
|
|
|
if (scn:IsNil()) then
|
|
Atr_ShowItemNameAndTexture (gCurrentPane.activeSearch.searchText);
|
|
else
|
|
Atr_ShowItemNameAndTexture (gCurrentPane.activeScan.itemName);
|
|
end
|
|
|
|
if (Atr_IsModeBuy()) then
|
|
|
|
if (gCurrentPane.activeSearch.searchText == "") then
|
|
Atr_SetMessage (ZT("Select an item from the list on the left\n or type a search term above to start a scan."));
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
if (Atr_IsTabSelected(BUY_TAB)) then
|
|
Atr_Shop_UpdateUI();
|
|
end
|
|
|
|
if (gCurrentPane.activeSearch and gCurrentPane.activeSearch:IsActive()) then
|
|
Atr_SetMessage (Atr_SearchProgressText ());
|
|
end
|
|
|
|
|
|
end
|
|
|
|
-- update the hlist if needed
|
|
|
|
if (gHlistNeedsUpdate and Atr_IsModeActiveAuctions()) then
|
|
gHlistNeedsUpdate = false;
|
|
Atr_DisplayHlist();
|
|
end
|
|
|
|
if (Atr_IsTabSelected(SELL_TAB)) then
|
|
Atr_UpdateUI_SellPane (needsUpdate);
|
|
end
|
|
|
|
end
|
|
|
|
---------------------------------------------------------
|
|
|
|
function Atr_UpdateUI_SellPane (needsUpdate)
|
|
|
|
local auctionItemName = GetAuctionSellItemInfo();
|
|
|
|
if (needsUpdate) then
|
|
|
|
if (gCurrentPane.activeSearch and gCurrentPane.activeSearch.processing_state ~= KM_NULL_STATE) then
|
|
Atr_CreateAuctionButton:Disable();
|
|
Atr_FullScanButton:Disable();
|
|
Auctionator1Button:Disable();
|
|
MoneyInputFrame_SetCopper (Atr_StartingPrice, 0);
|
|
return;
|
|
else
|
|
Atr_FullScanButton:Enable();
|
|
Auctionator1Button:Enable();
|
|
|
|
|
|
if (Atr_Batch_Stacksize.oldStackSize ~= Atr_StackSize()) then
|
|
Atr_Batch_Stacksize.oldStackSize = Atr_StackSize();
|
|
local itemPrice = MoneyInputFrame_GetCopper(Atr_ItemPrice);
|
|
MoneyInputFrame_SetCopper (Atr_StackPrice, itemPrice * Atr_StackSize());
|
|
end
|
|
|
|
Atr_StartingPriceDiscountText:SetText (ZT("Starting Price Discount")..": "..AUCTIONATOR_SAVEDVARS.STARTING_DISCOUNT.."%");
|
|
|
|
if (Atr_Batch_NumAuctions:GetNumber() < 2) then
|
|
Atr_Batch_Stacksize_Text:SetText (ZT("stack of"));
|
|
Atr_CreateAuctionButton:SetText (ZT("Create Auction"));
|
|
else
|
|
Atr_Batch_Stacksize_Text:SetText (ZT("stacks of"));
|
|
Atr_CreateAuctionButton:SetText (string.format (ZT("Create %d Auctions"), Atr_Batch_NumAuctions:GetNumber()));
|
|
end
|
|
|
|
if (Atr_StackSize() > 1) then
|
|
Atr_StackPriceText:SetText (ZT("Buyout Price").." |cff55ddffx"..Atr_StackSize().."|r");
|
|
Atr_ItemPriceText:SetText (ZT("Per Item"));
|
|
Atr_ItemPriceText:Show();
|
|
Atr_ItemPrice:Show();
|
|
else
|
|
Atr_StackPriceText:SetText (ZT("Buyout Price"));
|
|
Atr_ItemPriceText:Hide();
|
|
Atr_ItemPrice:Hide();
|
|
end
|
|
|
|
Atr_SetTextureButton ("Atr_SellControls_Tex", Atr_StackSize(), Atr_GetItemLink(auctionItemName));
|
|
|
|
|
|
local maxAuctions = 0;
|
|
if (Atr_StackSize() > 0) then
|
|
maxAuctions = math.floor (gCurrentPane.totalItems / Atr_StackSize());
|
|
end
|
|
|
|
Atr_Batch_MaxAuctions_Text:SetText (ZT("max")..": "..maxAuctions);
|
|
Atr_Batch_MaxStacksize_Text:SetText (ZT("max")..": "..gCurrentPane.fullStackSize);
|
|
|
|
Atr_SetDepositText();
|
|
end
|
|
|
|
if (gJustPosted_ItemName ~= nil) then
|
|
|
|
Atr_Recommend_Text:SetText (string.format (ZT("Auction created for %s"), gJustPosted_ItemName));
|
|
MoneyFrame_Update ("Atr_RecommendPerStack_Price", gJustPosted_BuyoutPrice);
|
|
Atr_SetTextureButton ("Atr_RecommendItem_Tex", gJustPosted_StackSize, gJustPosted_ItemLink);
|
|
|
|
gCurrentPane.currIndex = gCurrentPane.activeScan:FindInSortedData (gJustPosted_StackSize, gJustPosted_BuyoutPrice);
|
|
|
|
if (gCurrentPane:ShowCurrent()) then
|
|
Atr_HighlightEntry (gCurrentPane.currIndex); -- highlight the newly created auction(s)
|
|
else
|
|
Atr_HighlightEntry (gCurrentPane.histIndex);
|
|
end
|
|
|
|
elseif (gCurrentPane:IsScanEmpty()) then
|
|
Atr_SetMessage (ZT("Drag an item you want to sell to this area."));
|
|
end
|
|
end
|
|
|
|
-- stuff we should do every time (not just when needsUpdate is true)
|
|
|
|
local start = MoneyInputFrame_GetCopper(Atr_StartingPrice);
|
|
local buyout = MoneyInputFrame_GetCopper(Atr_StackPrice);
|
|
|
|
local pricesOK = (start > 0 and (start <= buyout or buyout == 0) and (auctionItemName ~= nil));
|
|
|
|
local numToSell = Atr_Batch_NumAuctions:GetNumber() * Atr_Batch_Stacksize:GetNumber();
|
|
|
|
zc.EnableDisable (Atr_CreateAuctionButton, pricesOK and (numToSell <= gCurrentPane.totalItems));
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetDepositText()
|
|
|
|
_, auctionCount = Atr_GetSellItemInfo();
|
|
|
|
if (auctionCount > 0) then
|
|
local duration = UIDropDownMenu_GetSelectedValue(Atr_Duration);
|
|
|
|
local deposit1 = CalculateAuctionDeposit (AtrNS.durationMinutes[duration] or 1440) / auctionCount;
|
|
local numAuctionString = "";
|
|
if (Atr_Batch_NumAuctions:GetNumber() > 1) then
|
|
numAuctionString = " |cffff55ff x"..Atr_Batch_NumAuctions:GetNumber();
|
|
end
|
|
|
|
Atr_Deposit_Text:SetText (ZT("Deposit")..":");
|
|
Atr_ShowDepositMoney (deposit1 * Atr_StackSize(), numAuctionString);
|
|
else
|
|
Atr_Deposit_Text:SetText ("");
|
|
Atr_ShowDepositMoney (nil);
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_BuildActiveAuctions ()
|
|
|
|
gActiveAuctions = {};
|
|
|
|
local i = 1;
|
|
while (true) do
|
|
local name, _, count = GetAuctionItemInfo ("owner", i);
|
|
if (name == nil) then
|
|
break;
|
|
end
|
|
|
|
if (count > 0) then -- count is 0 for sold items
|
|
if (gActiveAuctions[name] == nil) then
|
|
gActiveAuctions[name] = 1;
|
|
else
|
|
gActiveAuctions[name] = gActiveAuctions[name] + 1;
|
|
end
|
|
end
|
|
|
|
i = i + 1;
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_GetUCIcon (itemName)
|
|
|
|
local icon = " "
|
|
|
|
local undercutFound = false;
|
|
|
|
local scan = Atr_FindScan (itemName);
|
|
if (scan and scan.absoluteBest and scan.whenScanned ~= 0 and scan.yourBestPrice and scan.yourWorstPrice) then
|
|
|
|
local absBestPrice = scan.absoluteBest.itemPrice;
|
|
|
|
if (scan.yourBestPrice <= absBestPrice and scan.yourWorstPrice > absBestPrice) then
|
|
icon = "|cffffd100[~]|r "
|
|
undercutFound = true;
|
|
elseif (scan.yourBestPrice <= absBestPrice) then
|
|
icon = "|cff40ff40[+]|r "
|
|
else
|
|
icon = "|cffff4040[-]|r "
|
|
undercutFound = true;
|
|
end
|
|
end
|
|
|
|
if (gAtr_CheckingActive_State ~= ATR_CACT_NULL and undercutFound) then
|
|
gAtr_CheckingActive_NumUndercuts = gAtr_CheckingActive_NumUndercuts + 1;
|
|
end
|
|
|
|
return icon;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_DisplayHlist ()
|
|
|
|
if (Atr_IsTabSelected (BUY_TAB)) then -- done this way because OnScrollFrame always calls Atr_DisplayHlist
|
|
Atr_DisplaySlist();
|
|
return;
|
|
end
|
|
|
|
local doFull = (UIDropDownMenu_GetSelectedValue(Atr_DropDown1) == MODE_LIST_ALL);
|
|
|
|
Atr_BuildGlobalHistoryList (doFull);
|
|
|
|
local numrows = getn(gHistoryItemList);
|
|
|
|
local line; -- 1 through NN of our window to scroll
|
|
local dataOffset; -- an index into our data calculated from the scroll offset
|
|
|
|
FauxScrollFrame_Update (Atr_Hlist_ScrollFrame, numrows, ITEM_HIST_NUM_LINES, 16);
|
|
|
|
for line = 1,ITEM_HIST_NUM_LINES do
|
|
|
|
gCurrentPane.hlistScrollOffset = FauxScrollFrame_GetOffset (Atr_Hlist_ScrollFrame);
|
|
|
|
dataOffset = line + gCurrentPane.hlistScrollOffset;
|
|
|
|
local lineEntry = getglobal ("AuctionatorHEntry"..line);
|
|
|
|
lineEntry:SetID(dataOffset);
|
|
|
|
if (dataOffset <= numrows and gHistoryItemList[dataOffset]) then
|
|
|
|
local lineEntry_text = getglobal("AuctionatorHEntry"..line.."_EntryText");
|
|
|
|
local iName = gHistoryItemList[dataOffset];
|
|
|
|
local icon = "";
|
|
|
|
if (not doFull) then
|
|
icon = Atr_GetUCIcon (iName);
|
|
end
|
|
|
|
lineEntry_text:SetText (icon..Atr_AbbrevItemName (iName));
|
|
|
|
|
|
if (iName == gCurrentPane.activeSearch.searchText) then
|
|
Atr_SetRowSelected (lineEntry, true);
|
|
else
|
|
Atr_SetRowSelected (lineEntry, false);
|
|
end
|
|
|
|
lineEntry:Show();
|
|
else
|
|
lineEntry:Hide();
|
|
end
|
|
end
|
|
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ClearHlist ()
|
|
local line;
|
|
for line = 1,ITEM_HIST_NUM_LINES do
|
|
local lineEntry = getglobal ("AuctionatorHEntry"..line);
|
|
lineEntry:Hide();
|
|
|
|
local lineEntry_text = getglobal("AuctionatorHEntry"..line.."_EntryText");
|
|
lineEntry_text:SetText ("");
|
|
lineEntry_text:SetTextColor (.7,.7,.7);
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_HEntryOnClick(itemName)
|
|
|
|
if (gCurrentPane == gShopPane) then
|
|
Atr_SEntryOnClick();
|
|
return;
|
|
end
|
|
|
|
if (not itemName) then
|
|
local line = this;
|
|
|
|
if (gHentryTryAgain) then
|
|
line = gHentryTryAgain;
|
|
gHentryTryAgain = nil;
|
|
end
|
|
|
|
local _, itemLink;
|
|
local entryIndex = line:GetID();
|
|
|
|
itemName = gHistoryItemList[entryIndex];
|
|
end
|
|
|
|
if (IsAltKeyDown() and Atr_IsModeActiveAuctions()) then
|
|
Atr_Cancel_Undercuts_OnClick (itemName)
|
|
return;
|
|
end
|
|
|
|
if (AUCTIONATOR_PRICING_HISTORY[itemName]) then
|
|
local itemId, suffixId, uniqueId = Atr_strsplit (":", AUCTIONATOR_PRICING_HISTORY[itemName]["is"])
|
|
|
|
local itemId = tonumber(itemId);
|
|
|
|
if (suffixId == nil) then suffixId = 0;
|
|
else suffixId = tonumber(suffixId);
|
|
end
|
|
|
|
if (uniqueId == nil) then uniqueId = 0;
|
|
else uniqueId = tonumber(suffixId);
|
|
end
|
|
|
|
local itemString = "item:"..itemId..":0:"..suffixId..":"..uniqueId;
|
|
|
|
_, itemLink = Atr_GetItemInfo (itemString);
|
|
|
|
if (itemLink == nil) then -- pull it into the cache and go back to the idle loop to wait for it to appear
|
|
AtrScanningTooltip:SetHyperlink(itemString);
|
|
gHentryTryAgain = line;
|
|
zc.md ("pulling "..itemName.." into the local cache");
|
|
return;
|
|
end
|
|
end
|
|
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
|
|
Atr_ClearAll();
|
|
|
|
local cacheHit = gCurrentPane:DoSearch (itemName, true, 20);
|
|
|
|
Atr_Process_Historydata ();
|
|
Atr_FindBestHistoricalAuction ();
|
|
|
|
Atr_DisplayHlist(); -- for the highlight
|
|
|
|
if (cacheHit) then
|
|
Atr_OnSearchComplete();
|
|
end
|
|
|
|
PlaySound ("igMainMenuOptionCheckBoxOn");
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowWhichRB (id)
|
|
|
|
if (gCurrentPane.activeSearch.processing_state ~= KM_NULL_STATE) then -- if we're scanning auctions don't respond
|
|
return;
|
|
end
|
|
|
|
PlaySound("igMainMenuOptionCheckBoxOn");
|
|
|
|
if (id == 1) then
|
|
gCurrentPane:SetToShowCurrent();
|
|
elseif (id == 2) then
|
|
gCurrentPane:SetToShowHistory();
|
|
else
|
|
gCurrentPane:SetToShowHints();
|
|
end
|
|
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_RedisplayAuctions ()
|
|
|
|
if (Atr_ShowingSearchSummary()) then
|
|
Atr_ShowSearchSummary();
|
|
elseif (Atr_ShowingCurrentAuctions()) then
|
|
Atr_ShowCurrentAuctions();
|
|
elseif Atr_ShowingHistory() then
|
|
Atr_ShowHistory();
|
|
else
|
|
Atr_ShowHints();
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_BuildHistItemText(data)
|
|
|
|
local stacktext = "";
|
|
-- if (data.stackSize > 1) then
|
|
-- stacktext = " (stack of "..data.stackSize..")";
|
|
-- end
|
|
|
|
local now = time();
|
|
local nowtime = date ("*t");
|
|
|
|
local when = data.when;
|
|
local whentime = date ("*t", when);
|
|
|
|
local numauctions = data.stackSize;
|
|
|
|
local datestr = "";
|
|
|
|
if (data.type == "hy") then
|
|
return ZT("average of your auctions for").." "..whentime.year;
|
|
elseif (data.type == "hm") then
|
|
if (nowtime.year == whentime.year) then
|
|
return ZT("average of your auctions for").." "..date("%B", when);
|
|
else
|
|
return ZT("average of your auctions for").." "..date("%B %Y", when);
|
|
end
|
|
elseif (data.type == "hd") then
|
|
return ZT("average of your auctions for").." "..monthDay(whentime);
|
|
else
|
|
return ZT("your auction on").." "..monthDay(whentime)..date(" at %I:%M %p", when);
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function monthDay (when)
|
|
|
|
local t = time(when);
|
|
|
|
local s = date("%b ", t);
|
|
|
|
return s..when.day;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowLineTooltip (self)
|
|
|
|
local itemLink = self.itemLink;
|
|
|
|
if (itemLink) then
|
|
GameTooltip:SetOwner(self, "ANCHOR_RIGHT", -280);
|
|
GameTooltip:SetHyperlink (itemLink, 1);
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_HideLineTooltip (self)
|
|
GameTooltip:Hide();
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Onclick_Back ()
|
|
|
|
gCurrentPane.activeScan = Atr_FindScan (nil);
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Onclick_Col1 ()
|
|
|
|
if (not Atr_ShowingSearchSummary()) then -- list of auctions: flip cheapest-first / most-expensive-first
|
|
local scn = gCurrentPane.activeScan;
|
|
if (scn and not scn:IsNil()) then
|
|
local key = Atr_PickKey (scn, gCurrentPane.currIndex);
|
|
gAtr_PriceSortDesc = not gAtr_PriceSortDesc;
|
|
scn:CondenseAndSort ();
|
|
gCurrentPane.currIndex = Atr_FindPickKey (scn, key);
|
|
FauxScrollFrame_SetOffset (AuctionatorScrollFrame, 0);
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
PlaySound ("igMainMenuOptionCheckBoxOn");
|
|
end
|
|
return;
|
|
end
|
|
|
|
if (gCurrentPane.activeSearch) then
|
|
gCurrentPane.activeSearch:ClickPriceCol();
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Onclick_Col3 ()
|
|
|
|
if (gCurrentPane.activeSearch) then
|
|
gCurrentPane.activeSearch:ClickNameCol();
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowSearchSummary()
|
|
|
|
Atr_Col1_Heading_Button:SetText (ZT("Lowest Price"));
|
|
Atr_Col1_Heading:Hide();
|
|
Atr_Col3_Heading:Hide();
|
|
Atr_Col1_Heading_Button:Show();
|
|
Atr_Col3_Heading_Button:Show();
|
|
Atr_Col4_Heading:Show();
|
|
|
|
gCurrentPane.activeSearch:UpdateArrows ();
|
|
|
|
local numrows = gCurrentPane.activeSearch:NumScans();
|
|
|
|
if (gCurrentPane.activeScan.hasStack) then
|
|
Atr_Col4_Heading:SetText (ZT("Total Price"));
|
|
else
|
|
Atr_Col4_Heading:SetText ("");
|
|
end
|
|
|
|
local highIndex = 0;
|
|
local line = 0; -- 1 through 12 of our window to scroll
|
|
local dataOffset = FauxScrollFrame_GetOffset (AuctionatorScrollFrame); -- an index into our data calculated from the scroll offset
|
|
|
|
FauxScrollFrame_Update (AuctionatorScrollFrame, numrows, 12, 16);
|
|
|
|
while (line < 12) do
|
|
|
|
dataOffset = dataOffset + 1;
|
|
line = line + 1;
|
|
|
|
local lineEntry = getglobal ("AuctionatorEntry"..line);
|
|
|
|
lineEntry:SetID(dataOffset);
|
|
|
|
local scn;
|
|
|
|
if (gCurrentPane.activeSearch and gCurrentPane.activeSearch:NumSortedScans() > 0) then
|
|
scn = gCurrentPane.activeSearch.sortedScans[dataOffset];
|
|
end
|
|
|
|
if (dataOffset > numrows or not scn) then
|
|
|
|
lineEntry:Hide();
|
|
|
|
else
|
|
local data = scn.absoluteBest;
|
|
|
|
local lineEntry_item_tag = "AuctionatorEntry"..line.."_PerItem_Price";
|
|
|
|
local lineEntry_item = getglobal(lineEntry_item_tag);
|
|
local lineEntry_itemtext = getglobal("AuctionatorEntry"..line.."_PerItem_Text");
|
|
local lineEntry_text = getglobal("AuctionatorEntry"..line.."_EntryText");
|
|
local lineEntry_stack = getglobal("AuctionatorEntry"..line.."_StackPrice");
|
|
|
|
lineEntry_itemtext:SetText ("");
|
|
lineEntry_text:SetText ("");
|
|
lineEntry_stack:SetText ("");
|
|
Atr_ShowRowStackMoney (lineEntry, nil);
|
|
|
|
lineEntry_text:GetParent():SetPoint ("LEFT", 157, 0);
|
|
|
|
Atr_SetMFcolor (lineEntry_item_tag);
|
|
|
|
lineEntry:Show();
|
|
|
|
lineEntry.itemLink = scn.itemLink;
|
|
|
|
local r = scn.itemTextColor[1];
|
|
local g = scn.itemTextColor[2];
|
|
local b = scn.itemTextColor[3];
|
|
|
|
lineEntry_text:SetTextColor (r, g, b);
|
|
lineEntry_stack:SetTextColor (1, 1, 1);
|
|
|
|
local icon = Atr_GetUCIcon (scn.itemName);
|
|
|
|
lineEntry_text:SetText (icon.." "..scn.itemName);
|
|
lineEntry_stack:SetText (scn:GetNumAvailable().." "..ZT("available"));
|
|
|
|
if (data == nil or data.buyoutPrice == 0) then
|
|
lineEntry_item:Hide();
|
|
lineEntry_itemtext:Show();
|
|
lineEntry_itemtext:SetText (ZT("no buyout price"));
|
|
else
|
|
lineEntry_item:Show();
|
|
lineEntry_itemtext:Hide();
|
|
MoneyFrame_Update (lineEntry_item_tag, zc.round(data.buyoutPrice/data.stackSize) );
|
|
end
|
|
|
|
if (zc.StringSame (scn.itemName , gCurrentPane.SS_hilite_itemName)) then
|
|
highIndex = dataOffset;
|
|
end
|
|
|
|
|
|
end
|
|
end
|
|
|
|
Atr_HighlightEntry (highIndex); -- need this for when called from onVerticalScroll
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowCurrentAuctions()
|
|
|
|
Atr_Col1_Heading:Hide();
|
|
Atr_Col3_Heading:Hide();
|
|
Atr_Col4_Heading:Hide();
|
|
Atr_Col1_Heading_Button:Hide();
|
|
Atr_Col3_Heading_Button:Hide();
|
|
|
|
|
|
local numrows = getn(gCurrentPane.activeScan.sortedData);
|
|
|
|
if (numrows > 0) then
|
|
Atr_Col1_Heading_Button:SetText (ZT("Item Price")); -- clickable: flips the price order
|
|
Atr_Col1_Heading_Button:Show();
|
|
Atr_Col1_Heading_ButtonArrow:Show();
|
|
if (gAtr_PriceSortDesc) then
|
|
Atr_Col1_Heading_ButtonArrow:SetTexCoord (0, 0.5625, 1.0, 0);
|
|
else
|
|
Atr_Col1_Heading_ButtonArrow:SetTexCoord (0, 0.5625, 0, 1.0);
|
|
end
|
|
Atr_Col3_Heading:Show();
|
|
Atr_Col4_Heading:Show();
|
|
end
|
|
|
|
Atr_Col1_Heading:SetText (ZT("Item Price"));
|
|
Atr_Col3_Heading:SetText (ZT("Current Auctions"));
|
|
|
|
if (gCurrentPane.activeScan.hasStack) then
|
|
Atr_Col4_Heading:SetText (ZT("Stack Price"));
|
|
else
|
|
Atr_Col4_Heading:SetText ("");
|
|
end
|
|
|
|
local line = 0; -- 1 through 12 of our window to scroll
|
|
local dataOffset = FauxScrollFrame_GetOffset (AuctionatorScrollFrame); -- an index into our data calculated from the scroll offset
|
|
|
|
FauxScrollFrame_Update (AuctionatorScrollFrame, numrows, 12, 16);
|
|
|
|
while (line < 12) do
|
|
|
|
dataOffset = dataOffset + 1;
|
|
line = line + 1;
|
|
|
|
local lineEntry = getglobal ("AuctionatorEntry"..line);
|
|
|
|
lineEntry:SetID(dataOffset);
|
|
|
|
lineEntry.itemLink = nil;
|
|
|
|
if (dataOffset > numrows or not gCurrentPane.activeScan.sortedData[dataOffset]) then
|
|
|
|
lineEntry:Hide();
|
|
|
|
else
|
|
local data = gCurrentPane.activeScan.sortedData[dataOffset];
|
|
|
|
local lineEntry_item_tag = "AuctionatorEntry"..line.."_PerItem_Price";
|
|
|
|
local lineEntry_item = getglobal(lineEntry_item_tag);
|
|
local lineEntry_itemtext = getglobal("AuctionatorEntry"..line.."_PerItem_Text");
|
|
local lineEntry_text = getglobal("AuctionatorEntry"..line.."_EntryText");
|
|
local lineEntry_stack = getglobal("AuctionatorEntry"..line.."_StackPrice");
|
|
|
|
lineEntry_itemtext:SetText ("");
|
|
lineEntry_text:SetText ("");
|
|
lineEntry_stack:SetText ("");
|
|
Atr_ShowRowStackMoney (lineEntry, nil);
|
|
|
|
lineEntry_text:GetParent():SetPoint ("LEFT", 172, 0);
|
|
|
|
Atr_SetMFcolor (lineEntry_item_tag);
|
|
|
|
local entrytext = "";
|
|
|
|
if (data.type == "n") then
|
|
|
|
lineEntry:Show();
|
|
|
|
if (data.count == 1) then
|
|
entrytext = string.format ("%i %s %i", data.count, ZT ("stack of"), data.stackSize);
|
|
else
|
|
entrytext = string.format ("%i %s %i", data.count, ZT ("stacks of"), data.stackSize);
|
|
end
|
|
|
|
lineEntry_text:SetTextColor (0.6, 0.6, 0.6);
|
|
|
|
if ( data.stackSize == Atr_StackSize() or Atr_StackSize() == 0 or gCurrentPane ~= gSellPane) then
|
|
lineEntry_text:SetTextColor (1.0, 1.0, 1.0);
|
|
end
|
|
|
|
if (data.yours) then
|
|
entrytext = entrytext.." ("..ZT("yours")..")";
|
|
elseif (data.altname) then
|
|
entrytext = entrytext.." ("..data.altname..")";
|
|
end
|
|
|
|
-- local ccc = zc.If (data.minpage ~= data.maxpage, "|cffff8888", "");
|
|
-- entrytext = zc.msg_str (entrytext, " ", ccc, data.minpage, " / ", data.maxpage, " ", gCurrentPane.activeScan.searchWasExact);
|
|
|
|
lineEntry_text:SetText (entrytext);
|
|
|
|
if (data.buyoutPrice == 0) then
|
|
lineEntry_item:Hide();
|
|
lineEntry_itemtext:Show();
|
|
lineEntry_itemtext:SetText (ZT("no buyout price"));
|
|
else
|
|
lineEntry_item:Show();
|
|
lineEntry_itemtext:Hide();
|
|
MoneyFrame_Update (lineEntry_item_tag, zc.round(data.buyoutPrice/data.stackSize) );
|
|
|
|
if (data.stackSize > 1) then
|
|
Atr_ShowRowStackMoney (lineEntry, data.buyoutPrice);
|
|
end
|
|
end
|
|
|
|
else
|
|
zc.msg_red ("Unknown datatype:");
|
|
zc.msg_red (data.type);
|
|
end
|
|
end
|
|
end
|
|
|
|
Atr_HighlightEntry (gCurrentPane.currIndex); -- need this for when called from onVerticalScroll
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_ShowHistory ()
|
|
|
|
if (gCurrentPane.sortedHist == nil) then
|
|
Atr_Process_Historydata ();
|
|
Atr_FindBestHistoricalAuction ();
|
|
end
|
|
|
|
Atr_Col1_Heading:Hide();
|
|
Atr_Col1_Heading_Button:Hide();
|
|
Atr_Col3_Heading_Button:Hide();
|
|
Atr_Col3_Heading:Hide();
|
|
Atr_Col4_Heading:Hide();
|
|
|
|
Atr_Col3_Heading:SetText (ZT("History"));
|
|
|
|
local numrows = gCurrentPane.sortedHist and getn(gCurrentPane.sortedHist) or 0;
|
|
|
|
--zc.msg ("gCurrentPane.sortedHist: "..numrows,1,0,0);
|
|
|
|
if (numrows > 0) then
|
|
Atr_Col1_Heading:Show();
|
|
Atr_Col3_Heading:Show();
|
|
end
|
|
|
|
local line; -- 1 through 12 of our window to scroll
|
|
local dataOffset; -- an index into our data calculated from the scroll offset
|
|
|
|
FauxScrollFrame_Update (AuctionatorScrollFrame, numrows, 12, 16);
|
|
|
|
for line = 1,12 do
|
|
|
|
dataOffset = line + FauxScrollFrame_GetOffset (AuctionatorScrollFrame);
|
|
|
|
local lineEntry = getglobal ("AuctionatorEntry"..line);
|
|
|
|
lineEntry:SetID(dataOffset);
|
|
|
|
if (dataOffset <= numrows and gCurrentPane.sortedHist[dataOffset]) then
|
|
|
|
local data = gCurrentPane.sortedHist[dataOffset];
|
|
|
|
local lineEntry_item_tag = "AuctionatorEntry"..line.."_PerItem_Price";
|
|
|
|
local lineEntry_item = getglobal(lineEntry_item_tag);
|
|
local lineEntry_itemtext = getglobal("AuctionatorEntry"..line.."_PerItem_Text");
|
|
local lineEntry_text = getglobal("AuctionatorEntry"..line.."_EntryText");
|
|
local lineEntry_stack = getglobal("AuctionatorEntry"..line.."_StackPrice");
|
|
|
|
lineEntry_item:Show();
|
|
lineEntry_itemtext:Hide();
|
|
lineEntry_stack:SetText ("");
|
|
Atr_ShowRowStackMoney (lineEntry, nil);
|
|
|
|
Atr_SetMFcolor (lineEntry_item_tag);
|
|
|
|
MoneyFrame_Update (lineEntry_item_tag, zc.round(data.itemPrice) );
|
|
|
|
lineEntry_text:SetText (Atr_BuildHistItemText (data));
|
|
lineEntry_text:SetTextColor (0.8, 0.8, 1.0);
|
|
|
|
lineEntry:Show();
|
|
else
|
|
lineEntry:Hide();
|
|
end
|
|
end
|
|
|
|
if (Atr_IsTabSelected (SELL_TAB)) then
|
|
Atr_HighlightEntry (gCurrentPane.histIndex); -- need this for when called from onVerticalScroll
|
|
else
|
|
Atr_HighlightEntry (-1);
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_FindBestCurrentAuction()
|
|
|
|
local scan = gCurrentPane.activeScan;
|
|
|
|
if (gCurrentPane.pickKey) then -- keep the row the user picked while the search was running
|
|
local idx = Atr_FindPickKey (scan, gCurrentPane.pickKey);
|
|
if (idx) then
|
|
gCurrentPane.currIndex = idx;
|
|
return;
|
|
end
|
|
gCurrentPane.pickKey = nil;
|
|
end
|
|
|
|
|
|
if (Atr_IsModeCreateAuction()) then gCurrentPane.currIndex = scan:FindCheapest ();
|
|
elseif (Atr_IsModeBuy()) then gCurrentPane.currIndex = scan:FindCheapest ();
|
|
else gCurrentPane.currIndex = scan:FindMatchByYours ();
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_FindBestHistoricalAuction()
|
|
|
|
gCurrentPane.histIndex = nil;
|
|
|
|
if (gCurrentPane.sortedHist and getn(gCurrentPane.sortedHist) > 0) then
|
|
gCurrentPane.histIndex = 1;
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_HighlightEntry(entryIndex)
|
|
|
|
local line; -- 1 through 12 of our window to scroll
|
|
|
|
for line = 1,12 do
|
|
|
|
local lineEntry = getglobal ("AuctionatorEntry"..line);
|
|
|
|
if (lineEntry:GetID() == entryIndex) then
|
|
Atr_SetRowSelected (lineEntry, true);
|
|
else
|
|
Atr_SetRowSelected (lineEntry, false);
|
|
end
|
|
end
|
|
|
|
local doEnableCancel = false;
|
|
local doEnableBuy = false;
|
|
local data;
|
|
|
|
if (Atr_ShowingCurrentAuctions() and entryIndex ~= nil and entryIndex > 0 and entryIndex <= getn(gCurrentPane.activeScan.sortedData)) then
|
|
data = gCurrentPane.activeScan.sortedData[entryIndex];
|
|
if (data.yours) then
|
|
doEnableCancel = true;
|
|
end
|
|
|
|
if (not data.yours and not data.altname and data.buyoutPrice > 0) then
|
|
doEnableBuy = true;
|
|
end
|
|
end
|
|
|
|
Atr_Buy1_Button:Disable();
|
|
Atr_CancelSelectionButton:Disable();
|
|
|
|
if (doEnableCancel) then
|
|
Atr_CancelSelectionButton:Enable();
|
|
|
|
if (data.count == 1) then
|
|
Atr_CancelSelectionButton:SetText (CANCEL_AUCTION);
|
|
else
|
|
Atr_CancelSelectionButton:SetText (ZT("Cancel Auctions"));
|
|
end
|
|
end
|
|
|
|
if (doEnableBuy) then
|
|
Atr_Buy1_Button:Enable();
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_EntryOnClick()
|
|
|
|
local entryIndex = this:GetID();
|
|
|
|
if (Atr_ShowingSearchSummary()) then
|
|
elseif (Atr_ShowingCurrentAuctions()) then gCurrentPane.currIndex = entryIndex;
|
|
gCurrentPane.pickKey = Atr_PickKey (gCurrentPane.activeScan, entryIndex);
|
|
elseif (Atr_ShowingHistory()) then gCurrentPane.histIndex = entryIndex;
|
|
else gCurrentPane.hintsIndex = entryIndex;
|
|
end
|
|
|
|
if (Atr_ShowingSearchSummary()) then
|
|
local scn = gCurrentPane.activeSearch.sortedScans[entryIndex];
|
|
|
|
FauxScrollFrame_SetOffset (AuctionatorScrollFrame, 0);
|
|
gCurrentPane.activeScan = scn;
|
|
gCurrentPane.pickKey = nil;
|
|
gCurrentPane.currIndex = scn:FindMatchByYours ();
|
|
gCurrentPane.SS_hilite_itemName = scn.itemName;
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
else
|
|
Atr_HighlightEntry (entryIndex);
|
|
Atr_UpdateRecommendation(true);
|
|
end
|
|
|
|
PlaySound ("igMainMenuOptionCheckBoxOn");
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function AuctionatorMoneyFrame_OnLoad()
|
|
|
|
this.small = 1;
|
|
MoneyFrame_SetType("AUCTION");
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_GetNumItemInBags (theItemName)
|
|
|
|
return Atr_CountItemInBags (theItemName);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CancelAuction(x)
|
|
|
|
CancelAuction(x);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_LogCancelAuction(numCancelled, itemLink, stackSize)
|
|
|
|
local SSstring = "";
|
|
if (stackSize and stackSize > 1) then
|
|
SSstring = "|cff00ddddx"..stackSize;
|
|
end
|
|
|
|
if (numCancelled > 1) then
|
|
zc.msg_yellow (numCancelled..ZT(" auctions cancelled for ")..itemLink..SSstring);
|
|
elseif (numCancelled == 1) then
|
|
zc.msg_yellow (ZT("Auction cancelled for ")..itemLink..SSstring);
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CancelSelection_OnClick()
|
|
|
|
if (not Atr_ShowingCurrentAuctions()) then
|
|
return;
|
|
end
|
|
|
|
Atr_CancelAuction_ByIndex (gCurrentPane.currIndex);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CancelAuction_ByIndex(index)
|
|
|
|
local data = gCurrentPane.activeScan.sortedData[index];
|
|
|
|
if (not data.yours) then
|
|
return;
|
|
end
|
|
|
|
local numCancelled = 0;
|
|
local itemLink = gCurrentPane.activeScan.itemLink;
|
|
|
|
local i = 1;
|
|
|
|
while (true) do
|
|
local name, texture, count, quality, canUse, level,
|
|
minBid, minIncrement, buyoutPrice, bidAmount,
|
|
highBidder, owner = GetAuctionItemInfo ("owner", i);
|
|
|
|
if (name == nil) then
|
|
break;
|
|
end
|
|
|
|
if (name == gCurrentPane.activeScan.itemName and buyoutPrice == data.buyoutPrice and count == data.stackSize) then
|
|
Atr_CancelAuction (i);
|
|
numCancelled = numCancelled + 1;
|
|
AuctionatorSubtractFromScan (name, count, buyoutPrice);
|
|
gJustPosted_ItemName = nil;
|
|
end
|
|
|
|
i = i + 1;
|
|
end
|
|
|
|
Atr_LogCancelAuction (numCancelled, itemLink, data.stackSize);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_StackingPrefs_Init ()
|
|
|
|
AUCTIONATOR_STACKING_PREFS = {};
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Has_StackingPrefs (key)
|
|
|
|
local lkey = string.lower(key);
|
|
|
|
return (AUCTIONATOR_STACKING_PREFS[lkey] ~= nil);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Clear_StackingPrefs (key)
|
|
|
|
local lkey = string.lower(key);
|
|
|
|
AUCTIONATOR_STACKING_PREFS[lkey] = nil;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Get_StackingPrefs (key)
|
|
|
|
local lkey = string.lower(key);
|
|
|
|
if (Atr_Has_StackingPrefs(lkey)) then
|
|
return AUCTIONATOR_STACKING_PREFS[lkey].numstacks, AUCTIONATOR_STACKING_PREFS[lkey].stacksize;
|
|
end
|
|
|
|
return nil, nil;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Set_StackingPrefs_numstacks (key, numstacks)
|
|
|
|
local lkey = string.lower(key);
|
|
|
|
if (not Atr_Has_StackingPrefs(lkey)) then
|
|
AUCTIONATOR_STACKING_PREFS[lkey] = { stacksize = 0 };
|
|
end
|
|
|
|
AUCTIONATOR_STACKING_PREFS[lkey].numstacks = zc.Val (numstacks, 1);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Set_StackingPrefs_stacksize (key, stacksize)
|
|
|
|
local lkey = string.lower(key);
|
|
|
|
if (not Atr_Has_StackingPrefs(lkey)) then
|
|
AUCTIONATOR_STACKING_PREFS[lkey] = { numstacks = 0};
|
|
end
|
|
|
|
AUCTIONATOR_STACKING_PREFS[lkey].stacksize = zc.Val (stacksize, 1);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_GetStackingPrefs_ByItem (itemLink)
|
|
|
|
if (itemLink) then
|
|
|
|
local itemName = Atr_GetItemInfo (itemLink);
|
|
local text, spinfo;
|
|
|
|
for text, spinfo in pairs (AUCTIONATOR_STACKING_PREFS) do
|
|
|
|
if (zc.StringContains (itemName, text)) then
|
|
return spinfo.numstacks, spinfo.stacksize;
|
|
end
|
|
end
|
|
|
|
if (Atr_IsGlyph (itemLink)) then return Atr_Special_SP (ATR_SK_GLYPHS, 0, 1);
|
|
elseif (Atr_IsCutGem (itemLink)) then return Atr_Special_SP (ATR_SK_GEMS_CUT, 0, 1);
|
|
elseif (Atr_IsGem (itemLink)) then return Atr_Special_SP (ATR_SK_GEMS_UNCUT, 1, 0);
|
|
elseif (Atr_IsItemEnhancement (itemLink)) then return Atr_Special_SP (ATR_SK_ITEM_ENH, 0, 1);
|
|
elseif (Atr_IsPotion (itemLink) or Atr_IsElixir (itemLink)) then return Atr_Special_SP (ATR_SK_POT_ELIX, 1, 0);
|
|
elseif (Atr_IsFlask (itemLink)) then return Atr_Special_SP (ATR_SK_FLASKS, 1, 0);
|
|
elseif (Atr_IsHerb (itemLink)) then return Atr_Special_SP (ATR_SK_HERBS, 1, 0);
|
|
end
|
|
end
|
|
|
|
return nil, nil;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Special_SP (key, numstack, stacksize)
|
|
|
|
if (Atr_Has_StackingPrefs (key)) then
|
|
return Atr_Get_StackingPrefs(key);
|
|
end
|
|
|
|
return numstack, stacksize;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_GetSellStacking (itemLink, numDragged, numTotal)
|
|
|
|
local prefNumStacks, prefStackSize = Atr_GetStackingPrefs_ByItem (itemLink);
|
|
|
|
if (prefNumStacks == nil) then
|
|
return 1, numDragged;
|
|
end
|
|
|
|
if (prefNumStacks <= 0 and prefStackSize <= 0) then -- shouldn't happen but just in case
|
|
prefStackSize = 1;
|
|
end
|
|
|
|
--zc.msg (prefNumStacks, prefStackSize);
|
|
|
|
local numStacks = prefNumStacks;
|
|
local stackSize = prefStackSize;
|
|
local numToSell = numDragged;
|
|
|
|
if (numStacks == -1) then -- max number of stacks
|
|
numToSell = numTotal;
|
|
|
|
elseif (stackSize == 0) then -- auto stacksize
|
|
stackSize = math.floor (numDragged / numStacks);
|
|
|
|
elseif (numStacks > 0) then
|
|
numToSell = math.min (numStacks * stackSize, numTotal);
|
|
end
|
|
|
|
numStacks = math.floor (numToSell / stackSize);
|
|
|
|
--zc.msg_pink (numStacks, stackSize);
|
|
|
|
if (numStacks == 0) then
|
|
numStacks = 1;
|
|
stackSize = numToSell;
|
|
--zc.msg_red (numStacks, stackSize);
|
|
end
|
|
|
|
return numStacks, stackSize;
|
|
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
local gInitial_NumStacks;
|
|
local gInitial_StackSize;
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetInitialStacking (numStacks, stackSize)
|
|
|
|
gInitial_NumStacks = numStacks;
|
|
gInitial_StackSize = stackSize;
|
|
|
|
Atr_Batch_NumAuctions:SetText (numStacks);
|
|
Atr_SetStackSize (stackSize);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Memorize_Stacking_If ()
|
|
|
|
local newNumStacks = Atr_Batch_NumAuctions:GetNumber();
|
|
local newStackSize = Atr_StackSize();
|
|
|
|
local numStacksChanged = (tonumber (gInitial_NumStacks) ~= newNumStacks);
|
|
local stackSizeChanged = (tonumber (gInitial_StackSize) ~= newStackSize);
|
|
|
|
if (stackSizeChanged) then
|
|
|
|
local itemName = string.lower(gCurrentPane.activeScan.itemName);
|
|
|
|
if (itemName) then
|
|
|
|
-- see if user is trying to set it back to default
|
|
|
|
if (newNumStacks == 1) then
|
|
local _, _, auctionCount = GetAuctionSellItemInfo();
|
|
if (auctionCount == newStackSize) then
|
|
Atr_Clear_StackingPrefs (itemName);
|
|
return;
|
|
end
|
|
end
|
|
|
|
-- else remember the new stack size
|
|
|
|
Atr_Set_StackingPrefs_stacksize (itemName, Atr_StackSize());
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Duration_OnLoad(self)
|
|
UIDropDownMenu_Initialize (self, Atr_Duration_Initialize);
|
|
UIDropDownMenu_SetSelectedValue (Atr_Duration, 1);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Duration_OnShow(self)
|
|
UIDropDownMenu_Initialize (self, Atr_Duration_Initialize);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Duration_Initialize()
|
|
|
|
local info = UIDropDownMenu_CreateInfo();
|
|
local i;
|
|
|
|
for i = 1, 3 do
|
|
info.text = AtrNS.durationText[i];
|
|
info.value = i;
|
|
info.checked = nil;
|
|
info.func = Atr_Duration_OnClick;
|
|
UIDropDownMenu_AddButton(info);
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Duration_OnClick()
|
|
|
|
UIDropDownMenu_SetSelectedValue(Atr_Duration, this.value);
|
|
Atr_SetDepositText();
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_DropDown1_OnLoad (self)
|
|
UIDropDownMenu_Initialize(self, Atr_DropDown1_Initialize);
|
|
UIDropDownMenu_SetSelectedValue(Atr_DropDown1, MODE_LIST_ACTIVE);
|
|
Atr_DropDown1:Show();
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_DropDown1_Initialize()
|
|
local info = UIDropDownMenu_CreateInfo();
|
|
|
|
info.text = ZT("Active Items");
|
|
info.value = MODE_LIST_ACTIVE;
|
|
info.func = Atr_DropDown1_OnClick;
|
|
info.owner = Atr_DropDown1;
|
|
info.checked = nil;
|
|
UIDropDownMenu_AddButton(info);
|
|
|
|
info.text = ZT("All Items");
|
|
info.value = MODE_LIST_ALL;
|
|
info.func = Atr_DropDown1_OnClick;
|
|
info.owner = Atr_DropDown1;
|
|
info.checked = nil;
|
|
UIDropDownMenu_AddButton(info);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_DropDown1_OnClick()
|
|
|
|
UIDropDownMenu_SetSelectedValue(this.owner, this.value);
|
|
|
|
local mode = this.value;
|
|
|
|
if (mode == MODE_LIST_ALL) then
|
|
Atr_DisplayHlist();
|
|
end
|
|
|
|
if (mode == MODE_LIST_ACTIVE) then
|
|
Atr_DisplayHlist();
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_AddMenuPick (info, text, value, func)
|
|
|
|
info.text = text;
|
|
info.value = value;
|
|
info.func = func;
|
|
info.checked = nil;
|
|
info.owner = getglobal (UIDROPDOWNMENU_INIT_MENU);
|
|
UIDropDownMenu_AddButton(info);
|
|
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_IsTabSelected(whichTab)
|
|
|
|
if (not AuctionFrame or not AuctionFrame:IsShown()) then
|
|
return false;
|
|
end
|
|
|
|
if (not whichTab) then
|
|
return (Atr_IsTabSelected(SELL_TAB) or Atr_IsTabSelected(MORE_TAB) or Atr_IsTabSelected(BUY_TAB));
|
|
end
|
|
|
|
return (PanelTemplates_GetSelectedTab (AuctionFrame) == Atr_FindTabIndex(whichTab));
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_IsAuctionatorTab (tabIndex)
|
|
|
|
if (tabIndex == Atr_FindTabIndex(SELL_TAB) or tabIndex == Atr_FindTabIndex(MORE_TAB) or tabIndex == Atr_FindTabIndex(BUY_TAB) ) then
|
|
|
|
return true;
|
|
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Confirm_Yes()
|
|
|
|
if (Atr_Confirm_Proc_Yes) then
|
|
Atr_Confirm_Proc_Yes();
|
|
Atr_Confirm_Proc_Yes = nil;
|
|
end
|
|
|
|
Atr_Confirm_Frame:Hide();
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Confirm_No()
|
|
|
|
Atr_Confirm_Frame:Hide();
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_AddHistoricalPrice (itemName, price, stacksize, itemLink, testwhen)
|
|
|
|
if (not AUCTIONATOR_PRICING_HISTORY[itemName] ) then
|
|
AUCTIONATOR_PRICING_HISTORY[itemName] = {};
|
|
end
|
|
|
|
local itemId, suffixId, uniqueId = zc.ItemIDfromLink (itemLink);
|
|
|
|
local is = itemId;
|
|
|
|
if (suffixId ~= 0) then
|
|
is = is..":"..suffixId;
|
|
if (tonumber(suffixId) < 0) then
|
|
is = is..":"..uniqueId;
|
|
end
|
|
end
|
|
|
|
AUCTIONATOR_PRICING_HISTORY[itemName]["is"] = is;
|
|
|
|
local hist = tostring (zc.round (price))..":"..stacksize;
|
|
|
|
local roundtime = floor (time() / 60) * 60; -- so multiple auctions close together don't generate too many entries
|
|
|
|
local tag = tostring(ToTightTime(roundtime));
|
|
|
|
if (testwhen) then
|
|
tag = tostring(ToTightTime(testwhen));
|
|
end
|
|
|
|
AUCTIONATOR_PRICING_HISTORY[itemName][tag] = hist;
|
|
|
|
gCurrentPane.sortedHist = nil;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_HasHistoricalData (itemName)
|
|
|
|
if (AUCTIONATOR_PRICING_HISTORY[itemName] ) then
|
|
return true;
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_BuildGlobalHistoryList(full)
|
|
|
|
gHistoryItemList = {};
|
|
|
|
local n = 1;
|
|
|
|
if (full) then
|
|
for name,hist in pairs (AUCTIONATOR_PRICING_HISTORY) do
|
|
gHistoryItemList[n] = name;
|
|
n = n + 1;
|
|
end
|
|
else
|
|
if (zc.tableIsEmpty (gActiveAuctions)) then
|
|
Atr_BuildActiveAuctions();
|
|
end
|
|
|
|
local name;
|
|
for name, count in pairs (gActiveAuctions) do
|
|
if (name and count ~= 0) then
|
|
gHistoryItemList[n] = name;
|
|
n = n + 1;
|
|
end
|
|
end
|
|
end
|
|
|
|
table.sort (gHistoryItemList);
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_FindHListIndexByName (itemName)
|
|
|
|
local x;
|
|
|
|
for x = 1, getn(gHistoryItemList) do
|
|
if (itemName == gHistoryItemList[x]) then
|
|
return x;
|
|
end
|
|
end
|
|
|
|
return 0;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
local gAtr_CheckingActive_State = ATR_CACT_NULL;
|
|
local gAtr_CheckingActive_Index;
|
|
local gAtr_CheckingActive_NextItemName;
|
|
local gAtr_CheckingActive_AndCancel = false;
|
|
|
|
gAtr_CheckingActive_NumUndercuts = 0;
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CheckActive_OnClick (andCancel)
|
|
|
|
if (gAtr_CheckingActive_State == ATR_CACT_NULL) then
|
|
|
|
Atr_CheckActiveList (andCancel);
|
|
--[[
|
|
if (andCancel == nil) then
|
|
Atr_CheckActives_Frame:Show();
|
|
else
|
|
Atr_CheckActives_Frame:Hide();
|
|
Atr_CheckActiveList (andCancel);
|
|
end
|
|
]]--
|
|
else -- stop checking
|
|
Atr_CheckingActive_Finish ();
|
|
gCurrentPane.activeSearch:Abort();
|
|
gCurrentPane:ClearSearch();
|
|
Atr_SetMessage(ZT("Checking stopped"));
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CheckActiveList (andCancel)
|
|
|
|
gAtr_CheckingActive_State = ATR_CACT_READY;
|
|
gAtr_CheckingActive_NextItemName = gHistoryItemList[1];
|
|
gAtr_CheckingActive_AndCancel = andCancel;
|
|
gAtr_CheckingActive_NumUndercuts = 0;
|
|
|
|
gCurrentPane:SetToShowCurrent();
|
|
|
|
Atr_CheckingActiveIdle ();
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CheckingActive_Finish()
|
|
|
|
gAtr_CheckingActive_State = ATR_CACT_NULL; -- done
|
|
|
|
Atr_CheckActiveButton:SetText(ZT("Check for Undercuts"));
|
|
|
|
end
|
|
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CheckingActiveIdle()
|
|
|
|
if (gAtr_CheckingActive_State == ATR_CACT_READY) then
|
|
|
|
if (gAtr_CheckingActive_NextItemName == nil) then
|
|
|
|
Atr_CheckingActive_Finish ();
|
|
|
|
if (gAtr_CheckingActive_NumUndercuts > 0) then
|
|
Atr_CheckActives_Frame:Show();
|
|
end
|
|
|
|
else
|
|
gAtr_CheckingActive_State = ATR_CACT_PROCESSING;
|
|
|
|
Atr_CheckActiveButton:SetText(ZT("Stop Checking"));
|
|
|
|
local itemName = gAtr_CheckingActive_NextItemName;
|
|
|
|
local x = Atr_FindHListIndexByName (itemName);
|
|
gAtr_CheckingActive_NextItemName = (x > 0 and getn(gHistoryItemList) >= x+1) and gHistoryItemList[x+1] or nil;
|
|
|
|
local cacheHit = gCurrentPane:DoSearch (itemName, true, 15);
|
|
|
|
Atr_Hilight_Hentry (itemName);
|
|
|
|
if (cacheHit) then
|
|
Atr_CheckingActive_OnSearchComplete();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CheckActive_IsBusy()
|
|
|
|
return (gAtr_CheckingActive_State ~= ATR_CACT_NULL);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CheckingActive_OnSearchComplete()
|
|
|
|
if (gAtr_CheckingActive_State == ATR_CACT_PROCESSING) then
|
|
|
|
if (gAtr_CheckingActive_AndCancel) then
|
|
zc.AddDeferredCall (0.1, "Atr_CheckingActive_CheckCancel"); -- need to defer so UI can update and show auctions about to be canceled
|
|
else
|
|
zc.AddDeferredCall (0.1, "Atr_CheckingActive_Next"); -- need to defer so UI can update
|
|
end
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CheckingActive_CheckCancel()
|
|
|
|
if (gAtr_CheckingActive_State == ATR_CACT_PROCESSING) then
|
|
|
|
Atr_CancelUndercuts_CurrentScan(false);
|
|
|
|
if (gAtr_CheckingActive_State ~= ATR_CACT_WAITING_ON_CANCEL_CONFIRM) then
|
|
zc.AddDeferredCall (0.1, "Atr_CheckingActive_Next"); -- need to defer so UI can update
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CheckingActive_Next ()
|
|
|
|
if (gAtr_CheckingActive_State == ATR_CACT_PROCESSING) then
|
|
gAtr_CheckingActive_State = ATR_CACT_READY;
|
|
end
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CancelUndercut_Confirm (yesCancel)
|
|
gAtr_CheckingActive_State = ATR_CACT_PROCESSING;
|
|
Atr_CancelAuction_Confirm_Frame:Hide();
|
|
if (yesCancel) then
|
|
Atr_CancelUndercuts_CurrentScan(true);
|
|
end
|
|
zc.AddDeferredCall (0.1, "Atr_CheckingActive_Next");
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CancelUndercuts_CurrentScan(confirmed)
|
|
|
|
local scan = gCurrentPane.activeScan;
|
|
|
|
for x = getn(scan.sortedData),1,-1 do
|
|
|
|
local data = scan.sortedData[x];
|
|
|
|
if (data.yours and data.itemPrice > scan.absoluteBest.itemPrice) then
|
|
|
|
if (not confirmed) then
|
|
gAtr_CheckingActive_State = ATR_CACT_WAITING_ON_CANCEL_CONFIRM;
|
|
Atr_CancelAuction_Confirm_Frame_text:SetText (string.format (ZT("Your auction has been undercut:\n%s%s"), "|cffffffff", scan.itemName));
|
|
Atr_CancelAuction_Confirm_Frame:Show ();
|
|
return;
|
|
end
|
|
|
|
Atr_CancelAuction_ByIndex (x);
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Cancel_Undercuts_OnClick (nameToCancel)
|
|
|
|
local i;
|
|
local num = GetNumAuctionItems ("owner");
|
|
|
|
local cancelled = {};
|
|
|
|
for i = num, 1, -1 do
|
|
local name, _, stackSize, _, _, _, _, _, buyoutPrice = GetAuctionItemInfo ("owner", i);
|
|
|
|
if (name == nil) then
|
|
break;
|
|
end
|
|
|
|
if (nameToCancel == nil or zc.StringSame (name, nameToCancel)) then
|
|
local scan = Atr_FindScan (name);
|
|
if (scan and scan.absoluteBest and scan.whenScanned ~= 0 and scan.yourBestPrice and scan.yourWorstPrice) then
|
|
|
|
local absBestPrice = scan.absoluteBest.itemPrice;
|
|
|
|
local itemPrice = math.floor (buyoutPrice / stackSize);
|
|
|
|
-- zc.md (i, name, "itemPrice: ", itemPrice, "absBestPrice: ", absBestPrice);
|
|
|
|
if (itemPrice > absBestPrice) then
|
|
|
|
Atr_CancelAuction (i);
|
|
|
|
if (cancelled[name] == nil) then
|
|
cancelled[name] = {};
|
|
cancelled[name].num = 0;
|
|
cancelled[name].link = scan.itemLink;
|
|
cancelled[name].stackSize = stackSize;
|
|
end
|
|
|
|
cancelled[name].num = cancelled[name].num + 1;
|
|
|
|
if (scan.yourBestPrice > absBestPrice) then
|
|
gActiveAuctions[name] = nil;
|
|
end
|
|
|
|
AuctionatorSubtractFromScan (name, stackSize, buyoutPrice);
|
|
gJustPosted_ItemName = nil;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local nm, cancelInfo;
|
|
for nm, cancelInfo in pairs (cancelled) do
|
|
Atr_LogCancelAuction (cancelInfo.num, cancelInfo.link, cancelInfo.stackSize);
|
|
end
|
|
|
|
Atr_DisplayHlist();
|
|
Atr_CheckActives_Frame:Hide();
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Hilight_Hentry(itemName)
|
|
|
|
for line = 1,ITEM_HIST_NUM_LINES do
|
|
|
|
dataOffset = line + FauxScrollFrame_GetOffset (Atr_Hlist_ScrollFrame);
|
|
|
|
local lineEntry = getglobal ("AuctionatorHEntry"..line);
|
|
|
|
if (dataOffset <= getn(gHistoryItemList) and gHistoryItemList[dataOffset]) then
|
|
|
|
if (gHistoryItemList[dataOffset] == itemName) then
|
|
Atr_SetRowSelected (lineEntry, true);
|
|
else
|
|
Atr_SetRowSelected (lineEntry, false);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Item_Autocomplete(self)
|
|
|
|
local text = self:GetText();
|
|
local textlen = strlen(text);
|
|
local name;
|
|
|
|
-- first search shopping lists
|
|
|
|
local numLists = getn(AUCTIONATOR_SHOPPING_LISTS);
|
|
local n;
|
|
|
|
for n = 1,numLists do
|
|
local slist = AUCTIONATOR_SHOPPING_LISTS[n];
|
|
|
|
local numItems = getn(slist.items);
|
|
|
|
if ( numItems > 0 ) then
|
|
for i=1, numItems do
|
|
name = slist.items[i];
|
|
if ( name and text and (strfind(strupper(name), strupper(text), 1, 1) == 1) ) then
|
|
self:SetText(name);
|
|
self:HighlightText(textlen, -1);
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
-- next search history list
|
|
|
|
numItems = getn(gHistoryItemList);
|
|
|
|
if ( numItems > 0 ) then
|
|
for i=1, numItems do
|
|
name = gHistoryItemList[i];
|
|
if ( name and text and (strfind(strupper(name), strupper(text), 1, 1) == 1) ) then
|
|
self:SetText(name);
|
|
self:HighlightText(textlen, -1);
|
|
return;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_GetCurrentPane () -- so other modules can use gCurrentPane
|
|
return gCurrentPane;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_SetUINeedsUpdate () -- so other modules can easily set
|
|
gCurrentPane.UINeedsUpdate = true;
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CalcUndercutPrice (price)
|
|
|
|
if (price > 5000000) then return roundPriceDown (price, AUCTIONATOR_SAVEDVARS._5000000); end;
|
|
if (price > 1000000) then return roundPriceDown (price, AUCTIONATOR_SAVEDVARS._1000000); end;
|
|
if (price > 200000) then return roundPriceDown (price, AUCTIONATOR_SAVEDVARS._200000); end;
|
|
if (price > 50000) then return roundPriceDown (price, AUCTIONATOR_SAVEDVARS._50000); end;
|
|
if (price > 10000) then return roundPriceDown (price, AUCTIONATOR_SAVEDVARS._10000); end;
|
|
if (price > 2000) then return roundPriceDown (price, AUCTIONATOR_SAVEDVARS._2000); end;
|
|
if (price > 500) then return roundPriceDown (price, AUCTIONATOR_SAVEDVARS._500); end;
|
|
if (price > 0) then return math.floor (price - 1); end;
|
|
|
|
return 0;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_CalcStartPrice (buyoutPrice)
|
|
|
|
local discount = 1.00 - (AUCTIONATOR_SAVEDVARS.STARTING_DISCOUNT / 100);
|
|
|
|
local newStartPrice = Atr_CalcUndercutPrice(math.floor(buyoutPrice * discount));
|
|
|
|
if (AUCTIONATOR_SAVEDVARS.STARTING_DISCOUNT == 0) then -- zero means zero
|
|
newStartPrice = buyoutPrice;
|
|
end
|
|
|
|
return newStartPrice;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_AbbrevItemName (itemName)
|
|
|
|
return string.gsub (itemName, "Scroll of Enchant", "SoE");
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_IsMyToon (name)
|
|
|
|
if (name and (AUCTIONATOR_TOONS[name] or AUCTIONATOR_TOONS[string.lower(name)])) then
|
|
return true;
|
|
end
|
|
|
|
return false;
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_Error_Display (errmsg)
|
|
if (errmsg) then
|
|
Atr_Error_Text:SetText (errmsg);
|
|
Atr_Error_Frame:Show ();
|
|
return;
|
|
end
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_PollWho_Unused(s)
|
|
|
|
gSendZoneMsgs = true;
|
|
gQuietWho = time();
|
|
|
|
SetWhoToUI(1);
|
|
|
|
zc.md (s);
|
|
|
|
SendWho (s);
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function Atr_FriendsFrame_OnEvent(self, event)
|
|
|
|
end
|
|
|
|
-- roundPriceDown - rounds a price down to the next lowest multiple of a.
|
|
-- - if the result is not at least a/2 lower, rounds down by a/2.
|
|
--
|
|
-- examples: (128790, 500) -> 128500
|
|
-- (128700, 500) -> 128000
|
|
-- (128400, 500) -> 128000
|
|
-----------------------------------------
|
|
|
|
function roundPriceDown (price, a)
|
|
|
|
if (a == 0) then
|
|
return price;
|
|
end
|
|
|
|
local newprice = math.floor((price-1) / a) * a;
|
|
|
|
if ((price - newprice) < a/2) then
|
|
newprice = newprice - (a/2);
|
|
end
|
|
|
|
if (newprice == price) then
|
|
newprice = newprice - 1;
|
|
end
|
|
|
|
return newprice;
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function ToTightHour(t)
|
|
|
|
return floor((t - gTimeTightZero)/3600);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function FromTightHour(tt)
|
|
|
|
return (tt*3600) + gTimeTightZero;
|
|
|
|
end
|
|
|
|
|
|
-----------------------------------------
|
|
|
|
function ToTightTime(t)
|
|
|
|
return floor((t - gTimeTightZero)/60);
|
|
|
|
end
|
|
|
|
-----------------------------------------
|
|
|
|
function FromTightTime(tt)
|
|
|
|
return (tt*60) + gTimeTightZero;
|
|
|
|
end
|
|
|
|
|
|
--[[
|
|
|
|
- right click item in bag
|
|
- reset to 12 hours when switching tabs
|
|
- off by one when cancelling multisell
|
|
- cosmetic issue with the background
|
|
- collapsed multiple cancel messages
|
|
|
|
]]--
|
|
|
|
|
|
|
|
|