diff Modules/FailSafe.lua @ 5:1ba07a64bf14

Added a ?FailSafe? module which will safe you from mail failing to open. The opening of a single mail may get stuck when other things occur such as mail being send at the exact same time. This module will continue with the next mail after a set timeout (default set to 20 seconds).
author Zerotorescue
date Tue, 07 Sep 2010 20:57:49 +0200
parents
children f10c8a083d2a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Modules/FailSafe.lua	Tue Sep 07 20:57:49 2010 +0200
@@ -0,0 +1,159 @@
+local MailOpener = LibStub("AceAddon-3.0"):GetAddon("MailOpener");
+local FailSafe = MailOpener:NewModule("FailSafe", "AceEvent-3.0", "AceTimer-3.0");
+
+--[[
+Module name:	FailSafe
+Description:	Prevents the mail opening from stopping when the execution of a single mail opening function fails (e.g. because of mail functions throttling).
+Required:		No.
+]]
+
+function FailSafe:OnInitialize()
+	local defaults = {
+		profile = {
+			timeout = 20,
+		},
+	};
+	
+	-- Register our saved variables NameSpace
+	self.db = MailOpener.db:RegisterNamespace("FailSafe", defaults);
+end
+
+function FailSafe:OnEnable()
+	self:Debug("OnEnable");
+	
+	self:RegisterEvent("MAIL_SHOW");
+end
+
+-- Even though Ace can unregister our events it's neater to do it manually too
+function FailSafe:OnDisable()
+	self:Debug("OnDisable");
+	
+	self:UnregisterEvent("MAIL_SHOW");
+	
+	self:Stop();
+end
+
+function FailSafe:MAIL_SHOW()
+	self:Debug("MAIL_SHOW");
+	
+	self:RegisterEvent("MAIL_CLOSED");
+	
+	self:RegisterMessage("MO_OPENING_MAIL");
+	self:RegisterMessage("MO_MAIL_EMPTIED");
+end
+
+function FailSafe:MAIL_CLOSED()
+	self:Debug("MAIL_CLOSED");
+	
+	self:UnregisterEvent("MAIL_CLOSED");
+	
+	self:UnregisterMessage("MO_OPENING_MAIL");
+	self:UnregisterMessage("MO_OPENING_MAIL_FINISHED");
+	
+	self:CancelTimer(self.tmrTimeout);
+end
+
+function FailSafe:MO_OPENING_MAIL()
+	-- Single mail being opened
+	
+	self.tmrTimeout = self:ScheduleTimer("Continue", self.db.profile.timeout);
+end
+
+function FailSafe:MO_MAIL_EMPTIED()
+	-- Single mail has been opened
+	
+	self:CancelTimer(self.tmrTimeout);
+end
+
+function FailSafe:Continue()
+	MailOpener:GetModule("OpenAll"):Continue();
+	
+	print("|cff15ff00Mail Opener|r (FailSafe): Mail opening timeout, continueing with the next mail.");
+end
+
+function FailSafe:GetOptionsGroup()
+	local configGroup = {
+		order = 450,
+		type = "group",
+		name = "FailSafe",
+		desc = "Change settings for the FailSafe module.",
+		args = {
+			General = {
+				order = 10,
+				type = "group",
+				inline = true,
+				name = "General",
+				args = {
+					description = {
+						order = 10,
+						type = "description",
+						name = function()
+							local default = "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
+								return default .. "Status: |cff00ff00Enabled|r";
+							else
+								return default .. "Status: |cffff0000Disabled|r";
+							end
+						end,
+					},
+					disable = {
+						order = 20,
+						type = "execute",
+						name = function()
+							if self:IsEnabled() then
+								return "Disable Module";
+							else
+								return "Enable Module";
+							end
+						end,
+						desc = "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,
+					},
+				},
+			},
+			SingleMailTimeout = {
+				order = 20,
+				type = "group",
+				inline = true,
+				name = "Single Mail Opening Timeout",
+				args = {
+					description = {
+						order = 10,
+						type = "description",
+						name = "Change how long FailSafe should wait before skipping the last mail and continueing with the next. This will prevent mail opening getting stuck forever because a single mail is frozen for whatever reason.",
+					},
+					timeout = {
+						order = 20,
+						type = "range",
+						width = "double",
+						min = 1,
+						max = 60,
+						step = 0.5,
+						name = "Single Mail Timeout",
+						desc = "Change how long FailSafe should wait before skipping the last mail and continueing with the next. This should prevent mail opening getting stuck because a single mail is stuck for whatever reason.\n\nDefault value is 20 seconds.",
+						get = function() return self.db.profile.timeout; end,
+						set = function(i, v) self.db.profile.timeout = v; end,
+					},
+				},
+			},
+		},
+	};
+	
+	return configGroup;
+end
+
+function FailSafe:Debug(t)
+	return MailOpener:Debug("|cffff0000FailSafe|r:" .. t);
+end
\ No newline at end of file