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