vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[
        Auctioneer Addon for World of Warcraft(tm).
        Version: 3.9.0.1000 (Kangaroo)
        Revision: $Id: AucFilter.lua 856 2006-05-11 00:23:22Z luke1410 $

        Auctioneer filtering functions.
        Functions to filter auctions based upon various parameters.

        License:
                This program is free software; you can redistribute it and/or
                modify it under the terms of the GNU General Public License
                as published by the Free Software Foundation; either version 2
                of the License, or (at your option) any later version.

                This program is distributed in the hope that it will be useful,
                but WITHOUT ANY WARRANTY; without even the implied warranty of
                MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                GNU General Public License for more details.

                You should have received a copy of the GNU General Public License
                along with this program(see GPL.txt); if not, write to the Free Software
                Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
]]

--Local function prototypes
local brokerFilter, bidBrokerFilter, auctionOwnerFilter, competingFilter, percentLessFilter, plainFilter,  querySnapshot, doBroker, doBidBroker, doCompeting, doPercentLess

function brokerFilter (minProfit, signature) --function brokerFilter(minProfit, signature)
        local filterAuction = true;
        local id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(signature);
        local itemKey = id..":"..rprop..":"..enchant;

        if (buyout and buyout > 0 and buyout <= Auctioneer.Core.Constants.MaxBuyoutPrice and Auctioneer.Statistic.GetUsableMedian(itemKey)) then
                local auctKey = Auctioneer.Util.GetAuctionKey();
                local itemCat = Auctioneer.Util.GetCatForKey(itemKey);
                local snap = Auctioneer.Core.GetSnapshot(auctKey, itemCat, signature);

                if (snap) then
                        local timeLeft = snap.timeLeft;
                        local elapsedTime = time() - snap.lastSeenTime;
                        local secondsLeft = Auctioneer.Core.Constants.TimeLeft.Seconds[timeLeft] - elapsedTime;

                        if (secondsLeft > 0) then
                                local hsp, seenCount = Auctioneer.Statistic.GetHSP(itemKey, auctKey);
                                local profit = (hsp * count) - buyout;
                                local profitPricePercent = math.floor((profit / buyout) * 100);

                                if (profit >= minProfit and profitPricePercent >= Auctioneer.Core.Constants.MinProfitPricePercent and seenCount >= Auctioneer.Core.Constants.MinBuyoutSeenCount and not Auctioneer.Statistic.IsBadResaleChoice(signature)) then
                                        filterAuction = false;
                                end
                        end

                end
        end

        return filterAuction;
end

-- filters out all auctions except those that have no more than maximumTime remaining and meet profit requirements
function bidBrokerFilter(minProfit, signature, maximumTime, category, minQuality,itemName)
        local filterAuction = true;
        local id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(signature);
        local itemKey = id..":"..rprop..":"..enchant;
        if (not maximumTime) then maximumTime = 100000 end
        if (not category) then category = 0 end
        if (not minQuality) then minQuality = 0 end

        if (itemName) then
                local iName
                local oName = string.lower(name)
                local iCount = table.getn(itemName)
                local match = false
                for iPos=1, iCount do
                        iName = itemName[iPos]
                        if (iName and iName ~= "") then
                                local i,j = string.find(oName, string.lower(iName))
                                if (i) then match = true end
                        end
                end
                if (not match) then return true end
        end

        if Auctioneer.Statistic.GetUsableMedian(itemKey) then  -- only add if we have seen it enough times to have a usable median
                local auctKey = Auctioneer.Util.GetAuctionKey();
                local currentBid = Auctioneer.Statistic.GetCurrentBid(signature);
                local sbuy = Auctioneer.Core.GetSnapshotInfo(auctKey, itemKey);
                local buyoutValues = {};
                if (sbuy) then buyoutValues = sbuy.buyoutPrices end
                local lowest, second = Auctioneer.Statistic.GetLowest(buyoutValues);

                local itemCat = Auctioneer.Util.GetCatForKey(itemKey);
                if (category == 0 or itemCat == category) then
                        local snap = Auctioneer.Core.GetSnapshot(auctKey, itemCat, signature);

                        if (snap) then
                                if (tonumber(snap.quality) >= tonumber(minQuality)) then
                                        local timeLeft = tonumber(snap.timeLeft);
                                        local elapsedTime = time() - tonumber(snap.lastSeenTime);
                                        local secondsLeft = Auctioneer.Core.Constants.TimeLeft.Seconds[timeLeft] - elapsedTime;

                                        if (secondsLeft <= maximumTime and secondsLeft > 0) then
                                                -- hsp is the HSP with the lowest priced item still in the auction, nshp is the next highest price.
                                                local hsp, seenCount, x, x, nhsp = Auctioneer.Statistic.GetHSP(itemKey, auctKey, buyoutValues);
                                                local profit = (hsp * count) - currentBid;
                                                local profitPricePercent = math.floor((profit / currentBid) * 100);

                                                if ((minProfit == 0 or profit >= minProfit) and seenCount >= Auctioneer.Core.Constants.MinBuyoutSeenCount and not Auctioneer.Statistic.IsBadResaleChoice(signature)) then
                                                        filterAuction = false;
                                                end
                                        end
                                end
                        end
                end
        end

        return filterAuction;
