annotate Core.lua @ 81:64166ba5209a

Correct fix for bug 22. The bank needs to be considered and scanned if it is open, but not if the user is not using the bank
author Asa Ayers <Asa.Ayers@Gmail.com>
date Thu, 05 Aug 2010 20:21:05 -0700
parents 19609b3af2d7
children e9f7bc9199ca
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@63 344 function ItemAuditor:GetItem(link, viewOnly)
Asa@9 345 if viewOnly == nil then
Asa@9 346 viewOnly = false
Asa@9 347 end
Asa@8 348
Asa@9 349 local itemName = nil
Asa@9 350 if self:GetSafeLink(link) == nil then
Asa@9 351 itemName = link
Asa@9 352 else
Asa@9 353 link = self:GetSafeLink(link)
Asa@9 354 itemName = GetItemInfo(link)
Asa@9 355 end
Asa@9 356
Asa@12 357
Asa@9 358 if self.db.factionrealm.item_account[itemName] ~= nil then
Asa@65 359 self.db.factionrealm.items[link] = {
Asa@12 360 count = Altoholic:GetItemCount(self:GetIDFromLink(link)),
Asa@8 361 invested = abs(self.db.factionrealm.item_account[itemName] or 0),
Asa@8 362 }
Asa@8 363 self.db.factionrealm.item_account[itemName] = nil
Asa@8 364 end
Asa@8 365
Asa@65 366 if viewOnly == false and self.db.factionrealm.items[link] == nil then
Asa@24 367
Asa@65 368 self.db.factionrealm.items[link] = {
Asa@10 369 count = Altoholic:GetItemCount(self:GetIDFromLink(link)),
Asa@9 370 invested = abs(self.db.factionrealm.item_account[itemName] or 0),
Asa@9 371 }
Asa@9 372
Asa@9 373 end
Asa@9 374
Asa@65 375 if self.db.factionrealm.items[link] ~= nil then
Asa@65 376 self.db.factionrealm.items[link].count = Altoholic:GetItemCount(self:GetIDFromLink(link))
Asa@45 377
Asa@65 378 if self.db.factionrealm.items[link].invested == nil then
Asa@65 379 self.db.factionrealm.items[link].invested = 0
Asa@45 380 end
Asa@37 381 end
Asa@37 382
Asa@65 383 if viewOnly == true and self.db.factionrealm.items[link] == nil then
Asa@9 384 return {count = 0, invested = 0}
Asa@9 385 elseif viewOnly == true then
Asa@28 386
Asa@65 387 return {count = self.db.factionrealm.items[link].count, invested = self.db.factionrealm.items[link].invested}
Asa@9 388 end
Asa@37 389
Asa@28 390
Asa@28 391
Asa@65 392 return self.db.factionrealm.items[link]
Asa@8 393 end
Asa@8 394
Asa@63 395 function ItemAuditor:RemoveItem(link)
Asa@9 396 self.db.factionrealm.item_account[link] = nil
Asa@9 397 link = self:GetSafeLink(link)
Asa@9 398 if link ~= nil then
Asa@63 399 local item = ItemAuditor:GetItem(link)
Asa@35 400 item.invested = 0
Asa@24 401 else
Asa@24 402 self:Debug('Failed to convert link' .. tostring(link))
Asa@9 403 end
Asa@8 404 end
Asa@8 405
Asa@63 406 function ItemAuditor:SaveValue(link, value, countChange)
Asa@26 407 self:Debug("SaveValue(%s, %s, %s)", tostring(link), value, (countChange or 'default'))
Asa@26 408 countChange = countChange or 0
Asa@9 409 local item = nil
Asa@9 410 local realLink = self:GetSafeLink(link)
Asa@9 411 local itemName = nil
Asa@9 412 if realLink == nil then
Asa@26 413 itemName = link
Asa@23 414 self:Debug('SaveValue: GetSafeLink failed, falling back to storing by name: ' .. tostring(itemName))
Asa@9 415 self.db.factionrealm.item_account[itemName] = (self.db.factionrealm.item_account[itemName] or 0) + value
Asa@9 416 item = {invested = self.db.factionrealm.item_account[itemName], count = 1}
Asa@9 417 else
Asa@23 418
Asa@9 419 item = self:GetItem(realLink)
Asa@9 420 item.invested = item.invested + value
Asa@9 421 itemName = GetItemInfo(realLink)
Asa@9 422 end
Asa@8 423
Asa@26 424 if value > 0 and countChange > 0 and item.invested == value and item.count ~= countChange then
Asa@26 425 local costPerItem = value / countChange
Asa@26 426 value = costPerItem * item.count
Asa@26 427 item.invested = value
Asa@26 428 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 429 end
Asa@26 430
Asa@7 431 if abs(value) > 0 then
Asa@22 432 if item.invested < 0 then
Asa@16 433 if self.db.profile.messages.cost_updates then
Asa@16 434 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 435 end
Asa@12 436 self:RemoveItem(link)
Asa@12 437 -- This doesn't work when you mail the only copy of an item you have to another character.
Asa@12 438 --[[
Asa@12 439 elseif item.count == 0 and realLink and Altoholic:GetItemCount(self:GetIDFromLink(realLink)) then
Asa@15 440 self:Print("You ran out of " .. itemName .. " and never recovered " .. self:FormatMoney(item.invested))
Asa@12 441 self:RemoveItem(link)
Asa@12 442 ]]
Asa@16 443 else
Asa@16 444 if self.db.profile.messages.cost_updates then
Asa@16 445 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 446 end
Asa@12 447 end
Asa@0 448 end
Asa@10 449
Asa@10 450 if realLink ~= nil then
Asa@63 451 ItemAuditor:UpdateQAThreshold(realLink)
Asa@10 452 end
Asa@35 453 UpdateInvestedData()
Asa@10 454 end
Asa@12 455
Asa@0 456
Asa@63 457 function ItemAuditor:WatchBags()
Asa@4 458 if self.watch_handle == nil then
Asa@63 459 ItemAuditor:UpdateCurrentInventory()
Asa@23 460 self.watch_handle = self:RegisterBucketEvent({"BAG_UPDATE", "PLAYER_MONEY"}, 0.3, "UpdateAudit")
Asa@4 461 end
Asa@0 462 end
Asa@0 463
Asa@63 464 function ItemAuditor:UnwatchBags()
Asa@4 465 if self.watch_handle ~= nil then
Asa@4 466 self:UnregisterBucket(self.watch_handle)
Asa@4 467 self.watch_handle = nil
Asa@4 468 end
Asa@0 469 end
Asa@0 470
Asa@9 471
Asa@63 472 function ItemAuditor:GetSafeLink(link)
Asa@9 473 local newLink = nil
Asa@9 474
Asa@24 475 if link and link == string.match(link, '.-:[-0-9]+[:0-9]*') then
Asa@24 476 newLink = link
Asa@24 477 elseif link then
Asa@9 478 newLink = link and string.match(link, "|H(.-):([-0-9]+):([0-9]+)|h")
Asa@9 479 end
Asa@9 480 if newLink == nil then
Asa@9 481 local itemID = self:GetItemID(link)
Asa@9 482 if itemID ~= nil then
Asa@9 483 _, newLink = GetItemInfo(itemID)
Asa@9 484 return self:GetSafeLink(newLink)
Asa@9 485 end
Asa@9 486 end
Asa@9 487 return newLink and string.gsub(newLink, ":0:0:0:0:0:0", "")
Asa@9 488 end
Asa@9 489
Asa@63 490 function ItemAuditor:GetIDFromLink(link)
Asa@9 491 local _, _, _, _, Id = string.find(link, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?")
Asa@9 492 return tonumber(Id)
Asa@9 493 end
Asa@9 494
Asa@63 495 function ItemAuditor:GetItemCost(link, countModifier)
Asa@9 496 local item = self:GetItem(link, true)
Asa@8 497
Asa@9 498 if item.invested > 0 then
Asa@9 499 local count = item.count
Asa@9 500
Asa@9 501 if countModifier ~= nil then
Asa@9 502 count = count - countModifier
Asa@0 503 end
Asa@9 504 if count > 0 then
Asa@45 505 return ceil(item.invested), ceil(item.invested/count), count
Asa@9 506 end
Asa@9 507
Asa@0 508 end
Asa@35 509 return 0, 0, Altoholic:GetItemCount(ItemAuditor:GetIDFromLink(link))
Asa@0 510 end