vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
local locals = KC_ITEMS_LOCALS.modules.auction

KC_Auction = KC_ItemsModule:new({
        type             = "auction",
        name             = locals.name,
        desc             = locals.description,
        cmdOptions       = locals.chat,
        dependencies = {"common"},
        optPath          = {"options"},
        db                       = AceDatabase:new("KC_AuctionDB")
        
})

KC_Items:Register(KC_Auction)

function KC_Auction:Enable()
        if (not self:GetOpt({"options"}, "filters") ) then
                self:SetOpt({"options"}, "filters", "1,1,1,1,1,1,1,1,1,1")
        end
        self:RegisterEvent("AUCTION_HOUSE_SHOW")
        self.classes = {GetAuctionItemClasses()}
        if (self.app.tooltip) then
                self.app.tooltip:RegisterFunc(self, "Tooltip")
        end
end

function KC_Auction:Disable()
        KC_ItemsModule.Disable(self)
        if (self.app.tooltip) then
                self.app.tooltip:UnregisterFunc(self, "Tooltip")
        end
end

function KC_Auction:AUCTION_HOUSE_SHOW()
        self.gui.frame:SetParents();
        self.gui.frame:Initialize(self, self.gui.config)        
        self.gui.frame:OnLoad()
        self:UnregisterEvent("AUCTION_HOUSE_SHOW");
end

-- Auction Scanning Code.
function KC_Auction:Scan()
        
        if(not AuctionFrame:IsVisible()) then
                self:ScanCleanup(true)
                self:Msg(locals.auction.cantscan)
                return
        end

        local targets = self:GetOpt({"options"}, "filters")

        BrowseNoResultsText:Show()
        BrowseNoResultsText:SetText("")

        for i=1, NUM_BROWSE_TO_DISPLAY do
                button = getglobal("BrowseButton"..i)
                button:Hide()
        end

        if (strfind(targets, "1")) then
                self.scanning = true
                self.done = false
                self.targets = {}
                
                for i,v in {self.common:Explode(targets, ",")} do
                        _ = ((v == 1) and tinsert(self.targets, i))
                end

                for i = 0, 15 do
                        local chk = self.gui.frame["FilterChk" .. i]
                        chk:Disable()
                end

                self:Hook("CanSendAuctionQuery", function () if (self.Hooks.CanSendAuctionQuery.orig()) then self:NextPage() end end)
                self:Hook("AuctionFrameBrowse_OnEvent", function () end)

                self:RegisterEvent("AUCTION_ITEM_LIST_UPDATE"   , "AuctionUpdate")
                self:RegisterEvent("AUCTION_HOUSE_CLOSED"               , "ScanCanceled")

        else
                self:ScanCleanup(true)
                BrowseNoResultsText:SetText(locals.auction.notargets)
        end
end

function KC_Auction:NextPage()
        local maxPages
        if (self.page) then
                local numBatchAuctions, totalAuctions = GetNumAuctionItems("list")
                maxPages= floor(totalAuctions / NUM_AUCTION_ITEMS_PER_PAGE)

                if (totalAuctions == 0 or self.done) then
                        self:ScanDone()
                        return;
                end

                BrowseNoResultsText:SetText(format(locals.auction.scanning, self.page + 1, (maxPages or 0) + 1, self.classes[self.target]))
                
                if (self.page < maxPages) then
                        self.page = self.page + 1
                else
                        if (getn(self.targets) > 0) then
                                self.target = tremove(self.targets, 1)
                                self.page = 0
                        else
                                self.done = true
                                self.page = self.page +1
                        end
                end
        else
                self.page = 0
                self.target = tremove(self.targets, 1)
                BrowseNoResultsText:SetText(locals.auction.settingup)
        end
        self.needScan = true
        
        QueryAuctionItems("", "", "", nil, self.target, nil, self.page, nil, nil)

end

function KC_Auction:AuctionUpdate()
        if (not self.needScan) then return      end

        for id = 1, GetNumAuctionItems("list") do
                local link = GetAuctionItemLink("list", id)
                local _, _, count, _, _, _, minBid, _, buyoutPrice, bidAmount, _, _ = GetAuctionItemInfo("list", id)
                self:ProcessItem(link, count, minBid, bidAmount, buyoutPrice)
        end

        self.needScan = false
end

function KC_Auction:ScanDone()
                BrowseNoResultsText:SetText(locals.auction.done)
                self:ScanCleanup()
end

function KC_Auction:ScanCanceled()
                BrowseNoResultsText:SetText(locals.auction.canceled)
                self:ScanCleanup()
end

function KC_Auction:ScanCleanup(lite)

        if (not lite) then
                self:Unhook("CanSendAuctionQuery")
                self:Unhook("AuctionFrameBrowse_OnEvent")

                self:UnregisterEvent("AUCTION_ITEM_LIST_UPDATE")
                self:UnregisterEvent("AUCTION_HOUSE_CLOSED")    
        
                self:ProcessSnapshot()
        end

        for i = 0, 15 do
                local chk = self.gui.frame["FilterChk" .. i]
                chk:Enable()
        end

        self.gui.frame.ScanButton:SetValue(locals.labels.scan)

        self.snapshot = (self.snapshot and self.persistent) and self.snapshot or nil

        self.page = nil
        self.needScan = false
        self.target = nil
        self.targets = nil
        self.done = false
        self.scanning = nil
        self.gui.frame.scanning = nil

