AuctionLite-classic/CancelAuctions.lua

120 lignes
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