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 |