view Modules/Collected.lua @ 79:136aa3dd4dda

The keep free space will now cause the opener to partially loot mail when you are near the keep free space requirement, rather than skipping the entire mail. The config has been changed to reflect this.
author Zerotorescue
date Thu, 16 Sep 2010 17:20:34 +0200
parents bd80e4b4042f
children 5fe1f61452a1
line wrap: on
line source
local MailOpener = LibStub("AceAddon-3.0"):GetAddon("MailOpener");
local mod = MailOpener:NewModule("Collected", "AceEvent-3.0", "AceTimer-3.0");
local L = LibStub("AceLocale-3.0"):GetLocale("MailOpener");

mod.moduleDescription = L["Shows a simple summary of what has been collected at the mailbox."];
mod.moduleRequired = false;

-- Gold
local previousGold, earned, sessionEarned;
-- Items
local previousFreeSlotsAvailable, itemsGained, sessionItemsgained;
-- Mail
local previousMailCount, mailOpened, sessionMailOpened;
-- Time
local timeStarted, sessionTimeSpent; -- even though the first contains GetTime(), the second var will be filled with actual seconds

local updated;

function mod:OnInitialize()
	local defaults = {
		profile = {
			trackGold = true,
			trackItems = true,
			trackMail = true,
			trackTimeSpent = true,
			sessionSummary = false,
			batchSummary = false,
		},
	};
	
	-- Register our saved variables NameSpace
	self.db = MailOpener.db:RegisterNamespace("Collected", defaults);
end

function mod:OnEnable()
	self:Debug("OnEnable");
	
	self:RegisterEvent("MAIL_SHOW");
	
	MailOpener:TogglePostalModule("Rake", false);
	
	sessionEarned = 0;
	sessionItemsgained = 0;
	sessionMailOpened = 0;
	sessionTimeSpent = 0;
	
	-- If we were toggling this module on while the mailbox is opened we must register all events again
	if MailFrame:IsVisible() then
		self:MAIL_SHOW();
	end
end

-- Even though Ace can unregister our events it's neater to do it manually too
function mod:OnDisable()
	self:Debug("OnDisable");
	
	self:UnregisterEvent("MAIL_SHOW");
	
	self:Stop();
	
	MailOpener:TogglePostalModule("Rake", true);
end

function mod:MAIL_SHOW()
	self:Debug("MAIL_SHOW");
	
	-- Unbind / reset all previous events and settings
	self:Stop();
	
	self:RegisterEvent("MAIL_CLOSED");
	
	if self.db.profile.batchSummary then
		self:RegisterMessage("MO_OPEN_COMPLETE");
	end
	
	-- Money
	if self.db.profile.trackGold then
		self:RegisterEvent("PLAYER_MONEY");
	
		previousGold = GetMoney();
		earned = 0;
	end
	
	-- Items
	if self.db.profile.trackItems then
		self:RegisterEvent("BAG_UPDATE");
	
		previousFreeSlotsAvailable = self:GetNumFreeSlots();
		itemsGained = 0;
	end
	
	-- Mail
	if self.db.profile.trackMail then
		self:RegisterEvent("MAIL_INBOX_UPDATE");
		
		previousMailCount = nil;
		mailOpened = 0;
	end
	
	-- Time Spent
	if self.db.profile.trackTimeSpent then
		timeStarted = GetTime();
	end
end

function mod:MAIL_CLOSED()
	self:Debug("MAIL_CLOSED");
	
	self:Summarize(true);
	
	self:Stop();
end

function mod:PLAYER_MONEY()
	-- Sending mail does not interest us, so only remember what we earned
	local currentGold = GetMoney();
	
	if currentGold > previousGold then
		local goldEarned = ( currentGold - previousGold );
		
		earned = ( earned + goldEarned );
		
		updated = true;
		
		if self.db.profile.sessionSummary then
			sessionEarned = ( sessionEarned + goldEarned );
		end
	end
	
	previousGold = currentGold;
end