end

function auctionOwnerFilter(owner, signature)
        local auctKey = Auctioneer.Util.GetAuctionKey();
        local itemCat = Auctioneer.Util.GetCatForSig(signature);
        local snap = Auctioneer.Core.GetSnapshot(auctKey, itemCat, signature);
        if (snap and snap.owner == owner) then
                return false;
        end
        return true;
end

function competingFilter(minLess, signature, myAuctions)
        local id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(signature);
        if (count > 1) then buyout = buyout/count; end
        local itemKey = id..":"..rprop..":"..enchant;

        local auctKey = Auctioneer.Util.GetAuctionKey();
        local itemCat = Auctioneer.Util.GetCatForSig(signature);
        local snap = Auctioneer.Core.GetSnapshot(auctKey, itemCat, signature);
        if (snap and snap.owner ~= UnitName("player")) and
                (myAuctions[itemKey]) and
                (buyout > 0) and
                (buyout+minLess < myAuctions[itemKey]) then
                return false;
        end
        return true;
end

-- filters out all auctions that are not a given percentless than the median for that item.
function percentLessFilter(percentLess, signature, category, minQuality, itemName)
        local filterAuction = true;
        local id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(signature);
        local itemKey = id .. ":" .. rprop..":"..enchant;
        local auctKey = Auctioneer.Util.GetAuctionKey();

        if (not category) then category = 0 end
        if (not minQuality) then minQuality = 0 end

        if (itemName) then
                local iName
                local oName = string.lower(name)
                local iCount = table.getn(itemName)
                local match = false
                for iPos=1, iCount do
                        iName = itemName[iPos]
                        if (iName and iName ~= "") then
                                local i,j = string.find(oName, string.lower(iName))
                                if (i) then match = true end
                        end
                end
                if (not match) then return true end
        end

        local hsp, seenCount = Auctioneer.Statistic.GetHSP(itemKey, auctKey)

        if hsp > 0 and seenCount >= Auctioneer.Core.Constants.MinBuyoutSeenCount then
                local profit = (hsp * count) - buyout;
                --see if this auction should not be filtered
                if (buyout > 0 and Auctioneer.Statistic.PercentLessThan(hsp, buyout / count) >= tonumber(percentLess) and profit >= Auctioneer.Core.Constants.MinProfitMargin) then
                        local itemCat = Auctioneer.Util.GetCatForKey(itemKey);
                        if (category == 0 or itemCat == category) then
                                local snap = Auctioneer.Core.GetSnapshot(auctKey, itemCat, signature);
                                if (snap) then
                                        if (tonumber(snap.quality) >= tonumber(minQuality)) then
                                                local timeLeft = tonumber(snap.timeLeft);
                                                local elapsedTime = time() - tonumber(snap.lastSeenTime);
                                                local secondsLeft = Auctioneer.Core.Constants.TimeLeft.Seconds[timeLeft] - elapsedTime;

                                                if (secondsLeft > 0) then
                                                        filterAuction = false;
                                                end
                                        end
                                end
                        end
                end
        end

        return filterAuction;
end

