annotate Core.lua @ 3:c6f0976069c7

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