function mod:BAG_UPDATE()
	-- Sending mail does not interest us, so only remember what we earned
	local freeSlotAvailable = self:GetNumFreeSlots();
	
	if freeSlotAvailable < previousFreeSlotsAvailable then
		-- we lost a slot, so gained an item
		
		local gained = ( previousFreeSlotsAvailable - freeSlotAvailable );
		
		itemsGained = ( itemsGained + gained  );
		
		updated = true;
		
		if self.db.profile.sessionSummary then
			sessionItemsgained = ( sessionItemsgained + gained );
		end
	
			--We may need the lines below if we get inaccurate counts
			--	previousFreeSlotsAvailable = ( previousFreeSlotsAvailable - gained );
			--elseif freeSlotAvailable > previousFreeSlotsAvailable then
				-- an additional slot available, so we lost an item
				
			--	local lost = ( freeSlotAvailable - previousFreeSlotsAvailable );
			
			--	previousFreeSlotsAvailable = ( previousFreeSlotsAvailable + lost );
	end
	
	previousFreeSlotsAvailable = freeSlotAvailable;
end

function mod:MAIL_INBOX_UPDATE()
	local numItems, _ = GetInboxNumItems();
	
	if previousMailCount == nil then
		previousMailCount = numItems;
	else
		if numItems < previousMailCount then
			-- We lost a mail, which means we opened one without text
			
			--local opened = ( previousMailCount - numItems );
			
			mailOpened = ( mailOpened + 1 );
		
			updated = true;
		
			if self.db.profile.sessionSummary then
				sessionMailOpened = ( sessionMailOpened + 1 );
			end
		end
		
		previousMailCount = numItems;
	end
end

function mod:MO_OPEN_COMPLETE()
	-- Only summarize when changed
	if updated then
		self:Summarize(false);
		
		updated = false;
	end
end

function mod:Stop()
	self:UnregisterEvent("MAIL_CLOSED");
	
	-- Batch summary
	self:UnregisterMessage("MO_OPEN_COMPLETE");
	
	-- Clear any var in the memory remaining
	
	-- Money
	self:UnregisterEvent("PLAYER_MONEY");
	previousGold = nil;
	earned = nil;
	
	-- Items
	self:UnregisterEvent("BAG_UPDATE");
	previousFreeSlotsAvailable = nil;
	itemsGained = nil;
		
	-- Mail
	self:UnregisterEvent("MAIL_INBOX_UPDATE");
	previousMailCount = nil;
	mailOpened = nil;
	
	-- Time Spent
	timeStarted = nil;
end

