Mercurial > wow > itemauditor
comparison Core.lua @ 3:bbcf81868171
Code cleanup.
| author | Asa Ayers <Asa.Ayers@Gmail.com> | 
|---|---|
| date | Sat, 22 May 2010 11:34:19 -0700 | 
| parents | 6c87720c301c | 
| children | c940b527ccab | 
   comparison
  equal
  deleted
  inserted
  replaced
| 2:e9a1646beaa4 | 3:bbcf81868171 | 
|---|---|
| 1 local addon = LibStub("AceAddon-3.0"):NewAddon("ItemAuditor", "AceConsole-3.0", "AceEvent-3.0", "AceBucket-3.0") | 1 local addonName, addonTable = ...; | 
| 2 _G[addonName] = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceConsole-3.0", "AceEvent-3.0", "AceBucket-3.0") | |
| 3 local addon = _G[addonName] | |
| 2 | 4 | 
| 3 ItemAuditor = addon | 5 local utils = addonTable.utils | 
| 6 | |
| 4 | 7 | 
| 5 local WHITE = "|cFFFFFFFF" | 8 local WHITE = "|cFFFFFFFF" | 
| 6 local RED = "|cFFFF0000" | 9 local RED = "|cFFFF0000" | 
| 7 local GREEN = "|cFF00FF00" | 10 local GREEN = "|cFF00FF00" | 
| 8 local YELLOW = "|cFFFFFF00" | 11 local YELLOW = "|cFFFFFF00" | 
| 23 | 26 | 
| 24 self.db.char.debug = true | 27 self.db.char.debug = true | 
| 25 | 28 | 
| 26 self:RegisterOptions() | 29 self:RegisterOptions() | 
| 27 | 30 | 
| 28 self:RegisterEvent("MAIL_SHOW") | 31 self:RegisterEvent("PLAYER_ENTERING_WORLD") | 
| 29 self:WatchBags() | |
| 30 end | |
| 31 | |
| 32 local function IA_tcount(tab) | |
| 33 local n = #tab | |
| 34 if (n == 0) then | |
| 35 for _ in pairs(tab) do | |
| 36 n = n + 1 | |
| 37 end | |
| 38 end | |
| 39 return n | |
| 40 end | |
| 41 | |
| 42 | |
| 43 local options = { | |
| 44 name = "ItemAuditor", | |
| 45 handler = ItemAuditor, | |
| 46 type = 'group', | |
| 47 args = { | |
| 48 debug = { | |
| 49 type = "toggle", | |
| 50 name = "Debug", | |
| 51 desc = "Toggles debug messages in chat", | |
| 52 get = "GetDebug", | |
| 53 set = "SetDebug" | |
| 54 }, | |
| 55 dump = { | |
| 56 type = "execute", | |
| 57 name = "dump", | |
| 58 desc = "dumps IA database", | |
| 59 func = "DumpInfo", | |
| 60 }, | |
| 61 options = { | |
| 62 type = "execute", | |
| 63 name = "options", | |
| 64 desc = "Show Blizzard's options GUI", | |
| 65 func = "ShowOptionsGUI", | |
| 66 guiHidden = true, | |
| 67 }, | |
| 68 }, | |
| 69 } | |
| 70 | |
| 71 | |
| 72 function addon:DumpInfo() | |
| 73 self:Print("self.db.char") | |
| 74 DevTools_Dump(self.db.char) | |
| 75 self:Print("self.db.factionrealm") | |
| 76 DevTools_Dump(self.db.factionrealm) | |
| 77 end | |
| 78 | |
| 79 function addon:RegisterOptions() | |
| 80 self.optionsFrame = LibStub("AceConfigDialog-3.0"):AddToBlizOptions("ItemAuditor", "ItemAuditor") | |
| 81 | |
| 82 LibStub("AceConfig-3.0"):RegisterOptionsTable("ItemAuditor", options, {"ia"}) | |
| 83 end | |
| 84 | |
| 85 function addon:GetMessage(info) | |
| 86 return self.message | |
| 87 end | |
| 88 | |
| 89 function addon:SetMessage(info, newValue) | |
| 90 self.message = newValue | |
| 91 end | |
| 92 | |
| 93 | |
| 94 function addon:ShowOptionsGUI() | |
| 95 InterfaceOptionsFrame_OpenToCategory(self.optionsFrame) | |
| 96 end | |
| 97 | |
| 98 function addon:GetDebug(info) | |
| 99 return self.db.char.debug | |
| 100 end | |
| 101 | |
| 102 function addon:SetDebug(info, input) | |
| 103 self.db.char.debug = input | |
| 104 local value = "off" | |
| 105 if input then | |
| 106 value = "on" | |
| 107 end | |
| 108 self:Print("Debugging is now: " .. value) | |
| 109 end | |
| 110 | |
| 111 | |
| 112 -- ================ DEBUG ================ | |
| 113 addon.OriginalRegisterEvent = addon.RegisterEvent | |
| 114 addon.OriginalUnregisterEvent = addon.UnregisterEvent | |
| 115 | |
| 116 function addon:RegisterEvent(event, callback, arg) | |
| 117 self:Debug("RegisterEvent " .. event ) | |
| 118 if arg ~= nil then | |
| 119 addon:OriginalRegisterEvent(event, callback, arg) | |
| 120 elseif callback ~= nil then | |
| 121 addon:OriginalRegisterEvent(event, callback) | |
| 122 else | |
| 123 addon:OriginalRegisterEvent(event) | |
| 124 end | |
| 125 end | |
| 126 | |
| 127 function addon:UnregisterEvent(event) | |
| 128 self:Debug("UnregisterEvent " .. event ) | |
| 129 addon:OriginalUnregisterEvent (event) | |
| 130 end | |
| 131 | |
| 132 -- ================ DEBUG ================ | |
| 133 | |
| 134 function addon:FormatMoney(money) | |
| 135 return Altoholic:GetMoneyString(money, WHITE, false) | |
| 136 end | 32 end | 
| 137 | 33 | 
| 138 function addon:GetCurrentInventory() | 34 function addon:GetCurrentInventory() | 
| 139 local i = {} | 35 local i = {} | 
| 140 local link | 36 local link | 
| 221 | 117 | 
| 222 end | 118 end | 
| 223 return results | 119 return results | 
| 224 end | 120 end | 
| 225 | 121 | 
| 226 function addon:MAIL_SHOW() | |
| 227 self:Debug("MAIL_SHOW") | |
| 228 self.lastMailScan = self:ScanMail() | |
| 229 self:UnregisterEvent("MAIL_SHOW") | |
| 230 self:RegisterEvent("MAIL_CLOSED") | |
| 231 self:RegisterEvent("MAIL_INBOX_UPDATE") | |
| 232 self:Debug("MAIL_SHOW complete") | |
| 233 end | |
| 234 | |
| 235 function addon:MAIL_CLOSED() | |
| 236 addon:UnregisterEvent("MAIL_CLOSED") | |
| 237 self:UnregisterEvent("MAIL_INBOX_UPDATE") | |
| 238 self:RegisterEvent("MAIL_SHOW") | |
| 239 end | |
| 240 | |
| 241 function addon:MAIL_INBOX_UPDATE() | |
| 242 local newScan = addon:ScanMail() | |
| 243 local diff | |
| 244 for item, total in pairs(self.lastMailScan) do | |
| 245 | |
| 246 if newScan[item] == nil then | |
| 247 newScan[item] = 0 | |
| 248 end | |
| 249 diff = total - newScan[item] | |
| 250 if diff ~= 0 then | |
| 251 self:SaveValue(item, diff) | |
| 252 end | |
| 253 | |
| 254 end | |
| 255 | |
| 256 self.lastMailScan = newScan | |
| 257 end | |
| 258 | |
| 259 function addon:SaveValue(item, value) | 122 function addon:SaveValue(item, value) | 
| 260 local item_account = self.db.factionrealm.item_account | 123 local item_account = self.db.factionrealm.item_account | 
| 261 if item_account[item] == nil then | 124 if item_account[item] == nil then | 
| 262 item_account[item] = 0 | 125 item_account[item] = 0 | 
| 263 end | 126 end | 
| 266 if item_account[item] >= 0 then | 129 if item_account[item] >= 0 then | 
| 267 item_account[item] = nil | 130 item_account[item] = nil | 
| 268 end | 131 end | 
| 269 end | 132 end | 
| 270 | 133 | 
| 271 function addon:OnEnable() | 134 function addon:WatchBags(delay) | 
| 272 self:Debug("Hello, world! OnEnable") | |
| 273 end | |
| 274 | |
| 275 function addon:Debug(msg) | |
| 276 if self.db.char.debug then | |
| 277 self:Print(msg) | |
| 278 end | |
| 279 end | |
| 280 | |
| 281 function addon:WatchBags() | |
| 282 if self.watch_handle == nil then | 135 if self.watch_handle == nil then | 
| 136 delay = delay or 0.2 | |
| 283 self.lastInventory = self:GetCurrentInventory() | 137 self.lastInventory = self:GetCurrentInventory() | 
| 284 self.watch_handle = self:RegisterBucketEvent({"BAG_UPDATE", "PLAYER_MONEY"}, 0.2, "UpdateAudit") | 138 self.watch_handle = self:RegisterBucketEvent({"BAG_UPDATE", "PLAYER_MONEY"}, delay, "UpdateAudit") | 
| 285 end | 139 end | 
| 286 end | 140 end | 
| 287 | 141 | 
| 288 function addon:UnwatchBags() | 142 function addon:UnwatchBags() | 
| 289 if self.watch_handle ~= nil then | 143 if self.watch_handle ~= nil then | 
| 290 self:UnregisterBucket(self.watch_handle) | 144 self:UnregisterBucket(self.watch_handle) | 
| 291 self.watch_handle = nil | 145 self.watch_handle = nil | 
| 292 end | 146 end | 
| 293 end | 147 end | 
| 294 | 148 | 
| 295 function addon:UpdateAudit() | 149 | 
| 296 self:Debug("UpdateAudit") | |
| 297 local currentInventory = self:GetCurrentInventory() | |
| 298 local diff = addon:GetInventoryDiff(self.lastInventory, currentInventory) | |
| 299 -- this is only here for debugging | |
| 300 self.lastdiff = diff | |
| 301 | |
| 302 if abs(diff.money) > 0 and IA_tcount(diff.items) == 1 then | |
| 303 self:Debug("purchase or sale") | |
| 304 | |
| 305 for itemName, count in pairs(diff.items) do | |
| 306 self:SaveValue(itemName, diff.money) | |
| 307 end | |
| 308 elseif IA_tcount(diff.items) > 1 then | |
| 309 local positive, negative = {}, {} | |
| 310 local positiveCount, negativeCount = 0, 0 | |
| 311 for item, count in pairs(diff.items) do | |
| 312 if count > 0 then | |
| 313 positive[item] = count | |
| 314 positiveCount = positiveCount + count | |
| 315 elseif count < 0 then | |
| 316 negative[item] = count | |
| 317 negativeCount = negativeCount + abs(count) | |
| 318 end | |
| 319 end | |
| 320 | |
| 321 if IA_tcount(positive) > 0 and IA_tcount(negative) > 0 then | |
| 322 -- we must have created/converted something | |
| 323 self:Debug("conversion") | |
| 324 local totalChange = 0 | |
| 325 for itemName, change in pairs(negative) do | |
| 326 local _, itemCost, count = self:GetItemCost(itemName, change) | |
| 327 self:SaveValue(itemName, abs(itemCost * change)) | |
| 328 | |
| 329 totalChange = totalChange + abs(itemCost * change) | |
| 330 end | |
| 331 | |
| 332 self:Debug("totalChange") | |
| 333 self:Debug(totalChange) | |
| 334 | |
| 335 local valuePerItem = totalChange / positiveCount | |
| 336 self:Debug(valuePerItem ) | |
| 337 for itemName, change in pairs(positive) do | |
| 338 self:Debug(itemName) | |
| 339 self:Debug(0-abs(valuePerItem * change)) | |
| 340 self:SaveValue(itemName, 0-abs(valuePerItem * change)) | |
| 341 end | |
| 342 end | |
| 343 end | |
| 344 | |
| 345 self.lastInventory = currentInventory | |
| 346 end | |
| 347 | 150 | 
| 348 function addon:GetItemCost(itemName, countModifier) | 151 function addon:GetItemCost(itemName, countModifier) | 
| 349 local invested = abs(self.db.factionrealm.item_account[itemName] or 0) | 152 local invested = abs(self.db.factionrealm.item_account[itemName] or 0) | 
| 350 | 153 | 
| 351 if invested > 0 then | 154 if invested > 0 then | 
| 355 if countModifier ~= nil then | 158 if countModifier ~= nil then | 
| 356 count = count - countModifier | 159 count = count - countModifier | 
| 357 end | 160 end | 
| 358 if count == 0 then | 161 if count == 0 then | 
| 359 self.db.factionrealm.item_account[itemName] = nil | 162 self.db.factionrealm.item_account[itemName] = nil | 
| 360 self:Print("You ran out of " .. itemName .. "and never recovered " .. self:FormatMoney(invested)) | 163 self:Print("You ran out of " .. itemName .. "and never recovered " .. utils:FormatMoney(invested)) | 
| 361 return 0, 0, 0 | 164 return 0, 0, 0 | 
| 362 end | 165 end | 
| 363 return ceil(invested), ceil(invested/count), count | 166 return ceil(invested), ceil(invested/count), count | 
| 364 end | 167 end | 
| 365 return 0, 0, 0 | 168 return 0, 0, 0 | 
| 366 end | 169 end | 
| 367 | |
| 368 function addon:ShowTooltip(tip, link, num) | |
| 369 if (link == nil) then | |
| 370 return; | |
| 371 end | |
| 372 | |
| 373 local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, _, _, _, _, itemVendorPrice = GetItemInfo (link); | |
| 374 -- local _, _, Color, Ltype, Id, Enchant, Gem1, Gem2, Gem3, Gem4, Suffix, Unique, LinkLvl, Name = string.find(link, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?") | |
| 375 | |
| 376 local investedTotal, investedPerItem, count = self:GetItemCost(itemName) | |
| 377 | |
| 378 local AHCut = 0.05 | |
| 379 local keep = 1 - AHCut | |
| 380 | |
| 381 if investedTotal > 0 then | |
| 382 tip:AddDoubleLine("\124cffffffffIA: Total Invested", self:FormatMoney(investedTotal)); | |
| 383 tip:AddDoubleLine("\124cffffffffIA: Invested/Item (" .. count .. ")", self:FormatMoney(ceil(investedPerItem))); | |
| 384 tip:AddDoubleLine("\124cffffffffIA: Minimum faction AH Price: ", self:FormatMoney(ceil(investedPerItem/keep))) | |
| 385 tip:Show() | |
| 386 end | |
| 387 end | |
| 388 | |
| 389 local function ShowTipWithPricing(tip, link, num) | |
| 390 addon:ShowTooltip(tip, link, num) | |
| 391 end | |
| 392 | |
| 393 hooksecurefunc (GameTooltip, "SetBagItem", | |
| 394 function(tip, bag, slot) | |
| 395 local _, num = GetContainerItemInfo(bag, slot); | |
| 396 ShowTipWithPricing (tip, GetContainerItemLink(bag, slot), num); | |
| 397 end | |
| 398 ); | |
| 399 | |
| 400 | |
| 401 hooksecurefunc (GameTooltip, "SetAuctionItem", | |
| 402 function (tip, type, index) | |
| 403 ShowTipWithPricing (tip, GetAuctionItemLink(type, index)); | |
| 404 end | |
| 405 ); | |
| 406 | |
| 407 hooksecurefunc (GameTooltip, "SetAuctionSellItem", | |
| 408 function (tip) | |
| 409 local name, _, count = GetAuctionSellItemInfo(); | |
| 410 local __, link = GetItemInfo(name); | |
| 411 ShowTipWithPricing (tip, link, num); | |
| 412 end | |
| 413 ); | |
| 414 | |
| 415 | |
| 416 hooksecurefunc (GameTooltip, "SetLootItem", | |
| 417 function (tip, slot) | |
| 418 if LootSlotIsItem(slot) then | |
| 419 local link, _, num = GetLootSlotLink(slot); | |
| 420 ShowTipWithPricing (tip, link, num); | |
| 421 end | |
| 422 end | |
| 423 ); | |
| 424 | |
| 425 hooksecurefunc (GameTooltip, "SetLootRollItem", | |
| 426 function (tip, slot) | |
| 427 local _, _, num = GetLootRollItemInfo(slot); | |
| 428 ShowTipWithPricing (tip, GetLootRollItemLink(slot), num); | |
| 429 end | |
| 430 ); | |
| 431 | |
| 432 | |
| 433 hooksecurefunc (GameTooltip, "SetInventoryItem", | |
| 434 function (tip, unit, slot) | |
| 435 ShowTipWithPricing (tip, GetInventoryItemLink(unit, slot), GetInventoryItemCount(unit, slot)); | |
| 436 end | |
| 437 ); | |
| 438 | |
| 439 hooksecurefunc (GameTooltip, "SetGuildBankItem", | |
| 440 function (tip, tab, slot) | |
| 441 local _, num = GetGuildBankItemInfo(tab, slot); | |
| 442 ShowTipWithPricing (tip, GetGuildBankItemLink(tab, slot), num); | |
| 443 end | |
| 444 ); | |
| 445 | |
| 446 hooksecurefunc (GameTooltip, "SetTradeSkillItem", | |
| 447 function (tip, skill, id) | |
| 448 local link = GetTradeSkillItemLink(skill); | |
| 449 local num = GetTradeSkillNumMade(skill); | |
| 450 if id then | |
| 451 link = GetTradeSkillReagentItemLink(skill, id); | |
| 452 num = select (3, GetTradeSkillReagentInfo(skill, id)); | |
| 453 end | |
| 454 | |
| 455 ShowTipWithPricing (tip, link, num); | |
| 456 end | |
| 457 ); | |
| 458 | |
| 459 hooksecurefunc (GameTooltip, "SetTradePlayerItem", | |
| 460 function (tip, id) | |
| 461 local _, _, num = GetTradePlayerItemInfo(id); | |
| 462 ShowTipWithPricing (tip, GetTradePlayerItemLink(id), num); | |
| 463 end | |
| 464 ); | |
| 465 | |
| 466 hooksecurefunc (GameTooltip, "SetTradeTargetItem", | |
| 467 function (tip, id) | |
| 468 local _, _, num = GetTradeTargetItemInfo(id); | |
| 469 ShowTipWithPricing (tip, GetTradeTargetItemLink(id), num); | |
| 470 end | |
| 471 ); | |
| 472 | |
| 473 hooksecurefunc (GameTooltip, "SetQuestItem", | |
| 474 function (tip, type, index) | |
| 475 local _, _, num = GetQuestItemInfo(type, index); | |
| 476 ShowTipWithPricing (tip, GetQuestItemLink(type, index), num); | |
| 477 end | |
| 478 ); | |
| 479 | |
| 480 hooksecurefunc (GameTooltip, "SetQuestLogItem", | |
| 481 function (tip, type, index) | |
| 482 local num, _; | |
| 483 if type == "choice" then | |
| 484 _, _, num = GetQuestLogChoiceInfo(index); | |
| 485 else | |
| 486 _, _, num = GetQuestLogRewardInfo(index) | |
| 487 end | |
| 488 | |
| 489 ShowTipWithPricing (tip, GetQuestLogItemLink(type, index), num); | |
| 490 end | |
| 491 ); | |
| 492 | |
| 493 hooksecurefunc (GameTooltip, "SetInboxItem", | |
| 494 function (tip, index, attachIndex) | |
| 495 local _, _, num = GetInboxItem(index, attachIndex); | |
| 496 ShowTipWithPricing (tip, GetInboxItemLink(index, attachIndex), num); | |
| 497 end | |
| 498 ); | |
| 499 | |
| 500 hooksecurefunc (GameTooltip, "SetSendMailItem", | |
| 501 function (tip, id) | |
| 502 local name, _, num = GetSendMailItem(id) | |
| 503 local name, link = GetItemInfo(name); | |
| 504 ShowTipWithPricing (tip, link, num); | |
| 505 end | |
| 506 ); | |
| 507 | |
| 508 hooksecurefunc (GameTooltip, "SetHyperlink", | |
| 509 function (tip, itemstring, num) | |
| 510 local name, link = GetItemInfo (itemstring); | |
| 511 ShowTipWithPricing (tip, link, num); | |
| 512 end | |
| 513 ); | |
| 514 | |
| 515 hooksecurefunc (ItemRefTooltip, "SetHyperlink", | |
| 516 function (tip, itemstring) | |
| 517 local name, link = GetItemInfo (itemstring); | |
| 518 ShowTipWithPricing (tip, link); | |
| 519 end | |
| 520 ); | 
