119 lines
3.2 KiB
Lua
119 lines
3.2 KiB
Lua
-------------------------------------------------------------------------------
|
|
-- CancelAuctions.lua
|
|
--
|
|
-- Cancel a group of auctions.
|
|
-------------------------------------------------------------------------------
|
|
|
|
local _
|
|
local L = LibStub("AceLocale-3.0"):GetLocale("AuctionLite", false)
|
|
|
|
-- Static popup advertising AL's fast scan.
|
|
StaticPopupDialogs["AL_CANCEL_CONFIRM"] = {
|
|
text = L["CANCEL_CONFIRM_TEXT"],
|
|
button1 = L["Cancel All"],
|
|
button3 = L["Cancel Unbid"],
|
|
button2 = L["Do Nothing"],
|
|
OnAccept = function(self)
|
|
AuctionLite:FinishCancel(self.data, true);
|
|
end,
|
|
OnAlt = function(self)
|
|
AuctionLite:FinishCancel(self.data, false);
|
|
end,
|
|
OnCancel = function(self)
|
|
-- Do nothing.
|
|
end,
|
|
showAlert = 1,
|
|
timeout = 0,
|
|
exclusive = 1,
|
|
hideOnEscape = 1,
|
|
preferredIndex = 3
|
|
};
|
|
|
|
-- Cancel all auctions for "name" listed in "targets".
|
|
function AuctionLite:CancelAuctions(targets)
|
|
local batch = GetNumAuctionItems("owner");
|
|
local cancel = {};
|
|
local bidsDetected = false;
|
|
|
|
-- Find all the auctions to cancel.
|
|
local i;
|
|
for i = 1, batch do
|
|
local listing = self:GetListing("owner", i);
|
|
|
|
for _, target in ipairs(targets) do
|
|
if not target.found and
|
|
self:MatchListing(target.name, target, listing) then
|
|
|
|
target.found = true;
|
|
|
|
local item = { index = i,
|
|
target = target,
|
|
hasBid = (listing.bidAmount > 0) };
|
|
|
|
table.insert(cancel, item);
|
|
|
|
if item.hasBid then
|
|
bidsDetected = true;
|
|
end
|
|
|
|
break;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Clear all our marks.
|
|
for _, target in ipairs(targets) do
|
|
target.found = nil;
|
|
end
|
|
|
|
-- If we found any bids, show our confirmation dialog.
|
|
-- Otherwise, just cancel the auctions.
|
|
if bidsDetected then
|
|
local dialog = StaticPopup_Show("AL_CANCEL_CONFIRM");
|
|
if dialog ~= nil then
|
|
dialog.data = cancel;
|
|
end
|
|
else
|
|
self:FinishCancel(cancel, false);
|
|
end
|
|
end
|
|
|
|
-- Actually cancel the selected auctions.
|
|
function AuctionLite:FinishCancel(cancel, cancelBid)
|
|
-- Sort them from highest to lowest so that we can cancel the higher
|
|
-- ones without throwing off the indices of the remaining ones.
|
|
table.sort(cancel, function(a, b) return a.index > b.index end);
|
|
|
|
-- Cancel them!
|
|
local summary = {};
|
|
for _, item in ipairs(cancel) do
|
|
if cancelBid or not item.hasBid then
|
|
item.target.cancelled = true;
|
|
CancelAuction(item.index);
|
|
self:IgnoreMessage(ERR_AUCTION_REMOVED);
|
|
|
|
local name = item.target.name;
|
|
if summary[name] ~= nil then
|
|
summary[name] = summary[name] + 1;
|
|
else
|
|
summary[name] = 1;
|
|
end
|
|
|
|
-- Hack: We only want to cancel the first item, since WoW 4.0
|
|
-- now requires a hardware event for each cancel. Break here
|
|
-- and let subsequent calls to cancel take care of the rest.
|
|
-- It's important that we cancelled the last item in the list
|
|
-- so that subsequent calls don't fail.
|
|
break;
|
|
end
|
|
end
|
|
|
|
-- Print a summary.
|
|
for name, listingsCancelled in pairs(summary) do
|
|
self:Print(L["Cancelled %d |4listing:listings; of %s."]:
|
|
format(listingsCancelled, name));
|
|
end
|
|
|
|
-- Notify the "Buy" frame.
|
|
self:CancelComplete();
|
|
end
|