function mod:Summarize(full)
	-- Message buffer, append details we have data for
	local printMessage = "";
	
	local timeSpent, tempSessionTimeSpent;
	if timeStarted then
		timeSpent = ceil( GetTime() - timeStarted );
		
		if self.db.profile.sessionSummary and self.db.profile.trackTimeSpent then
			tempSessionTimeSpent = ( sessionTimeSpent + timeSpent );
			
			if full then
				-- Only remember the timespent when the mailbox is closed
				sessionTimeSpent = tempSessionTimeSpent;
			end
		end
		
		self:Debug(timeSpent);
	end
	
	-- Did we record any mail being opened?
	if mailOpened and mailOpened > 0 then
		-- Time Spent
		if timeSpent and timeSpent > 0 then
			local timeSpentMinutes = floor( timeSpent / 60 );
			local timeSpentSeconds = ( timeSpent % 60 );
			if timeSpentMinutes ~= 0 then
				printMessage = printMessage .. format(L["Collected a total of %d mail within %d minutes and %d seconds."], mailOpened, timeSpentMinutes, timeSpentSeconds) .. " ";
			else
				printMessage = printMessage .. format(L["Collected a total of %d mail within %d seconds."], mailOpened, timeSpentSeconds) .. " ";
			end
		else
			printMessage = printMessage .. format(L["Collected a total of %d mail."], mailOpened) .. " ";
		end
	elseif timeSpent and timeSpent > 0 then
		local timeSpentMinutes = floor( timeSpent / 60 );
		local timeSpentSeconds = ( timeSpent % 60 );
		if timeSpentMinutes ~= 0 then
			printMessage = printMessage .. format(L["Spent %d minutes and %d seconds collecting mail."], timeSpentMinutes, timeSpentSeconds) .. " ";
		else
			printMessage = printMessage .. format(L["Spent %d seconds collecting mail."], timeSpentSeconds) .. " ";
		end
	end
	
	-- Did we record any items or gold being looted?
	if (itemsGained and itemsGained > 0) and (earned and earned > 0) then
		printMessage = printMessage .. format(L["You gained %d items and %s from this."], itemsGained, MailOpener:FormatMoney(earned));
	elseif itemsGained and itemsGained > 0 then
		printMessage = printMessage .. format(L["You gained %d items from this."], itemsGained);
	elseif earned and earned > 0 then
		printMessage = printMessage .. format(L["You gained %s from this."], MailOpener:FormatMoney(earned));
	end
	
	-- Did we record anything? print that!
	if printMessage ~= "" then
		MailOpener:Print(printMessage);
	end
	
	if self.db.profile.sessionSummary and ((sessionMailOpened and (not mailOpened or sessionMailOpened > mailOpened)) or (tempSessionTimeSpent and (not timeSpent or tempSessionTimeSpent > timeSpent)) or (sessionEarned and (not earned or sessionEarned > earned)) or (sessionItemsgained and (not itemsGained or sessionItemsgained > itemsGained))) then
		-- Message buffer, append details we have data for
		printMessage = L["(Session summary)"] .. " ";
	
		-- Did we record any mail being opened?
		if sessionMailOpened and sessionMailOpened > 0 then
			-- Time Spent
			if tempSessionTimeSpent and tempSessionTimeSpent > 0 then
				local timeSpentMinutes = floor( tempSessionTimeSpent / 60 );
				local timeSpentSeconds = ( tempSessionTimeSpent % 60 );
				if timeSpentMinutes ~= 0 then
					printMessage = printMessage .. format(L["Collected a total of %d mail within %d minutes and %d seconds this session."], sessionMailOpened, timeSpentMinutes, timeSpentSeconds) .. " ";
				else
					printMessage = printMessage .. format(L["Collected a total of %d mail within %d seconds this session."], sessionMailOpened, timeSpentSeconds) .. " ";
				end
			else
				printMessage = printMessage .. format(L["Collected a total of %d mail this session."], sessionMailOpened) .. " ";
			end
		elseif tempSessionTimeSpent then
			local timeSpentMinutes = floor( tempSessionTimeSpent / 60 );
			local timeSpentSeconds = ( tempSessionTimeSpent % 60 );
			if timeSpentMinutes ~= 0 then
				printMessage = printMessage .. format(L["Spent %d minutes and %d seconds collecting mail this session."], timeSpentMinutes, timeSpentSeconds) .. " ";
			else
				printMessage = printMessage .. format(L["Spent %d seconds collecting mail this session."], timeSpentSeconds) .. " ";
			end
		end
		
		-- Did we record any items or gold being looted?
		if (sessionItemsgained and sessionItemsgained > 0) and (sessionEarned and sessionEarned > 0) then
			printMessage = printMessage .. format(L["You gained %d items and %s from this."], sessionItemsgained, MailOpener:FormatMoney(sessionEarned));
		elseif sessionItemsgained and sessionItemsgained > 0 then
			printMessage = printMessage .. format(L["You gained %d items from this."], sessionItemsgained);
		elseif sessionEarned and sessionEarned > 0 then
			printMessage = printMessage .. format(L["You gained %s from this."], MailOpener:FormatMoney(sessionEarned));
		end
	
		-- Did we record anything? print that!
		if printMessage ~= "" then
			MailOpener:Print(printMessage);
		end
	end
end

function mod:GetNumFreeSlots()
	local slotsAvailable = 0;
	for bag = 0, 4 do
		slotsAvailable = ( slotsAvailable + GetContainerNumFreeSlots(bag) );
	end
	
	return slotsAvailable;
end