-- filters out all auctions that are not below a certain price.
function plainFilter(maxPrice, signature, category, minQuality, itemName)
        local filterAuction = true;
        local id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(signature);
        local itemKey = id .. ":" .. rprop..":"..enchant;
        local auctKey = Auctioneer.Util.GetAuctionKey();

        if (not category) then category = 0 end
        if (not minQuality) then minQuality = 0 end
        if (not maxPrice or maxPrice == 0) then maxPrice = 100000000 end

        if (itemName) then
                local iName
                local oName = string.lower(name)
                local iCount = table.getn(itemName)
                local match = false
                for iPos=1, iCount do
                        iName = itemName[iPos]
                        if (iName and iName ~= "") then
                                local i,j = string.find(oName, string.lower(iName))
                                if (i) then match = true end
                        end
                end
                if (not match) then return true end
        end

        if (count and count > 1) then maxPrice = maxPrice * count end

        -- check to see if we need to retrieve the current bid before actually getting it
        local currentBid = min
        if (min <= maxPrice and (not buyout or buyout == 0 or buyout > maxPrice)) then
                local bid = Auctioneer.Statistic.GetCurrentBid(signature);
                if (bid) then currentBid = bid end
        end

        if (currentBid <= maxPrice or (buyout and buyout > 0 and buyout <= maxPrice)) then
                local itemCat = Auctioneer.Util.GetCatForKey(itemKey);
                if (category == 0 or itemCat == category) then
                        local snap = Auctioneer.Core.GetSnapshot(auctKey, itemCat, signature);
                        if (snap) then
                                if (tonumber(snap.quality) >= tonumber(minQuality)) then
                                        local timeLeft = tonumber(snap.timeLeft);
                                        local elapsedTime = time() - tonumber(snap.lastSeenTime);
                                        local secondsLeft = Auctioneer.Core.Constants.TimeLeft.Seconds[timeLeft] - elapsedTime;

                                        if (secondsLeft > 0) then
                                                filterAuction = false;
                                        end
                                end
                        end
                end
        end

        return filterAuction;
end


--[[
        generic function for querying the snapshot with a filter function that returns true if an auction should be filtered out of the result set.

        @return (array)
                all items in the current snapshot which are not filtered out by the given filter.
                Each entry of the array contains:
                   {snapshotdata, (see Auctioneer.Core.GetSnapshotFromData for details)
                    [signature]   (snapshot signature)
                   }
                If there are no matching entries in the snapshot, the function returns an empty array.
]]
function querySnapshot(filter, param, e1,e2,e3,e4,e5)
        local queryResults = {};
        param = param or "";

        local a;
        local auctKey = Auctioneer.Util.GetAuctionKey();

        if (AuctionConfig and AuctionConfig.snap and AuctionConfig.snap[auctKey]) then
                for itemCat, iData in pairs(AuctionConfig.snap[auctKey]) do
                        for auctionSignature, data in pairs(iData) do
                                if (not filter(param, auctionSignature, e1,e2,e3,e4,e5)) then
                                        a = Auctioneer.Core.GetSnapshotFromData(data);
                                        a.signature = auctionSignature;
                                        table.insert(queryResults, a);
                                end
                        end
                end
        end

        return queryResults;
end

-- builds the list of auctions that can be bought and resold for profit
function doBroker(minProfit)
        if not minProfit or minProfit == "" then
                minProfit = Auctioneer.Core.Constants.MinProfitMargin
        elseif (tonumber(minProfit)) then
                minProfit = tonumber(minProfit) * 100
        else
                Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtActUnknown'), minProfit))
                return
        end

        local output = string.format(_AUCT('FrmtBrokerHeader'), EnhTooltip.GetTextGSC(minProfit));
        Auctioneer.Util.ChatPrint(output);

        local resellableAuctions = querySnapshot(brokerFilter, minProfit);

        -- sort by profit decending
        table.sort(resellableAuctions, Auctioneer.Statistic.ProfitComparisonSort);

        -- output the list of auctions
        local id,rprop,enchant,name,count,min,buyout,uniq,itemKey,hsp,seenCount,profit,output;
        if (resellableAuctions) then
                for pos,a in pairs(resellableAuctions) do
                        id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
                        itemKey = id .. ":" .. rprop..":"..enchant;
                        hsp, seenCount = Auctioneer.Statistic.GetHSP(itemKey, Auctioneer.Util.GetAuctionKey());
                        profit = (hsp * count) - buyout;
                        output = string.format(_AUCT('FrmtBrokerLine'), Auctioneer.Util.ColorTextWhite(count.."x")..a.itemLink, seenCount, EnhTooltip.GetTextGSC(hsp * count), EnhTooltip.GetTextGSC(buyout), EnhTooltip.GetTextGSC(profit));
                        Auctioneer.Util.ChatPrint(output);
                end
        end

        Auctioneer.Util.ChatPrint(_AUCT('FrmtBrokerDone'));
