yellowfive@57
|
1 local Amr = LibStub("AceAddon-3.0"):GetAddon("AskMrRobot")
|
yellowfive@57
|
2 local L = LibStub("AceLocale-3.0"):GetLocale("AskMrRobot", true)
|
yellowfive@57
|
3 local AceGUI = LibStub("AceGUI-3.0")
|
yellowfive@57
|
4
|
yellowfive@133
|
5 local _lblLogging = nil
|
yellowfive@57
|
6 local _btnToggle = nil
|
yellowfive@57
|
7 local _panelUndoWipe = nil
|
yellowfive@57
|
8 local _chkAutoAll = nil
|
yellowfive@57
|
9 local _autoChecks = nil
|
yellowfive@57
|
10
|
yellowfive@159
|
11 local function createDifficultyCheckBox(instanceId, difficultyId, container)
|
yellowfive@57
|
12 local chk = AceGUI:Create("AmrUiCheckBox")
|
yellowfive@159
|
13 container:AddChild(chk)
|
yellowfive@57
|
14 chk:SetText(L.DifficultyNames[difficultyId])
|
yellowfive@57
|
15 chk:SetCallback("OnClick", function(widget)
|
yellowfive@57
|
16 Amr:ToggleAutoLog(instanceId, difficultyId)
|
yellowfive@57
|
17 end)
|
yellowfive@57
|
18
|
yellowfive@57
|
19 _autoChecks[instanceId][difficultyId] = chk
|
yellowfive@57
|
20 return chk
|
yellowfive@57
|
21 end
|
yellowfive@57
|
22
|
yellowfive@57
|
23 -- render a group of controls for auto-logging of a raid zone
|
yellowfive@137
|
24 local function renderAutoLogSection(instanceId, container, i, autoLbls, autoChks)
|
yellowfive@57
|
25 _autoChecks[instanceId] = {}
|
yellowfive@57
|
26
|
yellowfive@57
|
27 local lbl = AceGUI:Create("AmrUiLabel")
|
yellowfive@124
|
28 container:AddChild(lbl)
|
yellowfive@57
|
29 lbl:SetWidth(200)
|
yellowfive@57
|
30 lbl:SetText(L.InstanceNames[instanceId])
|
yellowfive@57
|
31 lbl:SetFont(Amr.CreateFont("Regular", 20, Amr.Colors.White))
|
yellowfive@57
|
32
|
yellowfive@137
|
33 if i == 1 then
|
yellowfive@137
|
34 lbl:SetPoint("TOPLEFT", _chkAutoAll.frame, "BOTTOMLEFT", -1, -15)
|
yellowfive@137
|
35 elseif i % 2 == 0 then
|
yellowfive@137
|
36 lbl:SetPoint("TOPLEFT", autoLbls[i - 1].frame, "TOPRIGHT", 40, 0)
|
yellowfive@137
|
37 else
|
yellowfive@137
|
38 lbl:SetPoint("TOPLEFT", autoChks[i - 2].frame, "BOTTOMLEFT", 0, -30)
|
yellowfive@137
|
39 end
|
yellowfive@137
|
40
|
yellowfive@57
|
41 local line = AceGUI:Create("AmrUiPanel")
|
yellowfive@137
|
42 container:AddChild(line)
|
yellowfive@57
|
43 line:SetHeight(1)
|
yellowfive@57
|
44 line:SetBackgroundColor(Amr.Colors.White)
|
yellowfive@57
|
45 line:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 1, -7)
|
yellowfive@57
|
46 line:SetPoint("TOPRIGHT", lbl.frame, "BOTTOMRIGHT", 0, -7)
|
yellowfive@57
|
47
|
yellowfive@159
|
48 local chkMythic = createDifficultyCheckBox(instanceId, Amr.Difficulties.Mythic, container)
|
yellowfive@57
|
49 chkMythic:SetPoint("TOPLEFT", line.frame, "BOTTOMLEFT", 0, -8)
|
yellowfive@159
|
50
|
yellowfive@159
|
51 local chkNormal = createDifficultyCheckBox(instanceId, Amr.Difficulties.Normal, container)
|
yellowfive@57
|
52 chkNormal:SetPoint("TOPLEFT", line.frame, "BOTTOMLEFT", 0, -30)
|
yellowfive@137
|
53
|
yellowfive@57
|
54 -- find the widest of mythic/normal
|
yellowfive@57
|
55 local w = math.max(chkMythic:GetWidth(), chkNormal:GetWidth())
|
yellowfive@57
|
56
|
yellowfive@159
|
57 local chkHeroic = createDifficultyCheckBox(instanceId, Amr.Difficulties.Heroic, container)
|
yellowfive@57
|
58 chkHeroic:SetPoint("TOPLEFT", line.frame, "BOTTOMLEFT", w + 20, -8)
|
yellowfive@57
|
59
|
yellowfive@159
|
60 local chkLfr = createDifficultyCheckBox(instanceId, Amr.Difficulties.Lfr, container)
|
yellowfive@57
|
61 chkLfr:SetPoint("TOPLEFT", line.frame, "BOTTOMLEFT", w + 20, -30)
|
yellowfive@137
|
62
|
yellowfive@61
|
63 return lbl, chkNormal
|
yellowfive@57
|
64 end
|
yellowfive@57
|
65
|
yellowfive@57
|
66 -- renders the main UI for the Combat Log tab
|
yellowfive@57
|
67 function Amr:RenderTabLog(container)
|
yellowfive@57
|
68
|
yellowfive@57
|
69 -- main commands
|
yellowfive@57
|
70 _btnToggle = AceGUI:Create("AmrUiButton")
|
yellowfive@159
|
71 container:AddChild(_btnToggle)
|
yellowfive@57
|
72 _btnToggle:SetText(L.LogButtonStartText)
|
yellowfive@57
|
73 _btnToggle:SetBackgroundColor(Amr.Colors.Green)
|
yellowfive@57
|
74 _btnToggle:SetFont(Amr.CreateFont("Bold", 16, Amr.Colors.White))
|
yellowfive@57
|
75 _btnToggle:SetWidth(200)
|
yellowfive@57
|
76 _btnToggle:SetHeight(26)
|
yellowfive@57
|
77 _btnToggle:SetCallback("OnClick", function() Amr:ToggleLogging() end)
|
yellowfive@124
|
78 _btnToggle:SetPoint("TOPLEFT", container.content, "TOPLEFT", 0, -40)
|
yellowfive@57
|
79
|
yellowfive@57
|
80 _lblLogging = AceGUI:Create("AmrUiLabel")
|
yellowfive@124
|
81 container:AddChild(_lblLogging)
|
yellowfive@57
|
82 _lblLogging:SetText(L.LogNote)
|
yellowfive@57
|
83 _lblLogging:SetWidth(200)
|
yellowfive@57
|
84 _lblLogging:SetFont(Amr.CreateFont("Italic", 14, Amr.Colors.BrightGreen))
|
yellowfive@57
|
85 _lblLogging:SetJustifyH("MIDDLE")
|
yellowfive@57
|
86 _lblLogging:SetPoint("TOP", _btnToggle.frame, "BOTTOM", 0, -5)
|
yellowfive@57
|
87
|
yellowfive@57
|
88 local btnReload = AceGUI:Create("AmrUiButton")
|
yellowfive@159
|
89 container:AddChild(btnReload)
|
yellowfive@57
|
90 btnReload:SetText(L.LogButtonReloadText)
|
yellowfive@57
|
91 btnReload:SetBackgroundColor(Amr.Colors.Blue)
|
yellowfive@57
|
92 btnReload:SetFont(Amr.CreateFont("Bold", 16, Amr.Colors.White))
|
yellowfive@57
|
93 btnReload:SetWidth(200)
|
yellowfive@57
|
94 btnReload:SetHeight(26)
|
yellowfive@57
|
95 btnReload:SetCallback("OnClick", ReloadUI)
|
yellowfive@124
|
96 btnReload:SetPoint("TOPLEFT", _btnToggle.frame, "TOPRIGHT", 40, 0)
|
yellowfive@57
|
97
|
yellowfive@91
|
98 --[[
|
yellowfive@57
|
99 local lbl = AceGUI:Create("AmrUiLabel")
|
yellowfive@57
|
100 lbl:SetText(L.LogReloadNote)
|
yellowfive@57
|
101 lbl:SetWidth(200)
|
yellowfive@57
|
102 lbl:SetFont(Amr.CreateFont("Italic", 14, Amr.Colors.TextTan))
|
yellowfive@57
|
103 lbl:SetJustifyH("MIDDLE")
|
yellowfive@57
|
104 lbl:SetPoint("TOP", btnReload.frame, "BOTTOM", 0, -5)
|
yellowfive@57
|
105 container:AddChild(lbl)
|
yellowfive@57
|
106
|
yellowfive@57
|
107 -- container for undo wipe so we can hide/show it all
|
yellowfive@57
|
108 _panelUndoWipe = AceGUI:Create("AmrUiPanel")
|
yellowfive@57
|
109 _panelUndoWipe:SetLayout("None")
|
yellowfive@57
|
110 _panelUndoWipe:SetBackgroundColor(Amr.Colors.Black, 0)
|
yellowfive@57
|
111 _panelUndoWipe:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -40)
|
yellowfive@57
|
112 container:AddChild(_panelUndoWipe)
|
yellowfive@57
|
113
|
yellowfive@57
|
114 local btnUndoWipe = AceGUI:Create("AmrUiButton")
|
yellowfive@57
|
115 btnUndoWipe:SetText(L.LogButtonUndoWipeText)
|
yellowfive@57
|
116 btnUndoWipe:SetBackgroundColor(Amr.Colors.Orange)
|
yellowfive@57
|
117 btnUndoWipe:SetFont(Amr.CreateFont("Bold", 16, Amr.Colors.White))
|
yellowfive@57
|
118 btnUndoWipe:SetWidth(200)
|
yellowfive@57
|
119 btnUndoWipe:SetHeight(26)
|
yellowfive@57
|
120 btnUndoWipe:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -40)
|
yellowfive@57
|
121 btnUndoWipe:SetCallback("OnClick", function() Amr:UndoWipe() end)
|
yellowfive@57
|
122 _panelUndoWipe:AddChild(btnUndoWipe)
|
yellowfive@57
|
123
|
yellowfive@57
|
124 lbl = AceGUI:Create("AmrUiLabel")
|
yellowfive@57
|
125 lbl:SetText(L.LogUndoWipeNote)
|
yellowfive@57
|
126 lbl:SetWidth(200)
|
yellowfive@57
|
127 lbl:SetFont(Amr.CreateFont("Italic", 14, Amr.Colors.TextTan))
|
yellowfive@57
|
128 lbl:SetJustifyH("MIDDLE")
|
yellowfive@57
|
129 lbl:SetPoint("TOP", btnUndoWipe.frame, "BOTTOM", 0, -5)
|
yellowfive@57
|
130 _panelUndoWipe:AddChild(lbl)
|
yellowfive@57
|
131
|
yellowfive@57
|
132 local lbl2 = AceGUI:Create("AmrUiLabel")
|
yellowfive@57
|
133 lbl2:SetText(L.LogUndoWipeDate(date("%B %d", time()), date("%I:%M %p", time())))
|
yellowfive@57
|
134 lbl2:SetWidth(200)
|
yellowfive@57
|
135 lbl2:SetFont(Amr.CreateFont("Italic", 14, Amr.Colors.TextTan))
|
yellowfive@57
|
136 lbl2:SetJustifyH("MIDDLE")
|
yellowfive@57
|
137 lbl2:SetPoint("TOP", lbl.frame, "BOTTOM", 0, -2)
|
yellowfive@57
|
138 _panelUndoWipe:AddChild(lbl2)
|
yellowfive@57
|
139
|
yellowfive@57
|
140 local btnWipe = AceGUI:Create("AmrUiButton")
|
yellowfive@57
|
141 btnWipe:SetText(L.LogButtonWipeText)
|
yellowfive@57
|
142 btnWipe:SetBackgroundColor(Amr.Colors.Orange)
|
yellowfive@57
|
143 btnWipe:SetFont(Amr.CreateFont("Bold", 16, Amr.Colors.White))
|
yellowfive@57
|
144 btnWipe:SetWidth(200)
|
yellowfive@57
|
145 btnWipe:SetHeight(26)
|
yellowfive@57
|
146 btnWipe:SetPoint("TOPRIGHT", btnUndoWipe.frame, "TOPLEFT", -40, 0)
|
yellowfive@57
|
147 btnWipe:SetCallback("OnClick", function() Amr:Wipe() end)
|
yellowfive@57
|
148 container:AddChild(btnWipe)
|
yellowfive@91
|
149
|
yellowfive@57
|
150 lbl = AceGUI:Create("AmrUiLabel")
|
yellowfive@57
|
151 lbl:SetText(L.LogWipeNote)
|
yellowfive@57
|
152 lbl:SetWidth(200)
|
yellowfive@57
|
153 lbl:SetFont(Amr.CreateFont("Italic", 14, Amr.Colors.TextTan))
|
yellowfive@57
|
154 lbl:SetJustifyH("MIDDLE")
|
yellowfive@57
|
155 lbl:SetPoint("TOP", btnWipe.frame, "BOTTOM", 0, -5)
|
yellowfive@57
|
156 container:AddChild(lbl)
|
yellowfive@57
|
157
|
yellowfive@57
|
158 lbl2 = AceGUI:Create("AmrUiLabel")
|
yellowfive@57
|
159 lbl2:SetText(L.LogWipeNote2("/amr wipe"))
|
yellowfive@57
|
160 lbl2:SetWidth(200)
|
yellowfive@57
|
161 lbl2:SetFont(Amr.CreateFont("Italic", 14, Amr.Colors.TextTan))
|
yellowfive@57
|
162 lbl2:SetJustifyH("MIDDLE")
|
yellowfive@57
|
163 lbl2:SetPoint("TOP", lbl.frame, "BOTTOM", 0, -2)
|
yellowfive@57
|
164 container:AddChild(lbl2)
|
yellowfive@91
|
165 ]]
|
yellowfive@57
|
166
|
yellowfive@57
|
167 -- auto-logging controls
|
yellowfive@91
|
168 local lbl = AceGUI:Create("AmrUiLabel")
|
yellowfive@124
|
169 container:AddChild(lbl)
|
yellowfive@57
|
170 lbl:SetWidth(600)
|
yellowfive@57
|
171 lbl:SetText(L.LogAutoTitle)
|
yellowfive@57
|
172 lbl:SetFont(Amr.CreateFont("Bold", 24, Amr.Colors.TextHeaderActive))
|
yellowfive@91
|
173 lbl:SetPoint("TOPLEFT", _btnToggle.frame, "BOTTOMLEFT", 0, -40)
|
yellowfive@57
|
174
|
yellowfive@57
|
175 _chkAutoAll = AceGUI:Create("AmrUiCheckBox")
|
yellowfive@159
|
176 container:AddChild(_chkAutoAll)
|
yellowfive@57
|
177 _chkAutoAll:SetText(L.LogAutoAllText)
|
yellowfive@57
|
178 _chkAutoAll:SetCallback("OnClick", function(widget) Amr:ToggleAllAutoLog() end)
|
yellowfive@124
|
179 _chkAutoAll:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 1, -15)
|
yellowfive@57
|
180
|
yellowfive@57
|
181 _autoChecks = {}
|
yellowfive@57
|
182
|
yellowfive@57
|
183 -- go through all supported instances, rendering in a left->right pattern, 2 per row
|
yellowfive@61
|
184 local autoLbls = {}
|
yellowfive@61
|
185 local autoChks = {}
|
yellowfive@57
|
186 for i, instanceId in ipairs(Amr.InstanceIdsOrdered) do
|
yellowfive@137
|
187 local autoLbl, autoChk = renderAutoLogSection(instanceId, container, i, autoLbls, autoChks)
|
yellowfive@57
|
188
|
yellowfive@61
|
189 table.insert(autoLbls, autoLbl)
|
yellowfive@61
|
190 table.insert(autoChks, autoChk)
|
yellowfive@57
|
191 end
|
yellowfive@124
|
192 autoLbls = nil
|
yellowfive@124
|
193 autoChks = nil
|
yellowfive@124
|
194
|
yellowfive@57
|
195 -- instructions
|
yellowfive@91
|
196 --[[
|
yellowfive@57
|
197 lbl = AceGUI:Create("AmrUiLabel")
|
yellowfive@57
|
198 lbl:SetText(L.LogInstructionsTitle)
|
yellowfive@57
|
199 lbl:SetWidth(480)
|
yellowfive@57
|
200 lbl:SetFont(Amr.CreateFont("Italic", 24, Amr.Colors.Text))
|
yellowfive@57
|
201 lbl:SetPoint("TOPRIGHT", container.content, "TOPRIGHT", 0, -40)
|
yellowfive@57
|
202 container:AddChild(lbl)
|
yellowfive@57
|
203
|
yellowfive@57
|
204 lbl2 = AceGUI:Create("AmrUiLabel")
|
yellowfive@57
|
205 lbl2:SetText(L.LogInstructions)
|
yellowfive@57
|
206 lbl2:SetWidth(480)
|
yellowfive@57
|
207 lbl2:SetFont(Amr.CreateFont("Italic", 14, Amr.Colors.Text))
|
yellowfive@57
|
208 lbl2:SetPoint("TOPLEFT", lbl.frame, "BOTTOMLEFT", 0, -10)
|
yellowfive@57
|
209 container:AddChild(lbl2)
|
yellowfive@91
|
210 ]]
|
yellowfive@57
|
211
|
yellowfive@57
|
212 -- initialize state of controls
|
yellowfive@57
|
213 Amr:RefreshLogUi()
|
yellowfive@57
|
214 end
|
yellowfive@57
|
215
|
yellowfive@57
|
216 function Amr:ReleaseTabLog()
|
yellowfive@133
|
217 _lblLogging = nil
|
yellowfive@57
|
218 _btnToggle = nil
|
yellowfive@57
|
219 _panelUndoWipe = nil
|
yellowfive@57
|
220 _chkAutoAll = nil
|
yellowfive@57
|
221 _autoChecks = nil
|
yellowfive@57
|
222 end
|
yellowfive@57
|
223
|
yellowfive@69
|
224 -- update the game's logging state
|
yellowfive@69
|
225 local function updateGameLogging(enabled)
|
yellowfive@69
|
226 if enabled then
|
yellowfive@69
|
227 -- always enable advanced combat logging via our addon, gathers more detailed data for better analysis
|
yellowfive@69
|
228 SetCVar("advancedCombatLogging", 1)
|
yellowfive@69
|
229 LoggingCombat(true)
|
yellowfive@69
|
230 else
|
yellowfive@69
|
231 LoggingCombat(false)
|
yellowfive@69
|
232 end
|
yellowfive@69
|
233 end
|
yellowfive@69
|
234
|
yellowfive@69
|
235 local function isAnyAutoLoggingEnabled()
|
yellowfive@69
|
236 local anyChecked = false
|
yellowfive@69
|
237 for i, instanceId in ipairs(Amr.InstanceIdsOrdered) do
|
yellowfive@69
|
238 for k, difficultyId in pairs(Amr.Difficulties) do
|
yellowfive@69
|
239 if Amr.db.profile.Logging.Auto[instanceId][difficultyId] then
|
yellowfive@69
|
240 anyChecked = true
|
yellowfive@69
|
241 break
|
yellowfive@69
|
242 end
|
yellowfive@69
|
243 end
|
yellowfive@69
|
244 if anyChecked then break end
|
yellowfive@69
|
245 end
|
yellowfive@69
|
246
|
yellowfive@69
|
247 return anyChecked
|
yellowfive@69
|
248 end
|
yellowfive@69
|
249
|
yellowfive@57
|
250 local function isAllAutoLoggingEnabled()
|
yellowfive@57
|
251 -- see if all auto-logging options are enabled
|
yellowfive@57
|
252 local allChecked = true
|
yellowfive@57
|
253 for i, instanceId in ipairs(Amr.InstanceIdsOrdered) do
|
yellowfive@57
|
254 for k, difficultyId in pairs(Amr.Difficulties) do
|
yellowfive@57
|
255 if not Amr.db.profile.Logging.Auto[instanceId][difficultyId] then
|
yellowfive@57
|
256 allChecked = false
|
yellowfive@57
|
257 break
|
yellowfive@57
|
258 end
|
yellowfive@57
|
259 end
|
yellowfive@57
|
260 if not allChecked then break end
|
yellowfive@57
|
261 end
|
yellowfive@57
|
262
|
yellowfive@57
|
263 return allChecked
|
yellowfive@57
|
264 end
|
yellowfive@57
|
265
|
yellowfive@57
|
266 -- check current zone and auto-logging settings, and enable logging if appropriate
|
yellowfive@69
|
267 local function updateAutoLogging(force, noWait)
|
yellowfive@69
|
268
|
yellowfive@69
|
269 local hasAuto = isAnyAutoLoggingEnabled()
|
yellowfive@69
|
270
|
yellowfive@69
|
271 -- before doing anything, make sure logging matches the user's current setting, deals with any inconsistency due to a crash or disconnect
|
yellowfive@69
|
272 if hasAuto then
|
yellowfive@69
|
273 updateGameLogging(Amr:IsLogging())
|
yellowfive@69
|
274 end
|
yellowfive@57
|
275
|
yellowfive@57
|
276 -- get the info about the instance
|
yellowfive@57
|
277 local zone, _, difficultyId, _, _, _, _, instanceId = GetInstanceInfo()
|
yellowfive@57
|
278
|
yellowfive@69
|
279 if Amr.IsSupportedInstanceId(instanceId) and difficultyId == 0 and not noWait then
|
yellowfive@69
|
280 -- the game is sometimes returning no difficulty id for raid zones... not sure why, wait 10 seconds and check again
|
yellowfive@69
|
281 Amr.Wait(10, function()
|
yellowfive@69
|
282 updateAutoLogging(false, false)
|
yellowfive@69
|
283 end)
|
yellowfive@69
|
284 return
|
yellowfive@69
|
285 end
|
yellowfive@69
|
286
|
yellowfive@57
|
287 if not force and zone == Amr.db.char.Logging.LastZone and difficultyId == Amr.db.char.Logging.LastDiff then
|
yellowfive@57
|
288 -- do nothing if the zone hasn't actually changed, otherwise we may override the user's manual enable/disable
|
yellowfive@57
|
289 return
|
yellowfive@57
|
290 end
|
yellowfive@57
|
291
|
yellowfive@57
|
292 Amr.db.char.Logging.LastZone = zone
|
yellowfive@57
|
293 Amr.db.char.Logging.LastDiff = difficultyId
|
yellowfive@57
|
294
|
yellowfive@137
|
295 if Amr.IsSupportedInstanceId(instanceId) then
|
yellowfive@137
|
296 if not Amr.db.profile.Logging.Auto[tonumber(instanceId)] then
|
yellowfive@137
|
297 Amr.db.profile.Logging.Auto[tonumber(instanceId)] = {}
|
yellowfive@137
|
298 end
|
yellowfive@91
|
299 end
|
yellowfive@91
|
300
|
yellowfive@57
|
301 if Amr.IsSupportedInstanceId(instanceId) and Amr.db.profile.Logging.Auto[tonumber(instanceId)][tonumber(difficultyId)] then
|
yellowfive@57
|
302 -- we are in a supported zone that we want to auto-log, turn logging on
|
yellowfive@69
|
303
|
yellowfive@57
|
304 -- (supported check is probably redundant, but just in case someone has old settings lying around)
|
yellowfive@57
|
305 if not Amr:IsLogging() then
|
yellowfive@57
|
306 Amr:StartLogging()
|
yellowfive@57
|
307 end
|
yellowfive@69
|
308 elseif hasAuto then
|
yellowfive@57
|
309 -- not in a zone that we want to auto-log, turn logging off
|
yellowfive@57
|
310 if Amr:IsLogging() then
|
yellowfive@57
|
311 Amr:StopLogging()
|
yellowfive@57
|
312 end
|
yellowfive@57
|
313 end
|
yellowfive@57
|
314 end
|
yellowfive@57
|
315
|
yellowfive@189
|
316 -- sometimes the game doesn't repaint checkboxes when it should... doing this forces it to do so
|
yellowfive@189
|
317 local function setCheckboxChecked(chk, val)
|
yellowfive@189
|
318 chk:SetChecked(val)
|
yellowfive@189
|
319 chk:SetChecked(not val)
|
yellowfive@189
|
320 chk:SetChecked(val)
|
yellowfive@189
|
321 chk:SetText(chk:GetText())
|
yellowfive@189
|
322 end
|
yellowfive@189
|
323
|
yellowfive@57
|
324 -- refresh the state of the tab based on current settings
|
yellowfive@57
|
325 function Amr:RefreshLogUi()
|
yellowfive@57
|
326 if not _btnToggle then return end
|
yellowfive@57
|
327
|
yellowfive@57
|
328 -- set state of logging button based on whether it is on or off
|
yellowfive@57
|
329 if self:IsLogging() then
|
yellowfive@57
|
330 _btnToggle:SetBackgroundColor(Amr.Colors.Red)
|
yellowfive@57
|
331 _btnToggle:SetText(L.LogButtonStopText)
|
yellowfive@57
|
332 else
|
yellowfive@57
|
333 _btnToggle:SetBackgroundColor(Amr.Colors.Green)
|
yellowfive@57
|
334 _btnToggle:SetText(L.LogButtonStartText)
|
yellowfive@57
|
335 end
|
yellowfive@57
|
336
|
yellowfive@57
|
337 _lblLogging:SetVisible(self:IsLogging())
|
yellowfive@57
|
338
|
yellowfive@57
|
339 -- hide/show undo wipe button based on whether a wipe has been called recently
|
yellowfive@91
|
340 if _panelUndoWipe then
|
yellowfive@91
|
341 _panelUndoWipe:SetVisible(Amr.db.char.Logging.LastWipe and true or false)
|
yellowfive@91
|
342 end
|
yellowfive@57
|
343
|
yellowfive@57
|
344 local all = isAllAutoLoggingEnabled()
|
yellowfive@189
|
345 --setCheckboxChecked(_chkAutoAll, all)
|
yellowfive@57
|
346 _chkAutoAll:SetChecked(all)
|
yellowfive@57
|
347
|
yellowfive@57
|
348 for i, instanceId in ipairs(Amr.InstanceIdsOrdered) do
|
yellowfive@91
|
349 if not Amr.db.profile.Logging.Auto[instanceId] then
|
yellowfive@91
|
350 Amr.db.profile.Logging.Auto[instanceId] = {}
|
yellowfive@91
|
351 end
|
yellowfive@57
|
352 for k, difficultyId in pairs(Amr.Difficulties) do
|
yellowfive@189
|
353 setCheckboxChecked(_autoChecks[instanceId][difficultyId], Amr.db.profile.Logging.Auto[instanceId][difficultyId])
|
yellowfive@189
|
354 --_autoChecks[instanceId][difficultyId]:SetChecked(Amr.db.profile.Logging.Auto[instanceId][difficultyId])
|
yellowfive@57
|
355 end
|
yellowfive@57
|
356 end
|
yellowfive@57
|
357 end
|
yellowfive@57
|
358
|
yellowfive@57
|
359 function Amr:IsLogging()
|
yellowfive@57
|
360 return Amr.db.char.Logging.Enabled
|
yellowfive@57
|
361 end
|
yellowfive@57
|
362
|
yellowfive@57
|
363 function Amr:ToggleLogging()
|
yellowfive@57
|
364 if not Amr.db.char.Logging.Enabled then
|
yellowfive@57
|
365 Amr:StartLogging()
|
yellowfive@57
|
366 else
|
yellowfive@57
|
367 Amr:StopLogging()
|
yellowfive@57
|
368 end
|
yellowfive@57
|
369 end
|
yellowfive@57
|
370
|
yellowfive@57
|
371 function Amr:StartLogging()
|
yellowfive@57
|
372
|
yellowfive@91
|
373 --[[
|
yellowfive@57
|
374 local now = time()
|
yellowfive@57
|
375 local oldDuration = 60 * 60 * 24 * 10
|
yellowfive@57
|
376
|
yellowfive@57
|
377 -- prune out entries in log data that are more than 10 days old
|
yellowfive@57
|
378
|
yellowfive@57
|
379 -- player data
|
yellowfive@57
|
380 local playerData = Amr.db.global.Logging.PlayerData
|
yellowfive@57
|
381 if playerData then
|
yellowfive@57
|
382 for name, timeList in pairs(playerData) do
|
yellowfive@57
|
383 for timestamp, dataString in pairs(timeList) do
|
yellowfive@57
|
384 if difftime(now, tonumber(timestamp)) > oldDuration then
|
yellowfive@57
|
385 timeList[timestamp] = nil
|
yellowfive@57
|
386 end
|
yellowfive@57
|
387 end
|
yellowfive@57
|
388
|
yellowfive@57
|
389 if next(timeList) == nil then
|
yellowfive@57
|
390 playerData[name] = nil
|
yellowfive@57
|
391 end
|
yellowfive@57
|
392 end
|
yellowfive@57
|
393 end
|
yellowfive@57
|
394
|
yellowfive@57
|
395 -- same idea with extra info (auras, pets, whatever we end up adding to it)
|
yellowfive@57
|
396 local extraData = Amr.db.global.Logging.PlayerExtras
|
yellowfive@57
|
397 if extraData then
|
yellowfive@57
|
398 for name, timeList in pairs(extraData) do
|
yellowfive@57
|
399 for timestamp, dataString in pairs(timeList) do
|
yellowfive@57
|
400 if difftime(now, tonumber(timestamp)) > oldDuration then
|
yellowfive@57
|
401 timeList[timestamp] = nil
|
yellowfive@57
|
402 end
|
yellowfive@57
|
403 end
|
yellowfive@57
|
404
|
yellowfive@57
|
405 if next(timeList) == nil then
|
yellowfive@57
|
406 extraData[name] = nil
|
yellowfive@57
|
407 end
|
yellowfive@57
|
408 end
|
yellowfive@57
|
409 end
|
yellowfive@57
|
410
|
yellowfive@57
|
411 -- delete wipes that are more than 10 days old
|
yellowfive@57
|
412 if Amr.db.global.Logging.Wipes then
|
yellowfive@57
|
413 local wipes = Amr.db.global.Logging.Wipes
|
yellowfive@57
|
414 local i = 1
|
yellowfive@57
|
415 while i <= #wipes do
|
yellowfive@57
|
416 local t = wipes[i]
|
yellowfive@57
|
417 if difftime(now, t) > oldDuration then
|
yellowfive@57
|
418 table.remove(wipes, i)
|
yellowfive@57
|
419 else
|
yellowfive@57
|
420 i = i + 1
|
yellowfive@57
|
421 end
|
yellowfive@57
|
422 end
|
yellowfive@57
|
423 end
|
yellowfive@57
|
424
|
yellowfive@57
|
425 -- delete the last wipe date if it is more than 10 days old
|
yellowfive@57
|
426 if Amr.db.char.Logging.LastWipe and difftime(now, Amr.db.char.Logging.LastWipe) > oldDuration then
|
yellowfive@57
|
427 Amr.db.char.Logging.LastWipe = nil
|
yellowfive@57
|
428 end
|
yellowfive@91
|
429 ]]
|
yellowfive@91
|
430
|
yellowfive@69
|
431 -- enable game log file
|
yellowfive@69
|
432 updateGameLogging(true)
|
yellowfive@57
|
433 Amr.db.char.Logging.Enabled = true
|
yellowfive@57
|
434
|
yellowfive@57
|
435 self:Print(L.LogChatStart)
|
yellowfive@57
|
436
|
yellowfive@57
|
437 self:UpdateMinimap()
|
yellowfive@57
|
438 self:RefreshLogUi()
|
yellowfive@57
|
439 end
|
yellowfive@57
|
440
|
yellowfive@57
|
441 function Amr:StopLogging()
|
yellowfive@57
|
442
|
yellowfive@69
|
443 updateGameLogging(false)
|
yellowfive@57
|
444 Amr.db.char.Logging.Enabled = false
|
yellowfive@57
|
445
|
yellowfive@57
|
446 self:Print(L.LogChatStop)
|
yellowfive@57
|
447
|
yellowfive@57
|
448 self:UpdateMinimap()
|
yellowfive@57
|
449 self:RefreshLogUi()
|
yellowfive@57
|
450 end
|
yellowfive@57
|
451
|
yellowfive@57
|
452 function Amr:Wipe()
|
yellowfive@91
|
453
|
yellowfive@91
|
454 --[[
|
yellowfive@57
|
455 local t = time()
|
yellowfive@57
|
456 table.insert(Amr.db.global.Logging.Wipes, t)
|
yellowfive@57
|
457 Amr.db.char.Logging.LastWipe = t
|
yellowfive@57
|
458
|
yellowfive@57
|
459 self:Print(L.LogChatWipe(date('%I:%M %p', t)))
|
yellowfive@57
|
460
|
yellowfive@57
|
461 self:RefreshLogUi()
|
yellowfive@91
|
462 ]]
|
yellowfive@57
|
463 end
|
yellowfive@57
|
464
|
yellowfive@57
|
465 function Amr:UndoWipe()
|
yellowfive@57
|
466
|
yellowfive@91
|
467 --[[
|
yellowfive@57
|
468 local t = Amr.db.char.Logging.LastWipe
|
yellowfive@57
|
469 local wipes = Amr.db.global.Logging.Wipes
|
yellowfive@57
|
470
|
yellowfive@57
|
471 if not t then
|
yellowfive@57
|
472 self:Print(L.LogChatNoWipes)
|
yellowfive@57
|
473 else
|
yellowfive@57
|
474 -- find this wipe and remove it, may not be the last one if this person is raiding on multiple characters
|
yellowfive@57
|
475 for i = #wipes, 1, -1 do
|
yellowfive@57
|
476 if wipes[i] == t then
|
yellowfive@57
|
477 table.remove(wipes, i)
|
yellowfive@57
|
478 break
|
yellowfive@57
|
479 end
|
yellowfive@57
|
480 end
|
yellowfive@57
|
481
|
yellowfive@57
|
482 Amr.db.char.Logging.LastWipe = nil
|
yellowfive@57
|
483 self:Print(L.LogChatUndoWipe(date('%I:%M %p', t)))
|
yellowfive@57
|
484 end
|
yellowfive@57
|
485
|
yellowfive@57
|
486 self:RefreshLogUi()
|
yellowfive@91
|
487 ]]
|
yellowfive@57
|
488 end
|
yellowfive@57
|
489
|
yellowfive@57
|
490 function Amr:ToggleAutoLog(instanceId, difficultyId)
|
yellowfive@57
|
491
|
yellowfive@57
|
492 local byDiff = Amr.db.profile.Logging.Auto[instanceId]
|
yellowfive@57
|
493 byDiff[difficultyId] = not byDiff[difficultyId]
|
yellowfive@57
|
494
|
yellowfive@57
|
495 self:RefreshLogUi()
|
yellowfive@57
|
496
|
yellowfive@57
|
497 -- see if we should turn logging on right now
|
yellowfive@57
|
498 updateAutoLogging(true)
|
yellowfive@57
|
499 end
|
yellowfive@57
|
500
|
yellowfive@57
|
501 function Amr:ToggleAllAutoLog()
|
yellowfive@57
|
502
|
yellowfive@57
|
503 local val = not isAllAutoLoggingEnabled()
|
yellowfive@57
|
504
|
yellowfive@57
|
505 for i, instanceId in ipairs(Amr.InstanceIdsOrdered) do
|
yellowfive@57
|
506 for k, difficultyId in pairs(Amr.Difficulties) do
|
yellowfive@57
|
507 Amr.db.profile.Logging.Auto[instanceId][difficultyId] = val
|
yellowfive@57
|
508 end
|
yellowfive@57
|
509 end
|
yellowfive@57
|
510
|
yellowfive@57
|
511 self:RefreshLogUi()
|
yellowfive@57
|
512
|
yellowfive@57
|
513 -- see if we should turn logging on right now
|
yellowfive@57
|
514 updateAutoLogging(true)
|
yellowfive@57
|
515 end
|
yellowfive@57
|
516
|
yellowfive@57
|
517 function Amr:ProcessPlayerSnapshot(msg)
|
yellowfive@91
|
518 --[[
|
yellowfive@57
|
519 if not self:IsLogging() then return end
|
yellowfive@57
|
520
|
yellowfive@57
|
521 -- message will be of format: timestamp\nregion\nrealm\nname\n[stuff]
|
yellowfive@57
|
522 local parts = {}
|
yellowfive@57
|
523 for part in string.gmatch(msg, "([^\n]+)") do
|
yellowfive@57
|
524 table.insert(parts, part)
|
yellowfive@57
|
525 end
|
yellowfive@57
|
526
|
yellowfive@57
|
527 local timestamp = tonumber(parts[1])
|
yellowfive@57
|
528 local name = parts[2] .. ":" .. parts[3] .. ":" .. parts[4]
|
yellowfive@57
|
529 local setup = parts[5]
|
yellowfive@57
|
530
|
yellowfive@57
|
531 -- initialize the player's table
|
yellowfive@57
|
532 local playerList = Amr.db.global.Logging.PlayerData[name]
|
yellowfive@57
|
533 if not playerList then
|
yellowfive@57
|
534 playerList = {}
|
yellowfive@57
|
535 Amr.db.global.Logging.PlayerData[name] = playerList
|
yellowfive@57
|
536 end
|
yellowfive@57
|
537
|
yellowfive@57
|
538 -- find the most recent setup already recorded for this player
|
yellowfive@57
|
539 local previousSetup = nil
|
yellowfive@57
|
540 local previousTime = 0
|
yellowfive@57
|
541 for t, v in pairs(playerList) do
|
yellowfive@57
|
542 if t > previousTime then
|
yellowfive@57
|
543 previousSetup = v
|
yellowfive@57
|
544 previousTime = t
|
yellowfive@57
|
545 end
|
yellowfive@57
|
546 end
|
yellowfive@57
|
547
|
yellowfive@57
|
548 -- if the previous setup is more than 12 hours old, don't consider it
|
yellowfive@57
|
549 if previousSetup and difftime(timestamp, previousTime) > 60 * 60 * 12 then
|
yellowfive@57
|
550 previousSetup = nil
|
yellowfive@57
|
551 end
|
yellowfive@57
|
552
|
yellowfive@57
|
553 -- we only need to keep this setup if it is different than the previous
|
yellowfive@57
|
554 if setup ~= previousSetup then
|
yellowfive@57
|
555 playerList[timestamp] = setup
|
yellowfive@57
|
556 end
|
yellowfive@91
|
557 ]]
|
yellowfive@57
|
558 end
|
yellowfive@57
|
559
|
yellowfive@57
|
560 -- read auras and pet mapping info (pet may not be necessary anymore... but doesn't hurt)
|
yellowfive@57
|
561 local function getPlayerExtraData(data, unitId, petId)
|
yellowfive@91
|
562 --[[
|
yellowfive@57
|
563 local guid = UnitGUID(unitId)
|
yellowfive@57
|
564 if guid == nil then return end
|
yellowfive@57
|
565
|
yellowfive@57
|
566 local fields = {}
|
yellowfive@57
|
567
|
yellowfive@57
|
568 local buffs = {}
|
yellowfive@57
|
569 for i=1,40 do
|
yellowfive@57
|
570 local _,_,_,count,_,_,_,_,_,_,spellId = UnitAura(unitId, i, "HELPFUL")
|
yellowfive@57
|
571 table.insert(buffs, spellId)
|
yellowfive@57
|
572 end
|
yellowfive@57
|
573 if not buffs or #buffs == 0 then
|
yellowfive@57
|
574 table.insert(fields, "_")
|
yellowfive@57
|
575 else
|
yellowfive@57
|
576 table.insert(fields, Amr.Serializer:ToCompressedNumberList(buffs))
|
yellowfive@57
|
577 end
|
yellowfive@57
|
578
|
yellowfive@57
|
579 local petGuid = UnitGUID(petId)
|
yellowfive@57
|
580 if petGuid then
|
yellowfive@57
|
581 table.insert(fields, guid .. "," .. petGuid)
|
yellowfive@57
|
582 else
|
yellowfive@57
|
583 table.insert(fields, '_')
|
yellowfive@57
|
584 end
|
yellowfive@57
|
585
|
yellowfive@57
|
586 local name = GetUnitName(unitId, true) -- GetRaidRosterInfo(rosterIndex)
|
yellowfive@57
|
587 local realm = GetRealmName()
|
yellowfive@57
|
588 local region = Amr.RegionNames[GetCurrentRegion()]
|
yellowfive@57
|
589 local splitPos = string.find(name, "-")
|
yellowfive@57
|
590 if splitPos ~= nil then
|
yellowfive@57
|
591 realm = string.sub(name, splitPos + 1)
|
yellowfive@57
|
592 name = string.sub(name, 1, splitPos - 1)
|
yellowfive@57
|
593 end
|
yellowfive@57
|
594
|
yellowfive@57
|
595 data[region .. ":" .. realm .. ":" .. name] = table.concat(fields, ";")
|
yellowfive@91
|
596 ]]
|
yellowfive@57
|
597 end
|
yellowfive@57
|
598
|
yellowfive@57
|
599 local function logPlayerExtraData()
|
yellowfive@91
|
600 --[[
|
yellowfive@57
|
601 if not Amr:IsLogging() or not Amr:IsSupportedInstance() then return end
|
yellowfive@57
|
602
|
yellowfive@57
|
603 local timestamp = time()
|
yellowfive@57
|
604 local units = {}
|
yellowfive@57
|
605 local petUnits = {}
|
yellowfive@57
|
606
|
yellowfive@57
|
607 if IsInRaid() then
|
yellowfive@57
|
608 for i = 1,40 do
|
yellowfive@57
|
609 table.insert(units, "raid" .. i)
|
yellowfive@57
|
610 table.insert(petUnits, "raidpet" .. i)
|
yellowfive@57
|
611 end
|
yellowfive@57
|
612 elseif IsInGroup() then
|
yellowfive@57
|
613 table.insert(units, "player")
|
yellowfive@57
|
614 table.insert(petUnits, "pet")
|
yellowfive@57
|
615 for i = 1,4 do
|
yellowfive@57
|
616 table.insert(units, "party" .. i)
|
yellowfive@57
|
617 table.insert(petUnits, "partypet" .. i)
|
yellowfive@57
|
618 end
|
yellowfive@57
|
619 else
|
yellowfive@57
|
620 return
|
yellowfive@57
|
621 end
|
yellowfive@57
|
622
|
yellowfive@57
|
623 local data = {}
|
yellowfive@57
|
624 for i = 1,#units do
|
yellowfive@57
|
625 getPlayerExtraData(data, units[i], petUnits[i])
|
yellowfive@57
|
626 end
|
yellowfive@57
|
627
|
yellowfive@57
|
628 for name, val in pairs(data) do
|
yellowfive@57
|
629 -- record aura stuff, we never check for duplicates, need to know it at each point in time
|
yellowfive@57
|
630 if Amr.db.global.Logging.PlayerExtras[name] == nil then
|
yellowfive@57
|
631 Amr.db.global.Logging.PlayerExtras[name] = {}
|
yellowfive@57
|
632 end
|
yellowfive@57
|
633 Amr.db.global.Logging.PlayerExtras[name][timestamp] = val
|
yellowfive@57
|
634 end
|
yellowfive@91
|
635 ]]
|
yellowfive@57
|
636 end
|
yellowfive@57
|
637
|
yellowfive@57
|
638 function Amr:InitializeCombatLog()
|
yellowfive@137
|
639 updateAutoLogging()
|
yellowfive@57
|
640 end
|
yellowfive@57
|
641
|
yellowfive@57
|
642 Amr:AddEventHandler("UPDATE_INSTANCE_INFO", updateAutoLogging)
|
yellowfive@57
|
643 Amr:AddEventHandler("PLAYER_DIFFICULTY_CHANGED", updateAutoLogging)
|
yellowfive@65
|
644 Amr:AddEventHandler("ENCOUNTER_START", updateAutoLogging)
|
yellowfive@122
|
645 --Amr:AddEventHandler("PLAYER_REGEN_DISABLED", logPlayerExtraData)
|