annotate Modules/OpenAll.lua @ 0:823e33465b6e

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