annotate Core.lua @ 1:6f17035de058

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