annotate Modules/OpenAll.lua @ 127:ba697df5c2af v1.2.8

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