Asa@3: local addonName, addonTable = ...; Asa@3: _G[addonName] = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceConsole-3.0", "AceEvent-3.0", "AceBucket-3.0") Asa@3: local addon = _G[addonName] Asa@0: Asa@3: local utils = addonTable.utils Asa@3: Asa@0: Asa@0: local WHITE = "|cFFFFFFFF" Asa@0: local RED = "|cFFFF0000" Asa@0: local GREEN = "|cFF00FF00" Asa@0: local YELLOW = "|cFFFFFF00" Asa@0: local ORANGE = "|cFFFF7F00" Asa@0: local TEAL = "|cFF00FF9A" Asa@0: local GOLD = "|cFFFFD700" Asa@0: Asa@0: function addon:OnInitialize() Asa@0: local DB_defaults = { Asa@0: char = { Asa@0: debug = false Asa@0: }, Asa@0: factionrealm = { Asa@0: item_account = {} Asa@0: }, Asa@0: } Asa@0: self.db = LibStub("AceDB-3.0"):New("ItemAuditorDB", DB_defaults, true) Asa@0: Asa@0: self.db.char.debug = true Asa@0: Asa@0: self:RegisterOptions() Asa@0: Asa@3: self:RegisterEvent("PLAYER_ENTERING_WORLD") Asa@0: end Asa@0: Asa@0: function addon:GetCurrentInventory() Asa@0: local i = {} Asa@0: local link Asa@0: Asa@0: for bagID = 0, NUM_BAG_SLOTS do Asa@0: bagSize=GetContainerNumSlots(bagID) Asa@0: for slotID = 0, bagSize do Asa@0: itemID = GetContainerItemID(bagID, slotID); Asa@0: Asa@0: if itemID ~= nil then Asa@0: _, itemCount, _, _, _= GetContainerItemInfo(bagID, slotID); Asa@0: name = GetItemInfo(itemID) Asa@0: if i[name] == nil then Asa@0: i[name] = 0 Asa@0: end Asa@0: i[name] = i[name] + (itemCount or 0) Asa@0: end Asa@0: Asa@0: end Asa@0: Asa@0: end Asa@0: return {items = i, money = GetMoney()} Asa@0: end Asa@0: Asa@0: function addon:GetInventoryDiff(pastInventory, current) Asa@0: if current == nil then Asa@0: current = self:GetCurrentInventory() Asa@0: end Asa@0: local diff = {} Asa@0: Asa@0: for name, count in pairs(current.items) do Asa@0: if pastInventory.items[name] == nil then Asa@0: diff[name] = count Asa@0: self:Debug("1 diff[" .. name .. "]=" .. diff[name]) Asa@0: elseif count - pastInventory.items[name] ~= 0 then Asa@0: diff[name] = count - pastInventory.items[name] Asa@0: self:Debug("2 diff[" .. name .. "]=" .. diff[name]) Asa@0: end Asa@0: end Asa@0: Asa@0: for name, count in pairs(pastInventory.items) do Asa@0: if current.items[name] == nil then Asa@0: diff[name] = -count Asa@0: self:Debug("3 diff[" .. name .. "]=" .. diff[name]) Asa@0: elseif current.items[name] - count ~= 0 then Asa@0: diff[name] = current.items[name] - pastInventory.items[name] Asa@0: self:Debug("4 diff[" .. name .. "]=" .. diff[name]) Asa@0: end Asa@0: end Asa@0: Asa@0: local moneyDiff = current.money - pastInventory.money Asa@0: Asa@0: return {items = diff, money = moneyDiff} Asa@0: end Asa@0: Asa@0: Asa@0: function addon:ScanMail() Asa@0: local results = {} Asa@0: for mailIndex = 1, GetInboxNumItems() or 0 do Asa@0: local sender, msgSubject, msgMoney, msgCOD, _, msgItem, _, _, msgText, _, isGM = select(3, GetInboxHeaderInfo(mailIndex)) Asa@0: local mailType = Postal:GetMailType(msgSubject) Asa@0: Asa@0: if mailType == "NonAHMail" then Asa@0: -- Don't know how to handle these yet Asa@0: elseif mailType == "AHSuccess" then Asa@0: local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex); Asa@0: if results[itemName] == nil then Asa@0: results[itemName] = 0 Asa@0: end Asa@0: results[itemName] = results[itemName] + deposit + buyout - consignment Asa@0: Asa@0: elseif mailType == "AHWon" then Asa@0: local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex); Asa@0: if results[itemName] == nil then Asa@0: results[itemName] = 0 Asa@0: end Asa@0: results[itemName] = results[itemName] - bid Asa@0: elseif mailType == "AHExpired" or mailType == "AHCancelled" then Asa@0: -- These should be handled when you pay the deposit at the AH Asa@0: else Asa@0: self:Debug("Unhandled mail type: " .. mailType) Asa@0: self:Debug(msgSubject) Asa@0: end Asa@0: Asa@0: end Asa@0: return results Asa@0: end Asa@0: Asa@0: function addon:SaveValue(item, value) Asa@0: local item_account = self.db.factionrealm.item_account Asa@0: if item_account[item] == nil then Asa@0: item_account[item] = 0 Asa@0: end Asa@0: item_account[item] = item_account[item] + value Asa@0: Asa@0: if item_account[item] >= 0 then Asa@0: item_account[item] = nil Asa@0: end Asa@0: end Asa@0: Asa@4: local defaultBagDelay = 0.2 Asa@4: Asa@3: function addon:WatchBags(delay) Asa@4: delay = delay or defaultBagDelay Asa@4: if delay ~= self.currentBagDelay then Asa@4: self:UnwatchBags() Asa@4: end Asa@4: Asa@4: if self.watch_handle == nil then Asa@4: self.currentBagDelay = delay Asa@4: self:Debug("currentBagDelay = " .. delay) Asa@4: addon:UpdateCurrentInventory() Asa@4: self.watch_handle = self:RegisterBucketEvent({"BAG_UPDATE", "PLAYER_MONEY"}, self.currentBagDelay, "UpdateAudit") Asa@4: end Asa@0: end Asa@0: Asa@0: function addon:UnwatchBags() Asa@4: if self.watch_handle ~= nil then Asa@4: self:UnregisterBucket(self.watch_handle) Asa@4: self.watch_handle = nil Asa@4: end Asa@0: end Asa@0: Asa@0: function addon:GetItemCost(itemName, countModifier) Asa@0: local invested = abs(self.db.factionrealm.item_account[itemName] or 0) Asa@0: Asa@0: if invested > 0 then Asa@0: local _, itemLink = GetItemInfo (itemName); Asa@0: local _, _, _, _, Id = string.find(itemLink, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?") Asa@0: local count = Altoholic:GetItemCount(tonumber(Id)) Asa@0: if countModifier ~= nil then Asa@0: count = count - countModifier Asa@0: end Asa@0: if count == 0 then Asa@0: self.db.factionrealm.item_account[itemName] = nil Asa@3: self:Print("You ran out of " .. itemName .. "and never recovered " .. utils:FormatMoney(invested)) Asa@0: return 0, 0, 0 Asa@0: end Asa@0: return ceil(invested), ceil(invested/count), count Asa@0: end Asa@0: return 0, 0, 0 Asa@0: end