annotate Core.lua @ 18:e25dd56b0deb

Removed tag Mail Opener 1.0-ALPHA7
author Zerotorescue
date Thu, 09 Sep 2010 16:44:50 +0200
parents fb952805d8b7
children d633bf82328b
rev   line source
Zerotorescue@3 1 -- You can access this addon's object through: LibStub("AceAddon-3.0"):GetAddon("MailOpener")
Zerotorescue@3 2 local MailOpener = LibStub("AceAddon-3.0"):NewAddon("MailOpener", "AceEvent-3.0", "AceTimer-3.0");
Zerotorescue@0 3
Zerotorescue@8 4 -- You can check if MailOpener is busy with the global MailAddonBusy (if not MailAddonBusy then ...do something... end)
Zerotorescue@8 5 -- MailAddonBusy will be nil when nothing is happening or filled with the addon name when MO is working
Zerotorescue@8 6 -- Another addon can use this variable to indicate they're working too, MailOpener will then wait for that to finish
Zerotorescue@3 7
Zerotorescue@3 8 local AutoOpenMail, MailOpenerConfig, lastAmount, lastQuickAuctionsStatus, freshList, mailboxEmptySoundPlayed;
Zerotorescue@0 9
Zerotorescue@0 10 function MailOpener:OnInitialize()
Zerotorescue@0 11 local defaults = {
Zerotorescue@0 12 profile = {
Zerotorescue@8 13 uses = 0,
Zerotorescue@0 14 general = {
Zerotorescue@8 15 defaultStatus = "disabled", -- addon enabled, but mail opening not auto on
Zerotorescue@0 16 defaultQAStatus = "__remember",
Zerotorescue@0 17 continueOpeningStackableItems = false,
Zerotorescue@0 18 autoDisableQAAutoMail = true,
Zerotorescue@0 19 autoReenableQAAutoMail = false,
Zerotorescue@0 20 autoSetBackQAAutoMail = true,
Zerotorescue@0 21 continueOpening = false,
Zerotorescue@0 22 waitTime = 5,
Zerotorescue@0 23 initialDelay = 0.5,
Zerotorescue@0 24 },
Zerotorescue@0 25 modules = {
Zerotorescue@0 26 Collected = true,
Zerotorescue@5 27 FailSafe = true,
Zerotorescue@0 28 },
Zerotorescue@0 29 notifications = {
Zerotorescue@3 30 welcome = false,
Zerotorescue@3 31 bye = false,
Zerotorescue@0 32 finishedCurrentBatch = true,
Zerotorescue@0 33 mailboxIsEmpty = true,
Zerotorescue@0 34
Zerotorescue@0 35 skipped = {
Zerotorescue@0 36 all = true,
Zerotorescue@0 37 inventoryFull = true,
Zerotorescue@0 38 keepFreeSpaceLimit = true,
Zerotorescue@0 39 GMMail = true,
Zerotorescue@0 40 COD = true,
Zerotorescue@0 41 normalGoldMail = true,
Zerotorescue@0 42 normalItemsMail = true,
Zerotorescue@0 43 AHexpired = true,
Zerotorescue@0 44 AHsuccess = true,
Zerotorescue@0 45 AHwon = true,
Zerotorescue@0 46 AHcanceled = true,
Zerotorescue@0 47 AHoutbid = true,
Zerotorescue@0 48 other = true,
Zerotorescue@0 49 },
Zerotorescue@0 50 processed = {
Zerotorescue@0 51 all = true,
Zerotorescue@0 52 normalGoldMail = true,
Zerotorescue@0 53 normalItemsMail = true,
Zerotorescue@0 54 AHexpired = true,
Zerotorescue@0 55 AHsuccess = true,
Zerotorescue@0 56 AHwon = true,
Zerotorescue@0 57 AHcanceled = true,
Zerotorescue@0 58 AHoutbid = true,
Zerotorescue@0 59 other = true,
Zerotorescue@0 60 },
Zerotorescue@0 61
Zerotorescue@0 62 bagsFullSound = false,
Zerotorescue@0 63 bagsFullSoundFile = "Sound\\Spells\\SimonGame_Visual_BadPress.wav",
Zerotorescue@0 64 bagsFullSoundFileName = "Simon Error",
Zerotorescue@0 65 bagsFullSoundOnlyOnce = true,
Zerotorescue@0 66 mailboxEmptySound = false,
Zerotorescue@0 67 mailboxEmptySoundFile = "Sound\\Spells\\SimonGame_Visual_GameStart.wav",
Zerotorescue@0 68 mailboxEmptySoundFileName = "Simon Start",
Zerotorescue@0 69 mailboxEmptySoundOnlyOnce = true,
Zerotorescue@0 70 },
Zerotorescue@0 71 },
Zerotorescue@0 72 };
Zerotorescue@0 73
Zerotorescue@0 74 -- Register our saved variables database
Zerotorescue@0 75 self.db = LibStub("AceDB-3.0"):New("MailOpenerDB", defaults, true);
Zerotorescue@0 76
Zerotorescue@0 77 -- Set these as object variables so we can use them in our modules
Zerotorescue@0 78 if select(6, GetAddOnInfo("Postal")) == nil then
Zerotorescue@0 79 self.PostalEnabled = true;
Zerotorescue@0 80
Zerotorescue@0 81 -- Ensure this addon is loaded if AddonLoader is installed
Zerotorescue@0 82 if AddonLoader and AddonLoader.LoadAddOn and not Postal then
Zerotorescue@0 83 AddonLoader:LoadAddOn("Postal");
Zerotorescue@0 84 end
Zerotorescue@0 85 end
Zerotorescue@0 86
Zerotorescue@0 87 if select(6, GetAddOnInfo("QuickAuctions")) == nil then
Zerotorescue@0 88 self.QuickAuctionsEnabled = true;
Zerotorescue@0 89
Zerotorescue@0 90 -- Ensure this addon is loaded if AddonLoader is installed
Zerotorescue@0 91 if AddonLoader and AddonLoader.LoadAddOn then
Zerotorescue@0 92 AddonLoader:LoadAddOn("QuickAuctions");
Zerotorescue@0 93 end
Zerotorescue@0 94 end
Zerotorescue@0 95
Zerotorescue@0 96 -- Don't enable the config module until we need it
Zerotorescue@0 97 for name, module in self:IterateModules() do
Zerotorescue@0 98 if name == "Config" then
Zerotorescue@0 99 module:SetEnabledState(false);
Zerotorescue@0 100 elseif self.db.profile.modules[name] ~= nil then
Zerotorescue@0 101 if self.db.profile.modules[name] then
Zerotorescue@0 102 self:Debug("|cff00ff00Enabling|r module: " .. name);
Zerotorescue@0 103 else
Zerotorescue@0 104 self:Debug("|cffff0000Disabling|r module: " .. name);
Zerotorescue@0 105 end
Zerotorescue@0 106
Zerotorescue@0 107 module:SetEnabledState(self.db.profile.modules[name]);
Zerotorescue@0 108 end
Zerotorescue@0 109 end
Zerotorescue@0 110
Zerotorescue@0 111 -- Make the open all checkbox
Zerotorescue@0 112 local check = CreateFrame("CheckButton", "cbMailOpenerEnable", MailFrame, "ChatConfigCheckButtonTemplate");
Zerotorescue@0 113 check:SetHeight(26);
Zerotorescue@0 114 check:SetWidth(26);
Zerotorescue@3 115 check:SetChecked(true);
Zerotorescue@0 116 check:SetHitRectInsets(0, -80, 0, 0);
Zerotorescue@0 117 check:SetScript("OnClick", function(self)
Zerotorescue@3 118 if IsShiftKeyDown() then
Zerotorescue@3 119 -- Shift key = toggle addon on or off, since addon is already on there's only one option
Zerotorescue@3 120
Zerotorescue@3 121 if not MailOpener:IsEnabled() then
Zerotorescue@3 122 print("|cff15ff00Mail Opener|r: Shift key was held down, so |cff00ff00enabling|r the entire addon as well as automatic opening of mail.");
Zerotorescue@3 123
Zerotorescue@3 124 MailOpener:Enable();
Zerotorescue@3 125
Zerotorescue@3 126 -- The above calls MAIL_SHOW which changes AutoOpenMail, so we can't remember the old setting
Zerotorescue@3 127 AutoOpenMail = true;
Zerotorescue@3 128
Zerotorescue@3 129 self:SetChecked(true);
Zerotorescue@3 130 else
Zerotorescue@3 131 print("|cff15ff00Mail Opener|r: Shift key was held down, so |cffff0000disabling|r the entire addon.");
Zerotorescue@3 132
Zerotorescue@3 133 MailOpener:Disable();
Zerotorescue@3 134
Zerotorescue@3 135 self:SetChecked(false);
Zerotorescue@3 136 end
Zerotorescue@0 137 else
Zerotorescue@3 138 -- Normal click
Zerotorescue@3 139
Zerotorescue@3 140 if self:GetChecked() then
Zerotorescue@3 141 print("|cff15ff00Mail Opener|r: |cff00ff00Enabling|r automatic opening of mail.");
Zerotorescue@3 142
Zerotorescue@3 143 AutoOpenMail = true;
Zerotorescue@8 144 MailOpener:ScheduleOpen(false);
Zerotorescue@3 145 else
Zerotorescue@3 146 print("|cff15ff00Mail Opener|r: |cffff0000Disabling|r automatic opening of mail.");
Zerotorescue@3 147
Zerotorescue@3 148 AutoOpenMail = false;
Zerotorescue@3 149 end
Zerotorescue@0 150 end
Zerotorescue@0 151 end);
Zerotorescue@3 152 check.tooltip = "Toggle automatic mail opening on or off (you can force this by holding shift when opening the mailbox.\n\nHold the |cffffffffSHIFT|r key to disable the entire addon.";
Zerotorescue@0 153 check:SetPoint("TOPLEFT", MailFrame, "TOPLEFT", 68, -13)
Zerotorescue@0 154
Zerotorescue@0 155 if self.QuickAuctionsEnabled then
Zerotorescue@0 156 -- QA is enabled so move the checkbox further to the right
Zerotorescue@0 157
Zerotorescue@0 158 check:SetPoint("TOPLEFT", MailFrame, "TOPLEFT", 155, -13);
Zerotorescue@0 159 end
Zerotorescue@0 160
Zerotorescue@0 161 -- Get reference to the text field
Zerotorescue@0 162 local checkboxText = _G[check:GetName() .. "Text"];
Zerotorescue@0 163 checkboxText:SetText("Mail Opener");
Zerotorescue@0 164 -- We like this color more
Zerotorescue@0 165 checkboxText:SetTextColor(1, 0.8, 0, 1);
Zerotorescue@0 166
Zerotorescue@0 167 self.cbOpenAll = check;
Zerotorescue@0 168
Zerotorescue@0 169 -- Make the config button
Zerotorescue@0 170 local button = CreateFrame("Button", "btnMailOpenerConfig", MailFrame, "UIPanelButtonTemplate")
Zerotorescue@0 171 button:SetText("Config")
Zerotorescue@0 172 button:SetHeight(23)
Zerotorescue@0 173 button:SetWidth(55)
Zerotorescue@0 174 if self.PostalEnabled then
Zerotorescue@0 175 button:SetPoint("TOPRIGHT", MailFrame, "TOPRIGHT", -75, -13);
Zerotorescue@0 176 else
Zerotorescue@0 177 button:SetPoint("TOPRIGHT", MailFrame, "TOPRIGHT", -55, -13);
Zerotorescue@0 178 end
Zerotorescue@0 179 button:SetScript("OnClick", function()
Zerotorescue@0 180 MailOpener:EnableConfigModule();
Zerotorescue@0 181
Zerotorescue@0 182 MailOpenerConfig:Show();
Zerotorescue@0 183
Zerotorescue@8 184 --BETA:if MailOpener.db.profile.uses >= 15 then
Zerotorescue@7 185 --BETA: MailOpener:ShowBetaPopup();
Zerotorescue@7 186 --BETA:end
Zerotorescue@0 187 end);
Zerotorescue@0 188
Zerotorescue@0 189 self.btnConfig = button;
Zerotorescue@0 190
Zerotorescue@0 191 -- Disable the AddonLoader slash commands
Zerotorescue@0 192 SLASH_MO1 = nil;
Zerotorescue@0 193 SLASH_MAILOPEN1 = nil;
Zerotorescue@0 194 SLASH_MAILOPENER1 = nil;
Zerotorescue@0 195
Zerotorescue@0 196 -- Register our own slash commands
Zerotorescue@0 197 SLASH_MAILOPENER1 = "/mo";
Zerotorescue@0 198 SLASH_MAILOPENER2 = "/mailopen";
Zerotorescue@0 199 SLASH_MAILOPENER3 = "/mailopener";
Zerotorescue@0 200 SlashCmdList["MAILOPENER"] = function(msg)
Zerotorescue@0 201 MailOpener:EnableConfigModule();
Zerotorescue@0 202
Zerotorescue@0 203 MailOpenerConfig:CommandHandler(msg);
Zerotorescue@0 204 end
Zerotorescue@0 205
Zerotorescue@0 206 -- Attempt to remove the interface options added by AddonLoader (if enabled)
Zerotorescue@0 207 if AddonLoader and AddonLoader.RemoveInterfaceOptions then
Zerotorescue@0 208 AddonLoader:RemoveInterfaceOptions("Mail Opener");
Zerotorescue@0 209 end
Zerotorescue@0 210
Zerotorescue@0 211 -- Now create our own options frame
Zerotorescue@0 212 local frame = CreateFrame("Frame", nil, UIParent);
Zerotorescue@0 213 frame:Hide();
Zerotorescue@0 214 frame.name = "Mail Opener";
Zerotorescue@0 215 frame:HookScript("OnShow", function(self)
Zerotorescue@0 216 -- Enable the config module
Zerotorescue@0 217 MailOpener:EnableConfigModule();
Zerotorescue@0 218
Zerotorescue@0 219 -- Load the options and add it to the blizzard interface list
Zerotorescue@0 220 MailOpenerConfig:Load();
Zerotorescue@0 221
Zerotorescue@0 222 -- Refresh the frame to instantly show the right options
Zerotorescue@0 223 InterfaceOptionsFrame_OpenToCategory(self.name)
Zerotorescue@0 224 end);
Zerotorescue@0 225 -- And add it to the interface options
Zerotorescue@0 226 InterfaceOptions_AddCategory(frame);
Zerotorescue@0 227 end
Zerotorescue@0 228
Zerotorescue@0 229 function MailOpener:OnEnable()
Zerotorescue@0 230 self:RegisterEvent("MAIL_SHOW");
Zerotorescue@0 231 self:RegisterEvent("PLAYER_ENTERING_WORLD");
Zerotorescue@0 232
Zerotorescue@0 233 self.btnConfig:Show();
Zerotorescue@0 234
Zerotorescue@0 235 -- Reset variables
Zerotorescue@0 236 lastAmount = 0;
Zerotorescue@0 237 self.debugChannel = nil;
Zerotorescue@0 238
Zerotorescue@8 239 --BETA:if (self.db.profile.uses % 15) == 0 then
Zerotorescue@7 240 --BETA: -- Automatically show once every 15 uses
Zerotorescue@7 241 --BETA: self:ShowBetaPopup();
Zerotorescue@7 242 --BETA:end
Zerotorescue@0 243
Zerotorescue@0 244 -- If we were toggling this addon on while the mailbox is opened we must register all events again
Zerotorescue@0 245 if MailFrame:IsVisible() then
Zerotorescue@0 246 self:MAIL_SHOW();
Zerotorescue@0 247 end
Zerotorescue@0 248 end
Zerotorescue@0 249
Zerotorescue@0 250 function MailOpener:OnDisable()
Zerotorescue@0 251 self:UnregisterEvent("MAIL_SHOW");
Zerotorescue@0 252
Zerotorescue@0 253 self.btnConfig:Hide();
Zerotorescue@0 254
Zerotorescue@0 255 MailOpener:Stop();
Zerotorescue@0 256 end
Zerotorescue@0 257
Zerotorescue@0 258 -- We must disable Quick Auction's auto mail (if set up that way in the settings) before opening the mailbox or it will instantly start sending stuff
Zerotorescue@0 259 function MailOpener:PLAYER_ENTERING_WORLD()
Zerotorescue@0 260 self:UnregisterEvent("PLAYER_ENTERING_WORLD");
Zerotorescue@0 261
Zerotorescue@0 262 self:ToggleQAStatus();
Zerotorescue@0 263 end
Zerotorescue@0 264
Zerotorescue@0 265 -- Fired when the mailbox is opened
Zerotorescue@0 266 function MailOpener:MAIL_SHOW()
Zerotorescue@0 267 -- To stop the timer when the mailbox is closed
Zerotorescue@0 268 self:RegisterEvent("MAIL_CLOSED", "Stop");
Zerotorescue@0 269 self:RegisterEvent("PLAYER_LEAVING_WORLD", "Stop");
Zerotorescue@0 270
Zerotorescue@0 271 -- To set the timer for when to refresh again
Zerotorescue@0 272 self:RegisterEvent("MAIL_INBOX_UPDATE");
Zerotorescue@0 273
Zerotorescue@0 274 -- We need to know when opening has completed
Zerotorescue@0 275 self:RegisterMessage("MO_OPEN_COMPLETE");
Zerotorescue@0 276
Zerotorescue@8 277 if self.db.profile.uses == 0 then
Zerotorescue@8 278 --TODO:statispopupdialog
Zerotorescue@8 279 end
Zerotorescue@8 280
Zerotorescue@8 281 self.db.profile.uses = ( self.db.profile.uses + 1 );
Zerotorescue@8 282
Zerotorescue@0 283 self:Debug("defaultStatus:" .. self.db.profile.general.defaultStatus);
Zerotorescue@0 284 -- Change the mail opening status according to our settings
Zerotorescue@0 285 if self.db.profile.general.defaultStatus == "_enabled" then
Zerotorescue@3 286 AutoOpenMail = true;
Zerotorescue@3 287 self.cbOpenAll:SetChecked(true);
Zerotorescue@3 288 elseif self.db.profile.general.defaultStatus == "disabled" then
Zerotorescue@3 289 -- Disable auto opening but leave mail opener enabled
Zerotorescue@3 290
Zerotorescue@3 291 AutoOpenMail = false;
Zerotorescue@3 292 self.cbOpenAll:SetChecked(false);
Zerotorescue@3 293 elseif self.db.profile.general.defaultStatus == "xdisabled" then
Zerotorescue@3 294 -- Disable entire addon
Zerotorescue@3 295
Zerotorescue@3 296 MailOpener:Disable();
Zerotorescue@3 297 self.cbOpenAll:SetChecked(false);
Zerotorescue@0 298 end
Zerotorescue@0 299
Zerotorescue@0 300 self:ToggleQAStatus();
Zerotorescue@0 301
Zerotorescue@0 302 -- Hide the InboxTooMuchMail warning to allow room for our mail remaining info line
Zerotorescue@0 303 InboxTooMuchMail:Hide()
Zerotorescue@0 304 InboxTooMuchMail.Show = function() end
Zerotorescue@0 305
Zerotorescue@0 306 if self.QuickAuctionsEnabled then
Zerotorescue@8 307 local QAMail = LibStub("AceAddon-3.0"):GetAddon("QuickAuctions", true):GetModule("Mail", true);
Zerotorescue@0 308
Zerotorescue@8 309 if QAMail then
Zerotorescue@8 310 -- Hide the open all button
Zerotorescue@8 311 QAMail.massOpening:Hide();
Zerotorescue@8 312 -- Hide the x mail remaining text
Zerotorescue@8 313 QAMail.totalMail:Hide();
Zerotorescue@8 314 end
Zerotorescue@0 315 end
Zerotorescue@0 316
Zerotorescue@0 317 if self.db.profile.notifications.welcome then
Zerotorescue@0 318 -- Welcome notification
Zerotorescue@0 319 local _, c = UnitClass("player");
Zerotorescue@0 320 c = RAID_CLASS_COLORS[c];
Zerotorescue@0 321 c = string.format("|cff%02x%02x%02x", c.r * 255 + 0.5, c.g * 255 + 0.5, c.b * 255 + 0.5);
Zerotorescue@0 322
Zerotorescue@0 323 print("|cff15ff00Mail Opener|r: Welcome back "..c..UnitName("player").."|r. Requesting new mail from the local Postal Service, your mail will automatically be opened when it becomes available.");
Zerotorescue@0 324 end
Zerotorescue@0 325
Zerotorescue@0 326 mailboxEmptySoundPlayed = nil;
Zerotorescue@0 327
Zerotorescue@0 328 self:Recheck();
Zerotorescue@0 329
Zerotorescue@0 330 if self.db.profile.general.continueOpening then
Zerotorescue@6 331 -- Continue opening mail, but use the "initial mail opening interval" as time
Zerotorescue@6 332 self:ScheduleOpen(false);
Zerotorescue@0 333 end
Zerotorescue@0 334 end
Zerotorescue@0 335
Zerotorescue@0 336 -- Fired after a successful server sync
Zerotorescue@0 337 -- Fired when mail is deleted (which happens after taking all attachments from a mail sent by the game)
Zerotorescue@0 338 function MailOpener:MAIL_INBOX_UPDATE()
Zerotorescue@0 339 local current, total = GetInboxNumItems();
Zerotorescue@0 340
Zerotorescue@3 341 -- Calculate the amount of mail waiting that actually have attachments
Zerotorescue@3 342 -- If we just compare numbers we won't be including mail that isn't automatically deleted when opened, such as mail with attachments sent by other players
Zerotorescue@3 343 local currentMailWithAttachments = 0;
Zerotorescue@3 344 for i = 1, current do
Zerotorescue@3 345 local _, _, _, _, money, _, _, items = GetInboxHeaderInfo(i);
Zerotorescue@3 346
Zerotorescue@3 347 if (items and items > 0) or (money and money > 0) then
Zerotorescue@3 348 currentMailWithAttachments = currentMailWithAttachments + 1;
Zerotorescue@3 349 end
Zerotorescue@0 350 end
Zerotorescue@0 351
Zerotorescue@3 352 local tempLastAmount = lastAmount;
Zerotorescue@3 353 lastAmount = currentMailWithAttachments;
Zerotorescue@3 354
Zerotorescue@11 355 --if currentMailWithAttachments ~= tempLastAmount then
Zerotorescue@11 356 -- self:Debug("MAIL_INBOX_UPDATE - lastAmount:" .. tempLastAmount .. " - current:" .. currentMailWithAttachments);
Zerotorescue@11 357 --end
Zerotorescue@3 358
Zerotorescue@3 359 if currentMailWithAttachments > tempLastAmount then
Zerotorescue@0 360 -- New messages arrived in our mailbox, so this was a refresh, so set a timer
Zerotorescue@0 361
Zerotorescue@3 362 self:Debug("MO_SERVER_SYNCED");
Zerotorescue@3 363
Zerotorescue@0 364 -- Yell that we successfully synced with the server
Zerotorescue@0 365 self:SendMessage("MO_SERVER_SYNCED");
Zerotorescue@0 366
Zerotorescue@0 367 -- This list is fresh
Zerotorescue@0 368 freshList = true;
Zerotorescue@0 369 mailboxEmptySoundPlayed = nil;
Zerotorescue@0 370
Zerotorescue@0 371 -- Stop previous timer
Zerotorescue@0 372 self:CancelTimer(self.tmrRecheck, true);
Zerotorescue@0 373 -- More will arrive in 60 seconds
Zerotorescue@0 374 self.tmrRecheck = self:ScheduleTimer(function()
Zerotorescue@0 375 self:Debug("tmrRecheck 61 finished");
Zerotorescue@0 376
Zerotorescue@0 377 -- We can get a fresh list now, so query the server
Zerotorescue@0 378 freshList = false;
Zerotorescue@0 379
Zerotorescue@0 380 -- Look for mail
Zerotorescue@0 381 self:Recheck();
Zerotorescue@0 382 end, 61);
Zerotorescue@0 383 self:Debug("tmrRecheck 61");
Zerotorescue@0 384
Zerotorescue@0 385 if not IsShiftKeyDown() then
Zerotorescue@0 386 -- Allow overriding of mailopening with the shift key
Zerotorescue@0 387
Zerotorescue@0 388 -- Open the current mail
Zerotorescue@0 389 self:ScheduleOpen(false);
Zerotorescue@0 390 end
Zerotorescue@3 391 elseif currentMailWithAttachments < tempLastAmount then
Zerotorescue@2 392 -- We lost a mail
Zerotorescue@2 393
Zerotorescue@3 394 -- TODO: NYI: May need to delay this until the mail is actually deleted
Zerotorescue@3 395
Zerotorescue@3 396 self:Debug("MO_MAIL_EMPTIED");
Zerotorescue@3 397
Zerotorescue@2 398 -- Yell that we successfully opened/removed a mail
Zerotorescue@3 399 self:SendMessage("MO_MAIL_EMPTIED");
Zerotorescue@3 400 elseif (currentMailWithAttachments == 50 and tempLastAmount == 50) then
Zerotorescue@0 401 if not IsShiftKeyDown() then
Zerotorescue@0 402 -- Allow overriding of mailopening with the shift key
Zerotorescue@0 403
Zerotorescue@0 404 -- Open the current mail
Zerotorescue@0 405 self:ScheduleOpen(false);
Zerotorescue@0 406 end
Zerotorescue@0 407 end
Zerotorescue@0 408 end
Zerotorescue@0 409
Zerotorescue@0 410 function MailOpener:ScheduleOpen(continued)
Zerotorescue@0 411 if lastAmount > 0 then
Zerotorescue@0 412 local waitTime;
Zerotorescue@0 413 if continued then
Zerotorescue@0 414 waitTime = self.db.profile.general.waitTime;
Zerotorescue@0 415 else
Zerotorescue@0 416 -- Even though this is not a continuation and should be instant, we set a .5 second timer to prevent multiple calls of the OpenNow function
Zerotorescue@0 417 waitTime = self.db.profile.general.initialDelay;
Zerotorescue@0 418 end
Zerotorescue@0 419
Zerotorescue@0 420 -- Stop previous timer
Zerotorescue@0 421 self:CancelTimer(self.tmrOpenNow, true);
Zerotorescue@0 422 -- Schedule the next open
Zerotorescue@0 423 self.tmrOpenNow = self:ScheduleTimer("OpenNow", waitTime);
Zerotorescue@0 424 end
Zerotorescue@0 425 end
Zerotorescue@0 426
Zerotorescue@0 427 function MailOpener:OpenNow()
Zerotorescue@8 428 self:Debug("OpenNow (" .. ((MailAddonBusy and "1") or "0") .. ")");
Zerotorescue@8 429 if MailFrame:IsVisible() and AutoOpenMail then
Zerotorescue@0 430 self:Debug("OpenNow");
Zerotorescue@0 431
Zerotorescue@0 432 -- BeanCounter is the only addon hiding the mail close button while busy, so we can look for that
Zerotorescue@0 433 local BeanCounterActive = not InboxCloseButton:IsVisible();
Zerotorescue@0 434
Zerotorescue@8 435 if not BeanCounterActive and not MailAddonBusy then
Zerotorescue@8 436 -- No other addon is currently active
Zerotorescue@0 437
Zerotorescue@0 438 self:CancelTimer(self.tmrTryAgain, true); -- Insurance
Zerotorescue@0 439
Zerotorescue@0 440 if QuickAuctionsAutoMail then
Zerotorescue@0 441 -- Remember the last known quick auctions status
Zerotorescue@0 442 lastQuickAuctionsStatus = QuickAuctionsAutoMail:GetChecked();
Zerotorescue@0 443 end
Zerotorescue@0 444 if self.db.profile.general.autoDisableQAAutoMail and self.QuickAuctionsEnabled and QuickAuctionsAutoMail and QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@0 445 -- If auto disable "QA Auto mail" is enabled and QA's auto mail is currently toggled on, turn it off
Zerotorescue@0 446 -- We need to do this with a :click to trigger the right events
Zerotorescue@0 447
Zerotorescue@0 448 self:Debug("Turning automail |cffff0000off|r.");
Zerotorescue@0 449
Zerotorescue@0 450 QuickAuctionsAutoMail:Click();
Zerotorescue@0 451 end
Zerotorescue@0 452
Zerotorescue@8 453 MailAddonBusy = self:GetName();
Zerotorescue@0 454
Zerotorescue@0 455 self:Debug("MO_OPEN_MAIL");
Zerotorescue@0 456
Zerotorescue@0 457 -- Summon the mail opening gods
Zerotorescue@0 458 self:SendMessage("MO_OPEN_MAIL");
Zerotorescue@0 459 else
Zerotorescue@8 460 -- Another addon is ACTIVE
Zerotorescue@8 461 self:Debug("Another addon active, waiting .5 seconds...");
Zerotorescue@0 462
Zerotorescue@0 463 self:CancelTimer(self.tmrTryAgain, true); -- Insurance
Zerotorescue@8 464 -- Try again every 0.5 seconds
Zerotorescue@0 465 self.tmrTryAgain = self:ScheduleTimer("OpenNow", 0.5);
Zerotorescue@0 466 end
Zerotorescue@0 467 end
Zerotorescue@0 468 end
Zerotorescue@0 469
Zerotorescue@0 470 function MailOpener:MO_OPEN_COMPLETE()
Zerotorescue@8 471 if MailAddonBusy == self:GetName() then
Zerotorescue@8 472 MailAddonBusy = nil;
Zerotorescue@8 473 end
Zerotorescue@1 474
Zerotorescue@1 475 -- Try a recheck
Zerotorescue@1 476 self:Recheck();
Zerotorescue@1 477
Zerotorescue@0 478 local current, total = GetInboxNumItems();
Zerotorescue@0 479
Zerotorescue@0 480 if (total - current) == 0 then
Zerotorescue@3 481 -- There is probably no unopenable mail remaining, so play the sound (if enabled)
Zerotorescue@3 482
Zerotorescue@0 483 if self.db.profile.notifications.mailboxEmptySound and (not MailOpener.db.profile.notifications.mailboxEmptySoundOnlyOnce or not mailboxEmptySoundPlayed) then
Zerotorescue@0 484 PlaySoundFile(self.db.profile.notifications.mailboxEmptySoundFile);
Zerotorescue@0 485 mailboxEmptySoundPlayed = true;
Zerotorescue@0 486 end
Zerotorescue@0 487 end
Zerotorescue@0 488
Zerotorescue@3 489 if self.QuickAuctionsEnabled then
Zerotorescue@3 490 -- Quick Auctions enabled?
Zerotorescue@3 491 -- Toggle automailing as per settings
Zerotorescue@0 492
Zerotorescue@3 493 if self.db.profile.general.autoReenableQAAutoMail and QuickAuctionsAutoMail and not QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@3 494 -- If auto re-enable "QA Auto mail" is enabled and QA's auto mail is currently toggled OFF, turn it on
Zerotorescue@3 495 -- We need to do this with a :click to trigger the right events
Zerotorescue@3 496
Zerotorescue@0 497 self:Debug("Turning automail |cff00ff00on|r.");
Zerotorescue@3 498
Zerotorescue@3 499 QuickAuctionsAutoMail:Click();
Zerotorescue@3 500 elseif self.db.profile.general.autoSetBackQAAutoMail and QuickAuctionsAutoMail and lastQuickAuctionsStatus ~= QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@3 501 -- If auto set back "QA Auto mail" is enabled and QA's auto mail is currently not the same as it was before starting, toggle it
Zerotorescue@3 502 -- We need to do this with a :click to trigger the right events
Zerotorescue@3 503
Zerotorescue@3 504 if lastQuickAuctionsStatus then
Zerotorescue@3 505 self:Debug("Turning automail |cff00ff00on|r.");
Zerotorescue@3 506 else
Zerotorescue@3 507 self:Debug("Turning automail |cffff0000off|r.");
Zerotorescue@3 508 end
Zerotorescue@3 509
Zerotorescue@3 510 QuickAuctionsAutoMail:Click();
Zerotorescue@0 511 end
Zerotorescue@0 512 end
Zerotorescue@0 513
Zerotorescue@0 514 if self.db.profile.general.continueOpening then
Zerotorescue@0 515 self:ScheduleOpen(true);
Zerotorescue@0 516 end
Zerotorescue@0 517 end
Zerotorescue@0 518
Zerotorescue@0 519 -- Run another CheckInbox
Zerotorescue@0 520 function MailOpener:Recheck()
Zerotorescue@0 521 self:Debug("|cffffff00Recheck|r");
Zerotorescue@0 522
Zerotorescue@0 523 -- Freshlist prevents this from being run too often
Zerotorescue@0 524 -- It is set to true after a server sync
Zerotorescue@0 525 -- and set to false 61 seconds afterwards with a recheck called instantly after it
Zerotorescue@3 526
Zerotorescue@3 527 -- We're not refreshing while we're opening because it is automatically done when current batch was completely opened
Zerotorescue@8 528 if not freshList and MailFrame:IsVisible() then
Zerotorescue@0 529 self:Debug("|cff00ff00Recheck|r");
Zerotorescue@0 530
Zerotorescue@0 531 -- If this isn't a fresh list (so messages weren't received within the last 60 seconds) and the mailbox wasn't closed
Zerotorescue@0 532
Zerotorescue@0 533 -- BeanCounter is the only addon hiding the mail close button while busy, so we can look for that
Zerotorescue@0 534 local BeanCounterActive = not InboxCloseButton:IsVisible();
Zerotorescue@0 535
Zerotorescue@8 536 if not BeanCounterActive and AutoOpenMail and not MailAddonBusy then
Zerotorescue@0 537 -- Query the server
Zerotorescue@0 538 CheckInbox();
Zerotorescue@0 539 end
Zerotorescue@0 540
Zerotorescue@0 541 -- Stop previous timer
Zerotorescue@0 542 self:CancelTimer(self.tmrRecheck, true);
Zerotorescue@0 543 -- Keep trying until it works
Zerotorescue@0 544 self.tmrRecheck = self:ScheduleTimer("Recheck", 2);
Zerotorescue@0 545
Zerotorescue@0 546 self:Debug("tmrRecheck 2");
Zerotorescue@0 547 end
Zerotorescue@0 548 end
Zerotorescue@0 549
Zerotorescue@0 550 -- Stop checking for new mail and unregister the events we needed
Zerotorescue@0 551 function MailOpener:Stop()
Zerotorescue@0 552 if self.db.profile.notifications.bye then
Zerotorescue@0 553 print("|cff15ff00Mail Opener|r: Have a nice day. :)");
Zerotorescue@0 554 end
Zerotorescue@0 555
Zerotorescue@8 556 if MailAddonBusy == self:GetName() then
Zerotorescue@8 557 MailAddonBusy = nil;
Zerotorescue@8 558 end
Zerotorescue@0 559
Zerotorescue@0 560 -- We won't need this anymore
Zerotorescue@0 561 self:UnregisterEvent("MAIL_CLOSED");
Zerotorescue@0 562 self:UnregisterEvent("PLAYER_LEAVING_WORLD");
Zerotorescue@0 563 self:UnregisterEvent("MAIL_INBOX_UPDATE");
Zerotorescue@0 564
Zerotorescue@0 565 -- Messages
Zerotorescue@0 566 self:UnregisterMessage("MO_OPEN_COMPLETE");
Zerotorescue@0 567
Zerotorescue@0 568 -- Timers
Zerotorescue@0 569 self:CancelTimer(self.tmrTryAgain, true);
Zerotorescue@0 570 self:CancelTimer(self.tmrOpenNow, true);
Zerotorescue@0 571
Zerotorescue@0 572 -- If we wait with disabling QA automail until MAIL_SHOW, QA will beat us to it and already start sending stuff
Zerotorescue@0 573 self:ToggleQAStatus();
Zerotorescue@0 574 end
Zerotorescue@0 575
Zerotorescue@0 576 function MailOpener:Debug(t)
Zerotorescue@0 577 if not self.debugChannel and self.debugChannel ~= false then
Zerotorescue@0 578 -- We want to check just once, so if you add a debug channel later just do a /reload (registering an event for this is wasted resources)
Zerotorescue@0 579 self.debugChannel = false;
Zerotorescue@0 580
Zerotorescue@0 581 for i = 1, NUM_CHAT_WINDOWS do
Zerotorescue@0 582 local name = GetChatWindowInfo(i);
Zerotorescue@0 583
Zerotorescue@0 584 if name:upper() == "DEBUG" then
Zerotorescue@0 585 self.debugChannel = _G["ChatFrame" .. i];
Zerotorescue@0 586 end
Zerotorescue@0 587 end
Zerotorescue@0 588 end
Zerotorescue@0 589
Zerotorescue@0 590 if self.debugChannel then
Zerotorescue@0 591 self.debugChannel:AddMessage(t);
Zerotorescue@0 592 end
Zerotorescue@0 593 end
Zerotorescue@0 594
Zerotorescue@0 595 -- Enable our config module if it's disabled and make a reference to it
Zerotorescue@0 596 function MailOpener:EnableConfigModule()
Zerotorescue@0 597 if not MailOpenerConfig then
Zerotorescue@0 598 MailOpenerConfig = self:GetModule("Config");
Zerotorescue@0 599 MailOpenerConfig:Enable();
Zerotorescue@0 600 end
Zerotorescue@0 601 end
Zerotorescue@0 602
Zerotorescue@0 603 -- Toggle Postal's opening modules on or off
Zerotorescue@0 604 function MailOpener:TogglePostalModule(name, status)
Zerotorescue@0 605 if MailOpener.PostalEnabled and Postal then
Zerotorescue@0 606 -- Postal must be enabled
Zerotorescue@0 607
Zerotorescue@3 608 -- Toggle module (let Postal handle this)
Zerotorescue@3 609 Postal.ToggleModule(nil, name, Postal:GetModule(name), status);
Zerotorescue@0 610 end
Zerotorescue@0 611 end
Zerotorescue@0 612
Zerotorescue@0 613 -- Change Quick Auction's auto mail status based on our prefered settings
Zerotorescue@0 614 function MailOpener:ToggleQAStatus()
Zerotorescue@0 615 self:Debug("defaultQAStatus:" .. self.db.profile.general.defaultQAStatus);
Zerotorescue@0 616
Zerotorescue@0 617 if self.QuickAuctionsEnabled and self.db.profile.general.defaultQAStatus ~= "__remember" and QuickAuctionsAutoMail then
Zerotorescue@0 618 if self.db.profile.general.defaultQAStatus == "_enabled" and not QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@0 619 self:Debug("Turning automail |cff00ff00on|r.");
Zerotorescue@0 620
Zerotorescue@0 621 QuickAuctionsAutoMail:Click();
Zerotorescue@0 622 elseif self.db.profile.general.defaultQAStatus == "disabled" and QuickAuctionsAutoMail:GetChecked() then
Zerotorescue@0 623 self:Debug("Turning automail |cffff0000off|r.");
Zerotorescue@0 624
Zerotorescue@0 625 QuickAuctionsAutoMail:Click();
Zerotorescue@0 626 end
Zerotorescue@0 627 end
Zerotorescue@0 628 end
Zerotorescue@0 629
Zerotorescue@0 630 function MailOpener:FormatMoney(copper)
Zerotorescue@0 631 local gold = floor( copper / 10000 );
Zerotorescue@0 632 local silver = floor( ( copper - ( gold * 10000 ) ) / 100 );
Zerotorescue@0 633 local copper = mod(copper, 100);
Zerotorescue@0 634
Zerotorescue@0 635 if gold > 0 then
Zerotorescue@0 636 return format(GOLD_AMOUNT_TEXTURE .. " " .. SILVER_AMOUNT_TEXTURE .. " " .. COPPER_AMOUNT_TEXTURE, gold, 0, 0, silver, 0, 0, copper, 0, 0);
Zerotorescue@0 637 elseif silver > 0 then
Zerotorescue@0 638 return format(SILVER_AMOUNT_TEXTURE .. " " .. COPPER_AMOUNT_TEXTURE, silver, 0, 0, copper, 0, 0);
Zerotorescue@0 639 else
Zerotorescue@0 640 return format(COPPER_AMOUNT_TEXTURE, copper, 0, 0);
Zerotorescue@0 641 end
Zerotorescue@0 642 end
Zerotorescue@0 643
Zerotorescue@7 644 -- General copy window for multiple things (clickable URLs, the time remaining, and such)
Zerotorescue@0 645 StaticPopupDialogs["MailOpenerCopyWindow"] = {
Zerotorescue@0 646 text = "Please CTRL-C to copy.",
Zerotorescue@0 647 button2 = CLOSE,
Zerotorescue@0 648 hasEditBox = 1,
Zerotorescue@0 649 hasWideEditBox = 1,
Zerotorescue@0 650 OnShow = function()
Zerotorescue@0 651 local editBox = _G[this:GetName().."WideEditBox"];
Zerotorescue@0 652 if editBox and MailOpener.currentPopupContents then
Zerotorescue@0 653 editBox:SetText(MailOpener.currentPopupContents);
Zerotorescue@0 654 editBox:SetFocus();
Zerotorescue@0 655 editBox:HighlightText(0);
Zerotorescue@0 656 end
Zerotorescue@0 657
Zerotorescue@0 658 -- Position the close button in the middle
Zerotorescue@0 659 local button = _G[this:GetName().."Button2"];
Zerotorescue@0 660 if button then
Zerotorescue@0 661 -- Remove previous know position
Zerotorescue@0 662 button:ClearAllPoints();
Zerotorescue@0 663 button:SetWidth(200);
Zerotorescue@0 664 -- Reposition in the center
Zerotorescue@0 665 button:SetPoint("CENTER", editBox, "CENTER", 0, -30);
Zerotorescue@0 666 end
Zerotorescue@0 667 end,
Zerotorescue@0 668 EditBoxOnEscapePressed = function()
Zerotorescue@0 669 this:GetParent():Hide();
Zerotorescue@0 670 end,
Zerotorescue@0 671 timeout = 0,
Zerotorescue@0 672 whileDead = 1,
Zerotorescue@0 673 hideOnEscape = 1,
Zerotorescue@0 674 maxLetters = 1024,
Zerotorescue@1 675 };
Zerotorescue@1 676
Zerotorescue@7 677 --BETA: The below either has to be removed or changed when releasing
Zerotorescue@0 678
Zerotorescue@7 679 --[[
Zerotorescue@7 680 BETA/ALPHA request box
Zerotorescue@0 681 function MailOpener:ShowBetaPopup()
Zerotorescue@0 682 function TableDump(key, val, jumps)
Zerotorescue@0 683 local cache = "";
Zerotorescue@0 684
Zerotorescue@0 685 if not jumps then
Zerotorescue@0 686 jumps = 0;
Zerotorescue@0 687 end
Zerotorescue@0 688
Zerotorescue@0 689 local spacer = "";
Zerotorescue@0 690 if jumps > 0 then
Zerotorescue@0 691 for i = 1, jumps do
Zerotorescue@0 692 spacer = spacer .. " ";
Zerotorescue@0 693 end
Zerotorescue@0 694 end
Zerotorescue@0 695
Zerotorescue@0 696 if type(val) == "table" then
Zerotorescue@0 697 cache = cache .. spacer .. key .. " = {\n";
Zerotorescue@0 698 foreach(val, function(k, v)
Zerotorescue@0 699 cache = cache .. TableDump(k, v, (jumps + 1));
Zerotorescue@0 700 end);
Zerotorescue@0 701 cache = cache .. spacer .. "},\n";
Zerotorescue@0 702 else
Zerotorescue@0 703 cache = cache .. spacer .. key .. " = " .. tostring(val) .. ",\n";
Zerotorescue@0 704 end
Zerotorescue@0 705
Zerotorescue@0 706 return cache;
Zerotorescue@0 707 end
Zerotorescue@0 708
Zerotorescue@0 709 local cache = "";
Zerotorescue@0 710 foreach(MailOpener.db.profile, function(k, v)
Zerotorescue@0 711 cache = cache .. TableDump(k, v, 0);
Zerotorescue@0 712 end);
Zerotorescue@0 713
Zerotorescue@0 714 local AceGUI = LibStub("AceGUI-3.0");
Zerotorescue@0 715 local frame = AceGUI:Create("Frame");
Zerotorescue@0 716 frame:SetTitle("Mail Opener ALPHA");
Zerotorescue@0 717 frame:SetWidth(575);
Zerotorescue@0 718 frame:SetHeight(375);
Zerotorescue@0 719
Zerotorescue@0 720 -- Add a normal description label
Zerotorescue@0 721 local desc = AceGUI:Create("Label");
Zerotorescue@0 722 desc:SetText("|cff00ff00After you have been using Mail Opener for a while and configured it just as you want it to be, please report your favorite settings by copying the text below at either of the below links. Thanks in advance!|r\n\n");
Zerotorescue@0 723 desc:SetFont(GameFontHighlightSmall:GetFont(), 13);
Zerotorescue@0 724 desc:SetFullWidth(true);
Zerotorescue@0 725 frame:AddChild(desc);
Zerotorescue@0 726
Zerotorescue@0 727 -- Add a MultiLineEditBox
Zerotorescue@0 728 local settingsMLEEB = AceGUI:Create("MultiLineEditBox");
Zerotorescue@0 729 settingsMLEEB:SetText(cache);
Zerotorescue@0 730 settingsMLEEB:SetLabel("Hit CTRL-A to select all and CTRL-C to copy the text. You can then use CTRL-V to paste.");
Zerotorescue@0 731 settingsMLEEB:SetFullWidth(true);
Zerotorescue@0 732 settingsMLEEB:SetNumLines(8);
Zerotorescue@0 733 settingsMLEEB:DisableButton(true);
Zerotorescue@0 734 settingsMLEEB:SetCallback("OnTextChanged", function()
Zerotorescue@0 735 settingsMLEEB:SetText(cache);
Zerotorescue@0 736 end);
Zerotorescue@0 737 frame:AddChild(settingsMLEEB);
Zerotorescue@0 738
Zerotorescue@0 739 -- Empty line between the two links
Zerotorescue@0 740 local label = AceGUI:Create("Label");
Zerotorescue@0 741 label:SetText("Please post the above text at either of these two links:");
Zerotorescue@0 742 label:SetFullWidth(true);
Zerotorescue@0 743 frame:AddChild(label);
Zerotorescue@0 744
Zerotorescue@0 745 local desc1 = AceGUI:Create("InteractiveLabel");
Zerotorescue@0 746 desc1:SetText("|cff00bbbb[http://wow.curseforge.com/addons/mailopener/create-ticket/]|r");
Zerotorescue@0 747 desc1:SetFont(GameFontHighlightSmall:GetFont(), 13);
Zerotorescue@0 748 desc1:SetFullWidth(true);
Zerotorescue@0 749 desc1:SetCallback("OnClick", function()
Zerotorescue@0 750 MailOpener.currentPopupContents = "http://wow.curseforge.com/addons/mailopener/create-ticket/";
Zerotorescue@0 751
Zerotorescue@0 752 StaticPopup_Show("MailOpenerCopyWindow");
Zerotorescue@0 753 end);
Zerotorescue@0 754 desc1:SetCallback("OnEnter", function()
Zerotorescue@0 755 frame:SetStatusText("Click to copy this URL.");
Zerotorescue@0 756 end);
Zerotorescue@0 757 desc1:SetCallback("OnLeave", function()
Zerotorescue@0 758 frame:SetStatusText("");
Zerotorescue@0 759 end);
Zerotorescue@0 760 frame:AddChild(desc1);
Zerotorescue@0 761
Zerotorescue@0 762 -- Empty line between the two links
Zerotorescue@0 763 local spacer = AceGUI:Create("Label");
Zerotorescue@0 764 spacer:SetText(" ");
Zerotorescue@0 765 frame:AddChild(spacer);
Zerotorescue@0 766
Zerotorescue@0 767 local desc2 = AceGUI:Create("InteractiveLabel");
Zerotorescue@0 768 desc2:SetText("|cff00bbbb[http://20kleveling.com/JMTCforum/posting.php?mode=reply&f=9&t=1403]|r");
Zerotorescue@0 769 desc2:SetFont(GameFontHighlightSmall:GetFont(), 13);
Zerotorescue@0 770 desc2:SetFullWidth(true);
Zerotorescue@0 771 desc2:SetCallback("OnClick", function()
Zerotorescue@0 772 MailOpener.currentPopupContents = "http://20kleveling.com/JMTCforum/posting.php?mode=reply&f=9&t=1403";
Zerotorescue@0 773
Zerotorescue@0 774 StaticPopup_Show("MailOpenerCopyWindow");
Zerotorescue@0 775 end);
Zerotorescue@0 776 desc2:SetCallback("OnEnter", function()
Zerotorescue@0 777 frame:SetStatusText("Click to copy this URL.");
Zerotorescue@0 778 end);
Zerotorescue@0 779 desc2:SetCallback("OnLeave", function()
Zerotorescue@0 780 frame:SetStatusText("");
Zerotorescue@0 781 end);
Zerotorescue@0 782 frame:AddChild(desc2);
Zerotorescue@0 783
Zerotorescue@0 784 -- Empty line between the two links
Zerotorescue@0 785 local label = AceGUI:Create("Label");
Zerotorescue@0 786 label:SetText("\n\nps. You can always view this window again at a later time by clicking the \"Config\" button in the mail frame.\nps2. The information above is completely Mail Opener related. It will be used to determine the best default settings.");
Zerotorescue@0 787 label:SetFullWidth(true);
Zerotorescue@0 788 frame:AddChild(label);
Zerotorescue@7 789 end
Zerotorescue@7 790 ]]