--[[ 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, }