annotate Modules/OpenAll.lua @ 34:69fc1ca8881f

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