changeset 39:003de902ae64

Implemented COD mail. This loses the ability to track postage, but that will be restored next.
author Asa Ayers <Asa.Ayers@Gmail.com>
date Mon, 19 Jul 2010 20:16:40 -0700
parents e27d13095b49
children 5273038322d7
files Core.lua Modules/Debug.lua Modules/Events.lua Modules/Options.lua Modules/Tooltip.lua Modules/Utils.lua
diffstat 6 files changed, 145 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/Core.lua	Sun Jul 18 22:46:35 2010 -0700
+++ b/Core.lua	Mon Jul 19 20:16:40 2010 -0700
@@ -3,9 +3,6 @@
 local addon = _G[addonName]
 addonTable.ItemAuditor = addon
 
-local utils = addonTable.utils
-
-
 local WHITE		= "|cFFFFFFFF"
 local RED		= "|cFFFF0000"
 local GREEN		= "|cFF00FF00"
@@ -34,6 +31,7 @@
 		factionrealm = {
 			item_account = {},
 			items = {},
+			outbound_cod = {},
 		},
 	}
 	self.db = LibStub("AceDB-3.0"):New("ItemAuditorDB", DB_defaults, true)
@@ -169,20 +167,23 @@
 	return {items = diff, money = moneyDiff}
 end
 
-
-
+local inboundCOD = {}
+local skipMail = {}
 function addon:ScanMail()
 	local results = {}
+	local CODPaymentRegex = gsub(COD_PAYMENT, "%%s", "(.*)")
+	
 	for mailIndex = 1, GetInboxNumItems() or 0 do
-		local sender, msgSubject, msgMoney, msgCOD, _, msgItem, _, _, msgText, _, isGM = select(3, GetInboxHeaderInfo(mailIndex))
+		local sender, msgSubject, msgMoney, msgCOD, daysLeft, msgItem, _, _, msgText, _, isGM = select(3, GetInboxHeaderInfo(mailIndex))
 		local mailType = self:GetMailType(msgSubject)
 		
+		local mailSignature = msgSubject .. '-' .. msgMoney .. '-' .. msgCOD .. '-' .. daysLeft
+		
 		results[mailType] = (results[mailType] or {})
 		
-		if mailType == "NonAHMail" then
-			--[[
-			and msgCOD > 0 
-			
+		if skipMail[mailSignature] ~= nil then
+			-- do nothing
+		elseif mailType == "NonAHMail" and msgCOD > 0 then
 			mailType = 'COD'
 			results[mailType] = (results[mailType] or {})
 			
@@ -190,23 +191,58 @@
 			for itemIndex = 1, ATTACHMENTS_MAX_RECEIVE do
 				local itemName, _, count, _, _= GetInboxItem(mailIndex, itemIndex)
 				if itemName ~= nil then
-					itemTypdes[itemName] = (itemTypes[itemName] or 0) + count
+					itemTypes[itemName] = (itemTypes[itemName] or 0) + count
 				end
 			end
 			
 			if self:tcount(itemTypes) == 1 then
 				for itemName, count in pairs(itemTypes) do
-					results[mailType][itemName] = (results[mailType][itemName] or 0) - msgCOD
+					results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
+					results[mailType][itemName].total = results[mailType][itemName].total + msgCOD
+					
+					if inboundCOD[mailSignature] == nil then
+						results[mailType][itemName].count = results[mailType][itemName].count + count
+						inboundCOD[mailSignature] = (inboundCOD[mailSignature] or 0) + count
+					else
+						results[mailType][itemName].count = inboundCOD[mailSignature]
+					end
+					
+					
 				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)
+			-- /dump ItemAuditor.db.factionrealm.outbound_cod
+			self:Debug(msgSubject)
+			self:Debug(CODPaymentRegex)
+			local outboundSubject = select(3, msgSubject:find(CODPaymentRegex))
+			local trackID
+			if outboundSubject ~= nil then
+				self:Debug(outboundSubject)
+				trackID = tonumber(select(3, outboundSubject:find('[[]IA: (%d*)[]]')))
+				
+				self:Debug('COD ID: %s', trackID)
+				if trackID ~= nil then
+					local cod = self.db.factionrealm.outbound_cod[trackID]
+					if cod == nil then
+						skipMail[mailSignature] = true
+						self:Print("WARNING: {%s} has an invalid ItemAuditor tracking number.", msgSubject)
+					else
+						itemName = trackID .. "|" .. cod['link']
+						
+						
+						results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
+						results[mailType][itemName].total = results[mailType][itemName].total - msgMoney
+						results[mailType][itemName].count = results[mailType][itemName].count - cod.count
+					end
+				end
+			end
 			
-			results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
-			results[mailType][itemName].total = results[mailType][itemName].total - msgMoney
+			if trackID == nil then
+				skipMail[mailSignature] = true
+				self:Print("WARNING: {%s} is a COD payment but doesn't have an ItemAuditor tracking number.", msgSubject)
+			end
 			
 		elseif mailType == "AHSuccess" then
 			local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex);