end

-- builds the list of auctions that can be bought and resold for profit
function doBidBroker(minProfit)
        if not minProfit or minProfit == "" then
                minProfit = Auctioneer.Core.Constants.MinProfitMargin
        elseif (tonumber(minProfit)) then
                minProfit = tonumber(minProfit) * 100
        else
                Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtActUnknown'), minProfit))
                return
        end

        local output = string.format(_AUCT('FrmtBidbrokerHeader'), EnhTooltip.GetTextGSC(minProfit));
        Auctioneer.Util.ChatPrint(output);

        local bidWorthyAuctions = querySnapshot(bidBrokerFilter, minProfit, Auctioneer.Core.Constants.TimeLeft.Seconds[Auctioneer.Core.Constants.TimeLeft.Medium]);

        table.sort(bidWorthyAuctions, function(a, b) return (a.timeLeft < b.timeLeft) end);

        -- output the list of auctions
        local id,rprop,enchant, name, count,min,buyout,uniq,itemKey,hsp,seenCount,currentBid,profit,bidText,output;
        if (bidWorthyAuctions) then
                for pos,a in pairs(bidWorthyAuctions) do
                        id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
                        itemKey = id .. ":" .. rprop..":"..enchant;
                        hsp, seenCount = Auctioneer.Statistic.GetHSP(itemKey, Auctioneer.Util.GetAuctionKey());
                        currentBid = Auctioneer.Statistic.GetCurrentBid(a.signature);
                        profit = (hsp * count) - currentBid;

                        bidText = _AUCT('FrmtBidbrokerCurbid');
                        if (currentBid == min) then
                                bidText = _AUCT('FrmtBidbrokerMinbid');
                        end
                        EnhTooltip.DebugPrint("a", a);

                        -- local secondsLeft = Auctioneer.Core.Constants.TimeLeft.Seconds[a.timeLeft] + a.lastSeenTime - time()
                        output = string.format(_AUCT('FrmtBidbrokerLine'), Auctioneer.Util.ColorTextWhite(count.."x")..a.itemLink, seenCount, EnhTooltip.GetTextGSC(hsp * count), bidText, EnhTooltip.GetTextGSC(currentBid), EnhTooltip.GetTextGSC(profit), Auctioneer.Util.ColorTextWhite(Auctioneer.Util.GetTimeLeftString(a.timeLeft)));
                        Auctioneer.Util.ChatPrint(output);
                end
        end

        Auctioneer.Util.ChatPrint(_AUCT('FrmtBidbrokerDone'));
end

