annotate Modules/OpenAll.lua @ 49:b2b98cc0c544

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