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@9: addonTable.ItemAuditor = addon 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@8: item_account = {}, Asa@8: items = {}, Asa@10: AHCut = 0.05, Asa@0: }, Asa@0: } Asa@0: self.db = LibStub("AceDB-3.0"):New("ItemAuditorDB", DB_defaults, true) Asa@8: addonTable.db= self.db Asa@8: self.items = self.db.factionrealm.items Asa@0: Asa@0: self:RegisterOptions() Asa@0: Asa@3: self:RegisterEvent("PLAYER_ENTERING_WORLD") Asa@0: end Asa@0: Asa@8: function addon:ConvertItems() Asa@8: for itemName, value in pairs(self.db.factionrealm.item_account) do Asa@8: local itemID = utils:GetItemID(itemName) Asa@8: if itemID ~= nil then Asa@8: self:GetItem('item:' .. itemID) Asa@8: end Asa@8: if value == 0 then Asa@8: self.db.factionrealm.item_account[itemName] = nil Asa@8: end Asa@8: end Asa@8: Asa@8: for link, data in pairs(self.db.factionrealm.items) do Asa@8: if self:GetItem(link).count == 0 or self:GetItem(link).invested == 0 then Asa@8: self:RemoveItem(link) Asa@8: end Asa@10: -- addon:UpdateQAThreshold(link) Asa@10: end Asa@10: Asa@12: self:RefreshQAGroups() Asa@12: end Asa@12: Asa@12: function addon:RefreshQAGroups() Asa@10: for groupName in pairs(QAAPI:GetGroups()) do Asa@10: self:UpdateQAGroup(groupName) Asa@8: end Asa@8: end Asa@8: Asa@0: function addon:GetCurrentInventory() Asa@8: local i = {} Asa@8: local bagID Asa@8: local slotID Asa@8: Asa@8: for bagID = 0, NUM_BAG_SLOTS do Asa@8: bagSize=GetContainerNumSlots(bagID) Asa@8: for slotID = 0, bagSize do Asa@8: local link= GetContainerItemLink(bagID, slotID); Asa@10: link = link and self:GetSafeLink(link) Asa@8: Asa@8: if link ~= nil and i[link] == nil then Asa@8: i[link] = GetItemCount(link); Asa@8: end Asa@8: end Asa@8: Asa@8: end Asa@8: return {items = i, money = GetMoney()} Asa@0: end Asa@0: Asa@0: function addon:GetInventoryDiff(pastInventory, current) Asa@8: if current == nil then Asa@8: current = self:GetCurrentInventory() Asa@8: end Asa@8: local diff = {} Asa@8: Asa@8: for link, count in pairs(current.items) do Asa@8: if pastInventory.items[link] == nil then Asa@8: diff[link] = count Asa@8: -- self:Debug("1 diff[" .. name .. "]=" .. diff[name]) Asa@8: elseif count - pastInventory.items[link] ~= 0 then Asa@8: diff[link] = count - pastInventory.items[link] Asa@8: -- self:Debug("2 diff[" .. name .. "]=" .. diff[name]) Asa@8: end Asa@8: end Asa@8: Asa@8: for link, count in pairs(pastInventory.items) do Asa@8: if current.items[link] == nil then Asa@8: diff[link] = -count Asa@8: -- self:Debug("3 diff[" .. name .. "]=" .. diff[name]) Asa@8: elseif current.items[link] - count ~= 0 then Asa@8: diff[link] = current.items[link] - pastInventory.items[link] Asa@8: -- self:Debug("4 diff[" .. name .. "]=" .. diff[name]) Asa@8: end Asa@8: end Asa@8: Asa@8: local moneyDiff = current.money - pastInventory.money Asa@8: Asa@8: return {items = diff, money = moneyDiff} Asa@0: end Asa@0: Asa@0: Asa@6: 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@6: local mailType = utils:GetMailType(msgSubject) Asa@6: Asa@6: results[mailType] = (results[mailType] or {}) Asa@6: Asa@12: if mailType == "NonAHMail" then Asa@9: --[[ Asa@12: and msgCOD > 0 Asa@12: Asa@6: mailType = 'COD' Asa@6: results[mailType] = (results[mailType] or {}) Asa@5: Asa@5: local itemTypes = {} Asa@5: for itemIndex = 1, ATTACHMENTS_MAX_RECEIVE do Asa@5: local itemName, _, count, _, _= GetInboxItem(mailIndex, itemIndex) Asa@5: if itemName ~= nil then Asa@7: itemTypdes[itemName] = (itemTypes[itemName] or 0) + count Asa@5: end Asa@5: end Asa@5: Asa@5: if utils:tcount(itemTypes) == 1 then Asa@5: for itemName, count in pairs(itemTypes) do Asa@6: results[mailType][itemName] = (results[mailType][itemName] or 0) - msgCOD Asa@5: end Asa@5: else Asa@5: self:Debug("Don't know what to do with more than one item type on COD mail.") Asa@5: end Asa@9: ]] Asa@6: elseif mailType == "CODPayment" then Asa@6: itemName = msgSubject:gsub(utils.SubjectPatterns[mailType], function(item) return item end) Asa@5: Asa@9: results[mailType][itemName] = (results[mailType][itemName] or 0) - msgMoney Asa@5: Asa@0: elseif mailType == "AHSuccess" then Asa@0: local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex); Asa@9: results[mailType][itemName] = (results[mailType][itemName] or 0) - deposit - buyout + consignment Asa@0: Asa@0: elseif mailType == "AHWon" then Asa@0: local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex); Asa@9: results[mailType][itemName] = (results[mailType][itemName] or 0) + bid Asa@5: elseif mailType == "AHExpired" or mailType == "AHCancelled" or mailType == "AHOutbid" 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@9: function addon:GetItem(link, viewOnly) Asa@9: if viewOnly == nil then Asa@9: viewOnly = false Asa@9: end Asa@8: Asa@9: local itemName = nil Asa@9: if self:GetSafeLink(link) == nil then Asa@9: itemName = link Asa@12: link = self:GetSafeLink(link) Asa@9: else Asa@9: link = self:GetSafeLink(link) Asa@9: itemName = GetItemInfo(link) Asa@9: end Asa@9: Asa@12: Asa@9: if self.db.factionrealm.item_account[itemName] ~= nil then Asa@8: self.items[link] = { Asa@12: count = Altoholic:GetItemCount(self:GetIDFromLink(link)), Asa@8: invested = abs(self.db.factionrealm.item_account[itemName] or 0), Asa@8: } Asa@8: self.db.factionrealm.item_account[itemName] = nil Asa@8: end Asa@8: Asa@9: if viewOnly == false and self.items[link] == nil then Asa@9: local itemName = GetItemInfo(link) Asa@9: Asa@9: self.items[link] = { Asa@10: count = Altoholic:GetItemCount(self:GetIDFromLink(link)), Asa@9: invested = abs(self.db.factionrealm.item_account[itemName] or 0), Asa@9: } Asa@9: Asa@9: end Asa@9: Asa@9: Asa@9: Asa@9: if viewOnly == true and self.items[link] == nil then Asa@9: return {count = 0, invested = 0} Asa@9: elseif viewOnly == true then Asa@9: return {count = self.items[link].count, invested = self.items[link].invested} Asa@9: end Asa@10: self.items[link].count = Altoholic:GetItemCount(self:GetIDFromLink(link)) Asa@8: return self.items[link] Asa@8: end Asa@8: Asa@8: function addon:RemoveItem(link) Asa@9: self.db.factionrealm.item_account[link] = nil Asa@9: link = self:GetSafeLink(link) Asa@9: if link ~= nil then Asa@9: self.items[link] = nil Asa@9: end Asa@8: end Asa@8: Asa@8: function addon:SaveValue(link, value) Asa@9: local item = nil Asa@9: local realLink = self:GetSafeLink(link) Asa@9: local itemName = nil Asa@9: if realLink == nil then Asa@9: itemName = link Asa@9: self.db.factionrealm.item_account[itemName] = (self.db.factionrealm.item_account[itemName] or 0) + value Asa@9: item = {invested = self.db.factionrealm.item_account[itemName], count = 1} Asa@9: else Asa@9: item = self:GetItem(realLink) Asa@9: item.invested = item.invested + value Asa@9: itemName = GetItemInfo(realLink) Asa@9: end Asa@8: Asa@7: if abs(value) > 0 then Asa@8: self:Debug("Updated price of " .. itemName .. " to " .. utils:FormatMoney(item.invested) .. "(change: " .. utils:FormatMoney(value) .. ")") Asa@12: Asa@12: if item.invested <= 0 then Asa@12: self:Debug("Updated price of " .. itemName .. " to " .. utils:FormatMoney(0)) Asa@12: self:RemoveItem(link) Asa@12: -- This doesn't work when you mail the only copy of an item you have to another character. Asa@12: --[[ Asa@12: elseif item.count == 0 and realLink and Altoholic:GetItemCount(self:GetIDFromLink(realLink)) then Asa@12: self:Print("You ran out of " .. itemName .. " and never recovered " .. utils:FormatMoney(item.invested)) Asa@12: self:RemoveItem(link) Asa@12: ]] Asa@12: end Asa@0: end Asa@10: Asa@10: if realLink ~= nil then Asa@10: addon:UpdateQAThreshold(realLink) Asa@10: end Asa@10: end Asa@12: Asa@10: function addon:UpdateQAThreshold(link) Asa@10: _, link= GetItemInfo(link) Asa@10: Asa@10: self:UpdateQAGroup(QAAPI:GetItemGroup(link)) Asa@10: end Asa@10: Asa@10: function addon:UpdateQAGroup(groupName) Asa@10: if groupName then Asa@12: local threshold = 0 Asa@10: Asa@10: for link in pairs(QAAPI:GetItemsInGroup(groupName)) do Asa@12: local _, itemCost= ItemAuditor:GetItemCost(link, 0) Asa@10: Asa@12: threshold = max(threshold, itemCost) Asa@10: end Asa@10: Asa@12: if threshold == 0 then Asa@12: threshold = 10000 Asa@12: end Asa@12: Asa@12: -- add my minimum profit margin Asa@12: threshold = threshold * 1.10 Asa@12: Asa@10: -- Adding the cost of mailing every item once. Asa@10: threshold = threshold + 30 Asa@10: Asa@10: -- add AH Cut Asa@10: local keep = 1 - self.db.factionrealm.AHCut Asa@10: threshold = threshold/keep Asa@10: Asa@10: QAAPI:SetGroupThreshold(groupName, ceil(threshold)) Asa@10: 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@9: function addon:GetItemID(itemName) Asa@9: return utils:GetItemID(itemName) Asa@9: end Asa@9: Asa@9: function addon:GetSafeLink(link) Asa@9: local newLink = nil Asa@9: Asa@10: if link and link ~= string.match(link, '.-:[-0-9]+[:0-9]*') then Asa@9: newLink = link and string.match(link, "|H(.-):([-0-9]+):([0-9]+)|h") Asa@9: end Asa@9: if newLink == nil then Asa@9: local itemID = self:GetItemID(link) Asa@9: if itemID ~= nil then Asa@9: _, newLink = GetItemInfo(itemID) Asa@9: return self:GetSafeLink(newLink) Asa@9: end Asa@9: end Asa@9: return newLink and string.gsub(newLink, ":0:0:0:0:0:0", "") Asa@9: end Asa@9: Asa@9: function addon:GetIDFromLink(link) Asa@9: local _, _, _, _, Id = string.find(link, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?") Asa@9: return tonumber(Id) Asa@9: end Asa@9: Asa@8: function addon:GetItemCost(link, countModifier) Asa@9: local item = self:GetItem(link, true) Asa@8: Asa@9: if item.invested > 0 then Asa@9: local count = item.count Asa@9: Asa@9: if countModifier ~= nil then Asa@9: count = count - countModifier Asa@0: end Asa@9: if count > 0 then Asa@9: return ceil(item.invested), ceil(item.invested/item.count), count Asa@9: end Asa@9: Asa@0: end Asa@0: return 0, 0, 0 Asa@0: end