--- a/Modules/Debug.lua	Sun Jul 18 22:46:35 2010 -0700
+++ b/Modules/Debug.lua	Mon Jul 19 20:16:40 2010 -0700
@@ -1,9 +1,6 @@
 local addonName, addonTable = ...; 
 local addon = _G[addonName]
 
-local utils = addonTable.utils
-
-
 function addon:Debug(msg, ...)
 	msg = format(msg, ...)
 	self:Log(msg, " |cffffff00DEBUG")
--- a/Modules/Events.lua	Sun Jul 18 22:46:35 2010 -0700
+++ b/Modules/Events.lua	Mon Jul 19 20:16:40 2010 -0700
@@ -1,8 +1,6 @@
 local addonName, addonTable = ...; 
 local addon = _G[addonName]
 
-local utils = addonTable.utils
-
 function addon:OnEnable()
 	self:RegisterEvent("MAIL_SHOW")
 	self:RegisterEvent("UNIT_SPELLCAST_START")
@@ -20,12 +18,97 @@
  
  function addon:MAIL_SHOW()
 	self:Debug("MAIL_SHOW")
+	self:UnwatchBags()
 	addon:UpdateCurrentInventory()
 	self.lastMailScan = self:ScanMail()
 	
 	self:UnregisterEvent("MAIL_SHOW")
 	self:RegisterEvent("MAIL_CLOSED")
 	self:RegisterEvent("MAIL_INBOX_UPDATE")
+	
+	self:GenerateBlankOutbox()
+	
+	self:RegisterEvent("MAIL_SUCCESS")
+end
+
+function addon:GenerateBlankOutbox()
+	self.mailOutbox = {
+		from = UnitName("player"),
+		to = "",
+		subject = "",
+		link = '',
+		count = 0,
+		COD = 0,
+		key = random(10000),
+		sent = 0,
+	}
+	
+	if self.db.factionrealm.outbound_cod[self.mailOutbox.key] ~= nil then
+		return self:GenerateBlankOutbox()
+	end
+end
+
+local Orig_SendMail = SendMail
+
+function SendMail(recipient, subject, body, ...)
+	local self = ItemAuditor
+	self:GenerateBlankOutbox()
+
+	self:Debug(format("[To: %s] [Subject: %s]", recipient, subject))
+	
+	self.mailOutbox.COD = GetSendMailCOD()
+	
+	if self.mailOutbox.COD == 0 then
+		self:Debug("Non-COD mail")
+		return Orig_SendMail(recipient, subject, body, ...)
+	end
+	
+	subject = format("[IA: %s] %s", self.mailOutbox.key, subject)
+	self.mailOutbox.subject = subject
+	self.mailOutbox.to = recipient
+	
+	self.mailOutbox.count  = 0
+	local link
+	for index = 1, 12 do
+		local itemName, _, itemCount = GetSendMailItem(index)
+		local newLink = GetSendMailItemLink(index)
+		
+		if link == nil then
+			link = newLink
+		end
+		
+		if newLink ~= nil and self:GetIDFromLink(newLink) ~= self:GetIDFromLink(link) then
+			self:Print(self:GetIDFromLink(newLink))
+			self:Print(self:GetIDFromLink(link))
+			
+			self:Print("WARNING: ItemAuditor can't track COD mail with more than one item type.")
+			self:GenerateBlankOutbox()
+			return
+		end
+		self.mailOutbox.link = link 
+		self.mailOutbox.count = self.mailOutbox.count + itemCount
+		
+	end
+	
+	-- self:MAIL_SUCCESS("Mock Success")
+	return Orig_SendMail(recipient, subject, body, ...)
+end
+
+function addon:MAIL_SUCCESS(event)
+
+	if self.mailOutbox.COD > 0 then
+		self:Debug(format("MAIL_SUCCESS %d [To: %s] [Subject: %s] [COD: %s]", self.mailOutbox.key, self.mailOutbox.to, self.mailOutbox.subject, self.mailOutbox.COD))
+		
+		self.mailOutbox.sent = time()
+		self.db.factionrealm.outbound_cod[self.mailOutbox.key] = self.mailOutbox
+	end
+	
+	self.mailOutbox = {
+		to = "",
+		subject = "",
+		items = {},
+		COD = 0,
+	}
 end
 
 function addon:MAIL_CLOSED()
