annotate Core.lua @ 82:e9f7bc9199ca release 2010-08-05

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