annotate Core.lua @ 121:f7efbd879062

Update GetItemCost to return the total invested even if you have none of that item left. If you sell all of an item but are waiting for the mail to arrive, you can still see how much you have invested even though you don't actually own any more of that item.
author Asa Ayers <Asa.Ayers@Gmail.com>
date Thu, 02 Sep 2010 21:40:08 -0700
parents d94195157a6b
children 451d8a19edea
rev   line source
Asa@63 1 local ItemAuditor = select(2, ...)
Asa@63 2 ItemAuditor = LibStub("AceAddon-3.0"):NewAddon(ItemAuditor, "ItemAuditor", "AceEvent-3.0", "AceBucket-3.0")
Asa@65 3 --@debug@
Asa@65 4 _G['ItemAuditor'] = ItemAuditor
Asa@65 5 --@end-debug@
Asa@0 6
Asa@87 7 if not DevTools_Dump then
Asa@87 8 function DevTools_Dump()
Asa@87 9 end
Asa@87 10 end
Asa@87 11
Asa@98 12 local allMailboxes = {}
Asa@98 13 local myMailbox = {}
Asa@67 14
Asa@67 15 ItemAuditor.Options = {
Asa@67 16 handler = ItemAuditor,
Asa@67 17 name = "ItemAuditor @project-version@",
Asa@67 18 type = 'group',
Asa@67 19 args = {
Asa@67 20 options = {
Asa@67 21 type = "execute",
Asa@67 22 name = "options",
Asa@67 23 desc = "Show Blizzard's options GUI",
Asa@67 24 func = "ShowOptionsGUI",
Asa@67 25 guiHidden = true,
Asa@67 26 },
Asa@67 27 debug = {
Asa@67 28 type = "execute",
Asa@67 29 name = "debug",
Asa@67 30 desc = "Shows the debug frame",
Asa@67 31 func = function() ItemAuditor_DebugFrame:Show() end,
Asa@67 32 guiHidden = true,
Asa@67 33 },
Asa@67 34 suspend = {
Asa@67 35 type = "toggle",
Asa@67 36 name = "suspend",
Asa@67 37 desc = "Suspends ItemAuditor",
Asa@67 38 get = "IsEnabled",
Asa@67 39 set = "SetEnabled",
Asa@67 40 guiHidden = true,
Asa@67 41 },
Asa@67 42 },
Asa@67 43 }
Asa@67 44
Asa@100 45 ItemAuditor.DB_defaults = {
Asa@100 46 char = {
Asa@100 47 ah = 1,
Asa@100 48 use_quick_auctions = false,
Asa@101 49 profitable_threshold = 10000,
Asa@100 50 auction_threshold = 0.15,
Asa@111 51 auction_threshold_value = 0,
Asa@100 52 qa_extra = 0,
Asa@100 53 output_chat_frame = nil,
Asa@109 54 cod_warnings = true,
Asa@100 55 },
Asa@100 56 profile = {
Asa@100 57 messages = {
Asa@100 58 cost_updates = true,
Asa@100 59 queue_skip = false,
Asa@100 60 },
Asa@100 61 ItemAuditor_enabled = true,
Asa@100 62 queue_destination = nil,
Asa@100 63 disabled_deciders = {},
Asa@100 64 pricing_method = 'low',
Asa@100 65 },
Asa@100 66 factionrealm = {
Asa@100 67 item_account = {},
Asa@100 68 items = {},
Asa@100 69 outbound_cod = {},
Asa@100 70 mailbox = {},
Asa@100 71 },
Asa@100 72 }
Asa@100 73
Asa@63 74 function ItemAuditor:OnInitialize()
Asa@100 75 self.db = LibStub("AceDB-3.0"):New("ItemAuditorDB", ItemAuditor.DB_defaults, true)
Asa@98 76
Asa@98 77 allMailboxes = self.db.factionrealm.mailbox
Asa@98 78 if not allMailboxes[UnitName("player")] then
Asa@98 79 allMailboxes[UnitName("player")] = {}
Asa@98 80 end
Asa@98 81 myMailbox = allMailboxes[UnitName("player")]
Asa@98 82
Asa@67 83 self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("ItemAuditor", "ItemAuditor")
Asa@67 84
Asa@67 85 LibStub("AceConfig-3.0"):RegisterOptionsTable("ItemAuditor", ItemAuditor.Options, {"ia"})
Asa@38 86 ItemAuditor:RegisterFrame(ItemAuditor_DebugFrame)
Asa@23 87
Asa@86 88 LibStub("AceConsole-3.0"):RegisterChatCommand('rl', ReloadUI)
Asa@100 89
Asa@101 90 if self.db.char.crafting_threshold then
Asa@101 91 local threshold = self.db.char.crafting_threshold
Asa@101 92 if threshold == 1 then
Asa@101 93 self.db.char.profitable_threshold = 5000
Asa@101 94 elseif threshold == 2 then
Asa@101 95 self.db.char.profitable_threshold = 10000
Asa@101 96 elseif threshold == 3 then
Asa@101 97 self.db.char.profitable_threshold = 50000
Asa@101 98 end
Asa@101 99
Asa@101 100 self.db.char.crafting_threshold = nil
Asa@101 101 end
Asa@101 102
Asa@119 103 ItemAuditor:IsQAEnabled()
Asa@112 104
Asa@65 105 --@debug@
Asa@59 106 -- ItemAuditor_DebugFrame:Show()
Asa@59 107 -- self:CreateFrame('tab_crafting')
Asa@74 108 self:RegisterEvent("TRADE_SKILL_SHOW", function()
Asa@93 109 ItemAuditor:DisplayCrafting()
Asa@74 110 end)
Asa@65 111 --@end-debug@
Asa@0 112 end
Asa@0 113
Asa@67 114
Asa@67 115
Asa@38 116 local registeredEvents = {}
Asa@63 117 local originalRegisterEvent = ItemAuditor.RegisterEvent
Asa@63 118 function ItemAuditor:RegisterEvent(event, callback, arg)
Asa@38 119 registeredEvents[event] = true
Asa@38 120 if arg ~= nil then
Asa@38 121 return originalRegisterEvent(self, event, callback, arg)
Asa@38 122 elseif callback ~= nil then
Asa@38 123 return originalRegisterEvent(self, event, callback)
Asa@38 124 else
Asa@38 125 return originalRegisterEvent(self, event)
Asa@38 126 end
Asa@38 127 end
Asa@38 128
Asa@63 129 local originalUnregisterEvent = ItemAuditor.UnregisterEvent
Asa@63 130 function ItemAuditor:UnregisterEvent(event)
Asa@38 131 registeredEvents[event] = nil
Asa@38 132 return originalUnregisterEvent(self, event)
Asa@38 133 end
Asa@38 134
Asa@63 135 function ItemAuditor:UnregisterAllEvents()
Asa@38 136 for event in pairs(registeredEvents) do
Asa@38 137 self:UnregisterEvent(event)
Asa@38 138 end
Asa@38 139 end
Asa@38 140
Asa@38 141 local registeredFrames = {}
Asa@63 142 function ItemAuditor:RegisterFrame(frame)
Asa@38 143 tinsert(registeredFrames, frame)
Asa@38 144 end
Asa@38 145
Asa@63 146 function ItemAuditor:HideAllFrames()
Asa@38 147 for key, frame in pairs(registeredFrames) do
Asa@38 148 if frame then
Asa@38 149 frame:Hide()
Asa@38 150 end
Asa@38 151 end
Asa@38 152 end
Asa@38 153
Asa@63 154 function ItemAuditor:ConvertItems()
Asa@8 155 for itemName, value in pairs(self.db.factionrealm.item_account) do
Asa@15 156 local itemID = self:GetItemID(itemName)
Asa@8 157 if itemID ~= nil then
Asa@8 158 self:GetItem('item:' .. itemID)
Asa@8 159 end
Asa@8 160 if value == 0 then
Asa@8 161 self.db.factionrealm.item_account[itemName] = nil
Asa@8 162 end
Asa@8 163 end
Asa@8 164
Asa@8 165 for link, data in pairs(self.db.factionrealm.items) do
Asa@8 166 if self:GetItem(link).count == 0 or self:GetItem(link).invested == 0 then
Asa@8 167 self:RemoveItem(link)
Asa@8 168 end
Asa@10 169 end
Asa@10 170
Asa@12 171 self:RefreshQAGroups()
Asa@12 172 end
Asa@12 173
Asa@65 174 -- Options doesn't exist when this file is created the first time, so getOptions will
Asa@65 175 -- make one call to :GetModule and return the result and replace itself with a
Asa@65 176 -- function that simply returns the same object. The permanent solution will probably be
Asa@65 177 -- to move :Print to a different module.
Asa@65 178 local function getOptions()
Asa@65 179 local Options = ItemAuditor:GetModule("Options")
Asa@65 180 getOptions = function() return Options end
Asa@65 181 return Options
Asa@65 182 end
Asa@65 183
Asa@24 184 local printPrefix = "|cFFA3CEFFItemAuditor|r: "
Asa@63 185 function ItemAuditor:Print(message, ...)
Asa@24 186 message = format(message, ...)
Asa@65 187 getOptions().GetSelectedChatWindow():AddMessage( printPrefix .. tostring(message))
Asa@16 188 end
Asa@16 189
Asa@81 190 local bankOpen = false
Asa@81 191
Asa@81 192 function ItemAuditor:BankFrameChanged(event)
Asa@81 193 bankOpen = (event == 'BANKFRAME_OPENED')
Asa@81 194 ItemAuditor:UpdateCurrentInventory()
Asa@81 195 end
Asa@81 196
Asa@80 197 local function scanBag(bagID, i)
Asa@80 198 bagSize=GetContainerNumSlots(bagID)
Asa@80 199 for slotID = 0, bagSize do
Asa@80 200 local link= GetContainerItemLink(bagID, slotID);
Asa@80 201 link = link and ItemAuditor:GetSafeLink(link)
Asa@80 202
Asa@80 203 if link ~= nil and i[link] == nil then
Asa@81 204 i[link] = GetItemCount(link, bankOpen);
Asa@80 205 end
Asa@80 206 end
Asa@80 207 end
Asa@80 208
Asa@63 209 function ItemAuditor:GetCurrentInventory()
Asa@8 210 local i = {}
Asa@8 211 local bagID
Asa@8 212 local slotID
Asa@8 213
Asa@8 214 for bagID = 0, NUM_BAG_SLOTS do
Asa@80 215 scanBag(bagID, i)
Asa@8 216 end
Asa@80 217
Asa@81 218 if bankOpen then
Asa@81 219 scanBag(BANK_CONTAINER, i)
Asa@81 220 for bagID = NUM_BAG_SLOTS+1, NUM_BANKBAGSLOTS do
Asa@81 221 scanBag(bagID, i)
Asa@81 222 end
Asa@80 223 end
Asa@80 224
Asa@8 225 return {items = i, money = GetMoney()}
Asa@0 226 end
Asa@0 227
Asa@63 228 function ItemAuditor:GetInventoryDiff(pastInventory, current)
Asa@8 229 if current == nil then
Asa@8 230 current = self:GetCurrentInventory()
Asa@8 231 end
Asa@8 232 local diff = {}
Asa@8 233
Asa@8 234 for link, count in pairs(current.items) do
Asa@8 235 if pastInventory.items[link] == nil then
Asa@8 236 diff[link] = count
Asa@23 237 self:Debug("1 diff[" .. link .. "]=" .. diff[link])
Asa@8 238 elseif count - pastInventory.items[link] ~= 0 then
Asa@8 239 diff[link] = count - pastInventory.items[link]
Asa@23 240 self:Debug("2 diff[" .. link .. "]=" .. diff[link])
Asa@8 241 end
Asa@8 242 end
Asa@8 243
Asa@8 244 for link, count in pairs(pastInventory.items) do
Asa@8 245 if current.items[link] == nil then
Asa@8 246 diff[link] = -count
Asa@23 247 self:Debug("3 diff[" .. link .. "]=" .. diff[link])
Asa@8 248 elseif current.items[link] - count ~= 0 then
Asa@8 249 diff[link] = current.items[link] - pastInventory.items[link]
Asa@23 250 self:Debug("4 diff[" .. link .. "]=" .. diff[link])
Asa@8 251 end
Asa@8 252 end
Asa@8 253
Asa@8 254 local moneyDiff = current.money - pastInventory.money
Asa@23 255 if abs(moneyDiff) > 0 then
Asa@23 256 self:Debug("moneyDiff: " .. moneyDiff)
Asa@23 257 end
Asa@8 258
Asa@8 259 return {items = diff, money = moneyDiff}
Asa@0 260 end
Asa@0 261
Asa@39 262 local inboundCOD = {}
Asa@39 263 local skipMail = {}
Asa@63 264 function ItemAuditor:ScanMail()
Asa@0 265 local results = {}
Asa@39 266 local CODPaymentRegex = gsub(COD_PAYMENT, "%%s", "(.*)")
Asa@39 267
Asa@0 268 for mailIndex = 1, GetInboxNumItems() or 0 do
Asa@39 269 local sender, msgSubject, msgMoney, msgCOD, daysLeft, msgItem, _, _, msgText, _, isGM = select(3, GetInboxHeaderInfo(mailIndex))
Asa@15 270 local mailType = self:GetMailType(msgSubject)
Asa@6 271
Asa@39 272 local mailSignature = msgSubject .. '-' .. msgMoney .. '-' .. msgCOD .. '-' .. daysLeft
Asa@39 273
Asa@6 274 results[mailType] = (results[mailType] or {})
Asa@6 275
Asa@39 276 if skipMail[mailSignature] ~= nil then
Asa@39 277 -- do nothing
Asa@39 278 elseif mailType == "NonAHMail" and msgCOD > 0 then
Asa@6 279 mailType = 'COD'
Asa@6 280 results[mailType] = (results[mailType] or {})
Asa@5 281
Asa@5 282 local itemTypes = {}
Asa@5 283 for itemIndex = 1, ATTACHMENTS_MAX_RECEIVE do
Asa@5 284 local itemName, _, count, _, _= GetInboxItem(mailIndex, itemIndex)
Asa@5 285 if itemName ~= nil then
Asa@39 286 itemTypes[itemName] = (itemTypes[itemName] or 0) + count
Asa@5 287 end
Asa@5 288 end
Asa@5 289
Asa@15 290 if self:tcount(itemTypes) == 1 then
Asa@5 291 for itemName, count in pairs(itemTypes) do
Asa@39 292 results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
Asa@39 293 results[mailType][itemName].total = results[mailType][itemName].total + msgCOD
Asa@39 294
Asa@39 295 if inboundCOD[mailSignature] == nil then
Asa@39 296 results[mailType][itemName].count = results[mailType][itemName].count + count
Asa@39 297 inboundCOD[mailSignature] = (inboundCOD[mailSignature] or 0) + count
Asa@39 298 else
Asa@39 299 results[mailType][itemName].count = inboundCOD[mailSignature]
Asa@39 300 end
Asa@39 301
Asa@39 302
Asa@5 303 end
Asa@5 304 else
Asa@5 305 self:Debug("Don't know what to do with more than one item type on COD mail.")
Asa@5 306 end
Asa@6 307 elseif mailType == "CODPayment" then
Asa@39 308 -- /dump ItemAuditor.db.factionrealm.outbound_cod
Asa@39 309 self:Debug(msgSubject)
Asa@39 310 self:Debug(CODPaymentRegex)
Asa@39 311 local outboundSubject = select(3, msgSubject:find(CODPaymentRegex))
Asa@39 312 local trackID
Asa@39 313 if outboundSubject ~= nil then
Asa@39 314 self:Debug(outboundSubject)
Asa@45 315 trackID = select(3, outboundSubject:find('[[]IA: (%d*)[]]'))
Asa@39 316
Asa@39 317 if trackID ~= nil then
Asa@45 318 trackID = tonumber(trackID)
Asa@45 319 self:Debug('COD ID: %s', trackID)
Asa@39 320 local cod = self.db.factionrealm.outbound_cod[trackID]
Asa@39 321 if cod == nil then
Asa@39 322 skipMail[mailSignature] = true
Asa@39 323 self:Print("WARNING: {%s} has an invalid ItemAuditor tracking number.", msgSubject)
Asa@39 324 else
Asa@39 325 itemName = trackID .. "|" .. cod['link']
Asa@39 326
Asa@39 327
Asa@39 328 results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
Asa@39 329 results[mailType][itemName].total = results[mailType][itemName].total - msgMoney
Asa@39 330 results[mailType][itemName].count = results[mailType][itemName].count - cod.count
Asa@39 331 end
Asa@39 332 end
Asa@39 333 end
Asa@5 334
Asa@39 335 if trackID == nil then
Asa@39 336 skipMail[mailSignature] = true
Asa@39 337 self:Print("WARNING: {%s} is a COD payment but doesn't have an ItemAuditor tracking number.", msgSubject)
Asa@39 338 end
Asa@5 339
Asa@0 340 elseif mailType == "AHSuccess" then
Asa@0 341 local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex);
Asa@26 342 results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
Asa@26 343 results[mailType][itemName].total = results[mailType][itemName].total - deposit - buyout + consignment
Asa@26 344
Asa@0 345
Asa@0 346 elseif mailType == "AHWon" then
Asa@0 347 local invoiceType, itemName, playerName, bid, buyout, deposit, consignment = GetInboxInvoiceInfo(mailIndex);
Asa@26 348 results[mailType][itemName] = (results[mailType][itemName] or {total=0,count=0})
Asa@26 349 results[mailType][itemName].total = results[mailType][itemName].total + bid
Asa@26 350
Asa@98 351 local count = select(3, GetInboxItem(mailIndex,1))
Asa@26 352 results[mailType][itemName].count = results[mailType][itemName].count + count
Asa@5 353 elseif mailType == "AHExpired" or mailType == "AHCancelled" or mailType == "AHOutbid" then
Asa@0 354 -- These should be handled when you pay the deposit at the AH
Asa@0 355 else
Asa@24 356 -- self:Debug("Unhandled mail type: " .. mailType)
Asa@24 357 -- self:Debug(msgSubject)
Asa@0 358 end
Asa@0 359
Asa@0 360 end
Asa@98 361
Asa@98 362 wipe(myMailbox)
Asa@23 363 for mailType, collection in pairs(results) do
Asa@98 364 myMailbox[mailType] = {}
Asa@26 365 for item, data in pairs(collection) do
Asa@98 366 myMailbox[mailType][item] = {
Asa@98 367 total = data.total,
Asa@98 368 count = data.count,
Asa@98 369 }
Asa@98 370 -- self:Print(format("|cFF00FF00MailScan|r: %s - %s - %s x %s", mailType, item, data.total, data.count))
Asa@23 371 end
Asa@23 372 end
Asa@0 373 return results
Asa@0 374 end
Asa@0 375
Asa@105 376 local realm = GetRealmName()
Asa@105 377 local ds_account = 'Default'
Asa@82 378 function ItemAuditor:GetItemCount(searchID)
Asa@105 379 local count = 0
Asa@105 380 for _, character in pairs(DataStore:GetCharacters(realm, ds_account)) do
Asa@105 381 local bag, bank = DataStore:GetContainerItemCount(character, searchID)
Asa@105 382 count = count + (bag or 0) + (bank or 0)
Asa@105 383 count = count + (DataStore:GetAuctionHouseItemCount(character, searchID) or 0)
Asa@105 384 count = count + (DataStore:GetInventoryItemCount(character, searchID) or 0)
Asa@105 385 count = count + (DataStore:GetMailItemCount(character, searchID) or 0)
Asa@105 386 count = count + (DataStore:GetCurrencyItemCount(character, searchID) or 0)
Asa@105 387 end
Asa@98 388 local itemName = GetItemInfo(searchID)
Asa@98 389 for character, mailbox in pairs(allMailboxes) do
Asa@98 390 for type, items in pairs(mailbox) do
Asa@98 391 if type == 'AHWon' or type == 'COD' then
Asa@98 392 for name, data in pairs(items) do
Asa@98 393 if name == itemName then
Asa@98 394 count = count - data.count
Asa@82 395
Asa@98 396 end
Asa@98 397 end
Asa@98 398 end
Asa@98 399 end
Asa@82 400 end
Asa@82 401 return count
Asa@82 402 end
Asa@82 403
Asa@63 404 function ItemAuditor:GetItem(link, viewOnly)
Asa@9 405 if viewOnly == nil then
Asa@9 406 viewOnly = false
Asa@9 407 end
Asa@8 408
Asa@9 409 local itemName = nil
Asa@9 410 if self:GetSafeLink(link) == nil then
Asa@9 411 itemName = link
Asa@9 412 else
Asa@9 413 link = self:GetSafeLink(link)
Asa@9 414 itemName = GetItemInfo(link)
Asa@9 415 end
Asa@9 416
Asa@12 417
Asa@9 418 if self.db.factionrealm.item_account[itemName] ~= nil then
Asa@65 419 self.db.factionrealm.items[link] = {
Asa@82 420 count = ItemAuditor:GetItemCount(self:GetIDFromLink(link)),
Asa@8 421 invested = abs(self.db.factionrealm.item_account[itemName] or 0),
Asa@8 422 }
Asa@8 423 self.db.factionrealm.item_account[itemName] = nil
Asa@8 424 end
Asa@8 425
Asa@65 426 if viewOnly == false and self.db.factionrealm.items[link] == nil then
Asa@24 427
Asa@65 428 self.db.factionrealm.items[link] = {
Asa@82 429 count = ItemAuditor:GetItemCount(self:GetIDFromLink(link)),
Asa@9 430 invested = abs(self.db.factionrealm.item_account[itemName] or 0),
Asa@9 431 }
Asa@9 432
Asa@9 433 end
Asa@9 434
Asa@65 435 if self.db.factionrealm.items[link] ~= nil then
Asa@82 436 self.db.factionrealm.items[link].count = ItemAuditor:GetItemCount(self:GetIDFromLink(link))
Asa@45 437
Asa@65 438 if self.db.factionrealm.items[link].invested == nil then
Asa@65 439 self.db.factionrealm.items[link].invested = 0
Asa@45 440 end
Asa@37 441 end
Asa@37 442
Asa@65 443 if viewOnly == true and self.db.factionrealm.items[link] == nil then
Asa@9 444 return {count = 0, invested = 0}
Asa@9 445 elseif viewOnly == true then
Asa@28 446
Asa@65 447 return {count = self.db.factionrealm.items[link].count, invested = self.db.factionrealm.items[link].invested}
Asa@9 448 end
Asa@37 449
Asa@28 450
Asa@28 451
Asa@65 452 return self.db.factionrealm.items[link]
Asa@8 453 end
Asa@8 454
Asa@63 455 function ItemAuditor:RemoveItem(link)
Asa@9 456 self.db.factionrealm.item_account[link] = nil
Asa@9 457 link = self:GetSafeLink(link)
Asa@9 458 if link ~= nil then
Asa@63 459 local item = ItemAuditor:GetItem(link)
Asa@35 460 item.invested = 0
Asa@24 461 else
Asa@24 462 self:Debug('Failed to convert link' .. tostring(link))
Asa@9 463 end
Asa@8 464 end
Asa@8 465
Asa@63 466 function ItemAuditor:SaveValue(link, value, countChange)
Asa@26 467 self:Debug("SaveValue(%s, %s, %s)", tostring(link), value, (countChange or 'default'))
Asa@26 468 countChange = countChange or 0
Asa@9 469 local item = nil
Asa@9 470 local realLink = self:GetSafeLink(link)
Asa@9 471 local itemName = nil
Asa@9 472 if realLink == nil then
Asa@26 473 itemName = link
Asa@23 474 self:Debug('SaveValue: GetSafeLink failed, falling back to storing by name: ' .. tostring(itemName))
Asa@9 475 self.db.factionrealm.item_account[itemName] = (self.db.factionrealm.item_account[itemName] or 0) + value
Asa@9 476 item = {invested = self.db.factionrealm.item_account[itemName], count = 1}
Asa@9 477 else
Asa@23 478
Asa@9 479 item = self:GetItem(realLink)
Asa@9 480 item.invested = item.invested + value
Asa@9 481 itemName = GetItemInfo(realLink)
Asa@9 482 end
Asa@8 483
Asa@26 484 if value > 0 and countChange > 0 and item.invested == value and item.count ~= countChange then
Asa@26 485 local costPerItem = value / countChange
Asa@26 486 value = costPerItem * item.count
Asa@26 487 item.invested = value
Asa@26 488 self:Print("You already owned %s %s with an unknown price, so they have also been updated to %s each", (item.count - countChange), itemName, self:FormatMoney(costPerItem))
Asa@26 489 end
Asa@26 490
Asa@7 491 if abs(value) > 0 then
Asa@22 492 if item.invested < 0 then
Asa@16 493 if self.db.profile.messages.cost_updates then
Asa@103 494 self:Print(format("Updated price of %s from %s to %s. |cFF00FF00You just made a profit of %s.", itemName, self:FormatMoney(item.invested - value), self:FormatMoney(0), self:FormatMoney(abs(item.invested))))
Asa@16 495 end
Asa@12 496 self:RemoveItem(link)
Asa@12 497 -- This doesn't work when you mail the only copy of an item you have to another character.
Asa@12 498 --[[
Asa@82 499 elseif item.count == 0 and realLink and ItemAuditor:GetItemCount(self:GetIDFromLink(realLink)) then
Asa@15 500 self:Print("You ran out of " .. itemName .. " and never recovered " .. self:FormatMoney(item.invested))
Asa@12 501 self:RemoveItem(link)
Asa@12 502 ]]
Asa@16 503 else
Asa@16 504 if self.db.profile.messages.cost_updates then
Asa@16 505 self:Print(format("Updated price of %s from %s to %s. (total change:%s)", itemName, self:FormatMoney(item.invested - value), self:FormatMoney(item.invested), self:FormatMoney(value)))
Asa@16 506 end
Asa@12 507 end
Asa@0 508 end
Asa@10 509
Asa@10 510 if realLink ~= nil then
Asa@63 511 ItemAuditor:UpdateQAThreshold(realLink)
Asa@112 512 self:SendMessage("IA_COST_CHANGED", realLink, unpack({ItemAuditor:GetItemCost(realLink)}))
Asa@10 513 end
Asa@35 514 UpdateInvestedData()
Asa@10 515 end
Asa@12 516
Asa@0 517
Asa@63 518 function ItemAuditor:WatchBags()
Asa@4 519 if self.watch_handle == nil then
Asa@63 520 ItemAuditor:UpdateCurrentInventory()
Asa@23 521 self.watch_handle = self:RegisterBucketEvent({"BAG_UPDATE", "PLAYER_MONEY"}, 0.3, "UpdateAudit")
Asa@4 522 end
Asa@0 523 end
Asa@0 524
Asa@63 525 function ItemAuditor:UnwatchBags()
Asa@4 526 if self.watch_handle ~= nil then
Asa@4 527 self:UnregisterBucket(self.watch_handle)
Asa@4 528 self.watch_handle = nil
Asa@4 529 end
Asa@0 530 end
Asa@0 531
Asa@9 532
Asa@63 533 function ItemAuditor:GetSafeLink(link)
Asa@9 534 local newLink = nil
Asa@9 535
Asa@24 536 if link and link == string.match(link, '.-:[-0-9]+[:0-9]*') then
Asa@24 537 newLink = link
Asa@24 538 elseif link then
Asa@9 539 newLink = link and string.match(link, "|H(.-):([-0-9]+):([0-9]+)|h")
Asa@9 540 end
Asa@9 541 if newLink == nil then
Asa@9 542 local itemID = self:GetItemID(link)
Asa@9 543 if itemID ~= nil then
Asa@9 544 _, newLink = GetItemInfo(itemID)
Asa@9 545 return self:GetSafeLink(newLink)
Asa@9 546 end
Asa@9 547 end
Asa@9 548 return newLink and string.gsub(newLink, ":0:0:0:0:0:0", "")
Asa@9 549 end
Asa@9 550
Asa@63 551 function ItemAuditor:GetIDFromLink(link)
Asa@9 552 local _, _, _, _, Id = string.find(link, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?")
Asa@9 553 return tonumber(Id)
Asa@9 554 end
Asa@9 555
Asa@63 556 function ItemAuditor:GetItemCost(link, countModifier)
Asa@9 557 local item = self:GetItem(link, true)
Asa@8 558
Asa@9 559 if item.invested > 0 then
Asa@9 560 local count = item.count
Asa@9 561
Asa@9 562 if countModifier ~= nil then
Asa@9 563 count = count - countModifier
Asa@0 564 end
Asa@9 565 if count > 0 then
Asa@45 566 return ceil(item.invested), ceil(item.invested/count), count
Asa@9 567 end
Asa@121 568 return ceil(item.invested), 0, count
Asa@0 569 end
Asa@82 570 return 0, 0, ItemAuditor:GetItemCount(ItemAuditor:GetIDFromLink(link))
Asa@0 571 end