@@ -34,6 +117,7 @@
 	self:MAIL_INBOX_UPDATE()
 	self:UnregisterEvent("MAIL_INBOX_UPDATE")
 	self:RegisterEvent("MAIL_SHOW")
+	self:WatchBags()
 end
 
 local storedCountDiff
@@ -41,6 +125,7 @@
 	self:Debug("MAIL_INBOX_UPDATE")
 	local newScan = addon:ScanMail()
 	local diff
+	
 	for mailType, collection in pairs(self.lastMailScan) do
 		newScan[mailType] = (newScan[mailType] or {})
 		for itemName, data in pairs(collection) do
@@ -57,6 +142,12 @@
 			end
 			
 			if totalDiff ~= 0 then
+				if mailType == "CODPayment" then
+					local trackID
+					trackID, itemName= strsplit("|", itemName, 2)
+					self.db.factionrealm.outbound_cod[tonumber(trackID)] = nil
+					self:Debug("Removing COD Tracker: " .. trackID)
+				end
 				self:SaveValue(itemName, totalDiff, storedCountDiff)
 				storedCountDiff = 0
 			end
--- a/Modules/Options.lua	Sun Jul 18 22:46:35 2010 -0700
+++ b/Modules/Options.lua	Mon Jul 19 20:16:40 2010 -0700
@@ -1,8 +1,6 @@
 local addonName, addonTable = ...; 
 local addon = _G[addonName]
 
-local utils = addonTable.utils
-
 local currentFaction = UnitFactionGroup("player")
 local AHFactions = { currentFaction, 'Neutral' }
 
@@ -227,13 +225,6 @@
 	return AHFactions[ItemAuditor.db.char.ah]
 end
 
-function addon:DumpInfo()
-	for itemName, value in pairsByKeys(self.db.factionrealm.item_account) do
-		self:Print(itemName .. ": " .. self:FormatMoney(value))
-	end
-end
-
-
 function addon:ShowOptionsGUI()
 	InterfaceOptionsFrame_OpenToCategory(self.optionsFrame)
 end
--- a/Modules/Tooltip.lua	Sun Jul 18 22:46:35 2010 -0700
+++ b/Modules/Tooltip.lua	Mon Jul 19 20:16:40 2010 -0700
@@ -1,8 +1,6 @@
 local addonName, addonTable = ...; 
 local addon = _G[addonName]
 
-local utils = addonTable.utils
-
 local function ShowTipWithPricing(tip, link, num)
 	if (link == nil) then
 		return;
--- a/Modules/Utils.lua	Sun Jul 18 22:46:35 2010 -0700
+++ b/Modules/Utils.lua	Mon Jul 19 20:16:40 2010 -0700
@@ -1,9 +1,6 @@
 local addonName, addonTable = ...; 
 local addon = _G[addonName]
 
-addonTable.utils = addon
-IAUtils = addon
-
 function addon:FormatMoney(copper, color, textOnly)
 	color = color or "|cFFFFFFFF"
 	local prefix = ""