Zerotorescue@0: local MailOpener = LibStub("AceAddon-3.0"):GetAddon("MailOpener"); Zerotorescue@31: local mod = MailOpener:NewModule("Collected", "AceEvent-3.0", "AceTimer-3.0"); Zerotorescue@0: Zerotorescue@31: mod.moduleDescription = "Shows a simple summary of what has been collected at the mailbox."; Zerotorescue@31: mod.moduleRequired = false; Zerotorescue@3: Zerotorescue@31: -- Gold Zerotorescue@0: local previousGold, earned, sessionEarned; Zerotorescue@31: -- Items Zerotorescue@0: local previousFreeSlotsAvailable, itemsGained, sessionItemsgained; Zerotorescue@31: -- Mail Zerotorescue@0: local previousMailCount, mailOpened, sessionMailOpened; Zerotorescue@31: -- Time Zerotorescue@0: local timeStarted, sessionTimeSpent; -- even though the first contains GetTime(), the second var will be filled with actual seconds Zerotorescue@31: Zerotorescue@0: local updated; Zerotorescue@0: Zerotorescue@31: function mod:OnInitialize() Zerotorescue@0: local defaults = { Zerotorescue@0: profile = { Zerotorescue@0: trackGold = true, Zerotorescue@0: trackItems = true, Zerotorescue@0: trackMail = true, Zerotorescue@0: sessionSummary = false, Zerotorescue@0: batchSummary = false, Zerotorescue@0: }, Zerotorescue@0: }; Zerotorescue@0: Zerotorescue@0: -- Register our saved variables NameSpace Zerotorescue@0: self.db = MailOpener.db:RegisterNamespace("Collected", defaults); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:OnEnable() Zerotorescue@0: self:Debug("OnEnable"); Zerotorescue@0: Zerotorescue@0: self:RegisterEvent("MAIL_SHOW"); Zerotorescue@0: Zerotorescue@0: MailOpener:TogglePostalModule("Rake", false); Zerotorescue@0: Zerotorescue@0: sessionEarned = 0; Zerotorescue@0: sessionItemsgained = 0; Zerotorescue@0: sessionMailOpened = 0; Zerotorescue@0: sessionTimeSpent = 0; Zerotorescue@0: Zerotorescue@0: -- If we were toggling this module on while the mailbox is opened we must register all events again Zerotorescue@0: if MailFrame:IsVisible() then Zerotorescue@0: self:MAIL_SHOW(); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Even though Ace can unregister our events it's neater to do it manually too Zerotorescue@31: function mod:OnDisable() Zerotorescue@0: self:Debug("OnDisable"); Zerotorescue@0: Zerotorescue@0: self:UnregisterEvent("MAIL_SHOW"); Zerotorescue@0: Zerotorescue@0: self:Stop(); Zerotorescue@0: Zerotorescue@0: MailOpener:TogglePostalModule("Rake", true); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:MAIL_SHOW() Zerotorescue@0: self:Debug("MAIL_SHOW"); Zerotorescue@0: Zerotorescue@0: -- Unbind / reset all previous events and settings Zerotorescue@0: self:Stop(); Zerotorescue@0: Zerotorescue@0: self:RegisterEvent("MAIL_CLOSED"); Zerotorescue@0: Zerotorescue@0: if self.db.profile.batchSummary then Zerotorescue@0: self:RegisterMessage("MO_OPEN_COMPLETE"); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Money Zerotorescue@0: if self.db.profile.trackGold then Zerotorescue@0: self:RegisterEvent("PLAYER_MONEY"); Zerotorescue@0: Zerotorescue@0: previousGold = GetMoney(); Zerotorescue@0: earned = 0; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Items Zerotorescue@0: if self.db.profile.trackItems then Zerotorescue@0: self:RegisterEvent("BAG_UPDATE"); Zerotorescue@0: Zerotorescue@0: previousFreeSlotsAvailable = self:GetNumFreeSlots(); Zerotorescue@0: itemsGained = 0; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Mail Zerotorescue@0: if self.db.profile.trackMail then Zerotorescue@0: self:RegisterEvent("MAIL_INBOX_UPDATE"); Zerotorescue@0: Zerotorescue@0: previousMailCount = nil; Zerotorescue@0: mailOpened = 0; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Time Spent Zerotorescue@0: if self.db.profile.trackTimeSpent then Zerotorescue@0: timeStarted = GetTime(); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:MAIL_CLOSED() Zerotorescue@0: self:Debug("MAIL_CLOSED"); Zerotorescue@0: Zerotorescue@0: self:Summarize(); Zerotorescue@0: Zerotorescue@0: self:Stop(); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:PLAYER_MONEY() Zerotorescue@0: -- Sending mail does not interest us, so only remember what we earned Zerotorescue@0: local currentGold = GetMoney(); Zerotorescue@0: Zerotorescue@0: if currentGold > previousGold then Zerotorescue@0: local goldEarned = ( currentGold - previousGold ); Zerotorescue@0: Zerotorescue@0: earned = ( earned + goldEarned ); Zerotorescue@0: Zerotorescue@0: updated = true; Zerotorescue@0: Zerotorescue@0: if self.db.profile.sessionSummary then Zerotorescue@0: sessionEarned = ( sessionEarned + goldEarned ); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: previousGold = currentGold; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:BAG_UPDATE() Zerotorescue@0: -- Sending mail does not interest us, so only remember what we earned Zerotorescue@0: local freeSlotAvailable = self:GetNumFreeSlots(); Zerotorescue@0: Zerotorescue@0: if freeSlotAvailable < previousFreeSlotsAvailable then Zerotorescue@0: -- we lost a slot, so gained an item Zerotorescue@0: Zerotorescue@0: local gained = ( previousFreeSlotsAvailable - freeSlotAvailable ); Zerotorescue@0: Zerotorescue@0: itemsGained = ( itemsGained + gained ); Zerotorescue@0: Zerotorescue@0: updated = true; Zerotorescue@0: Zerotorescue@0: if self.db.profile.sessionSummary then Zerotorescue@0: sessionItemsgained = ( sessionItemsgained + gained ); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: --We may need the lines below if we get inaccurate counts Zerotorescue@0: -- previousFreeSlotsAvailable = ( previousFreeSlotsAvailable - gained ); Zerotorescue@0: --elseif freeSlotAvailable > previousFreeSlotsAvailable then Zerotorescue@0: -- an additional slot available, so we lost an item Zerotorescue@0: Zerotorescue@0: -- local lost = ( freeSlotAvailable - previousFreeSlotsAvailable ); Zerotorescue@0: Zerotorescue@0: -- previousFreeSlotsAvailable = ( previousFreeSlotsAvailable + lost ); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: previousFreeSlotsAvailable = freeSlotAvailable; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:MAIL_INBOX_UPDATE() Zerotorescue@0: local numItems, _ = GetInboxNumItems(); Zerotorescue@0: Zerotorescue@0: if previousMailCount == nil then Zerotorescue@0: previousMailCount = numItems; Zerotorescue@0: else Zerotorescue@0: if numItems < previousMailCount then Zerotorescue@0: -- We lost a mail, which means we opened one without text Zerotorescue@0: Zerotorescue@0: --local opened = ( previousMailCount - numItems ); Zerotorescue@0: Zerotorescue@0: mailOpened = ( mailOpened + 1 ); Zerotorescue@0: Zerotorescue@0: updated = true; Zerotorescue@0: Zerotorescue@0: if self.db.profile.sessionSummary then Zerotorescue@0: sessionMailOpened = ( sessionMailOpened + 1 ); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: previousMailCount = numItems; Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:MO_OPEN_COMPLETE() Zerotorescue@0: -- Only summarize when changed Zerotorescue@0: if updated then Zerotorescue@0: self:Summarize(); Zerotorescue@0: Zerotorescue@0: updated = false; Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:Stop() Zerotorescue@0: self:UnregisterEvent("MAIL_CLOSED"); Zerotorescue@0: Zerotorescue@0: -- Batch summary Zerotorescue@0: self:UnregisterMessage("MO_OPEN_COMPLETE"); Zerotorescue@0: Zerotorescue@0: -- Clear any var in the memory remaining Zerotorescue@0: Zerotorescue@0: -- Money Zerotorescue@0: self:UnregisterEvent("PLAYER_MONEY"); Zerotorescue@0: previousGold = nil; Zerotorescue@0: earned = nil; Zerotorescue@0: Zerotorescue@0: -- Items Zerotorescue@0: self:UnregisterEvent("BAG_UPDATE"); Zerotorescue@0: previousFreeSlotsAvailable = nil; Zerotorescue@0: itemsGained = nil; Zerotorescue@0: Zerotorescue@0: -- Mail Zerotorescue@0: self:UnregisterEvent("MAIL_INBOX_UPDATE"); Zerotorescue@0: previousMailCount = nil; Zerotorescue@0: mailOpened = nil; Zerotorescue@0: Zerotorescue@0: -- Time Spent Zerotorescue@0: timeStarted = nil; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:Summarize() Zerotorescue@0: -- Message buffer, append details we have data for Zerotorescue@0: local printMessage = ""; Zerotorescue@0: Zerotorescue@0: local timeSpent; Zerotorescue@0: if timeStarted then Zerotorescue@0: timeSpent = ( GetTime() - timeStarted ); Zerotorescue@0: Zerotorescue@0: if self.db.profile.sessionSummary and self.db.profile.trackTimeSpent then Zerotorescue@0: sessionTimeSpent = ( sessionTimeSpent + timeSpent ); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Did we record any mail being opened? Zerotorescue@0: if mailOpened and mailOpened > 0 then Zerotorescue@0: -- Time Spent Zerotorescue@1: if timeSpent and timeSpent > 0 then Zerotorescue@0: printMessage = printMessage .. format("Collected a total of %d mails within %d minutes and %d seconds. ", mailOpened, floor( timeSpent / 60 ), ( timeSpent % 60 )); Zerotorescue@0: else Zerotorescue@0: printMessage = printMessage .. format("Collected a total of %d mails. ", mailOpened); Zerotorescue@0: end Zerotorescue@1: elseif timeSpent and timeSpent > 0 then Zerotorescue@0: printMessage = printMessage .. format("Spent %d minutes and %d seconds collecting mail. ", floor( timeSpent / 60 ), ( timeSpent % 60 )); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Did we record any items or gold being looted? Zerotorescue@0: if (itemsGained and itemsGained > 0) and (earned and earned > 0) then Zerotorescue@0: printMessage = printMessage .. format("From these mails you gained %d items and %s.", itemsGained, MailOpener:FormatMoney(earned)); Zerotorescue@0: elseif itemsGained and itemsGained > 0 then Zerotorescue@0: printMessage = printMessage .. format("From these mails you gained %d items.", itemsGained); Zerotorescue@0: elseif earned and earned > 0 then Zerotorescue@0: printMessage = printMessage .. format("From these mails you gained %s.", MailOpener:FormatMoney(earned)); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Did we record anything? print that! Zerotorescue@0: if printMessage ~= "" then Zerotorescue@0: print("|cff15ff00Mail Opener|r: " .. printMessage); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: if self.db.profile.sessionSummary and ((sessionMailOpened and (not mailOpened or sessionMailOpened > mailOpened)) or (sessionTimeSpent and (not timeSpent or sessionTimeSpent > timeSpent)) or (sessionEarned and (not earned or sessionEarned > earned)) or (sessionItemsgained and (not itemsGained or sessionItemsgained > itemsGained))) then Zerotorescue@0: -- Message buffer, append details we have data for Zerotorescue@0: printMessage = "|cff15ff00Mail Opener|r: (Session summary) "; Zerotorescue@0: Zerotorescue@0: -- Did we record any mail being opened? Zerotorescue@0: if sessionMailOpened and sessionMailOpened > 0 then Zerotorescue@0: -- Time Spent Zerotorescue@1: if sessionTimeSpent and sessionTimeSpent > 0 then Zerotorescue@0: printMessage = printMessage .. format("Collected a total of %d mails within %d minutes and %d seconds this session. ", sessionMailOpened, floor( sessionTimeSpent / 60 ), ( sessionTimeSpent % 60 )); Zerotorescue@0: else Zerotorescue@0: printMessage = printMessage .. format("Collected a total of %d mails this session. ", sessionMailOpened); Zerotorescue@0: end Zerotorescue@0: elseif sessionTimeSpent then Zerotorescue@0: printMessage = printMessage .. format("Spent %d minutes and %d seconds collecting mail this session. ", floor( sessionTimeSpent / 60 ), ( sessionTimeSpent % 60 )); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Did we record any items or gold being looted? Zerotorescue@0: if (sessionItemsgained and sessionItemsgained > 0) and (sessionEarned and sessionEarned > 0) then Zerotorescue@0: printMessage = printMessage .. format("From these mails you gained %d items and %s.", sessionItemsgained, MailOpener:FormatMoney(sessionEarned)); Zerotorescue@0: elseif sessionItemsgained and sessionItemsgained > 0 then Zerotorescue@0: printMessage = printMessage .. format("From these mails you gained %d items.", sessionItemsgained); Zerotorescue@0: elseif sessionEarned and sessionEarned > 0 then Zerotorescue@0: printMessage = printMessage .. format("From these mails you gained %s.", MailOpener:FormatMoney(sessionEarned)); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: -- Did we record anything? print that! Zerotorescue@0: if printMessage ~= "" then Zerotorescue@0: print(printMessage); Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:GetNumFreeSlots() Zerotorescue@0: local slotsAvailable = 0; Zerotorescue@0: for bag = 0, 4 do Zerotorescue@0: slotsAvailable = ( slotsAvailable + GetContainerNumFreeSlots(bag) ); Zerotorescue@0: end Zerotorescue@0: Zerotorescue@0: return slotsAvailable; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:GetOptionsGroup() Zerotorescue@0: local configGroup = { Zerotorescue@31: order = 0, Zerotorescue@31: type = "modulesSubGroup", Zerotorescue@0: name = "Collected", Zerotorescue@0: desc = "Change settings for the collected module.", Zerotorescue@0: args = { Zerotorescue@0: General = { Zerotorescue@0: order = 10, Zerotorescue@0: type = "group", Zerotorescue@0: inline = true, Zerotorescue@0: name = "General", Zerotorescue@0: args = { Zerotorescue@0: description = { Zerotorescue@0: order = 10, Zerotorescue@0: type = "description", Zerotorescue@0: name = function() Zerotorescue@31: local descText = "With this button you can completely toggle this module |cff00ff00on|r or |cffff0000off|r. This setting will be remembered and the module will be automatically toggled |cff00ff00on|r or |cffff0000off|r upon logon as it was last set.\n\n"; Zerotorescue@0: Zerotorescue@0: if self:IsEnabled() then Zerotorescue@31: descText = descText .. "Status: |cff00ff00Enabled|r"; Zerotorescue@0: else Zerotorescue@31: descText = descText .. "Status: |cffff0000Disabled|r"; Zerotorescue@0: end Zerotorescue@31: Zerotorescue@31: return descText; Zerotorescue@0: end, Zerotorescue@0: }, Zerotorescue@0: disable = { Zerotorescue@0: order = 20, Zerotorescue@0: type = "execute", Zerotorescue@0: name = function() Zerotorescue@0: if self:IsEnabled() then Zerotorescue@0: return "Disable Module"; Zerotorescue@0: else Zerotorescue@0: return "Enable Module"; Zerotorescue@0: end Zerotorescue@0: end, Zerotorescue@0: desc = "Click here to completely toggle this module on or off.", Zerotorescue@0: width = "double", Zerotorescue@0: func = function() Zerotorescue@0: if self:IsEnabled() then Zerotorescue@0: self:Disable(); Zerotorescue@0: Zerotorescue@0: MailOpener.db.profile.modules[self:GetName()] = false; Zerotorescue@0: else Zerotorescue@0: self:Enable(); Zerotorescue@0: Zerotorescue@0: MailOpener.db.profile.modules[self:GetName()] = true; Zerotorescue@0: end Zerotorescue@0: end, Zerotorescue@0: }, Zerotorescue@0: }, Zerotorescue@0: }, Zerotorescue@0: TrackStats = { Zerotorescue@0: order = 20, Zerotorescue@0: type = "group", Zerotorescue@0: inline = true, Zerotorescue@0: name = "Track Stats", Zerotorescue@0: args = { Zerotorescue@0: description = { Zerotorescue@0: order = 10, Zerotorescue@0: type = "description", Zerotorescue@0: name = "You can select what things to track. Toggling something off will stop tracking of it completely and reduce the resources used by Mail Opener (although you shouldn't notice a difference).", Zerotorescue@0: }, Zerotorescue@0: AHHeader = { Zerotorescue@0: order = 15, Zerotorescue@0: type = "header", Zerotorescue@0: name = "", Zerotorescue@0: }, Zerotorescue@0: trackGold = { Zerotorescue@0: order = 20, Zerotorescue@0: type = "toggle", Zerotorescue@0: name = "Track |cfffed000gold gained|r", Zerotorescue@0: desc = "Track the amount of gold gained and display it when closing the mailbox.", Zerotorescue@0: set = function(i, v) Zerotorescue@0: self.db.profile.trackGold = v; Zerotorescue@0: Zerotorescue@0: if MailFrame:IsVisible() then Zerotorescue@0: self:MAIL_SHOW(); Zerotorescue@0: end Zerotorescue@0: end, Zerotorescue@0: get = function() return self.db.profile.trackGold; end, Zerotorescue@0: }, Zerotorescue@0: trackItems = { Zerotorescue@0: order = 30, Zerotorescue@0: type = "toggle", Zerotorescue@0: name = "Track |cfffed000items gained|r", Zerotorescue@0: desc = "Track the amount of items gained and display it when closing the mailbox.", Zerotorescue@0: set = function(i, v) Zerotorescue@0: self.db.profile.trackItems = v; Zerotorescue@0: Zerotorescue@0: if MailFrame:IsVisible() then Zerotorescue@0: self:MAIL_SHOW(); Zerotorescue@0: end Zerotorescue@0: end, Zerotorescue@0: get = function() return self.db.profile.trackItems; end, Zerotorescue@0: }, Zerotorescue@0: trackMail = { Zerotorescue@0: order = 40, Zerotorescue@0: type = "toggle", Zerotorescue@0: name = "Track |cfffed000mail opened|r", Zerotorescue@0: desc = "Track the amount of mail received and display it when closing the mailbox.", Zerotorescue@0: set = function(i, v) Zerotorescue@0: self.db.profile.trackMail = v; Zerotorescue@0: Zerotorescue@0: if MailFrame:IsVisible() then Zerotorescue@0: self:MAIL_SHOW(); Zerotorescue@0: end Zerotorescue@0: end, Zerotorescue@0: get = function() return self.db.profile.trackMail; end, Zerotorescue@0: }, Zerotorescue@0: trackTimeSpent = { Zerotorescue@0: order = 50, Zerotorescue@0: type = "toggle", Zerotorescue@0: name = "Track |cfffed000time spent|r", Zerotorescue@0: desc = "Track the amount of time spent at the mailbox.", Zerotorescue@0: set = function(i, v) Zerotorescue@0: self.db.profile.trackTimeSpent = v; Zerotorescue@0: Zerotorescue@0: if MailFrame:IsVisible() then Zerotorescue@0: self:MAIL_SHOW(); Zerotorescue@0: end Zerotorescue@0: end, Zerotorescue@0: get = function() return self.db.profile.trackTimeSpent; end, Zerotorescue@0: }, Zerotorescue@0: }, Zerotorescue@0: }, Zerotorescue@0: Summarize = { Zerotorescue@0: order = 30, Zerotorescue@0: type = "group", Zerotorescue@0: inline = true, Zerotorescue@0: name = "Summarize", Zerotorescue@0: args = { Zerotorescue@0: sessionSummary = { Zerotorescue@0: order = 20, Zerotorescue@0: type = "toggle", Zerotorescue@0: name = "Also show a summary of the recorded stats within the entire session", Zerotorescue@0: desc = "Also show a summary of the recorded stats within the entire session (since your last login or /reload).", Zerotorescue@0: set = function(i, v) Zerotorescue@0: self.db.profile.sessionSummary = v; Zerotorescue@0: Zerotorescue@0: if MailFrame:IsVisible() then Zerotorescue@0: self:MAIL_SHOW(); Zerotorescue@0: end Zerotorescue@0: end, Zerotorescue@0: get = function() return self.db.profile.sessionSummary; end, Zerotorescue@0: width = "full", Zerotorescue@0: }, Zerotorescue@0: batchSummary = { Zerotorescue@0: order = 30, Zerotorescue@0: type = "toggle", Zerotorescue@0: name = "Show a summary of the recorded stats whenever it updated after opening the current batch has finished", Zerotorescue@0: desc = "Show a summary of the recorded stats whenever it has been updated after opening the current batch of mails has finished.", Zerotorescue@0: set = function(i, v) Zerotorescue@0: self.db.profile.batchSummary = v; Zerotorescue@0: Zerotorescue@0: if MailFrame:IsVisible() then Zerotorescue@0: self:MAIL_SHOW(); Zerotorescue@0: end Zerotorescue@0: end, Zerotorescue@0: get = function() return self.db.profile.batchSummary; end, Zerotorescue@0: width = "full", Zerotorescue@0: }, Zerotorescue@0: }, Zerotorescue@0: }, Zerotorescue@0: }, Zerotorescue@0: }; Zerotorescue@0: Zerotorescue@0: return configGroup; Zerotorescue@0: end Zerotorescue@0: Zerotorescue@31: function mod:Debug(t) Zerotorescue@0: return MailOpener:Debug("|cffff0000Collected|r:" .. t); Zerotorescue@0: end