function mod:GetOptionsGroup()
	local configGroup = {
		order = 0,
		type = "modulesSubGroup",
		name = L["Collected"],
		desc = L["Change settings for the collected module."],
		args = {
			General = {
				order = 10,
				type = "group",
				inline = true,
				name = L["General"],
				args = {
					description = {
						order = 10,
						type = "description",
						name = function()
							local descText = L["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";
							
							if self:IsEnabled() then
								descText = descText .. L["Status: %s"]:format(L["|cff00ff00Enabled|r"]);
							else
								descText = descText .. L["Status: %s"]:format(L["|cffff0000Disabled|r"]);
							end
							
							return descText;
						end,
					},
					disable = {
						order = 20,
						type = "execute",
						name = function()
							if self:IsEnabled() then
								return L["Disable Module"];
							else
								return L["Enable Module"];
							end
						end,
						desc = L["Click here to completely toggle this module on or off."],
						width = "double",
						func = function()
							if self:IsEnabled() then
								self:Disable();
								
								MailOpener.db.profile.modules[self:GetName()] = false;
							else
								self:Enable();
								
								MailOpener.db.profile.modules[self:GetName()] = true;
							end
						end,
					},
				},
			},
			TrackStats = {
				order = 20,
				type = "group",
				inline = true,
				name = L["Track Stats"],
				args = {
					description = {
						order = 10,
						type = "description",
						name = L["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)."],
					},
					AHHeader = {
						order = 15,
						type = "header",
						name = "",
					},
					trackGold = {
						order = 20,
						type = "toggle",
						name = L["Track |cfffed000gold gained|r"],
						desc = L["Track the amount of gold gained and display it when closing the mailbox."],
						set = function(i, v)
							self.db.profile.trackGold = v;
							
							if MailFrame:IsVisible() then
								self:MAIL_SHOW();
							end
						end,
						get = function() return self.db.profile.trackGold; end,
					},
					trackItems = {
						order = 30,
						type = "toggle",
						name = L["Track |cfffed000items gained|r"],
						desc = L["Track the amount of items gained and display it when closing the mailbox."],
						set = function(i, v)
							self.db.profile.trackItems = v;
							
							if MailFrame:IsVisible() then
								self:MAIL_SHOW();
							end
						end,
						get = function() return self.db.profile.trackItems; end,
					},
					trackMail = {
						order = 40,
						type = "toggle",
						name = L["Track |cfffed000mail opened|r"],
						desc = L["Track the amount of mail received and display it when closing the mailbox."],
						set = function(i, v)
							self.db.profile.trackMail = v;
							
							if MailFrame:IsVisible() then
								self:MAIL_SHOW();
							end
						end,
						get = function() return self.db.profile.trackMail; end,
					},
					trackTimeSpent = {
						order = 50,
						type = "toggle",
						name = L["Track |cfffed000time spent|r"],
						desc = L["Track the amount of time spent at the mailbox."],
						set = function(i, v)
							self.db.profile.trackTimeSpent = v;
							
							if MailFrame:IsVisible() then
								self:MAIL_SHOW();
							end
						end,
						get = function() return self.db.profile.trackTimeSpent; end,
					},
				},
			},
			Summarize = {
				order = 30,
				type = "group",
				inline = true,
				name = L["Summarize"],
				args = {
					sessionSummary = {
						order = 20,
						type = "toggle",
						name = L["Also show a summary of the recorded stats within the entire session"],
						desc = L["Also show a summary of the recorded stats within the entire session (since your last login or /reload)."],
						set = function(i, v)
							self.db.profile.sessionSummary = v;
							
							if MailFrame:IsVisible() then
								self:MAIL_SHOW();
							end
						end,
						get = function() return self.db.profile.sessionSummary; end,
						width = "full",
					},
					batchSummary = {
						order = 30,
						type = "toggle",
						name = L["Show a summary of the recorded stats whenever it updated after opening the current batch has finished"],
						desc = L["Show a summary of the recorded stats whenever it has been updated after opening the current batch of mails has finished."],
						set = function(i, v)
							self.db.profile.batchSummary = v;
							
							if MailFrame:IsVisible() then
								self:MAIL_SHOW();
							end
						end,
						get = function() return self.db.profile.batchSummary; end,
						width = "full",
					},
				},
			},
		},
	};
	
	return configGroup;
end

function mod:Debug(t)
	return MailOpener:Debug("|cffff0000Collected|r:" .. t);
end