view Core.lua @ 12:6a6296dd249f

Removed dependency on DevTools, completed chaning over the database to use links instead of names, Added integration with my version of QuickAuctions3 (I need to make this optional soon)
author Asa Ayers <Asa.Ayers@Gmail.com>
date Wed, 30 Jun 2010 22:59:37 -0700
parents c79ede3c7b82
children 8c83d5f6e306
line wrap: on
line source
local addonName, addonTable = ...; 
_G[addonName] = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceConsole-3.0", "AceEvent-3.0", "AceBucket-3.0")
local addon = _G[addonName]
addonTable.ItemAuditor = addon

local utils = addonTable.utils


local WHITE		= "|cFFFFFFFF"
local RED		= "|cFFFF0000"
local GREEN		= "|cFF00FF00"
local YELLOW	= "|cFFFFFF00"
local ORANGE	= "|cFFFF7F00"
local TEAL		= "|cFF00FF9A"
local GOLD		= "|cFFFFD700"

function addon:OnInitialize()
	local DB_defaults = {
		char = {
			debug = false
		},
		factionrealm = {
			item_account = {},
			items = {},
			AHCut = 0.05,
		},
	}
	self.db = LibStub("AceDB-3.0"):New("ItemAuditorDB", DB_defaults, true)
	addonTable.db= self.db
	self.items = self.db.factionrealm.items
	
	self:RegisterOptions()
	
	self:RegisterEvent("PLAYER_ENTERING_WORLD")
end

function addon:ConvertItems()
	for itemName, value in pairs(self.db.factionrealm.item_account) do
		local itemID = utils:GetItemID(itemName)
		if itemID ~= nil then
			self:GetItem('item:' .. itemID)
		end
		if value == 0 then
			self.db.factionrealm.item_account[itemName] = nil
		end
	end
	
	for link, data in pairs(self.db.factionrealm.items) do
		if self:GetItem(link).count == 0 or self:GetItem(link).invested == 0 then
			self:RemoveItem(link)
		end
		-- addon:UpdateQAThreshold(link)
	end
	
	self:RefreshQAGroups()
end

function addon:RefreshQAGroups()
	for groupName in pairs(QAAPI:GetGroups()) do
		self:UpdateQAGroup(groupName)
	end
end

function addon:GetCurrentInventory()
	local i = {}
	local bagID
	local slotID
	
	for bagID = 0, NUM_BAG_SLOTS do
		bagSize=GetContainerNumSlots(bagID)
		for slotID = 0, bagSize do
			local link= GetContainerItemLink(bagID, slotID);
			link = link and self:GetSafeLink(link)

			if link ~= nil and i[link] == nil then
				i[link] = GetItemCount(link);
			end
		end

	end
	return {items = i, money = GetMoney()}
end

function addon:GetInventoryDiff(pastInventory, current)
	if current == nil then
		current = self:GetCurrentInventory()
	end
	local diff = {}

	for link, count in pairs(current.items) do
		if pastInventory.items[link] == nil then
			diff[link] = count
			-- self:Debug("1 diff[" .. name .. "]=" .. diff[name])
		elseif count - pastInventory.items[link] ~= 0 then
			diff[link] = count - pastInventory.items[link]
			-- self:Debug("2 diff[" .. name .. "]=" .. diff[name])        
		end    
	end

	for link, count in pairs(pastInventory.items) do
		if current.items[link] == nil then
			diff[link] = -count
			-- self:Debug("3 diff[" .. name .. "]=" .. diff[name])                
		elseif current.items[link] - count ~= 0 then
			diff[link] = current.items[link] - pastInventory.items[link]
			-- self:Debug("4 diff[" .. name .. "]=" .. diff[name])        
		end
	end

	local moneyDiff = current.money - pastInventory.money

	return {items = diff, money = moneyDiff}
end



function addon:ScanMail()
	local results = {}
	for mailIndex = 1, GetInboxNumItems() or 0 do
		local sender, msgSubject, msgMoney, msgCOD, _, msgItem, _, _, msgText, _, isGM = select(3, GetInboxHeaderInfo(mailIndex))
		local mailType = utils:GetMailType(msgSubject)
		
		results[mailType] = (results[mailType] or {})
		
		if mailType == "NonAHMail" then
			--[[
			and msgCOD > 0 
			
			mailType = 'COD'
			results[mailType] = (results[mailType] or {})
			
			local itemTypes = {}
			for itemIndex = 1, ATTACHMENTS_MAX_RECEIVE do
				local itemName, _, count, _, _= GetInboxItem(mailIndex, itemIndex)
				if itemName ~= nil then
					itemTypdes[itemName] = (itemTypes[itemName] or 0) + count
				end
			end
			
			if utils:tcount(itemTypes) == 1 then
				for itemName, count in pairs(itemTypes) do
					results[mailType][itemName] = (results[mailType][itemName] or 0) - msgCOD
				end
			else
				self:Debug("Don't know what to do with more than one item type on COD mail.")
			end
			]]
		elseif mailType == "CODPayment" then	
			itemName = msgSubject:gsub(utils.SubjectPatterns[mailType], function(item) return item end)
			
			results[mailType][itemName] = (results[mailType][itemName] or 0) - msgMoney
			
		elseif mailType == "AHSuccess" then
			local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex);
			results[mailType][itemName] = (results[mailType][itemName] or 0) - deposit - buyout + consignment

		elseif mailType == "AHWon" then
			local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex);
			results[mailType][itemName] = (results[mailType][itemName] or 0) + bid
		elseif mailType == "AHExpired" or mailType == "AHCancelled" or mailType == "AHOutbid" then
			-- These should be handled when you pay the deposit at the AH
		else
			self:Debug("Unhandled mail type: " .. mailType)
			self:Debug(msgSubject)
		end

	end
	return results   
