annotate Core.lua @ 8:1b2d819b4fa8

Now using the global MailAddonBusy to indicate MailOpener is busy, read comments in Core.lua for more info. Default status is now ?enabled without automatic mail opening? to let first time users look around before MailOpener messes up their heads. A StaticPopupDialog will be added later to ask if they want to auto-enable. When ?enabled without automatic mail opening? is on and you toggle the mail opening checkbox on, mail opening will automatically start.
author Zerotorescue
date Thu, 09 Sep 2010 10:53:19 +0200
parents 7249f9f1205a
children fb952805d8b7
rev   line source
Zerotorescue@3 1 -- You can access this addon's object through: LibStub("AceAddon-3.0"):GetAddon("MailOpener")
Zerotorescue@3 2 local MailOpener = LibStub("AceAddon-3.0"):NewAddon("MailOpener", "AceEvent-3.0", "AceTimer-3.0");
Zerotorescue@0 3
Zerotorescue@8 4 -- You can check if MailOpener is busy with the global MailAddonBusy (if not MailAddonBusy then ...do something... end)
Zerotorescue@8 5 -- MailAddonBusy will be nil when nothing is happening or filled with the addon name when MO is working
Zerotorescue@8 6 -- Another addon can use this variable to indicate they're working too, MailOpener will then wait for that to finish
Zerotorescue@3 7
Zerotorescue@3 8 local AutoOpenMail, MailOpenerConfig, lastAmount, lastQuickAuctionsStatus, freshList, mailboxEmptySoundPlayed;
Zerotorescue@0 9
Zerotorescue@0 10 function MailOpener:OnInitialize()
Zerotorescue@0 11 local defaults = {
Zerotorescue@0 12 profile = {
Zerotorescue@8 13 uses = 0,
Zerotorescue@0 14 general = {
Zerotorescue@8 15 defaultStatus = "disabled", -- addon enabled, but mail opening not auto on
Zerotorescue@0 16 defaultQAStatus = "__remember",
Zerotorescue@0 17 continueOpeningStackableItems = false,
Zerotorescue@0 18 autoDisableQAAutoMail = true,
Zerotorescue@0 19 autoReenableQAAutoMail = false,
Zerotorescue@0 20 autoSetBackQAAutoMail = true,
Zerotorescue@0 21 continueOpening = false,
Zerotorescue@0 22 waitTime = 5,
Zerotorescue@0 23 initialDelay = 0.5,
Zerotorescue@0 24 },
Zerotorescue@0 25 modules = {
Zerotorescue@0 26 Collected = true,
Zerotorescue@5 27 FailSafe = true,
Zerotorescue@0 28 },
Zerotorescue@0 29 notifications = {
Zerotorescue@3 30 welcome = false,
Zerotorescue@3 31 bye = false,
Zerotorescue@0 32 finishedCurrentBatch = true,
Zerotorescue@0 33 mailboxIsEmpty = true,
Zerotorescue@0 34
Zerotorescue@0 35 skipped = {
Zerotorescue@0 36 all = true,
Zerotorescue@0 37 inventoryFull = true,
Zerotorescue@0 38 keepFreeSpaceLimit = true,
Zerotorescue@0 39 GMMail = true,
Zerotorescue@0 40 COD = true,
Zerotorescue@0 41 normalGoldMail = true,
Zerotorescue@0 42 normalItemsMail = true,
Zerotorescue@0 43 AHexpired = true,
Zerotorescue@0 44 AHsuccess = true,
Zerotorescue@0 45 AHwon = true,
Zerotorescue@0 46 AHcanceled = true,
Zerotorescue@0 47 AHoutbid = true,
Zerotorescue@0 48 other = true,
Zerotorescue@0 49 },
Zerotorescue@0 50 processed = {
Zerotorescue@0 51 all = true,
Zerotorescue@0 52 normalGoldMail = true,
Zerotorescue@0 53 normalItemsMail = true,
Zerotorescue@0 54 AHexpired = true,
Zerotorescue@0 55 AHsuccess = true,
Zerotorescue@0 56 AHwon = true,
Zerotorescue@0 57 AHcanceled = true,
Zerotorescue@0 58 AHoutbid = true,
Zerotorescue@0 59 other = true,
Zerotorescue@0 60 },
Zerotorescue@0 61
Zerotorescue@0 62 bagsFullSound = false,
Zerotorescue@0 63 bagsFullSoundFile = "Sound\\Spells\\SimonGame_Visual_BadPress.wav",
Zerotorescue@0 64 bagsFullSoundFileName = "Simon Error",
Zerotorescue@0 65 bagsFullSoundOnlyOnce = true,
Zerotorescue@0 66 mailboxEmptySound = false,
Zerotorescue@0 67 mailboxEmptySoundFile = "Sound\\Spells\\SimonGame_Visual_GameStart.wav",
Zerotorescue@0 68 mailboxEmptySoundFileName = "Simon Start",
Zerotorescue@0 69 mailboxEmptySoundOnlyOnce = true,
Zerotorescue@0 70 },
Zerotorescue@0 71 },
Zerotorescue@0 72 };
Zerotorescue@0 73
Zerotorescue@0 74 -- Register our saved variables database
Zerotorescue@0 75 self.db = LibStub("AceDB-3.0"):New("MailOpenerDB", defaults, true);
Zerotorescue@0 76
Zerotorescue@0 77 -- Set these as object variables so we can use them in our modules
Zerotorescue@0 78 if select(6, GetAddOnInfo("Postal")) == nil then
Zerotorescue@0 79 self.PostalEnabled = true;
Zerotorescue@0 80
Zerotorescue@0 81 -- Ensure this addon is loaded if AddonLoader is installed
Zerotorescue@0 82 if AddonLoader and AddonLoader.LoadAddOn and not Postal then
Zerotorescue@0 83 AddonLoader:LoadAddOn("Postal");
Zerotorescue@0 84 end
Zerotorescue@0 85 end
Zerotorescue@0 86
Zerotorescue@0 87 if select(6, GetAddOnInfo("QuickAuctions")) == nil then
Zerotorescue@0 88 self.QuickAuctionsEnabled = true;
Zerotorescue@0 89
Zerotorescue@0 90 -- Ensure this addon is loaded if AddonLoader is installed
Zerotorescue@0 91 if AddonLoader and AddonLoader.LoadAddOn then
Zerotorescue@0 92 AddonLoader:LoadAddOn("QuickAuctions");
Zerotorescue@0 93 end
Zerotorescue@0 94 end
Zerotorescue@0 95
Zerotorescue@0 96 -- Don't enable the config module until we need it
Zerotorescue@0 97 for name, module in self:IterateModules() do
Zerotorescue@0 98 if name == "Config" then
Zerotorescue@0 99 module:SetEnabledState(false);
Zerotorescue@0 100 elseif self.db.profile.modules[name] ~= nil then
Zerotorescue@0 101 if self.db.profile.modules[name] then
Zerotorescue@0 102 self:Debug("|cff00ff00Enabling|r module: " .. name);
Zerotorescue@0 103 else
Zerotorescue@0 104 self:Debug("|cffff0000Disabling|r module: " .. name);
Zerotorescue@0 105 end
Zerotorescue@0 106
Zerotorescue@0 107 module:SetEnabledState(self.db.profile.modules[name]);
Zerotorescue@0 108 end
Zerotorescue@0 109 end
Zerotorescue@0 110
Zerotorescue@0 111 -- Make the open all checkbox
Zerotorescue@0 112 local check = CreateFrame("CheckButton", "cbMailOpenerEnable", MailFrame, "ChatConfigCheckButtonTemplate");
Zerotorescue@0 113 check:SetHeight(26);
Zerotorescue@0 114 check:SetWidth(26);
Zerotorescue@3 115 check:SetChecked(true);
Zerotorescue@0 116 check:SetHitRectInsets(0, -80, 0, 0);
Zerotorescue@0 117 check:SetScript("OnClick", function(self)
Zerotorescue@3 118 if IsShiftKeyDown() then
Zerotorescue@3 119 -- Shift key = toggle addon on or off, since addon is already on there's only one option
Zerotorescue@3 120
Zerotorescue@3 121 if not MailOpener:IsEnabled() then
Zerotorescue@3 122 print("|cff15ff00Mail Opener|r: Shift key was held down, so |cff00ff00enabling|r the entire addon as well as automatic opening of mail.");
Zerotorescue@3 123
Zerotorescue@3 124 MailOpener:Enable();
Zerotorescue@3 125
Zerotorescue@3 126 -- The above calls MAIL_SHOW which changes AutoOpenMail, so we can't remember the old setting
Zerotorescue@3 127 AutoOpenMail = true;
Zerotorescue@3 128
Zerotorescue@3 129 self:SetChecked(true);
Zerotorescue@3 130 else
Zerotorescue@3 131 print("|cff15ff00Mail Opener|r: Shift key was held down, so |cffff0000disabling|r the entire addon.");
Zerotorescue@3 132
Zerotorescue@3 133 MailOpener:Disable();
Zerotorescue@3 134
Zerotorescue@3 135 self:SetChecked(false);
Zerotorescue@3 136 end
Zerotorescue@0 137 else
Zerotorescue@3 138 -- Normal click
Zerotorescue@3 139
Zerotorescue@3 140 if self:GetChecked() then
Zerotorescue@3 141 print("|cff15ff00Mail Opener|r: |cff00ff00Enabling|r automatic opening of mail.");
Zerotorescue@3 142
Zerotorescue@3 143 AutoOpenMail = true;
Zerotorescue@8 144 MailOpener:ScheduleOpen(false);
Zerotorescue@3 145 else
Zerotorescue@3 146 print("|cff15ff00Mail Opener|r: |cffff0000Disabling|r automatic opening of mail.");
Zerotorescue@3 147
Zerotorescue@3 148 AutoOpenMail = false;
Zerotorescue@3 149 end
Zerotorescue@0 150 end
Zerotorescue@0 151 end);
Zerotorescue@3 152 check.tooltip = "Toggle automatic mail opening on or off (you can force this by holding shift when opening the mailbox.\n\nHold the |cffffffffSHIFT|r key to disable the entire addon.";
Zerotorescue@0 153 check:SetPoint("TOPLEFT", MailFrame, "TOPLEFT", 68, -13)
Zerotorescue@0 154
Zerotorescue@0 155 if self.QuickAuctionsEnabled then
Zerotorescue@0 156 -- QA is enabled so move the checkbox further to the right
Zerotorescue@0 157
Zerotorescue@0 158 check:SetPoint("TOPLEFT", MailFrame, "TOPLEFT", 155, -13);
Zerotorescue@0 159 end
Zerotorescue@0 160
Zerotorescue@0 161 -- Get reference to the text field
Zerotorescue@0 162 local checkboxText = _G[check:GetName() .. "Text"];
Zerotorescue@0 163 checkboxText:SetText("Mail Opener");
Zerotorescue@0 164 -- We like this color more
Zerotorescue@0 165 checkboxText:SetTextColor(1, 0.8, 0, 1);
Zerotorescue@0 166
Zerotorescue@0 167 self.cbOpenAll = check;
Zerotorescue@0 168
Zerotorescue@0 169 -- Make the config button
Zerotorescue@0 170 local button = CreateFrame("Button", "btnMailOpenerConfig", MailFrame, "UIPanelButtonTemplate")
Zerotorescue@0 171 button:SetText("Config")
Zerotorescue@0 172 button:SetHeight(23)
Zerotorescue@0 173 button:SetWidth(55)
Zerotorescue@0 174 if self.PostalEnabled then
Zerotorescue@0 175 button:SetPoint("TOPRIGHT", MailFrame, "TOPRIGHT", -75, -13);
Zerotorescue@0 176 else
Zerotorescue@0 177 button:SetPoint("TOPRIGHT", MailFrame, "TOPRIGHT", -55, -13);
Zerotorescue@0 178 end
Zerotorescue@0 179 button:SetScript("OnClick", function()
Zerotorescue@0 180 MailOpener:EnableConfigModule();
Zerotorescue@0 181
Zerotorescue@0 182 MailOpenerConfig:Show();
Zerotorescue@0 183
Zerotorescue@8 184 --BETA:if MailOpener.db.profile.uses >= 15 then
Zerotorescue@7 185 --BETA: MailOpener:ShowBetaPopup();
Zerotorescue@7 186 --BETA:end
Zerotorescue@0 187 end);
Zerotorescue@0 188
Zerotorescue@0 189 self.btnConfig = button;
Zerotorescue@0 190
Zerotorescue@0 191 -- Disable the AddonLoader slash commands
Zerotorescue@0 192 SLASH_MO1 = nil;
Zerotorescue@0 193 SLASH_MAILOPEN1 = nil;
Zerotorescue@0 194 SLASH_MAILOPENER1 = nil;
Zerotorescue@0 195
Zerotorescue@0 196 -- Register our own slash commands
Zerotorescue@0 197 SLASH_MAILOPENER1 = "/mo";
Zerotorescue@0 198 SLASH_MAILOPENER2 = "/mailopen";
Zerotorescue@0 199 SLASH_MAILOPENER3 = "/mailopener";
Zerotorescue@0 200 SlashCmdList["MAILOPENER"] = function(msg)
Zerotorescue@0 201 MailOpener:EnableConfigModule();
Zerotorescue@0 202
Zerotorescue@0 203 MailOpenerConfig:CommandHandler(msg);
Zerotorescue@0 204 end
Zerotorescue@0 205
Zerotorescue@0 206 -- Attempt to remove the interface options added by AddonLoader (if enabled)
Zerotorescue@0 207 if AddonLoader and AddonLoader.RemoveInterfaceOptions then
Zerotorescue@0 208 AddonLoader:RemoveInterfaceOptions("Mail Opener");
Zerotorescue@0 209 end
Zerotorescue@0 210
Zerotorescue@0 211 -- Now create our own options frame
Zerotorescue@0 212 local frame = CreateFrame("Frame", nil, UIParent);
Zerotorescue@0 213 frame:Hide();
Zerotorescue@0 214 frame.name = "Mail Opener";
Zerotorescue@0 215 frame:HookScript("OnShow", function(self)
Zerotorescue@0 216 -- Enable the config module
Zerotorescue@0 217 MailOpener:EnableConfigModule();
Zerotorescue@0 218
Zerotorescue@0 219 -- Load the options and add it to the blizzard interface list
Zerotorescue@0 220 MailOpenerConfig:Load();
Zerotorescue@0 221
Zerotorescue@0 222 -- Refresh the frame to instantly show the right options
Zerotorescue@0 223 InterfaceOptionsFrame_OpenToCategory(self.name)
Zerotorescue@0 224 end);
Zerotorescue@0 225 -- And add it to the interface options
Zerotorescue@0 226 InterfaceOptions_AddCategory(frame);
Zerotorescue@0 227 end
Zerotorescue@0 228
Zerotorescue@0 229 function MailOpener:OnEnable()
Zerotorescue@0 230 self:RegisterEvent("MAIL_SHOW");
Zerotorescue@0 231 self:RegisterEvent("PLAYER_ENTERING_WORLD");
Zerotorescue@0 232
Zerotorescue@0 233 self.btnConfig:Show();
Zerotorescue@0 234
Zerotorescue@0 235 -- Reset variables
Zerotorescue@0 236 lastAmount = 0;
Zerotorescue@0 237 self.debugChannel = nil;
Zerotorescue@0 238
Zerotorescue@8 239 --BETA:if (self.db.profile.uses % 15) == 0 then
Zerotorescue@7 240 --BETA: -- Automatically show once every 15 uses
Zerotorescue@7 241 --BETA: self:ShowBetaPopup();
Zerotorescue@7 242 --BETA:end
Zerotorescue@0 243
Zerotorescue@0 244 -- If we were toggling this addon on while the mailbox is opened we must register all events again
Zerotorescue@0 245 if MailFrame:IsVisible() then
Zerotorescue@0 246 self:MAIL_SHOW();
Zerotorescue@0 247 end
Zerotorescue@0 248 end
Zerotorescue@0 249
Zerotorescue@0 250 function MailOpener:OnDisable()
Zerotorescue@0 251 self:UnregisterEvent("MAIL_SHOW");
Zerotorescue@0 252
Zerotorescue@0 253 self.btnConfig:Hide();
Zerotorescue@0 254
Zerotorescue@0 255 MailOpener:Stop();
Zerotorescue@0 256 end
Zerotorescue@0 257
Zerotorescue@0 258 -- We must disable Quick Auction's auto mail (if set up that way in the settings) before opening the mailbox or it will instantly start sending stuff
Zerotorescue@0 259 function MailOpener:PLAYER_ENTERING_WORLD()
Zerotorescue@0 260 self:UnregisterEvent("PLAYER_ENTERING_WORLD");
Zerotorescue@0 261
Zerotorescue@0 262 self:ToggleQAStatus();
Zerotorescue@0 263 end
Zerotorescue@0 264
Zerotorescue@0 265 -- Fired when the mailbox is opened
Zerotorescue@0 266 function MailOpener:MAIL_SHOW()
Zerotorescue@0 267 -- To stop the timer when the mailbox is closed
Zerotorescue@0 268 self:RegisterEvent("MAIL_CLOSED", "Stop");
Zerotorescue@0 269 self:RegisterEvent("PLAYER_LEAVING_WORLD", "Stop");
Zerotorescue@0 270
Zerotorescue@0 271 -- To set the timer for when to refresh again
Zerotorescue@0 272 self:RegisterEvent("MAIL_INBOX_UPDATE");
Zerotorescue@0 273
Zerotorescue@0 274 -- We need to know when opening has completed
Zerotorescue@0 275 self:RegisterMessage("MO_OPEN_COMPLETE");
Zerotorescue@0 276
Zerotorescue@8 277 if self.db.profile.uses == 0 then
Zerotorescue@8 278 --TODO:statispopupdialog
Zerotorescue@8 279 end
Zerotorescue@8 280
Zerotorescue@8 281 self.db.profile.uses = ( self.db.profile.uses + 1 );
Zerotorescue@8 282
Zerotorescue@0 283 self:Debug("defaultStatus:" .. self.db.profile.general.defaultStatus);
Zerotorescue@0 284 -- Change the mail opening status according to our settings
Zerotorescue@0 285 if self.db.profile.general.defaultStatus == "_enabled" then
Zerotorescue@3 286 AutoOpenMail = true;
Zerotorescue@3 287 self.cbOpenAll:SetChecked(true);
Zerotorescue@3 288 elseif self.db.profile.general.defaultStatus == "disabled" then
Zerotorescue@3 289 -- Disable auto opening but leave mail opener enabled
Zerotorescue@3 290
Zerotorescue@3 291 AutoOpenMail = false;
Zerotorescue@3 292 self.cbOpenAll:SetChecked(false);
Zerotorescue@3 293 elseif self.db.profile.general.defaultStatus == "xdisabled" then
Zerotorescue@3 294 -- Disable entire addon
Zerotorescue@3 295
Zerotorescue@3 296 MailOpener:Disable();
Zerotorescue@3 297 self.cbOpenAll:SetChecked(false);
Zerotorescue@0 298 end
Zerotorescue@0 299
Zerotorescue@0 300 self:ToggleQAStatus();
Zerotorescue@0 301
Zerotorescue@0 302 -- Hide the InboxTooMuchMail warning to allow room for our mail remaining info line
Zerotorescue@0 303 InboxTooMuchMail:Hide()
Zerotorescue@0 304 InboxTooMuchMail.Show = function() end
Zerotorescue@0 305
Zerotorescue@0 306 if self.QuickAuctionsEnabled then
Zerotorescue@8 307 local QAMail = LibStub("AceAddon-3.0"):GetAddon("QuickAuctions", true):GetModule("Mail", true);
Zerotorescue@0 308
Zerotorescue@8 309 if QAMail then
Zerotorescue@8 310 -- Hide the open all button
Zerotorescue@8 311 QAMail.massOpening:Hide();
Zerotorescue@8 312 -- Hide the x mail remaining text
Zerotorescue@8 313 QAMail.totalMail:Hide();
Zerotorescue@8 314 end
Zerotorescue@0 315 end
Zerotorescue@0 316
Zerotorescue@0 317 if self.db.profile.notifications.welcome then
Zerotorescue@0 318 -- Welcome notification
Zerotorescue@0 319 local _, c = UnitClass("player");
Zerotorescue@0 320 c = RAID_CLASS_COLORS[c];
Zerotorescue@0 321 c = string.format("|cff%02x%02x%02x", c.r * 255 + 0.5, c.g * 255 + 0.5, c.b * 255 + 0.5);
Zerotorescue@0 322
Zerotorescue@0 323 print("|cff15ff00Mail Opener|r: Welcome back "..c..UnitName("player").."|r. Requesting new mail from the local Postal Service, your mail will automatically be opened when it becomes available.");
Zerotorescue@0 324 end
Zerotorescue@0 325
Zerotorescue@0 326 mailboxEmptySoundPlayed = nil;
Zerotorescue@0 327
Zerotorescue@0 328 self:Recheck();
Zerotorescue@0 329
Zerotorescue@0 330 if self.db.profile.general.continueOpening then
Zerotorescue@6 331 -- Continue opening mail, but use the "initial mail opening interval" as time
Zerotorescue@6 332 self:ScheduleOpen(false);
Zerotorescue@0 333 end
Zerotorescue@0 334 end
Zerotorescue@0 335
Zerotorescue@0 336 -- Fired after a successful server sync
Zerotorescue@0 337 -- Fired when mail is deleted (which happens after taking all attachments from a mail sent by the game)
Zerotorescue@0 338 function MailOpener:MAIL_INBOX_UPDATE()
Zerotorescue@0 339 local current, total = GetInboxNumItems();
Zerotorescue@0 340
Zerotorescue@3 341 -- Calculate the amount of mail waiting that actually have attachments
Zerotorescue@3 342 -- If we just compare numbers we won't be including mail that isn't automatically deleted when opened, such as mail with attachments sent by other players
Zerotorescue@3 343 local currentMailWithAttachments = 0;
Zerotorescue@3 344 for i = 1, current do
Zerotorescue@3 345 local _, _, _, _, money, _, _, items = GetInboxHeaderInfo(i);
Zerotorescue@3 346
Zerotorescue@3 347 if (items and items > 0) or (money and money > 0) then
Zerotorescue@3 348 currentMailWithAttachments = currentMailWithAttachments + 1;
Zerotorescue@3 349 end
Zerotorescue@0 350 end
Zerotorescue@0 351
Zerotorescue@3 352 local tempLastAmount = lastAmount;
Zerotorescue@3 353 lastAmount = currentMailWithAttachments;
Zerotorescue@3 354
Zerotorescue@3 355 if currentMailWithAttachments ~= tempLastAmount then
Zerotorescue@3 356 self:Debug("MAIL_INBOX_UPDATE - lastAmount:" .. tempLastAmount .. " - current:" .. currentMailWithAttachments);
Zerotorescue@3 357 end
Zerotorescue@3 358
Zerotorescue@3 359 if currentMailWithAttachments > tempLastAmount then
Zerotorescue@0 360 -- New messages arrived in our mailbox, so this was a refresh, so set a timer
Zerotorescue@0 361
Zerotorescue@3 362 self:Debug("MO_SERVER_SYNCED");
Zerotorescue@3 363
Zerotorescue@0 364 -- Yell that we successfully synced with the server
Zerotorescue@0 365 self:SendMessage("MO_SERVER_SYNCED");
Zerotorescue@0 366
Zerotorescue@0 367 -- This list is fresh
Zerotorescue@0 368 freshList = true;
Zerotorescue@0 369 mailboxEmptySoundPlayed = nil;
Zerotorescue@0 370
Zerotorescue@0 371 -- Stop previous timer
Zerotorescue@0 372 self:CancelTimer(self.tmrRecheck, true);
Zerotorescue@0 373 -- More will arrive in 60 seconds
Zerotorescue@0 374 self.tmrRecheck = self:ScheduleTimer(function()
Zerotorescue@0 375 self:Debug("tmrRecheck 61 finished");
Zerotorescue@0 376
Zerotorescue@0 377 -- We can get a fresh list now, so query the server
Zerotorescue@0 378 freshList = false;
Zerotorescue@0 379
Zerotorescue@0 380 -- Look for mail
Zerotorescue@0 381 self:Recheck();
Zerotorescue@0 382 end, 61);
Zerotorescue@0 383 self:Debug("tmrRecheck 61");
Zerotorescue@0 384
Zerotorescue@0 385 if not IsShiftKeyDown() then
Zerotorescue@0 386 -- Allow overriding of mailopening with the shift key
Zerotorescue@0 387
Zerotorescue@0 388 -- Open the current mail
Zerotorescue@0 389 self:ScheduleOpen(false);
Zerotorescue@0 390 end
Zerotorescue@3 391 elseif currentMailWithAttachments < tempLastAmount then
Zerotorescue@2 392 -- We lost a mail
Zerotorescue@2 393
Zerotorescue@3 394 -- TODO: NYI: May need to delay this until the mail is actually deleted
Zerotorescue@3 395
Zerotorescue@3 396 self:Debug("MO_MAIL_EMPTIED");
Zerotorescue@3 397
Zerotorescue@2 398 -- Yell that we successfully opened/removed a mail
Zerotorescue@3 399 self:SendMessage("MO_MAIL_EMPTIED");
Zerotorescue@3 400 elseif (currentMailWithAttachments == 50 and tempLastAmount == 50) then
Zerotorescue@0 401 if not IsShiftKeyDown() then
Zerotorescue@0 402 -- Allow overriding of mailopening with the shift key
Zerotorescue@0 403
Zerotorescue@0 404 -- Open the current mail
Zerotorescue@0 405 self:ScheduleOpen(false);
Zerotorescue@0 406 end
Zerotorescue@0 407 end
Zerotorescue@0 408 end
Zerotorescue@0 409
Zerotorescue@0 410 function MailOpener:ScheduleOpen(continued)
Zerotorescue@0 411 if lastAmount > 0 then
Zerotorescue@0 412 local waitTime;
Zerotorescue@0 413 if continued then
Zerotorescue@0 414 waitTime = self.db.profile.general.waitTime;
Zerotorescue@0 415 else
Zerotorescue@0 416 -- Even though this is not a continuation and should be instant, we set a .5 second timer to prevent multiple calls of the OpenNow function
Zerotorescue@0 417 waitTime = self.db.profile.general.initialDelay;
Zerotorescue@0 418 end
Zerotorescue@0 419
Zerotorescue@0 420 -- Stop previous timer
Zerotorescue@0 421 self:CancelTimer(self.tmrOpenNow, true);
Zerotorescue@0 422 -- Schedule the next open
Zerotorescue@0 423 self.tmrOpenNow = self:ScheduleTimer("OpenNow", waitTime);
Zerotorescue@0 424 end
Zerotorescue@0 425 end
Zerotorescue@0 426
Zerotorescue@0 427 function MailOpener:OpenNow()
Zerotorescue@8 428 self:Debug("OpenNow (" .. ((MailAddonBusy and "1") or "0") .. ")");
Zerotorescue@8 429 if MailFrame:IsVisible() and AutoOpenMail then
Zerotorescue@0 430 self:Debug("OpenNow");
Zerotorescue@0 431
Zerotorescue@0 432 -- BeanCounter is the only addon hiding the mail close button while busy, so we can look for that
Zerotorescue@0 433 local BeanCounterActive = not InboxCloseButton:IsVisible();
Zerotorescue@0 434
Zerotorescue@8 435 if not BeanCounterActive and not MailAddonBusy then
Zerotorescue@8 436 -- No other addon is currently active
Zerotorescue@0 437
Zerotorescue@0 438 self:CancelTimer(self.tmrTryAgain, true); -- Insurance
Zerotorescue@0 439
Zerotorescue@0 440 if QuickAuctionsAutoMail then
Zerotorescue@0 441 -- Remember the last known quick auctions status
Zerotorescue@0 442 lastQuickAuctionsStatus = QuickAuctionsAutoMail:GetChecked();
Zerotorescue@0 443 end
Zerotorescue@0 444 if self.db.profile.general.autoDisableQAAutoMail and self.QuickAuctionsEnabled and QuickAuctionsAutoMail and QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@0 445 -- If auto disable "QA Auto mail" is enabled and QA's auto mail is currently toggled on, turn it off
Zerotorescue@0 446 -- We need to do this with a :click to trigger the right events
Zerotorescue@0 447
Zerotorescue@0 448 self:Debug("Turning automail |cffff0000off|r.");
Zerotorescue@0 449
Zerotorescue@0 450 QuickAuctionsAutoMail:Click();
Zerotorescue@0 451 end
Zerotorescue@0 452
Zerotorescue@8 453 MailAddonBusy = self:GetName();
Zerotorescue@0 454
Zerotorescue@0 455 self:Debug("MO_OPEN_MAIL");
Zerotorescue@0 456
Zerotorescue@0 457 -- Summon the mail opening gods
Zerotorescue@0 458 self:SendMessage("MO_OPEN_MAIL");
Zerotorescue@0 459 else
Zerotorescue@8 460 -- Another addon is ACTIVE
Zerotorescue@8 461 self:Debug("Another addon active, waiting .5 seconds...");
Zerotorescue@0 462
Zerotorescue@0 463 self:CancelTimer(self.tmrTryAgain, true); -- Insurance
Zerotorescue@8 464 -- Try again every 0.5 seconds
Zerotorescue@0 465 self.tmrTryAgain = self:ScheduleTimer("OpenNow", 0.5);
Zerotorescue@0 466 end
Zerotorescue@0 467 end
Zerotorescue@0 468 end
Zerotorescue@0 469
Zerotorescue@0 470 function MailOpener:MO_OPEN_COMPLETE()
Zerotorescue@8 471 if MailAddonBusy == self:GetName() then
Zerotorescue@8 472 MailAddonBusy = nil;
Zerotorescue@8 473 end
Zerotorescue@1 474
Zerotorescue@1 475 -- Try a recheck
Zerotorescue@1 476 self:Recheck();
Zerotorescue@1 477
Zerotorescue@0 478 local current, total = GetInboxNumItems();
Zerotorescue@0 479
Zerotorescue@0 480 if (total - current) == 0 then
Zerotorescue@3 481 -- There is probably no unopenable mail remaining, so play the sound (if enabled)
Zerotorescue@3 482
Zerotorescue@0 483 if self.db.profile.notifications.mailboxEmptySound and (not MailOpener.db.profile.notifications.mailboxEmptySoundOnlyOnce or not mailboxEmptySoundPlayed) then
Zerotorescue@0 484 PlaySoundFile(self.db.profile.notifications.mailboxEmptySoundFile);
Zerotorescue@0 485 mailboxEmptySoundPlayed = true;
Zerotorescue@0 486 end
Zerotorescue@0 487 end
Zerotorescue@0 488
Zerotorescue@3 489 if self.QuickAuctionsEnabled then
Zerotorescue@3 490 -- Quick Auctions enabled?
Zerotorescue@3 491 -- Toggle automailing as per settings
Zerotorescue@0 492
Zerotorescue@3 493 if self.db.profile.general.autoReenableQAAutoMail and QuickAuctionsAutoMail and not QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@3 494 -- If auto re-enable "QA Auto mail" is enabled and QA's auto mail is currently toggled OFF, turn it on
Zerotorescue@3 495 -- We need to do this with a :click to trigger the right events
Zerotorescue@3 496
Zerotorescue@0 497 self:Debug("Turning automail |cff00ff00on|r.");
Zerotorescue@3 498
Zerotorescue@3 499 QuickAuctionsAutoMail:Click();
Zerotorescue@3 500 elseif self.db.profile.general.autoSetBackQAAutoMail and QuickAuctionsAutoMail and lastQuickAuctionsStatus ~= QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@3 501 -- If auto set back "QA Auto mail" is enabled and QA's auto mail is currently not the same as it was before starting, toggle it
Zerotorescue@3 502 -- We need to do this with a :click to trigger the right events
Zerotorescue@3 503
Zerotorescue@3 504 if lastQuickAuctionsStatus then
Zerotorescue@3 505 self:Debug("Turning automail |cff00ff00on|r.");
Zerotorescue@3 506 else
Zerotorescue@3 507 self:Debug("Turning automail |cffff0000off|r.");
Zerotorescue@3 508 end
Zerotorescue@3 509
Zerotorescue@3 510 QuickAuctionsAutoMail:Click();
Zerotorescue@0 511 end
Zerotorescue@0 512 end
Zerotorescue@0 513
Zerotorescue@0 514 if self.db.profile.general.continueOpening then
Zerotorescue@0 515 self:ScheduleOpen(true);
Zerotorescue@0 516 end
Zerotorescue@0 517 end
Zerotorescue@0 518
Zerotorescue@0 519 -- Run another CheckInbox
Zerotorescue@0 520 function MailOpener:Recheck()
Zerotorescue@0 521 self:Debug("|cffffff00Recheck|r");
Zerotorescue@0 522
Zerotorescue@0 523 -- Freshlist prevents this from being run too often
Zerotorescue@0 524 -- It is set to true after a server sync
Zerotorescue@0 525 -- and set to false 61 seconds afterwards with a recheck called instantly after it
Zerotorescue@3 526
Zerotorescue@3 527 -- We're not refreshing while we're opening because it is automatically done when current batch was completely opened
Zerotorescue@8 528 if not freshList and MailFrame:IsVisible() then
Zerotorescue@0 529 self:Debug("|cff00ff00Recheck|r");
Zerotorescue@0 530
Zerotorescue@0 531 -- If this isn't a fresh list (so messages weren't received within the last 60 seconds) and the mailbox wasn't closed
Zerotorescue@0 532
Zerotorescue@0 533 -- BeanCounter is the only addon hiding the mail close button while busy, so we can look for that
Zerotorescue@0 534 local BeanCounterActive = not InboxCloseButton:IsVisible();
Zerotorescue@0 535
Zerotorescue@8 536 if not BeanCounterActive and AutoOpenMail and not MailAddonBusy then
Zerotorescue@0 537 -- Query the server
Zerotorescue@0 538 CheckInbox();
Zerotorescue@0 539 end
Zerotorescue@0 540
Zerotorescue@0 541 -- Stop previous timer
Zerotorescue@0 542 self:CancelTimer(self.tmrRecheck, true);
Zerotorescue@0 543 -- Keep trying until it works
Zerotorescue@0 544 self.tmrRecheck = self:ScheduleTimer("Recheck", 2);
Zerotorescue@0 545
Zerotorescue@0 546 self:Debug("tmrRecheck 2");
Zerotorescue@0 547 end
Zerotorescue@0 548 end
Zerotorescue@0 549
Zerotorescue@0 550 -- Stop checking for new mail and unregister the events we needed
Zerotorescue@0 551 function MailOpener:Stop()
Zerotorescue@0 552 if self.db.profile.notifications.bye then
Zerotorescue@0 553 print("|cff15ff00Mail Opener|r: Have a nice day. :)");
Zerotorescue@0 554 end
Zerotorescue@0 555
Zerotorescue@8 556 if MailAddonBusy == self:GetName() then
Zerotorescue@8 557 MailAddonBusy = nil;
Zerotorescue@8 558 end
Zerotorescue@0 559
Zerotorescue@0 560 -- We won't need this anymore
Zerotorescue@0 561 self:UnregisterEvent("MAIL_CLOSED");
Zerotorescue@0 562 self:UnregisterEvent("PLAYER_LEAVING_WORLD");
Zerotorescue@0 563 self:UnregisterEvent("MAIL_INBOX_UPDATE");
Zerotorescue@0 564
Zerotorescue@0 565 -- Messages
Zerotorescue@0 566 self:UnregisterMessage("MO_OPEN_COMPLETE");
Zerotorescue@0 567
Zerotorescue@0 568 -- Timers
Zerotorescue@0 569 self:CancelTimer(self.tmrTryAgain, true);
Zerotorescue@0 570 self:CancelTimer(self.tmrOpenNow, true);
Zerotorescue@0 571
Zerotorescue@0 572 -- If we wait with disabling QA automail until MAIL_SHOW, QA will beat us to it and already start sending stuff
Zerotorescue@0 573 self:ToggleQAStatus();
Zerotorescue@0 574 end
Zerotorescue@0 575
Zerotorescue@0 576 function MailOpener:Debug(t)
Zerotorescue@0 577 if not self.debugChannel and self.debugChannel ~= false then
Zerotorescue@0 578 -- We want to check just once, so if you add a debug channel later just do a /reload (registering an event for this is wasted resources)
Zerotorescue@0 579 self.debugChannel = false;
Zerotorescue@0 580
Zerotorescue@0 581 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@0 582 local name = GetChatWindowInfo(i);
Zerotorescue@0 583
Zerotorescue@0 584 if name:upper() == "DEBUG" then
Zerotorescue@0 585 self.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@0 586 end
Zerotorescue@0 587 end
Zerotorescue@0 588 end
Zerotorescue@0 589
Zerotorescue@0 590 if self.debugChannel then
Zerotorescue@0 591 self.debugChannel:AddMessage(t);
Zerotorescue@0 592 end
Zerotorescue@0 593 end
Zerotorescue@0 594
Zerotorescue@0 595 -- Enable our config module if it's disabled and make a reference to it
Zerotorescue@0 596 function MailOpener:EnableConfigModule()
Zerotorescue@0 597 if not MailOpenerConfig then
Zerotorescue@0 598 MailOpenerConfig = self:GetModule("Config");
Zerotorescue@0 599 MailOpenerConfig:Enable();
Zerotorescue@0 600 end
Zerotorescue@0 601 end
Zerotorescue@0 602
Zerotorescue@0 603 -- Toggle Postal's opening modules on or off
Zerotorescue@0 604 function MailOpener:TogglePostalModule(name, status)
Zerotorescue@0 605 if MailOpener.PostalEnabled and Postal then
Zerotorescue@0 606 -- Postal must be enabled
Zerotorescue@0 607
Zerotorescue@3 608 -- Toggle module (let Postal handle this)
Zerotorescue@3 609 Postal.ToggleModule(nil, name, Postal:GetModule(name), status);
Zerotorescue@0 610 end
Zerotorescue@0 611 end
Zerotorescue@0 612
Zerotorescue@0 613 -- Change Quick Auction's auto mail status based on our prefered settings
Zerotorescue@0 614 function MailOpener:ToggleQAStatus()
Zerotorescue@0 615 self:Debug("defaultQAStatus:" .. self.db.profile.general.defaultQAStatus);
Zerotorescue@0 616
Zerotorescue@0 617 if self.QuickAuctionsEnabled and self.db.profile.general.defaultQAStatus ~= "__remember" and QuickAuctionsAutoMail then
Zerotorescue@0 618 if self.db.profile.general.defaultQAStatus == "_enabled" and not QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@0 619 self:Debug("Turning automail |cff00ff00on|r.");
Zerotorescue@0 620
Zerotorescue@0 621 QuickAuctionsAutoMail:Click();
Zerotorescue@0 622 elseif self.db.profile.general.defaultQAStatus == "disabled" and QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@0 623 self:Debug("Turning automail |cffff0000off|r.");
Zerotorescue@0 624
Zerotorescue@0 625 QuickAuctionsAutoMail:Click();
Zerotorescue@0 626 end
Zerotorescue@0 627 end
Zerotorescue@0 628 end
Zerotorescue@0 629
Zerotorescue@0 630 function MailOpener:FormatMoney(copper)
Zerotorescue@0 631 local gold = floor( copper / 10000 );
Zerotorescue@0 632 local silver = floor( ( copper - ( gold * 10000 ) ) / 100 );
Zerotorescue@0 633 local copper = mod(copper, 100);
Zerotorescue@0 634
Zerotorescue@0 635 if gold > 0 then
Zerotorescue@0 636 return format(GOLD_AMOUNT_TEXTURE .. " " .. SILVER_AMOUNT_TEXTURE .. " " .. COPPER_AMOUNT_TEXTURE, gold, 0, 0, silver, 0, 0, copper, 0, 0);
Zerotorescue@0 637 elseif silver > 0 then
Zerotorescue@0 638 return format(SILVER_AMOUNT_TEXTURE .. " " .. COPPER_AMOUNT_TEXTURE, silver, 0, 0, copper, 0, 0);
Zerotorescue@0 639 else
Zerotorescue@0 640 return format(COPPER_AMOUNT_TEXTURE, copper, 0, 0);
Zerotorescue@0 641 end
Zerotorescue@0 642 end
Zerotorescue@0 643
Zerotorescue@7 644 -- General copy window for multiple things (clickable URLs, the time remaining, and such)
Zerotorescue@0 645 StaticPopupDialogs["MailOpenerCopyWindow"] = {
Zerotorescue@0 646 text = "Please CTRL-C to copy.",
Zerotorescue@0 647 button2 = CLOSE,
Zerotorescue@0 648 hasEditBox = 1,
Zerotorescue@0 649 hasWideEditBox = 1,
Zerotorescue@0 650 OnShow = function()
Zerotorescue@0 651 local editBox = _G[this:GetName().."WideEditBox"];
Zerotorescue@0 652 if editBox and MailOpener.currentPopupContents then
Zerotorescue@0 653 editBox:SetText(MailOpener.currentPopupContents);
Zerotorescue@0 654 editBox:SetFocus();
Zerotorescue@0 655 editBox:HighlightText(0);
Zerotorescue@0 656 end
Zerotorescue@0 657
Zerotorescue@0 658 -- Position the close button in the middle
Zerotorescue@0 659 local button = _G[this:GetName().."Button2"];
Zerotorescue@0 660 if button then
Zerotorescue@0 661 -- Remove previous know position
Zerotorescue@0 662 button:ClearAllPoints();
Zerotorescue@0 663 button:SetWidth(200);
Zerotorescue@0 664 -- Reposition in the center
Zerotorescue@0 665 button:SetPoint("CENTER", editBox, "CENTER", 0, -30);
Zerotorescue@0 666 end
Zerotorescue@0 667 end,
Zerotorescue@0 668 EditBoxOnEscapePressed = function()
Zerotorescue@0 669 this:GetParent():Hide();
Zerotorescue@0 670 end,
Zerotorescue@0 671 timeout = 0,
Zerotorescue@0 672 whileDead = 1,
Zerotorescue@0 673 hideOnEscape = 1,
Zerotorescue@0 674 maxLetters = 1024,
Zerotorescue@1 675 };
Zerotorescue@1 676
Zerotorescue@7 677 --BETA: The below either has to be removed or changed when releasing
Zerotorescue@0 678
Zerotorescue@7 679 --[[
Zerotorescue@7 680 BETA/ALPHA request box
Zerotorescue@0 681 function MailOpener:ShowBetaPopup()
Zerotorescue@0 682 function TableDump(key, val, jumps)
Zerotorescue@0 683 local cache = "";
Zerotorescue@0 684
Zerotorescue@0 685 if not jumps then
Zerotorescue@0 686 jumps = 0;
Zerotorescue@0 687 end
Zerotorescue@0 688
Zerotorescue@0 689 local spacer = "";
Zerotorescue@0 690 if jumps > 0 then
Zerotorescue@0 691 for i = 1, jumps do
Zerotorescue@0 692 spacer = spacer .. " ";
Zerotorescue@0 693 end
Zerotorescue@0 694 end
Zerotorescue@0 695
Zerotorescue@0 696 if type(val) == "table" then
Zerotorescue@0 697 cache = cache .. spacer .. key .. " = {\n";
Zerotorescue@0 698 foreach(val, function(k, v)
Zerotorescue@0 699 cache = cache .. TableDump(k, v, (jumps + 1));
Zerotorescue@0 700 end);
Zerotorescue@0 701 cache = cache .. spacer .. "},\n";
Zerotorescue@0 702 else
Zerotorescue@0 703 cache = cache .. spacer .. key .. " = " .. tostring(val) .. ",\n";
Zerotorescue@0 704 end
Zerotorescue@0 705
Zerotorescue@0 706 return cache;
Zerotorescue@0 707 end
Zerotorescue@0 708
Zerotorescue@0 709 local cache = "";
Zerotorescue@0 710 foreach(MailOpener.db.profile, function(k, v)
Zerotorescue@0 711 cache = cache .. TableDump(k, v, 0);
Zerotorescue@0 712 end);
Zerotorescue@0 713
Zerotorescue@0 714 local AceGUI = LibStub("AceGUI-3.0");
Zerotorescue@0 715 local frame = AceGUI:Create("Frame");
Zerotorescue@0 716 frame:SetTitle("Mail Opener ALPHA");
Zerotorescue@0 717 frame:SetWidth(575);
Zerotorescue@0 718 frame:SetHeight(375);
Zerotorescue@0 719
Zerotorescue@0 720 -- Add a normal description label
Zerotorescue@0 721 local desc = AceGUI:Create("Label");
Zerotorescue@0 722 desc:SetText("|cff00ff00After you have been using Mail Opener for a while and configured it just as you want it to be, please report your favorite settings by copying the text below at either of the below links. Thanks in advance!|r\n\n");
Zerotorescue@0 723 desc:SetFont(GameFontHighlightSmall:GetFont(), 13);
Zerotorescue@0 724 desc:SetFullWidth(true);
Zerotorescue@0 725 frame:AddChild(desc);
Zerotorescue@0 726
Zerotorescue@0 727 -- Add a MultiLineEditBox
Zerotorescue@0 728 local settingsMLEEB = AceGUI:Create("MultiLineEditBox");
Zerotorescue@0 729 settingsMLEEB:SetText(cache);
Zerotorescue@0 730 settingsMLEEB:SetLabel("Hit CTRL-A to select all and CTRL-C to copy the text. You can then use CTRL-V to paste.");
Zerotorescue@0 731 settingsMLEEB:SetFullWidth(true);
Zerotorescue@0 732 settingsMLEEB:SetNumLines(8);
Zerotorescue@0 733 settingsMLEEB:DisableButton(true);
Zerotorescue@0 734 settingsMLEEB:SetCallback("OnTextChanged", function()
Zerotorescue@0 735 settingsMLEEB:SetText(cache);
Zerotorescue@0 736 end);
Zerotorescue@0 737 frame:AddChild(settingsMLEEB);
Zerotorescue@0 738
Zerotorescue@0 739 -- Empty line between the two links
Zerotorescue@0 740 local label = AceGUI:Create("Label");
Zerotorescue@0 741 label:SetText("Please post the above text at either of these two links:");
Zerotorescue@0 742 label:SetFullWidth(true);
Zerotorescue@0 743 frame:AddChild(label);
Zerotorescue@0 744
Zerotorescue@0 745 local desc1 = AceGUI:Create("InteractiveLabel");
Zerotorescue@0 746 desc1:SetText("|cff00bbbb[http://wow.curseforge.com/addons/mailopener/create-ticket/]|r");
Zerotorescue@0 747 desc1:SetFont(GameFontHighlightSmall:GetFont(), 13);
Zerotorescue@0 748 desc1:SetFullWidth(true);
Zerotorescue@0 749 desc1:SetCallback("OnClick", function()
Zerotorescue@0 750 MailOpener.currentPopupContents = "http://wow.curseforge.com/addons/mailopener/create-ticket/";
Zerotorescue@0 751
Zerotorescue@0 752 StaticPopup_Show("MailOpenerCopyWindow");
Zerotorescue@0 753 end);
Zerotorescue@0 754 desc1:SetCallback("OnEnter", function()
Zerotorescue@0 755 frame:SetStatusText("Click to copy this URL.");
Zerotorescue@0 756 end);
Zerotorescue@0 757 desc1:SetCallback("OnLeave", function()
Zerotorescue@0 758 frame:SetStatusText("");
Zerotorescue@0 759 end);
Zerotorescue@0 760 frame:AddChild(desc1);
Zerotorescue@0 761
Zerotorescue@0 762 -- Empty line between the two links
Zerotorescue@0 763 local spacer = AceGUI:Create("Label");
Zerotorescue@0 764 spacer:SetText(" ");
Zerotorescue@0 765 frame:AddChild(spacer);
Zerotorescue@0 766
Zerotorescue@0 767 local desc2 = AceGUI:Create("InteractiveLabel");
Zerotorescue@0 768 desc2:SetText("|cff00bbbb[http://20kleveling.com/JMTCforum/posting.php?mode=reply&f=9&t=1403]|r");
Zerotorescue@0 769 desc2:SetFont(GameFontHighlightSmall:GetFont(), 13);
Zerotorescue@0 770 desc2:SetFullWidth(true);
Zerotorescue@0 771 desc2:SetCallback("OnClick", function()
Zerotorescue@0 772 MailOpener.currentPopupContents = "http://20kleveling.com/JMTCforum/posting.php?mode=reply&f=9&t=1403";
Zerotorescue@0 773
Zerotorescue@0 774 StaticPopup_Show("MailOpenerCopyWindow");
Zerotorescue@0 775 end);
Zerotorescue@0 776 desc2:SetCallback("OnEnter", function()
Zerotorescue@0 777 frame:SetStatusText("Click to copy this URL.");
Zerotorescue@0 778 end);
Zerotorescue@0 779 desc2:SetCallback("OnLeave", function()
Zerotorescue@0 780 frame:SetStatusText("");
Zerotorescue@0 781 end);
Zerotorescue@0 782 frame:AddChild(desc2);
Zerotorescue@0 783
Zerotorescue@0 784 -- Empty line between the two links
Zerotorescue@0 785 local label = AceGUI:Create("Label");
Zerotorescue@0 786 label:SetText("\n\nps. You can always view this window again at a later time by clicking the \"Config\" button in the mail frame.\nps2. The information above is completely Mail Opener related. It will be used to determine the best default settings.");
Zerotorescue@0 787 label:SetFullWidth(true);
Zerotorescue@0 788 frame:AddChild(label);
Zerotorescue@7 789 end
Zerotorescue@7 790 ]]