annotate Modules/Events.lua @ 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
rev   line source
Asa@3 1 local addonName, addonTable = ...;
Asa@3 2 local addon = _G[addonName]
Asa@3 3
Asa@38 4 function addon:OnEnable()
Asa@3 5 self:RegisterEvent("MAIL_SHOW")
Asa@4 6 self:RegisterEvent("UNIT_SPELLCAST_START")
Asa@24 7 addon:UpdateCurrentInventory()
Asa@3 8 self:WatchBags()
Asa@9 9
Asa@38 10 self:SetEnabled(nil, self.db.profile.addon_enabled)
Asa@38 11 end
Asa@38 12
Asa@38 13 function addon:OnDisable()
Asa@38 14 self:UnwatchBags()
Asa@38 15 self:UnregisterAllEvents()
Asa@38 16 addon:HideAllFrames()
Asa@3 17 end
Asa@3 18
Asa@3 19 function addon:MAIL_SHOW()
Asa@3 20 self:Debug("MAIL_SHOW")
Asa@39 21 self:UnwatchBags()
Asa@24 22 addon:UpdateCurrentInventory()
Asa@3 23 self.lastMailScan = self:ScanMail()
Asa@7 24
Asa@3 25 self:UnregisterEvent("MAIL_SHOW")
Asa@3 26 self:RegisterEvent("MAIL_CLOSED")
Asa@3 27 self:RegisterEvent("MAIL_INBOX_UPDATE")
Asa@39 28
Asa@39 29 self:GenerateBlankOutbox()
Asa@39 30
Asa@39 31 self:RegisterEvent("MAIL_SUCCESS")
Asa@39 32 end
Asa@39 33
Asa@39 34 function addon:GenerateBlankOutbox()
Asa@39 35 self.mailOutbox = {
Asa@39 36 from = UnitName("player"),
Asa@39 37 to = "",
Asa@39 38 subject = "",
Asa@39 39 link = '',
Asa@39 40 count = 0,
Asa@39 41 COD = 0,
Asa@39 42 key = random(10000),
Asa@39 43 sent = 0,
Asa@39 44 }
Asa@39 45
Asa@39 46 if self.db.factionrealm.outbound_cod[self.mailOutbox.key] ~= nil then
Asa@39 47 return self:GenerateBlankOutbox()
Asa@39 48 end
Asa@39 49 end
Asa@39 50
Asa@39 51 local Orig_SendMail = SendMail
Asa@39 52
Asa@39 53 function SendMail(recipient, subject, body, ...)
Asa@39 54 local self = ItemAuditor
Asa@39 55 self:GenerateBlankOutbox()
Asa@39 56
Asa@39 57 self:Debug(format("[To: %s] [Subject: %s]", recipient, subject))
Asa@39 58
Asa@39 59 self.mailOutbox.COD = GetSendMailCOD()
Asa@39 60
Asa@39 61 if self.mailOutbox.COD == 0 then
Asa@39 62 self:Debug("Non-COD mail")
Asa@39 63 return Orig_SendMail(recipient, subject, body, ...)
Asa@39 64 end
Asa@39 65
Asa@39 66 subject = format("[IA: %s] %s", self.mailOutbox.key, subject)
Asa@39 67 self.mailOutbox.subject = subject
Asa@39 68 self.mailOutbox.to = recipient
Asa@39 69
Asa@39 70 self.mailOutbox.count = 0
Asa@39 71 local link
Asa@39 72 for index = 1, 12 do
Asa@39 73 local itemName, _, itemCount = GetSendMailItem(index)
Asa@39 74 local newLink = GetSendMailItemLink(index)
Asa@39 75
Asa@39 76 if link == nil then
Asa@39 77 link = newLink
Asa@39 78 end
Asa@39 79
Asa@39 80 if newLink ~= nil and self:GetIDFromLink(newLink) ~= self:GetIDFromLink(link) then
Asa@39 81 self:Print(self:GetIDFromLink(newLink))
Asa@39 82 self:Print(self:GetIDFromLink(link))
Asa@39 83
Asa@39 84 self:Print("WARNING: ItemAuditor can't track COD mail with more than one item type.")
Asa@39 85 self:GenerateBlankOutbox()
Asa@39 86 return
Asa@39 87 end
Asa@39 88 self.mailOutbox.link = link
Asa@39 89 self.mailOutbox.count = self.mailOutbox.count + itemCount
Asa@39 90
Asa@39 91 end
Asa@39 92
Asa@39 93 -- self:MAIL_SUCCESS("Mock Success")
Asa@39 94 return Orig_SendMail(recipient, subject, body, ...)
Asa@39 95 end
Asa@39 96
Asa@39 97 function addon:MAIL_SUCCESS(event)
Asa@39 98
Asa@39 99 if self.mailOutbox.COD > 0 then
Asa@39 100 self:Debug(format("MAIL_SUCCESS %d [To: %s] [Subject: %s] [COD: %s]", self.mailOutbox.key, self.mailOutbox.to, self.mailOutbox.subject, self.mailOutbox.COD))
Asa@39 101
Asa@39 102 self.mailOutbox.sent = time()
Asa@39 103 self.db.factionrealm.outbound_cod[self.mailOutbox.key] = self.mailOutbox
Asa@39 104 end
Asa@39 105
Asa@39 106 self.mailOutbox = {
Asa@39 107 to = "",
Asa@39 108 subject = "",
Asa@39 109 items = {},
Asa@39 110 COD = 0,
Asa@39 111 }
Asa@3 112 end
Asa@3 113
Asa@3 114 function addon:MAIL_CLOSED()
Asa@23 115 self:Debug("MAIL_CLOSED")
Asa@3 116 addon:UnregisterEvent("MAIL_CLOSED")
Asa@7 117 self:MAIL_INBOX_UPDATE()
Asa@3 118 self:UnregisterEvent("MAIL_INBOX_UPDATE")
Asa@3 119 self:RegisterEvent("MAIL_SHOW")
Asa@39 120 self:WatchBags()
Asa@3 121 end
Asa@3 122
Asa@26 123 local storedCountDiff
Asa@3 124 function addon:MAIL_INBOX_UPDATE()
Asa@23 125 self:Debug("MAIL_INBOX_UPDATE")
Asa@3 126 local newScan = addon:ScanMail()
Asa@3 127 local diff
Asa@39 128
Asa@6 129 for mailType, collection in pairs(self.lastMailScan) do
Asa@7 130 newScan[mailType] = (newScan[mailType] or {})
Asa@26 131 for itemName, data in pairs(collection) do
Asa@26 132 newScan[mailType][itemName] = (newScan[mailType][itemName] or {total=0,count=0})
Asa@26 133 local totalDiff = data.total - newScan[mailType][itemName].total
Asa@26 134 local countDiff = data.count - newScan[mailType][itemName].count
Asa@26 135 --[[
Asa@26 136 In one update the item will be taken and in the following update the invoice
Asa@26 137 will be gone. I need to store the item difference in order ot pass it into
Asa@26 138 SaveValue.
Asa@26 139 ]]
Asa@26 140 if countDiff ~= 0 then
Asa@26 141 storedCountDiff = countDiff
Asa@26 142 end
Asa@26 143
Asa@26 144 if totalDiff ~= 0 then
Asa@39 145 if mailType == "CODPayment" then
Asa@39 146 local trackID
Asa@39 147 trackID, itemName= strsplit("|", itemName, 2)
Asa@39 148 self.db.factionrealm.outbound_cod[tonumber(trackID)] = nil
Asa@39 149 self:Debug("Removing COD Tracker: " .. trackID)
Asa@39 150 end
Asa@26 151 self:SaveValue(itemName, totalDiff, storedCountDiff)
Asa@26 152 storedCountDiff = 0
Asa@6 153 end
Asa@6 154
Asa@3 155 end
Asa@3 156 end
Asa@3 157
Asa@3 158 self.lastMailScan = newScan
Asa@3 159 end
Asa@3 160
Asa@4 161 function addon:UNIT_SPELLCAST_START(event, target, spell)
Asa@5 162 if target == "player" and spell == "Milling" or spell == "Prospecting" or spell == "Disenchanting" then
Asa@23 163 self:Debug(event .. " " .. spell)
Asa@4 164 self:UnwatchBags()
Asa@4 165 self:UpdateCurrentInventory()
Asa@4 166 self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
Asa@4 167 self:RegisterEvent("LOOT_CLOSED")
Asa@3 168 end
Asa@3 169 end
Asa@3 170
Asa@4 171 --[[
Asa@4 172 The item should be destroyed before this point, so the last inventory check
Asa@4 173 needs to be kept so it can be combined with the up coming loot.
Asa@4 174 ]]
Asa@4 175 function addon:LOOT_CLOSED()
Asa@23 176 self:Debug("LOOT_CLOSED")
Asa@4 177 self:UnregisterEvent("LOOT_CLOSED")
Asa@4 178 self:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED")
Asa@4 179 local inventory = self.lastInventory
Asa@4 180 self:WatchBags()
Asa@4 181 self.lastInventory = inventory
Asa@4 182 end
Asa@3 183
Asa@4 184 function addon:UNIT_SPELLCAST_INTERRUPTED(event, target, spell)
Asa@5 185 if target == "player" and spell == "Milling" or spell == "Prospecting" or spell == "Disenchanting" then
Asa@23 186 self:Debug(event .. " " .. spell)
Asa@4 187 self:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED")
Asa@4 188 self:UnregisterEvent("LOOT_CLOSED")
Asa@4 189 self:WatchBags()
Asa@4 190 end
Asa@4 191 end
Asa@4 192
Asa@4 193 function addon:UpdateCurrentInventory()
Asa@4 194 self.lastInventory = self:GetCurrentInventory()
Asa@3 195 end
Asa@3 196
Asa@3 197 function addon:UpdateAudit()
Asa@23 198 -- self:Debug("UpdateAudit " .. event)
Asa@3 199 local currentInventory = self:GetCurrentInventory()
Asa@3 200 local diff = addon:GetInventoryDiff(self.lastInventory, currentInventory)
Asa@3 201
Asa@5 202 local positive, negative = {}, {}
Asa@5 203 local positiveCount, negativeCount = 0, 0
Asa@5 204 for item, count in pairs(diff.items) do
Asa@5 205 if count > 0 then
Asa@5 206 positive[item] = count
Asa@5 207 positiveCount = positiveCount + count
Asa@5 208 elseif count < 0 then
Asa@5 209 negative[item] = count
Asa@5 210 negativeCount = negativeCount + abs(count)
Asa@5 211 end
Asa@5 212 end
Asa@5 213
Asa@23 214 if positiveCount + negativeCount == 0 then
Asa@33 215 --[[
Asa@33 216 Nothing needs to be done, but this will prevent mistakenly attributing
Asa@33 217 the cost of flights to the first item you pick up.
Asa@33 218 ]]
Asa@33 219 elseif diff.money > 0 and self:tcount(positive) > 0 and self:tcount(negative) == 0 then
Asa@15 220 self:Debug("loot")
Asa@20 221 elseif abs(diff.money) > 0 and self:tcount(diff.items) == 1 then
Asa@15 222 self:Debug("purchase or sale")
Asa@3 223
Asa@9 224 for link, count in pairs(diff.items) do
Asa@26 225 self:SaveValue(link, 0 - diff.money, count)
Asa@3 226 end
Asa@23 227 elseif self:tcount(diff.items) > 1 and self:tcount(positive) > 0 and self:tcount(negative) > 0 then
Asa@23 228 -- we must have created/converted something
Asa@23 229 self:Debug("conversion")
Asa@3 230
Asa@23 231 local totalChange = 0
Asa@23 232 for link, change in pairs(negative) do
Asa@23 233 local _, itemCost, count = self:GetItemCost(link, change)
Asa@26 234 self:SaveValue(link, itemCost * change, change)
Asa@10 235
Asa@23 236 totalChange = totalChange + (itemCost * abs(change))
Asa@3 237 end
Asa@23 238
Asa@23 239 local valuePerItem = totalChange / positiveCount
Asa@23 240
Asa@23 241 for link, change in pairs(positive) do
Asa@26 242 self:SaveValue(link, valuePerItem * change, change)
Asa@23 243 end
Asa@23 244 else
Asa@23 245 self:Debug("No match in UpdateAudit.")
Asa@3 246 end
Asa@3 247
Asa@3 248 self.lastInventory = currentInventory
Asa@4 249 addon:WatchBags()
Asa@3 250 end