end

function addon:GetItem(link, viewOnly)
	if viewOnly == nil then
		viewOnly = false
	end
	
	local itemName = nil
	if self:GetSafeLink(link) == nil then
		itemName = link
		link = self:GetSafeLink(link)
	else
		link = self:GetSafeLink(link)
		itemName = GetItemInfo(link)
	end
	
	
	if self.db.factionrealm.item_account[itemName] ~= nil then
		self.items[link] = {
			count = Altoholic:GetItemCount(self:GetIDFromLink(link)),
			invested = abs(self.db.factionrealm.item_account[itemName] or 0),
		}
		self.db.factionrealm.item_account[itemName] = nil
	end
	
	if viewOnly == false and self.items[link] == nil then
		local itemName = GetItemInfo(link)
	
		self.items[link] = {
			count =  Altoholic:GetItemCount(self:GetIDFromLink(link)),
			invested = abs(self.db.factionrealm.item_account[itemName] or 0),
		}
		
	end
	
	
	
	if viewOnly == true and self.items[link] == nil then
		return {count = 0, invested = 0}
	elseif viewOnly == true then
		return {count = self.items[link].count, invested = self.items[link].invested}
	end
	self.items[link].count =  Altoholic:GetItemCount(self:GetIDFromLink(link))
	return self.items[link]
end

function addon:RemoveItem(link)
	self.db.factionrealm.item_account[link] = nil
	link = self:GetSafeLink(link)
	if link ~= nil then
		self.items[link] = nil
	end
end

function addon:SaveValue(link, value)
	local item = nil
	local realLink = self:GetSafeLink(link)
	local itemName = nil
	if realLink == nil then
		itemName = link
		self.db.factionrealm.item_account[itemName] = (self.db.factionrealm.item_account[itemName] or 0) + value
		item = {invested = self.db.factionrealm.item_account[itemName], count = 1}
	else
		item = self:GetItem(realLink)
		item.invested = item.invested + value
		itemName = GetItemInfo(realLink)
	end
	
	if abs(value) > 0 then
		self:Debug("Updated price of " .. itemName .. " to " .. utils:FormatMoney(item.invested) .. "(change: " .. utils:FormatMoney(value) .. ")")
		
		if item.invested <= 0 then
			self:Debug("Updated price of " .. itemName .. " to " .. utils:FormatMoney(0))
			self:RemoveItem(link)
		-- This doesn't work when you mail the only copy of an item you have to another character.
		--[[
		elseif item.count == 0 and realLink and Altoholic:GetItemCount(self:GetIDFromLink(realLink)) then 
			self:Print("You ran out of " .. itemName .. " and never recovered " .. utils:FormatMoney(item.invested))
			self:RemoveItem(link)
		]]
		end
	end
	
	if realLink ~= nil then
		addon:UpdateQAThreshold(realLink)
	end
end

function addon:UpdateQAThreshold(link)
	_, link= GetItemInfo(link)
	
	self:UpdateQAGroup(QAAPI:GetItemGroup(link))
end

function addon:UpdateQAGroup(groupName)
	if groupName then
		local threshold = 0
		
		for link in pairs(QAAPI:GetItemsInGroup(groupName)) do
			local _, itemCost= ItemAuditor:GetItemCost(link, 0)
			
			threshold = max(threshold, itemCost)
		end
		
		if threshold == 0 then
			threshold = 10000
		end
		
		-- add my minimum profit margin
		threshold = threshold * 1.10
		
		-- Adding the cost of mailing every item once.
		threshold = threshold + 30
		
		-- add AH Cut
		local keep = 1 - self.db.factionrealm.AHCut
		threshold = threshold/keep
		
		QAAPI:SetGroupThreshold(groupName, ceil(threshold))
	end
end

local defaultBagDelay = 0.2

function addon:WatchBags(delay)
	delay = delay or defaultBagDelay
	if delay ~= self.currentBagDelay  then
		self:UnwatchBags()
	end

	if self.watch_handle == nil then
		self.currentBagDelay = delay
		self:Debug("currentBagDelay = " .. delay)
		addon:UpdateCurrentInventory()
		self.watch_handle = self:RegisterBucketEvent({"BAG_UPDATE", "PLAYER_MONEY"}, self.currentBagDelay, "UpdateAudit")
	end
end

function addon:UnwatchBags()
	if self.watch_handle ~= nil then
		self:UnregisterBucket(self.watch_handle)
		self.watch_handle = nil
	end
end

function addon:GetItemID(itemName)
	return utils:GetItemID(itemName)
end

function addon:GetSafeLink(link)
	local newLink = nil

	if link and link ~= string.match(link, '.-:[-0-9]+[:0-9]*') then
		newLink = link and string.match(link, "|H(.-):([-0-9]+):([0-9]+)|h")
	end
	if newLink == nil then
		local itemID = self:GetItemID(link)
		if itemID ~= nil then
			_, newLink = GetItemInfo(itemID)
			return self:GetSafeLink(newLink)
		end
	end
	return newLink and string.gsub(newLink, ":0:0:0:0:0:0", "")
end

function addon:GetIDFromLink(link)
	local _, _, _, _, Id = string.find(link, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?")
	return tonumber(Id)
end

function addon:GetItemCost(link, countModifier)
	local item = self:GetItem(link, true)

	if item.invested > 0 then
		local count = item.count
		
		if countModifier ~= nil then
			count = count - countModifier
		end
		if count > 0 then 
			return ceil(item.invested), ceil(item.invested/item.count), count
		end
		
	end
	return 0, 0, 0
end