annotate Modules/OpenAll.lua @ 77:aabb70411186

Can now add URLs to tips. Added a request to help localize the addon in the tips.
author Zerotorescue
date Wed, 15 Sep 2010 23:52:24 +0200
parents eadff31e61e8
children 136aa3dd4dda
rev   line source
Zerotorescue@0 1 local MailOpener = LibStub("AceAddon-3.0"):GetAddon("MailOpener");
Zerotorescue@31 2 local mod = MailOpener:NewModule("OpenAll", "AceEvent-3.0", "AceTimer-3.0");
Zerotorescue@68 3 local L = LibStub("AceLocale-3.0"):GetLocale("MailOpener");
Zerotorescue@31 4
Zerotorescue@68 5 mod.moduleDescription = L["The actual mail opening initiated by the core."];
Zerotorescue@31 6 mod.moduleRequired = true;
Zerotorescue@0 7
Zerotorescue@3 8 --[[
Zerotorescue@3 9 Dev notes:
Zerotorescue@3 10 When shift clicking the Open All button it should override all filters.
Zerotorescue@3 11 ]]
Zerotorescue@3 12
Zerotorescue@46 13 local MAIL_ITEM_INDEX, MAIL_OPEN_EVERYTHING, mailTimer, inventoryFull, inventoryFullSoundPlayed, inventoryFullSoundPlayedThisVisit, opening, lastSync, numCurrentMail, numHiddenMail, continue;
Zerotorescue@0 14
Zerotorescue@31 15 function mod:OnInitialize()
Zerotorescue@0 16 local defaults = {
Zerotorescue@0 17 profile = {
Zerotorescue@0 18 speed = 0.05,
Zerotorescue@0 19 keepFreeSpace = 0,
Zerotorescue@0 20 filter = {
Zerotorescue@0 21 AH = {
Zerotorescue@0 22 canceled = true,
Zerotorescue@0 23 expired = true,
Zerotorescue@0 24 outbid = true,
Zerotorescue@0 25 success = true,
Zerotorescue@0 26 won = true,
Zerotorescue@0 27 },
Zerotorescue@0 28 normalAttachments = false,
Zerotorescue@0 29 normalMoney = true,
Zerotorescue@50 30 allowShiftClick = true,
Zerotorescue@0 31 },
Zerotorescue@0 32 },
Zerotorescue@0 33 };
Zerotorescue@0 34
Zerotorescue@0 35 -- Register our saved variables NameSpace
Zerotorescue@0 36 self.db = MailOpener.db:RegisterNamespace("OpenAll", defaults);
Zerotorescue@0 37 end
Zerotorescue@0 38
Zerotorescue@31 39 function mod:OnEnable()
Zerotorescue@0 40 self:RegisterEvent("MAIL_SHOW");
Zerotorescue@42 41
Zerotorescue@0 42 if not self.btnOpenAll then
Zerotorescue@0 43 -- Open all button
Zerotorescue@46 44 local button = CreateFrame("Button", "btnMailOpenerOpenAll", InboxFrame, "UIPanelButtonTemplate");
Zerotorescue@68 45 button:SetText(L["Open all"]);
Zerotorescue@46 46 button:SetHeight(26);
Zerotorescue@46 47 button:SetWidth(120);
Zerotorescue@46 48 button:SetPoint("BOTTOM", InboxFrame, "CENTER", -10, -165);
Zerotorescue@48 49 button:RegisterForClicks("LeftButtonUp", "RightButtonUp");
Zerotorescue@48 50 button:SetScript("OnClick", function(self, mouseButton)
Zerotorescue@48 51 if mouseButton == "RightButton" then
Zerotorescue@48 52 -- Hide the gametooltip
Zerotorescue@48 53 GameTooltip:Hide();
Zerotorescue@48 54
Zerotorescue@48 55 if not mod.ddmFilters then
Zerotorescue@48 56 -- Build the drop down menu
Zerotorescue@48 57 local info = {};
Zerotorescue@48 58
Zerotorescue@48 59 local dropDownMenu = CreateFrame("Frame", "MailOpenerFiltersDropDownMenu");
Zerotorescue@48 60 dropDownMenu.displayMode = "MENU";
Zerotorescue@48 61 dropDownMenu.initialize = function(s, level)
Zerotorescue@48 62 if not level then return; end
Zerotorescue@48 63
Zerotorescue@48 64 if level == 1 then
Zerotorescue@48 65 -- Create the title of the menu
Zerotorescue@48 66 info.isTitle = true;
Zerotorescue@68 67 info.text = L["Toggle filters for %s profile."]:format(MailOpener.db:GetCurrentProfile());
Zerotorescue@48 68 info.notCheckable = true;
Zerotorescue@48 69 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 70
Zerotorescue@48 71 -- Reset title specific values
Zerotorescue@48 72 info.isTitle = nil;
Zerotorescue@48 73 info.disabled = nil;
Zerotorescue@48 74 info.notCheckable = nil;
Zerotorescue@48 75
Zerotorescue@48 76 -- We don't want to close the DDM when something is toggled
Zerotorescue@48 77 info.keepShownOnClick = true;
Zerotorescue@48 78
Zerotorescue@48 79 -- Make Auction canceled option
Zerotorescue@68 80 info.text = L["Auction canceled"];
Zerotorescue@48 81 info.func = function(this) mod.db.profile.filter.AH.canceled = this.checked; end;
Zerotorescue@48 82 info.checked = mod.db.profile.filter.AH.canceled;
Zerotorescue@48 83 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 84
Zerotorescue@48 85 -- Make Auction expired option
Zerotorescue@68 86 info.text = L["Auction expired"];
Zerotorescue@48 87 info.func = function(this) mod.db.profile.filter.AH.expired = this.checked; end;
Zerotorescue@48 88 info.checked = mod.db.profile.filter.AH.expired;
Zerotorescue@48 89 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 90
Zerotorescue@48 91 -- Make Auction outbid option
Zerotorescue@68 92 info.text = L["Auction outbid"];
Zerotorescue@48 93 info.func = function(this) mod.db.profile.filter.AH.outbid = this.checked; end;
Zerotorescue@48 94 info.checked = mod.db.profile.filter.AH.outbid;
Zerotorescue@48 95 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 96
Zerotorescue@48 97 -- Make Auction successful option
Zerotorescue@68 98 info.text = L["Auction successful"];
Zerotorescue@48 99 info.func = function(this) mod.db.profile.filter.AH.success = this.checked; end;
Zerotorescue@48 100 info.checked = mod.db.profile.filter.AH.success;
Zerotorescue@48 101 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 102
Zerotorescue@48 103 -- Make Auction won option
Zerotorescue@68 104 info.text = L["Auction won"];
Zerotorescue@48 105 info.func = function(this) mod.db.profile.filter.AH.won = this.checked; end;
Zerotorescue@48 106 info.checked = mod.db.profile.filter.AH.won;
Zerotorescue@48 107 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 108
Zerotorescue@48 109 -- Make Other mail with attachments
Zerotorescue@68 110 info.text = L["Other mail with attachments"];
Zerotorescue@48 111 info.func = function(this) mod.db.profile.filter.normalAttachments = this.checked; end;
Zerotorescue@48 112 info.checked = mod.db.profile.filter.normalAttachments;
Zerotorescue@48 113 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 114
Zerotorescue@48 115 -- Make Other mail with gold
Zerotorescue@68 116 info.text = L["Other mail with gold"];
Zerotorescue@48 117 info.func = function(this) mod.db.profile.filter.normalMoney = this.checked; end;
Zerotorescue@48 118 info.checked = mod.db.profile.filter.normalMoney;
Zerotorescue@48 119 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 120
Zerotorescue@48 121 -- Make Other mail with gold
Zerotorescue@48 122 info.text = CLOSE;
Zerotorescue@48 123 info.func = function() CloseDropDownMenus(); end;
Zerotorescue@48 124 info.checked = nil;
Zerotorescue@48 125 info.notCheckable = true;
Zerotorescue@48 126 UIDropDownMenu_AddButton(info, level);
Zerotorescue@48 127
Zerotorescue@48 128 wipe(info);
Zerotorescue@48 129 end
Zerotorescue@48 130 end
Zerotorescue@48 131
Zerotorescue@48 132 mod.ddmFilters = dropDownMenu;
Zerotorescue@48 133 end
Zerotorescue@48 134
Zerotorescue@48 135 ToggleDropDownMenu(1, nil, mod.ddmFilters, self:GetName(), 0, 0);
Zerotorescue@48 136 else
Zerotorescue@48 137 mod:Open(true, IsShiftKeyDown());
Zerotorescue@48 138 end
Zerotorescue@48 139 end);
Zerotorescue@68 140 button.tooltipTitle = L["Open all"];
Zerotorescue@68 141 button.tooltip = L["Hold |cfffed000shift|r while clicking this button to temporarily override your filters and loot every single mail containing attachments and/or gold.\n\n|cfffed000Right|r click this button to quickly adjust mail opening filters for this profile."];
Zerotorescue@48 142 button:SetScript("OnEnter", function(self)
Zerotorescue@51 143 if MailOpener.db.profile.general.showHelpTooltips then
Zerotorescue@51 144 GameTooltip:SetOwner(self, "ANCHOR_NONE")
Zerotorescue@51 145 GameTooltip:SetPoint("BOTTOM", self, "TOP")
Zerotorescue@51 146 GameTooltip:SetText(self.tooltipTitle, 1, .82, 0, 1)
Zerotorescue@51 147
Zerotorescue@51 148 if type(self.tooltip) == "string" then
Zerotorescue@51 149 GameTooltip:AddLine(self.tooltip, 1, 1, 1, 1);
Zerotorescue@51 150 end
Zerotorescue@51 151
Zerotorescue@51 152 GameTooltip:Show();
Zerotorescue@48 153 end
Zerotorescue@48 154 end);
Zerotorescue@48 155 button:SetScript("OnLeave", function(self)
Zerotorescue@48 156 GameTooltip:Hide();
Zerotorescue@46 157 end);
Zerotorescue@0 158
Zerotorescue@0 159 self.btnOpenAll = button;
Zerotorescue@0 160 end
Zerotorescue@0 161
Zerotorescue@0 162 self.btnOpenAll:Show();
Zerotorescue@0 163
Zerotorescue@0 164 if not self.timeLeftFrame then
Zerotorescue@0 165 -- If the timeLeftFrame doesn't exist we will have to build it
Zerotorescue@0 166
Zerotorescue@0 167 self:Debug("Building text frame");
Zerotorescue@0 168
Zerotorescue@0 169 local frame = CreateFrame("Button", "MailOpenerTimeLeftButton", InboxFrame);
Zerotorescue@0 170
Zerotorescue@0 171 -- Mail counter
Zerotorescue@0 172 frame.text = frame:CreateFontString("MailOpenerTimeLeftFrameMailCount", "OVERLAY", "GameFontHighlight");
Zerotorescue@0 173 frame.text:SetPoint("CENTER", MailFrame, "TOPLEFT", 40, -35);
Zerotorescue@0 174
Zerotorescue@0 175 -- Long time left indicator
Zerotorescue@0 176 frame.smallText = frame:CreateFontString("MailOpenerTimeLeftFrameTimeRemaining", "OVERLAY", "GameFontNormal");
Zerotorescue@0 177 frame.smallText:SetFont(GameFontHighlight:GetFont(), 11, "OUTLINE");
Zerotorescue@0 178 frame.smallText:SetPoint("TOPLEFT", MailFrame, "TOPLEFT", 75, -38);
Zerotorescue@0 179 frame.smallText:SetWidth(270);
Zerotorescue@0 180 frame.smallText:SetJustifyH("LEFT");
Zerotorescue@0 181 frame.smallText:SetJustifyV("MIDDLE");
Zerotorescue@0 182
Zerotorescue@0 183 frame:SetPoint("TOPLEFT", MailFrame, "TOPLEFT", 75, -38);
Zerotorescue@0 184 frame:SetWidth(270);
Zerotorescue@0 185 frame:SetHeight(35);
Zerotorescue@0 186 frame:SetScript("OnClick", function(self)
Zerotorescue@0 187 local timeRemainingUntillOpened = frame.smallText:GetText();
Zerotorescue@0 188 if timeRemainingUntillOpened then
Zerotorescue@0 189 MailOpener.currentPopupContents = "|cffffd700" .. timeRemainingUntillOpened .. "|r";
Zerotorescue@0 190
Zerotorescue@0 191 StaticPopup_Show("MailOpenerCopyWindow");
Zerotorescue@0 192 end
Zerotorescue@0 193 end);
Zerotorescue@0 194
Zerotorescue@0 195 self.timeLeftFrame = frame;
Zerotorescue@0 196 end
Zerotorescue@0 197
Zerotorescue@0 198 self.timeLeftFrame:Show();
Zerotorescue@0 199
Zerotorescue@3 200 -- Go through all children of the mail frame to find QA's element and hide it
Zerotorescue@42 201 -- There's no other way to do this because QuickAuctions has a local referrence to it (not as a property of the object like most other frames)
Zerotorescue@0 202 local kids = { MailFrame:GetChildren() };
Zerotorescue@0 203
Zerotorescue@0 204 for _, child in ipairs(kids) do
Zerotorescue@0 205 if child and child.text then
Zerotorescue@0 206 child.text:Hide();
Zerotorescue@0 207 end
Zerotorescue@0 208 end
Zerotorescue@0 209
Zerotorescue@0 210 -- If we were toggling this module on while the mailbox is opened we must register all events again
Zerotorescue@0 211 if MailFrame:IsVisible() then
Zerotorescue@0 212 self:MAIL_SHOW();
Zerotorescue@0 213 end
Zerotorescue@0 214 end
Zerotorescue@0 215
Zerotorescue@31 216 function mod:OnDisable()
Zerotorescue@0 217 self:UnregisterEvent("MAIL_SHOW");
Zerotorescue@0 218
Zerotorescue@0 219 if self.btnOpenAll then
Zerotorescue@0 220 self.btnOpenAll:Hide();
Zerotorescue@0 221 end
Zerotorescue@0 222
Zerotorescue@0 223 if self.timeLeftFrame then
Zerotorescue@0 224 self.timeLeftFrame:Hide();
Zerotorescue@0 225 end
Zerotorescue@0 226
Zerotorescue@0 227 if MailOpener.PostalEnabled then
Zerotorescue@0 228 -- Enable Postal's openers again
Zerotorescue@0 229
Zerotorescue@0 230 MailOpener:TogglePostalModule("OpenAll", true);
Zerotorescue@0 231 MailOpener:TogglePostalModule("Select", true);
Zerotorescue@0 232 end
Zerotorescue@0 233
Zerotorescue@0 234 -- Go through all children of the mail frame to find QA's elements and SHOW these
Zerotorescue@42 235 -- There's no other way to do this because QuickAuctions has a local referrence to it (not as a property of the object like most other frames)
Zerotorescue@0 236 local kids = { MailFrame:GetChildren() };
Zerotorescue@0 237
Zerotorescue@0 238 for _, child in ipairs(kids) do
Zerotorescue@0 239 if child and child.text then
Zerotorescue@0 240 child.text:Show();
Zerotorescue@0 241 end
Zerotorescue@0 242 end
Zerotorescue@0 243
Zerotorescue@0 244 self:Stop();
Zerotorescue@0 245 end
Zerotorescue@0 246
Zerotorescue@31 247 function mod:MAIL_SHOW()
Zerotorescue@0 248 self:Debug("MAIL_SHOW");
Zerotorescue@0 249
Zerotorescue@0 250 self:StopOpening(false);
Zerotorescue@42 251
Zerotorescue@42 252 inventoryFullSoundPlayedThisVisit = nil;
Zerotorescue@0 253
Zerotorescue@0 254 if MailOpener.PostalEnabled then
Zerotorescue@0 255 -- Disable Postal's openers so we can do it ourselves
Zerotorescue@0 256
Zerotorescue@0 257 MailOpener:TogglePostalModule("OpenAll", false);
Zerotorescue@0 258 MailOpener:TogglePostalModule("Select", false);
Zerotorescue@0 259 end
Zerotorescue@0 260
Zerotorescue@0 261 -- Keep an eye for closing of the mailbox
Zerotorescue@0 262 self:RegisterEvent("MAIL_CLOSED", "Stop");
Zerotorescue@0 263 self:RegisterEvent("PLAYER_LEAVING_WORLD", "Stop");
Zerotorescue@0 264
Zerotorescue@0 265 -- Look if the mailbox is full
Zerotorescue@0 266 self:RegisterEvent("UI_ERROR_MESSAGE");
Zerotorescue@0 267 -- Only look again after bags updated
Zerotorescue@0 268 self:RegisterEvent("BAG_UPDATE");
Zerotorescue@0 269
Zerotorescue@0 270 -- We need to know when to start opening
Zerotorescue@0 271 self:RegisterMessage("MO_OPEN_MAIL", "Open");
Zerotorescue@0 272 self:RegisterMessage("MO_SERVER_SYNCED");
Zerotorescue@3 273 self:RegisterMessage("MO_MAIL_EMPTIED");
Zerotorescue@0 274
Zerotorescue@0 275 self:CancelTimer(self.tmrTimeRemaining, true);
Zerotorescue@0 276 self.tmrTimeRemaining = self:ScheduleRepeatingTimer("UpdateTimer", 1);
Zerotorescue@0 277 self:UpdateTimer();
Zerotorescue@0 278 end
Zerotorescue@0 279
Zerotorescue@31 280 function mod:Stop()
Zerotorescue@0 281 self:Debug("Stop");
Zerotorescue@0 282
Zerotorescue@0 283 -- We shutdown, so nothing to do when the mailbox is closed anymore
Zerotorescue@0 284 self:UnregisterEvent("MAIL_CLOSED");
Zerotorescue@0 285 self:UnregisterEvent("PLAYER_LEAVING_WORLD");
Zerotorescue@0 286
Zerotorescue@0 287 -- We care about a full inventory just a little
Zerotorescue@0 288 self:UnregisterEvent("UI_ERROR_MESSAGE");
Zerotorescue@0 289 self:UnregisterEvent("BAG_UPDATE");
Zerotorescue@0 290
Zerotorescue@0 291 -- We no longer care
Zerotorescue@0 292 self:UnregisterMessage("MO_OPEN_MAIL");
Zerotorescue@0 293 self:UnregisterMessage("MO_SERVER_SYNCED");
Zerotorescue@3 294 self:UnregisterMessage("MO_MAIL_EMPTIED");
Zerotorescue@0 295
Zerotorescue@0 296 self:CancelTimer(self.tmrMailOpener, true);
Zerotorescue@0 297 self:CancelTimer(self.tmrTimeRemaining, true);
Zerotorescue@0 298
Zerotorescue@0 299 self:SetOpeningStatus(false);
Zerotorescue@0 300 end
Zerotorescue@0 301
Zerotorescue@31 302 function mod:MO_SERVER_SYNCED()
Zerotorescue@0 303 self:Debug("MO_SERVER_SYNCED");
Zerotorescue@0 304
Zerotorescue@31 305 -- Stop opening now to prevent the opener from continueing while BeanCounter is counting
Zerotorescue@2 306 self:StopOpening(false);
Zerotorescue@2 307
Zerotorescue@0 308 lastSync = GetTime();
Zerotorescue@0 309
Zerotorescue@2 310 self:UpdateMailCount();
Zerotorescue@2 311 end
Zerotorescue@2 312
Zerotorescue@31 313 function mod:MO_MAIL_EMPTIED()
Zerotorescue@3 314 -- A mail has been processed so we can process the next
Zerotorescue@2 315 continue = true;
Zerotorescue@2 316
Zerotorescue@3 317 self:UpdateTimer();
Zerotorescue@2 318 end
Zerotorescue@2 319
Zerotorescue@31 320 function mod:UpdateMailCount()
Zerotorescue@0 321 local numItems, totalItems = GetInboxNumItems();
Zerotorescue@0 322
Zerotorescue@0 323 numCurrentMail = numItems;
Zerotorescue@0 324 numHiddenMail = ( totalItems - numItems );
Zerotorescue@0 325 end
Zerotorescue@0 326
Zerotorescue@31 327 function mod:BAG_UPDATE()
Zerotorescue@0 328 -- If the bags are updated we should check if the inventory is full again
Zerotorescue@0 329 inventoryFull = false;
Zerotorescue@1 330 -- Replay sound
Zerotorescue@1 331 inventoryFullSoundPlayed = nil;
Zerotorescue@0 332 end
Zerotorescue@0 333
Zerotorescue@0 334 -- We registered this event to look for the inventory full error message because this is faster than counting the amount of items in the inventory all the time
Zerotorescue@31 335 function mod:UI_ERROR_MESSAGE(e, errorMessage)
Zerotorescue@0 336 if errorMessage == ERR_INV_FULL then
Zerotorescue@0 337 -- Inventory is full.
Zerotorescue@0 338
Zerotorescue@0 339 if not inventoryFull then
Zerotorescue@0 340 inventoryFull = true;
Zerotorescue@0 341
Zerotorescue@0 342 -- Play the sound
Zerotorescue@42 343 if MailOpener.db.profile.notifications.bagsFullSound and (not MailOpener.db.profile.notifications.bagsFullSoundOnlyOnce or not inventoryFullSoundPlayed) and (not MailOpener.db.profile.notifications.bagsFullSoundOnlyOncePerMailboxVisit or not inventoryFullSoundPlayedThisVisit) then
Zerotorescue@0 344 PlaySoundFile(MailOpener.db.profile.notifications.bagsFullSoundFile);
Zerotorescue@0 345 inventoryFullSoundPlayed = true;
Zerotorescue@42 346 inventoryFullSoundPlayedThisVisit = true;
Zerotorescue@0 347 end
Zerotorescue@0 348 end
Zerotorescue@0 349
Zerotorescue@0 350 -- Continue opening mail (we still want to open gold mail)
Zerotorescue@0 351 continue = true;
Zerotorescue@0 352 elseif errorMessage == ERR_ITEM_MAX_COUNT or errorMessage == ERR_MAIL_DATABASE_ERROR then
Zerotorescue@0 353 -- Can't carry more of this item OR mail database error
Zerotorescue@0 354
Zerotorescue@0 355 -- Continue opening mail (we still want to retrieve other items or gold)
Zerotorescue@0 356 continue = true;
Zerotorescue@0 357 end
Zerotorescue@0 358 end
Zerotorescue@0 359
Zerotorescue@46 360 function mod:Open(forced, everything)
Zerotorescue@46 361 self:Debug("Open (" .. ((everything and "1") or "0") .. ")");
Zerotorescue@0 362
Zerotorescue@0 363 if not opening or forced == true then
Zerotorescue@0 364 local numItems, totalItems = GetInboxNumItems();
Zerotorescue@0 365 -- Start at the end, add one because OpenNext will take it away again
Zerotorescue@0 366 local newMailItemIndex = ( ( numItems or 0 ) + 1 );
Zerotorescue@0 367
Zerotorescue@0 368 if newMailItemIndex > 1 then
Zerotorescue@0 369 self:Debug("Open succes");
Zerotorescue@0 370
Zerotorescue@0 371 -- Stop the previous opening and restart
Zerotorescue@0 372 if forced == true then
Zerotorescue@0 373 self:StopOpening(false); -- this is not a "simple" stop, so also reset inventory full warning
Zerotorescue@0 374 else
Zerotorescue@0 375 self:StopOpening(true); -- forced is false - automated action - simple reset, skip inventory full reset to avoid sound spam
Zerotorescue@0 376 end
Zerotorescue@0 377
Zerotorescue@0 378 -- Update the caret
Zerotorescue@0 379 MAIL_ITEM_INDEX = newMailItemIndex;
Zerotorescue@46 380 -- Do we want to override filters and open every single mail?
Zerotorescue@50 381 if everything and self.db.profile.filter.allowShiftClick then
Zerotorescue@46 382 MAIL_OPEN_EVERYTHING = true;
Zerotorescue@46 383
Zerotorescue@68 384 MailOpener:Print(L["Shift key was held while pressing the open all button. Temporarily overriding filters; going to open every mail with attachments."]);
Zerotorescue@46 385 else
Zerotorescue@46 386 MAIL_OPEN_EVERYTHING = nil;
Zerotorescue@46 387 end
Zerotorescue@0 388
Zerotorescue@0 389 -- We're now going to be busy again
Zerotorescue@0 390 self:SetOpeningStatus(true);
Zerotorescue@0 391
Zerotorescue@0 392 -- Open the next mail in line
Zerotorescue@0 393 self:OpenNext();
Zerotorescue@0 394 else
Zerotorescue@0 395 if MailOpener.db.profile.notifications.mailboxIsEmpty then
Zerotorescue@68 396 print(L["|cffff0000There is currently no mail available.|r"]);
Zerotorescue@0 397 end
Zerotorescue@0 398
Zerotorescue@0 399 self:Debug("MO_OPEN_COMPLETE");
Zerotorescue@0 400
Zerotorescue@0 401 -- Report that we're all done
Zerotorescue@0 402 self:SendMessage("MO_OPEN_COMPLETE");
Zerotorescue@0 403 end
Zerotorescue@0 404 end
Zerotorescue@0 405 end
Zerotorescue@0 406
Zerotorescue@0 407 -- Return the type of mail a message subject is
Zerotorescue@0 408 local knownAHSubjectPatterns = {
Zerotorescue@0 409 canceled = AUCTION_REMOVED_MAIL_SUBJECT:replace("%s", ""),
Zerotorescue@0 410 expired = AUCTION_EXPIRED_MAIL_SUBJECT:replace("%s", ""),
Zerotorescue@0 411 outbid = AUCTION_OUTBID_MAIL_SUBJECT:replace("%s", ""),
Zerotorescue@0 412 success = AUCTION_SOLD_MAIL_SUBJECT:replace("%s", ""),
Zerotorescue@0 413 won = AUCTION_WON_MAIL_SUBJECT:replace("%s", ""),
Zerotorescue@0 414 };
Zerotorescue@31 415 function mod:GetAuctionMailType(subject)
Zerotorescue@0 416 if subject then
Zerotorescue@0 417 -- Check if any of our patterns match, sorted by most likely matches first (if one is true the rest shouldn't be evaluated)
Zerotorescue@0 418 if subject:find(knownAHSubjectPatterns.expired) then
Zerotorescue@0 419 return "expired";
Zerotorescue@0 420 elseif subject:find(knownAHSubjectPatterns.success) then
Zerotorescue@0 421 return "success";
Zerotorescue@0 422 elseif subject:find(knownAHSubjectPatterns.won) then
Zerotorescue@0 423 return "won";
Zerotorescue@0 424 elseif subject:find(knownAHSubjectPatterns.canceled) then
Zerotorescue@0 425 return "canceled";
Zerotorescue@0 426 elseif subject:find(knownAHSubjectPatterns.outbid) then
Zerotorescue@0 427 return "outbid";
Zerotorescue@0 428 end
Zerotorescue@0 429 end
Zerotorescue@0 430
Zerotorescue@0 431 return; -- not auction mail
Zerotorescue@0 432 end
Zerotorescue@0 433
Zerotorescue@31 434 function mod:OpenMail(index)
Zerotorescue@68 435 if index and index > 0 then
Zerotorescue@0 436 -- LUA arrays start at 1, so mail with index 0 doesn't exist, so we're finished
Zerotorescue@0 437
Zerotorescue@0 438 local sender, subject, gold, cod, _, items, _, _, _, _, isGM = select(3, GetInboxHeaderInfo(index));
Zerotorescue@0 439 local auctionMailType = self:GetAuctionMailType(subject);
Zerotorescue@0 440
Zerotorescue@68 441 if not subject then subject = ""; end
Zerotorescue@68 442
Zerotorescue@68 443 local skippingString = L["Skipping %d: %s (%s)"];
Zerotorescue@68 444
Zerotorescue@0 445 if isGM then
Zerotorescue@68 446 -- Blizzard Mail
Zerotorescue@0 447 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped.GMMail then
Zerotorescue@68 448 print(skippingString:format(index, subject, L["Blizzard mail"]));
Zerotorescue@0 449 end
Zerotorescue@0 450
Zerotorescue@0 451 self:OpenNext();
Zerotorescue@0 452
Zerotorescue@0 453 return;
Zerotorescue@0 454 elseif cod and cod > 0 then
Zerotorescue@0 455 -- Cost on delivery
Zerotorescue@0 456 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped.COD then
Zerotorescue@68 457 print(skippingString:format(index, subject, L["C.O.D."]));
Zerotorescue@0 458 end
Zerotorescue@0 459
Zerotorescue@0 460 self:OpenNext();
Zerotorescue@0 461
Zerotorescue@0 462 return;
Zerotorescue@0 463 elseif ((gold and gold > 0) or (items and items > 0)) then
Zerotorescue@0 464 -- Mail with some sort of attachments
Zerotorescue@0 465
Zerotorescue@0 466 local slotsAvailable = 0;
Zerotorescue@0 467 if self.db.profile.keepFreeSpace > 0 then
Zerotorescue@0 468 for bag = 0, 4 do
Zerotorescue@0 469 local numberOfFreeSlots = GetContainerNumFreeSlots(bag);
Zerotorescue@0 470 slotsAvailable = ( slotsAvailable + numberOfFreeSlots );
Zerotorescue@0 471 end
Zerotorescue@0 472 end
Zerotorescue@0 473
Zerotorescue@46 474 if inventoryFull and not MAIL_OPEN_EVERYTHING and not MailOpener.db.profile.general.continueOpeningStackableItems and items and items > 0 then
Zerotorescue@0 475 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped.inventoryFull then
Zerotorescue@68 476 print(skippingString:format(index, subject, L["inventory is full"]));
Zerotorescue@0 477 end
Zerotorescue@0 478
Zerotorescue@0 479 self:OpenNext();
Zerotorescue@0 480
Zerotorescue@0 481 return;
Zerotorescue@0 482 elseif self.db.profile.keepFreeSpace > 0 and items and ( slotsAvailable - items ) < self.db.profile.keepFreeSpace then
Zerotorescue@0 483 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped.keepFreeSpaceLimit then
Zerotorescue@68 484 print(skippingString:format(index, subject, L["keep free space limit"]));
Zerotorescue@0 485 end
Zerotorescue@0 486
Zerotorescue@0 487 self:OpenNext();
Zerotorescue@0 488
Zerotorescue@0 489 return;
Zerotorescue@0 490 else
Zerotorescue@0 491 -- This string will hold the mailtype, MailOpener.db.profile.notifications.skipped/processed[mailType] will be checked if this should be announced
Zerotorescue@0 492 local mailType = "other";
Zerotorescue@0 493
Zerotorescue@0 494 if not auctionMailType then
Zerotorescue@0 495 -- This is a normal mail
Zerotorescue@0 496
Zerotorescue@0 497 if gold and gold > 0 then
Zerotorescue@0 498 mailType = "normalGoldMail";
Zerotorescue@0 499 elseif items and items > 0 then
Zerotorescue@0 500 mailType = "normalItemsMail";
Zerotorescue@0 501 end
Zerotorescue@0 502 else
Zerotorescue@0 503 -- This is an auction house mail
Zerotorescue@0 504
Zerotorescue@0 505 mailType = "AH" .. auctionMailType;
Zerotorescue@0 506 end
Zerotorescue@0 507
Zerotorescue@46 508 if not MAIL_OPEN_EVERYTHING and not self.db.profile.filter.normalMoney and mailType == "normalGoldMail" then
Zerotorescue@0 509 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped[mailType] then
Zerotorescue@68 510 print(skippingString:format(index, subject, L["normal mail with gold"]));
Zerotorescue@0 511 end
Zerotorescue@0 512
Zerotorescue@0 513 self:OpenNext();
Zerotorescue@0 514
Zerotorescue@0 515 return;
Zerotorescue@46 516 elseif not MAIL_OPEN_EVERYTHING and not self.db.profile.filter.normalAttachments and mailType == "normalItemsMail" then
Zerotorescue@0 517 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped[mailType] then
Zerotorescue@68 518 print(skippingString:format(index, subject, L["normal mail with attachments"]));
Zerotorescue@0 519 end
Zerotorescue@0 520
Zerotorescue@0 521 self:OpenNext();
Zerotorescue@0 522
Zerotorescue@0 523 return;
Zerotorescue@46 524 elseif not MAIL_OPEN_EVERYTHING and not self.db.profile.filter.AH.expired and mailType == "AHexpired" then
Zerotorescue@0 525 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped[mailType] then
Zerotorescue@68 526 print(skippingString:format(index, subject, L["expired auction"]));
Zerotorescue@0 527 end
Zerotorescue@0 528
Zerotorescue@0 529 self:OpenNext();
Zerotorescue@0 530
Zerotorescue@0 531 return;
Zerotorescue@46 532 elseif not MAIL_OPEN_EVERYTHING and not self.db.profile.filter.AH.success and mailType == "AHsuccess" then
Zerotorescue@0 533 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped[mailType] then
Zerotorescue@68 534 print(skippingString:format(index, subject, L["successful auction"]));
Zerotorescue@0 535 end
Zerotorescue@0 536
Zerotorescue@0 537 self:OpenNext();
Zerotorescue@0 538
Zerotorescue@0 539 return;
Zerotorescue@46 540 elseif not MAIL_OPEN_EVERYTHING and not self.db.profile.filter.AH.won and mailType == "AHwon" then
Zerotorescue@0 541 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped[mailType] then
Zerotorescue@68 542 print(skippingString:format(index, subject, L["auction won"]));
Zerotorescue@0 543 end
Zerotorescue@0 544
Zerotorescue@0 545 self:OpenNext();
Zerotorescue@0 546
Zerotorescue@0 547 return;
Zerotorescue@46 548 elseif not MAIL_OPEN_EVERYTHING and not self.db.profile.filter.AH.canceled and mailType == "AHcanceled" then
Zerotorescue@0 549 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped[mailType] then
Zerotorescue@68 550 print(skippingString:format(index, subject, L["canceled auction"]));
Zerotorescue@0 551 end
Zerotorescue@0 552
Zerotorescue@0 553 self:OpenNext();
Zerotorescue@0 554
Zerotorescue@0 555 return;
Zerotorescue@46 556 elseif not MAIL_OPEN_EVERYTHING and not self.db.profile.filter.AH.outbid and mailType == "AHoutbid" then
Zerotorescue@0 557 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped[mailType] then
Zerotorescue@68 558 print(skippingString:format(index, subject, L["outbid on auction"]));
Zerotorescue@0 559 end
Zerotorescue@0 560
Zerotorescue@0 561 self:OpenNext();
Zerotorescue@0 562
Zerotorescue@0 563 return;
Zerotorescue@0 564 else
Zerotorescue@0 565 continue = false;
Zerotorescue@3 566
Zerotorescue@11 567 self:Debug("MO_OPENING_MAIL (#" .. index .. ")");
Zerotorescue@0 568
Zerotorescue@2 569 -- Notifiy other modules of opening
Zerotorescue@2 570 self:SendMessage("MO_OPENING_MAIL");
Zerotorescue@2 571
Zerotorescue@0 572 -- Open current mail
Zerotorescue@0 573 AutoLootMailItem(index);
Zerotorescue@0 574
Zerotorescue@0 575 if MailOpener.db.profile.notifications.processed.all and MailOpener.db.profile.notifications.processed[mailType] then
Zerotorescue@0 576 if gold and gold > 0 then
Zerotorescue@68 577 print(L["Processing %d: %s (%s)"]:format(index, subject, MailOpener:FormatMoney(gold)));
Zerotorescue@0 578 else
Zerotorescue@68 579 print(L["Processing %d: %s"]:format(index, subject));
Zerotorescue@0 580 end
Zerotorescue@0 581 end
Zerotorescue@0 582
Zerotorescue@0 583 -- And prepare for the next
Zerotorescue@0 584 self.tmrMailOpener = self:ScheduleTimer("OpenNext", self.db.profile.speed);
Zerotorescue@0 585 end
Zerotorescue@0 586 end
Zerotorescue@0 587 else
Zerotorescue@0 588 -- Unknown, probably just text
Zerotorescue@0 589 if MailOpener.db.profile.notifications.skipped.all and MailOpener.db.profile.notifications.skipped.other then
Zerotorescue@68 590 print(L["Skipping %d: %s"]:format(index, subject));
Zerotorescue@0 591 end
Zerotorescue@0 592
Zerotorescue@0 593 self:OpenNext();
Zerotorescue@0 594 end
Zerotorescue@0 595 else
Zerotorescue@0 596 -- Finished!
Zerotorescue@0 597 if MailOpener.db.profile.notifications.finishedCurrentBatch then
Zerotorescue@68 598 print(L["Finished opening the current batch."]);
Zerotorescue@0 599 end
Zerotorescue@0 600
Zerotorescue@0 601 self:SetOpeningStatus(false);
Zerotorescue@3 602
Zerotorescue@0 603 self:Debug("MO_OPEN_COMPLETE");
Zerotorescue@0 604
Zerotorescue@0 605 -- Report that we're all done
Zerotorescue@0 606 self:SendMessage("MO_OPEN_COMPLETE");
Zerotorescue@0 607 end
Zerotorescue@0 608 end
Zerotorescue@0 609
Zerotorescue@31 610 function mod:OpenNext()
Zerotorescue@0 611 if continue then
Zerotorescue@0 612 -- If the previous mail was opened successful, open the next
Zerotorescue@0 613
Zerotorescue@0 614 -- Next mail in line
Zerotorescue@0 615 MAIL_ITEM_INDEX = ( MAIL_ITEM_INDEX - 1 );
Zerotorescue@0 616
Zerotorescue@0 617 -- Open it
Zerotorescue@0 618 self:OpenMail(MAIL_ITEM_INDEX);
Zerotorescue@0 619 else
Zerotorescue@0 620 -- Try again at the next interval
Zerotorescue@0 621
Zerotorescue@0 622 self.tmrMailOpener = self:ScheduleTimer("OpenNext", self.db.profile.speed);
Zerotorescue@0 623 end
Zerotorescue@0 624 end
Zerotorescue@0 625
Zerotorescue@31 626 function mod:Continue()
Zerotorescue@2 627 continue = true;
Zerotorescue@2 628 self:OpenNext();
Zerotorescue@2 629 end
Zerotorescue@2 630
Zerotorescue@0 631 local mailRemainingPatterns = {
Zerotorescue@68 632 minutesSeconds = L["|cffffffff%d|r/|cffffffff%d|r mail remaining, opening everything will take about |cffffffff%d|r minutes and |cffffffff%d|r seconds (next refresh in |cffffffff%d|r seconds)."],
Zerotorescue@68 633 minutes = L["|cffffffff%d|r/|cffffffff%d|r mail remaining, opening everything will take about |cffffffff%d|r minutes (next refresh in |cffffffff%d|r seconds)."],
Zerotorescue@68 634 seconds = L["|cffffffff%d|r/|cffffffff%d|r mail remaining, opening everything will take about |cffffffff%d|r seconds (next refresh in |cffffffff%d|r seconds)."],
Zerotorescue@68 635 nextRefresh = L["|cffffffff%d|r/|cffffffff%d|r mail remaining, next refresh in |cffffffff%d|r seconds."],
Zerotorescue@68 636 waitingBatch = L["|cffffffff%d|r/|cffffffff%d|r mail remaining - waiting for something from the current batch to be opened..."],
Zerotorescue@68 637 waitingSync = L["|cffffffff%d|r/|cffffffff%d|r mail remaining - waiting for the next mailbox refresh..."],
Zerotorescue@68 638 soon = L["|cffffffff%d|r/|cffffffff%d|r mail remaining - everything will be opened soon..."],
Zerotorescue@0 639 };
Zerotorescue@0 640
Zerotorescue@31 641 function mod:UpdateTimer()
Zerotorescue@0 642 if lastSync then
Zerotorescue@3 643 self:UpdateMailCount();
Zerotorescue@3 644
Zerotorescue@0 645 -- Calculate the total amount of mail waiting
Zerotorescue@0 646 local numTotalMail = ( numHiddenMail + numCurrentMail );
Zerotorescue@0 647
Zerotorescue@0 648 -- Resize the font based on mail left so the counter always fits perfectly
Zerotorescue@0 649 if numTotalMail < 100 then
Zerotorescue@0 650 self.timeLeftFrame.text:SetFont(GameFontHighlight:GetFont(), 30, "THICKOUTLINE");
Zerotorescue@0 651 elseif numTotalMail < 1000 then
Zerotorescue@0 652 self.timeLeftFrame.text:SetFont(GameFontHighlight:GetFont(), 24, "THICKOUTLINE");
Zerotorescue@0 653 else
Zerotorescue@0 654 self.timeLeftFrame.text:SetFont(GameFontHighlight:GetFont(), 18, "THICKOUTLINE");
Zerotorescue@0 655 end
Zerotorescue@0 656 self.timeLeftFrame.text:SetText(numTotalMail);
Zerotorescue@3 657
Zerotorescue@3 658 -- Calculate the next server sync based on the last server sync plus sync interval
Zerotorescue@3 659 local nextSync = ( lastSync + 61 );
Zerotorescue@0 660
Zerotorescue@3 661 -- Calculate the timer remaining untill the next sync
Zerotorescue@3 662 local timeRemaining = floor( nextSync - GetTime() );
Zerotorescue@3 663
Zerotorescue@3 664 if numHiddenMail > 0 or timeRemaining > 0 then
Zerotorescue@3 665 -- If there is still mail being hidden or the timer is still know, display stuff
Zerotorescue@0 666
Zerotorescue@0 667 -- If the next sync was already due, our nextSync calculation was wrong and we must wait a little longer (lag?)
Zerotorescue@0 668 local syncTimeOut = false;
Zerotorescue@0 669 -- If time remaining is below 0, next sync should be soon
Zerotorescue@0 670 if timeRemaining < 0 then
Zerotorescue@0 671 timeRemaining = 0;
Zerotorescue@0 672 syncTimeOut = true;
Zerotorescue@0 673 end
Zerotorescue@0 674
Zerotorescue@0 675 -- Calculate the amount of server syncs required to open all mail
Zerotorescue@0 676 local syncsRequired = ceil( numHiddenMail / 50 );
Zerotorescue@0 677 -- Calculate the time required to execute all these syncs
Zerotorescue@0 678 local timeRequired = ( ( syncsRequired - 1 ) * 61 ) + timeRemaining;
Zerotorescue@0 679
Zerotorescue@0 680 local minutes = floor( timeRequired / 60 );
Zerotorescue@0 681 local seconds = floor( timeRequired % 60 );
Zerotorescue@0 682
Zerotorescue@0 683 local remainingText;
Zerotorescue@0 684 if syncTimeOut then
Zerotorescue@3 685 -- Previous server sync was expected earlier, notify user
Zerotorescue@3 686
Zerotorescue@0 687 if numCurrentMail == 50 then
Zerotorescue@3 688 -- Sync couldn't occur because we were still waiting for the current batch to be opened
Zerotorescue@0 689 remainingText = format(mailRemainingPatterns.waitingBatch, numCurrentMail, numTotalMail);
Zerotorescue@0 690 else
Zerotorescue@0 691 remainingText = format(mailRemainingPatterns.waitingSync, numCurrentMail, numTotalMail);
Zerotorescue@0 692 end
Zerotorescue@3 693 elseif numHiddenMail == 0 then
Zerotorescue@3 694 -- If no hidden mail is remaining, only show the timer for as long as we can be sure
Zerotorescue@3 695
Zerotorescue@3 696 remainingText = format(mailRemainingPatterns.nextRefresh, numCurrentMail, numTotalMail, timeRemaining);
Zerotorescue@0 697 elseif minutes ~= 0 then
Zerotorescue@0 698 if seconds ~= 0 then
Zerotorescue@0 699 remainingText = format(mailRemainingPatterns.minutesSeconds, numCurrentMail, numTotalMail, minutes, seconds, timeRemaining);
Zerotorescue@0 700 else
Zerotorescue@0 701 remainingText = format(mailRemainingPatterns.minutes, numCurrentMail, numTotalMail, minutes, timeRemaining);
Zerotorescue@0 702 end
Zerotorescue@0 703 elseif seconds ~= 0 then
Zerotorescue@0 704 remainingText = format(mailRemainingPatterns.seconds, numCurrentMail, numTotalMail, seconds, timeRemaining);
Zerotorescue@0 705 else
Zerotorescue@0 706 remainingText = format(mailRemainingPatterns.soon, numCurrentMail, numTotalMail);
Zerotorescue@0 707 end
Zerotorescue@0 708
Zerotorescue@0 709 self.timeLeftFrame.smallText:SetText(remainingText);
Zerotorescue@3 710 else
Zerotorescue@0 711 self.timeLeftFrame.smallText:SetText("");
Zerotorescue@0 712 end
Zerotorescue@0 713 end
Zerotorescue@0 714 end
Zerotorescue@0 715
Zerotorescue@31 716 function mod:StopOpening(simple)
Zerotorescue@2 717 -- Stop opener timer
Zerotorescue@2 718 self:CancelTimer(self.tmrMailOpener, true);
Zerotorescue@2 719
Zerotorescue@0 720 if not simple then
Zerotorescue@39 721 -- A simple stop is an automated stop, an advanced stop is one manually or after a sever sync
Zerotorescue@2 722
Zerotorescue@0 723 -- Recheck inventory full
Zerotorescue@0 724 inventoryFull = false;
Zerotorescue@0 725 -- Replay sound
Zerotorescue@0 726 inventoryFullSoundPlayed = nil;
Zerotorescue@0 727 end
Zerotorescue@0 728
Zerotorescue@0 729 -- Reset opener position
Zerotorescue@0 730 MAIL_ITEM_INDEX = 0;
Zerotorescue@46 731 -- Reset open everything state
Zerotorescue@46 732 MAIL_OPEN_EVERYTHING = nil;
Zerotorescue@0 733 -- Stopped opening, so allow to continue
Zerotorescue@0 734 continue = true;
Zerotorescue@31 735
Zerotorescue@0 736 self:SetOpeningStatus(false);
Zerotorescue@0 737 end
Zerotorescue@0 738
Zerotorescue@31 739 function mod:SetOpeningStatus(openingStatus)
Zerotorescue@0 740 opening = openingStatus;
Zerotorescue@0 741
Zerotorescue@0 742 if openingStatus then
Zerotorescue@68 743 self.btnOpenAll:SetText(L["Opening..."]);
Zerotorescue@0 744 else
Zerotorescue@68 745 self.btnOpenAll:SetText(L["Open all"]);
Zerotorescue@0 746 end
Zerotorescue@0 747 end
Zerotorescue@0 748
Zerotorescue@31 749 function mod:GetOptionsGroup()
Zerotorescue@0 750 local configGroup = {
Zerotorescue@0 751 order = 300,
Zerotorescue@0 752 type = "group",
Zerotorescue@68 753 name = L["Open All"],
Zerotorescue@68 754 desc = L["Change open all settings."],
Zerotorescue@0 755 args = {
Zerotorescue@0 756 filters = {
Zerotorescue@0 757 order = 10,
Zerotorescue@0 758 type = "group",
Zerotorescue@0 759 inline = true,
Zerotorescue@68 760 name = L["Filters"],
Zerotorescue@0 761 args = {
Zerotorescue@0 762 description = {
Zerotorescue@0 763 order = 10,
Zerotorescue@0 764 type = "description",
Zerotorescue@68 765 name = L["Toggle which mail the opener should autoloot."],
Zerotorescue@0 766 },
Zerotorescue@0 767 AHHeader = {
Zerotorescue@0 768 order = 15,
Zerotorescue@0 769 type = "header",
Zerotorescue@68 770 name = L["Auction House Mail"],
Zerotorescue@0 771 },
Zerotorescue@0 772 canceled = {
Zerotorescue@0 773 order = 20,
Zerotorescue@0 774 type = "toggle",
Zerotorescue@68 775 name = L["Open all |cfffed000auction canceled|r mail"],
Zerotorescue@68 776 desc = L["Automatically loot all auction canceled mail from the auction house."],
Zerotorescue@0 777 set = function(i, v) self.db.profile.filter.AH.canceled = v; end,
Zerotorescue@0 778 get = function() return self.db.profile.filter.AH.canceled; end,
Zerotorescue@0 779 width = "double",
Zerotorescue@0 780 },
Zerotorescue@0 781 expired = {
Zerotorescue@0 782 order = 21,
Zerotorescue@0 783 type = "toggle",
Zerotorescue@68 784 name = L["Open all |cfffed000auction expired|r mail"],
Zerotorescue@68 785 desc = L["Automatically loot all auction expired mail from the auction house."],
Zerotorescue@0 786 set = function(i, v) self.db.profile.filter.AH.expired = v; end,
Zerotorescue@0 787 get = function() return self.db.profile.filter.AH.expired; end,
Zerotorescue@0 788 width = "double",
Zerotorescue@0 789 },
Zerotorescue@0 790 outbid = {
Zerotorescue@0 791 order = 22,
Zerotorescue@0 792 type = "toggle",
Zerotorescue@68 793 name = L["Open all |cfffed000outbid on|r mail"],
Zerotorescue@68 794 desc = L["Automatically loot all auction outbid mail from the auction house."],
Zerotorescue@0 795 set = function(i, v) self.db.profile.filter.AH.outbid = v; end,
Zerotorescue@0 796 get = function() return self.db.profile.filter.AH.outbid; end,
Zerotorescue@0 797 width = "double",
Zerotorescue@0 798 },
Zerotorescue@0 799 success = {
Zerotorescue@0 800 order = 23,
Zerotorescue@0 801 type = "toggle",
Zerotorescue@68 802 name = L["Open all |cfffed000auction successful|r mail"],
Zerotorescue@68 803 desc = L["Automatically loot all auction successful mail from the auction house."],
Zerotorescue@0 804 set = function(i, v) self.db.profile.filter.AH.success = v; end,
Zerotorescue@0 805 get = function() return self.db.profile.filter.AH.success; end,
Zerotorescue@0 806 width = "double",
Zerotorescue@0 807 },
Zerotorescue@0 808 won = {
Zerotorescue@0 809 order = 24,
Zerotorescue@0 810 type = "toggle",
Zerotorescue@68 811 name = L["Open all |cfffed000auction won|r mail"],
Zerotorescue@68 812 desc = L["Automatically loot all auction won mail from the auction house."],
Zerotorescue@0 813 set = function(i, v) self.db.profile.filter.AH.won = v; end,
Zerotorescue@0 814 get = function() return self.db.profile.filter.AH.won; end,
Zerotorescue@0 815 width = "double",
Zerotorescue@0 816 },
Zerotorescue@0 817 normalHeader = {
Zerotorescue@0 818 order = 30,
Zerotorescue@0 819 type = "header",
Zerotorescue@68 820 name = L["Remaining Mail"],
Zerotorescue@0 821 },
Zerotorescue@0 822 normalAttachments = {
Zerotorescue@0 823 order = 40,
Zerotorescue@0 824 type = "toggle",
Zerotorescue@68 825 name = L["Normal mail with |cfffed000attachments|r"],
Zerotorescue@68 826 desc = L["Automatically loot all normal mail containing attachments (CoDs and Blizzard mail will be skipped)."],
Zerotorescue@0 827 set = function(i, v) self.db.profile.filter.normalAttachments = v; end,
Zerotorescue@0 828 get = function() return self.db.profile.filter.normalAttachments; end,
Zerotorescue@0 829 width = "double",
Zerotorescue@0 830 },
Zerotorescue@0 831 normalMoney = {
Zerotorescue@0 832 order = 50,
Zerotorescue@0 833 type = "toggle",
Zerotorescue@68 834 name = L["Normal mail with |cfffed000gold|r"],
Zerotorescue@68 835 desc = L["Automatically loot all normal mail containing gold (CoDs and Blizzard mail will be skipped)."],
Zerotorescue@0 836 set = function(i, v) self.db.profile.filter.normalMoney = v; end,
Zerotorescue@0 837 get = function() return self.db.profile.filter.normalMoney; end,
Zerotorescue@0 838 width = "double",
Zerotorescue@0 839 },
Zerotorescue@50 840 allowShiftClick = {
Zerotorescue@50 841 order = 60,
Zerotorescue@50 842 type = "toggle",
Zerotorescue@68 843 name = L["Allow shift-clicking of the |cfffed000Open All|r button to autoloot |cfffed000everything|r, regardless of the above filters."],
Zerotorescue@68 844 desc = L["Allow shift-clicking of the |cfffed000Open All|r button to autoloot |cfffed000everything|r with attachments, temporarily overriding all filters."],
Zerotorescue@50 845 set = function(i, v) self.db.profile.filter.allowShiftClick = v; end,
Zerotorescue@50 846 get = function() return self.db.profile.filter.allowShiftClick; end,
Zerotorescue@50 847 width = "full",
Zerotorescue@50 848 },
Zerotorescue@0 849 },
Zerotorescue@0 850 },
Zerotorescue@0 851 -- Continuous opening config inline group
Zerotorescue@0 852 continuousOpening = {
Zerotorescue@0 853 order = 20,
Zerotorescue@0 854 type = "group",
Zerotorescue@0 855 inline = true,
Zerotorescue@68 856 name = L["Opening Interval"],
Zerotorescue@0 857 args = {
Zerotorescue@0 858 description = {
Zerotorescue@0 859 order = 10,
Zerotorescue@0 860 type = "description",
Zerotorescue@0 861 name = function()
Zerotorescue@68 862 local defaultString = L["The default behavior for opening mail is to only do so right after new mail was received from the server. If you close the mailbox or your inventory is full before everything is opened you will have to click the open all button manually or wait for a next mailbox refresh."] .. "\n\n";
Zerotorescue@0 863
Zerotorescue@0 864 local currentSettings = "";
Zerotorescue@0 865 if MailOpener.db.profile.general.continueOpening then
Zerotorescue@68 866 currentSettings = currentSettings .. L["Mail Opener will |cff00ff00continue|r to attempt to open the remaining mail every |cfffed000%d seconds|r."]:format(MailOpener.db.profile.general.waitTime) .. " ";
Zerotorescue@0 867 else
Zerotorescue@68 868 currentSettings = currentSettings .. L["Mail Opener will |cffff0000not|r continue to attempt to open the remaining mail and will only start opening when new mail has just been received from the server."] .. " ";
Zerotorescue@0 869 end
Zerotorescue@68 870 currentSettings = currentSettings .. L["The first batch after each server refresh will be opened after waiting |cfffed000%d seconds|r."]:format(MailOpener.db.profile.general.initialDelay);
Zerotorescue@0 871 return defaultString .. currentSettings;
Zerotorescue@0 872 end,
Zerotorescue@0 873 },
Zerotorescue@0 874 header = {
Zerotorescue@0 875 order = 15,
Zerotorescue@0 876 type = "header",
Zerotorescue@0 877 name = "",
Zerotorescue@0 878 },
Zerotorescue@0 879 continueOpening = {
Zerotorescue@0 880 order = 20,
Zerotorescue@0 881 type = "toggle",
Zerotorescue@68 882 name = L["Continue opening mail"],
Zerotorescue@68 883 desc = L["Continue opening mail at the interval set below, even if the mailbox wasn't refreshed recently."],
Zerotorescue@0 884 width = "full",
Zerotorescue@0 885 get = function() return MailOpener.db.profile.general.continueOpening; end,
Zerotorescue@0 886 set = function(i, v) MailOpener.db.profile.general.continueOpening = v; end,
Zerotorescue@0 887 },
Zerotorescue@0 888 waitTime = {
Zerotorescue@0 889 order = 30,
Zerotorescue@0 890 type = "range",
Zerotorescue@0 891 width = "double",
Zerotorescue@0 892 min = 0.5,
Zerotorescue@0 893 max = 60,
Zerotorescue@0 894 step = 0.5,
Zerotorescue@68 895 name = L["Continued Mail Opening Interval"],
Zerotorescue@68 896 desc = L["Change the interval at which Mail Opener tries to continue opening mail after opening the mailbox. Please note that this setting does not reduce the game's normal 60 seconds wait time for mail.\n\nThe default value is 5 seconds."],
Zerotorescue@0 897 get = function() return MailOpener.db.profile.general.waitTime; end,
Zerotorescue@0 898 set = function(i, v) MailOpener.db.profile.general.waitTime = v; end,
Zerotorescue@0 899 disabled = function() return (not MailOpener.db.profile.general.continueOpening); end,
Zerotorescue@0 900 },
Zerotorescue@0 901 initialDelay = {
Zerotorescue@0 902 order = 40,
Zerotorescue@0 903 type = "range",
Zerotorescue@0 904 width = "double",
Zerotorescue@0 905 min = 0.5,
Zerotorescue@0 906 max = 60,
Zerotorescue@0 907 step = 0.5,
Zerotorescue@68 908 name = L["Initial Mail Opening Delay"],
Zerotorescue@68 909 desc = L["Change the delay before Mail Opener tries opening mail after opening the mailbox or new mail has been received from the server.\n\nThe default value is 0.5 seconds."],
Zerotorescue@0 910 get = function() return MailOpener.db.profile.general.initialDelay; end,
Zerotorescue@0 911 set = function(i, v) MailOpener.db.profile.general.initialDelay = v; end,
Zerotorescue@0 912 },
Zerotorescue@0 913 },
Zerotorescue@0 914 }, -- end Continuous opening config inline group
Zerotorescue@0 915 keepFree = {
Zerotorescue@0 916 order = 30,
Zerotorescue@0 917 type = "group",
Zerotorescue@0 918 inline = true,
Zerotorescue@68 919 name = L["Keep Free Space"],
Zerotorescue@0 920 args = {
Zerotorescue@0 921 description = {
Zerotorescue@0 922 order = 10,
Zerotorescue@0 923 type = "description",
Zerotorescue@68 924 name = L["You can set an amount of bag space you wish to reserve when opening mail. Mail with a higher amount of attachments than available space will be skipped completely with this option set above 0."],
Zerotorescue@0 925 },
Zerotorescue@0 926 header = {
Zerotorescue@0 927 order = 15,
Zerotorescue@0 928 type = "header",
Zerotorescue@0 929 name = "",
Zerotorescue@0 930 },
Zerotorescue@0 931 keepFreeSpace = {
Zerotorescue@0 932 order = 20,
Zerotorescue@0 933 type = "range",
Zerotorescue@0 934 min = 0,
Zerotorescue@0 935 max = 100,
Zerotorescue@0 936 step = 1,
Zerotorescue@0 937 width = "double",
Zerotorescue@68 938 name = L["Keep free space"],
Zerotorescue@68 939 desc = L["Change the amount of space to reserve for other things when opening mail. If this option is set higher than 0, mail with a higher amount of attachments than available space will be skipped completely.\n\nE.g. If this is set to 1 and you have a total of 12 slots left then any mail with 12 attachments will be skipped while one with 11 attachments would be opened."],
Zerotorescue@0 940 set = function(i, v) self.db.profile.keepFreeSpace = v; end,
Zerotorescue@0 941 get = function() return self.db.profile.keepFreeSpace; end,
Zerotorescue@0 942 },
Zerotorescue@0 943 },
Zerotorescue@0 944 },
Zerotorescue@0 945 speed = {
Zerotorescue@0 946 order = 40,
Zerotorescue@0 947 type = "group",
Zerotorescue@0 948 inline = true,
Zerotorescue@0 949 name = "Opening Speed",
Zerotorescue@0 950 args = {
Zerotorescue@0 951 description = {
Zerotorescue@0 952 order = 10,
Zerotorescue@0 953 type = "description",
Zerotorescue@68 954 name = L["Change the speed at which mail is opened. You should set the opening speed to the lowest latency you have in a city or experiment with setting it to the minimum."],
Zerotorescue@0 955 },
Zerotorescue@0 956 header = {
Zerotorescue@0 957 order = 15,
Zerotorescue@0 958 type = "header",
Zerotorescue@0 959 name = "",
Zerotorescue@0 960 },
Zerotorescue@0 961 openMailInterval = {
Zerotorescue@0 962 order = 20,
Zerotorescue@0 963 type = "range",
Zerotorescue@0 964 min = 5,
Zerotorescue@0 965 max = 2500,
Zerotorescue@0 966 step = 5,
Zerotorescue@0 967 width = "double",
Zerotorescue@68 968 name = L["Open single mail interval"],
Zerotorescue@68 969 desc = L["Change the mail opening speed (in microseconds) for each mail. Lower may not always be faster."],
Zerotorescue@0 970 get = function() return ( self.db.profile.speed * 1000 ); end,
Zerotorescue@0 971 set = function(i, v) self.db.profile.speed = ( v / 1000 ); end,
Zerotorescue@0 972 },
Zerotorescue@0 973 },
Zerotorescue@0 974 },
Zerotorescue@0 975 },
Zerotorescue@0 976 };
Zerotorescue@0 977
Zerotorescue@0 978 return configGroup;
Zerotorescue@0 979 end
Zerotorescue@0 980
Zerotorescue@31 981 function mod:Debug(t)
Zerotorescue@68 982 return MailOpener:Debug(("|cff00ff00OpenAll|r:%s"):format(t));
Zerotorescue@0 983 end