end

function KC_Auction:ProcessItem(link, count, min, bid, buy)
        local code = self.common:GetCode(link, true);
        
        self.snapshot                           = self.snapshot or {}
        self.snapshot[code]                     = self.snapshot[code] or {}
        self.snapshot[code].buys        = (buy > 0) and ((self.snapshot[code].buys or "") .. self.common:Round(buy/count,3) .. ",") or self.snapshot[code].buys 
        self.snapshot[code].buycount= (buy > 0) and (self.snapshot[code].buycount or 0) + 1 or self.snapshot[code].buycount
        self.snapshot[code].bids        = (bid > 0) and ((self.snapshot[code].bids or "") .. self.common:Round(bid/count,3) .. ",") or self.snapshot[code].bids 
        self.snapshot[code].bidcount= (bid > 0) and (self.snapshot[code].bidcount or 0) + 1 or self.snapshot[code].bidcount
        self.snapshot[code].mins        = (self.snapshot[code].mins or "") .. self.common:Round(min/count,3) .. "," 
        self.snapshot[code].stacks      = (self.snapshot[code].stacks or "") .. count .. "," 
        self.snapshot[code].seen        = (self.snapshot[code].seen or 0) + 1 
end 

function KC_Auction:ProcessSnapshot()
        if (not self.snapshot) then return end
        
        local realmFactionID = self.common:GetRealmFactionID()
        local nWeight            = .65
        local sWeight            = .35

        for item in self.snapshot do
                local sSeen, sAvgStack, sMin, sBidcount, sBid, sBuycount, sBuy = self:GetItemData(item)
                
                local buys   = {self.common:Explode(self.snapshot[item].buys, ",")}
                local bids   = {self.common:Explode(self.snapshot[item].bids, ",")}
                local mins   = {self.common:Explode(self.snapshot[item].mins, ",")}
                local stacks = {self.common:Explode(self.snapshot[item].stacks, ",")}

                buys    = getn(buys) > 0 and buys or nil
                bids    = getn(bids) > 0 and bids or nil
                mins    = getn(mins) > 0 and mins or nil
                stacks  = getn(stacks) > 0 and stacks or nil

                local nMin = mins and self.common:BellCurve(mins) or 0
                local nBid = bids and self.common:BellCurve(bids) or 0
                local nBuy = buys and self.common:BellCurve(buys) or 0

                local nAvgStack = stacks and self.common:Avg(stacks) or 0

                nMin = (sMin and sMin > 0) and self.common:WeightedAvg(nMin, sMin, nWeight, sWeight) or nMin
                nBid = (sBid and sBid > 0) and self.common:WeightedAvg(nBid, sBid, nWeight, sWeight) or nBid
                nBuy = (sMin and sMin > 0) and self.common:WeightedAvg(nBuy, sMin, nWeight, sWeight) or nBuy

                nAvgStack = (sAvgStack and sAvgStack > 0) and self.common:WeightedAvg(nAvgStack, sAvgStack, nWeight, sWeight) or nAvgStack

                local nSeen             =  self.snapshot[item].seen + (sSeen or 0)
                local nBidcount = (self.snapshot[item].bidcount or 0) + (sBidcount or 0)
                local nBuycount = (self.snapshot[item].buycount or 0) + (sBuycount or 0)
        
                self.db:set({realmFactionID}, item, format("%s:%s:%s:%s:%s:%s:%s", nSeen, nAvgStack, nMin, nBidcount, nBid, nBuycount, nBuy))
        end
end

function KC_Auction:GetItemData(code)
        return self.common:Explode(self.db:get({self.common:GetRealmFactionID()}, code) or "0", ":");
end

function KC_Auction:EnablePersistence()
        self.persistent = true;
end

function KC_Auction:Tooltip(tooltip, code, lcode, qty, hooker)
        local sSeen, sAvgStack, sMin, sBidcount, sBid, sBuycount, sBuy = self:GetItemData(lcode)
        
        if (sSeen == 0) then return end

        local short             = self:GetOpt(self.optPath, "short")
        local single    = self:GetOpt(self.optPath, "single")
        local stats             = self:GetOpt(self.optPath, "showstats")
        local showbid   = self:GetOpt(self.optPath, "showbid")
        
        local mLabel = format(short and locals.labels.min.short or locals.labels.min.long, qty)
        local bLabel = format(short and locals.labels.buy.short or locals.labels.buy.long, qty)
        local iLabel = format(short and locals.labels.bid.short or locals.labels.bid.long, qty)
        local hLabel = format(locals.labels.header, qty)
        local sLabel = format(locals.labels.stats,  sSeen, self.common:Round(sAvgStack, 2))

        _ = (not short)                                         and hooker:AddTextLine( tooltip, hLabel)
        _ = (sMin and sMin > 0)                         and hooker:AddPriceLine(tooltip, sMin * qty, mLabel, locals.sep, locals.sepcolor)
        _ = (sBuy and sBuy > 0)                         and hooker:AddPriceLine(tooltip, sBuy * qty, bLabel, locals.sep, locals.sepcolor)
        _ = (showbid and tonumber(sBid) and sBid > 0)   and hooker:AddPriceLine(tooltip, sBid * qty, iLabel, locals.sep, locals.sepcolor)
        _ = (stats)                                                     and hooker:AddTextLine( tooltip, sLabel)
end

Generated by GNU Enscript 1.6.5.90.