function doCompeting(minLess)
        if not minLess or minLess == "" then
                minLess = Auctioneer.Core.Constants.DefaultCompeteLess * 100
        elseif (tonumber(minLess)) then
                minLess = tonumber(minLess) * 100
        else
                Auctioneer.Util.ChatPrint(string.format(_AUCT('FrmtActUnknown'), minLess))
                return
        end

        local output = string.format(_AUCT('FrmtCompeteHeader'), EnhTooltip.GetTextGSC(minLess));
        Auctioneer.Util.ChatPrint(output);

        local myAuctions = querySnapshot(auctionOwnerFilter, UnitName("player"));
        local myHighestPrices = {}
        local id,rprop,enchant,name,count,min,buyout,uniq,itemKey,competingAuctions,currentBid,buyoutForOne,bidForOne,bidPrice,myBuyout,buyPrice,myPrice,priceLess,lessPrice,output;
        if (myAuctions) then
                for pos,a in pairs(myAuctions) do
                        id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
                        if (count > 1) then buyout = buyout/count; end
                        itemKey = id .. ":" .. rprop..":"..enchant;
                        if (not myHighestPrices[itemKey]) or (myHighestPrices[itemKey] < buyout) then
                                myHighestPrices[itemKey] = buyout;
                        end
                end
        end
        competingAuctions = querySnapshot(competingFilter, minLess, myHighestPrices);

        table.sort(competingAuctions, Auctioneer.Statistic.ProfitComparisonSort);

        -- output the list of auctions
        if (competingAuctions) then
                for pos,a in pairs(competingAuctions) do
                        id,rprop,enchant, name, count,min,buyout,uniq = Auctioneer.Core.GetItemSignature(a.signature);
                        itemKey = id .. ":" .. rprop..":"..enchant;
                        currentBid = Auctioneer.Statistic.GetCurrentBid(a.signature);

                        buyoutForOne = buyout;
                        bidForOne = currentBid;
                        if (count > 1) then
                                buyoutForOne = buyout/count;
                                bidForOne = currentBid/count;
                        end

                        bidPrice = EnhTooltip.GetTextGSC(bidForOne).."ea";
                        if (currentBid == min) then
                                bidPrice = "No bids ("..bidPrice..")";
                        end

                        myBuyout = myHighestPrices[itemKey];
                        buyPrice = EnhTooltip.GetTextGSC(buyoutForOne).."ea";
                        myPrice = EnhTooltip.GetTextGSC(myBuyout).."ea";
                        priceLess = myBuyout - buyoutForOne;
                        lessPrice = EnhTooltip.GetTextGSC(priceLess);

                        output = string.format(_AUCT('FrmtCompeteLine'), Auctioneer.Util.ColorTextWhite(count.."x")..a.itemLink, bidPrice, buyPrice, myPrice, lessPrice);
                        Auctioneer.Util.ChatPrint(output);
                end
        end

        Auctioneer.Util.ChatPrint(_AUCT('FrmtCompeteDone'));
end

-- builds the list of auctions that can be bought and resold for profit
function doPercentLess(percentLess)
        if not percentLess or percentLess == "" then percentLess = Auctioneer.Core.Constants.MinPercentLessThanHSP end
        local output = string.format(_AUCT('FrmtPctlessHeader'), percentLess);
        Auctioneer.Util.ChatPrint(output);

        local auctionsBelowHSP = querySnapshot(percentLessFilter, percentLess);

        -- sort by profit based on median
        table.sort(auctionsBelowHSP, Auctioneer.Statistic.ProfitComparisonSort);

        -- output the list of auctions
        local id,rprop,enchant,name,count,buyout,itemKey,hsp,seenCount,profit,output,x;
        if (auctionsBelowHSP) then
                for pos,a in pairs(auctionsBelowHSP) do
                        id,rprop,enchant, name, count,x,buyout,x = Auctioneer.Core.GetItemSignature(a.signature);
                        itemKey = id ..":"..rprop..":"..enchant;
                        hsp, seenCount = Auctioneer.Statistic.GetHSP(itemKey, Auctioneer.Util.GetAuctionKey());
                        profit = (hsp * count) - buyout;
                        output = string.format(_AUCT('FrmtPctlessLine'), Auctioneer.Util.ColorTextWhite(count.."x")..a.itemLink, seenCount, EnhTooltip.GetTextGSC(hsp * count), EnhTooltip.GetTextGSC(buyout), EnhTooltip.GetTextGSC(profit), Auctioneer.Util.ColorTextWhite(Auctioneer.Statistic.PercentLessThan(hsp, buyout / count).."%"));
                        Auctioneer.Util.ChatPrint(output);
                end
        end

        Auctioneer.Util.ChatPrint(_AUCT('FrmtPctlessDone'));
end
-- Auctioneer.Filter.
Auctioneer.Filter = {
        BrokerFilter = brokerFilter,
        BidBrokerFilter = bidBrokerFilter,
        AuctionOwnerFilter = auctionOwnerFilter,
        CompetingFilter = competingFilter,
        PercentLessFilter = percentLessFilter,
        PlainFilter = plainFilter,
        QuerySnapshot = querySnapshot,
        DoBroker = doBroker,
        DoBidBroker = doBidBroker,
        DoCompeting = doCompeting,
        DoPercentLess = doPercentLess,
}