annotate CombatLog.lua @ 195:4ccc9ff6e824 v95

Update item parsing for new item link format changes.
author Yellowfive
date Tue, 24 Nov 2020 16:20:10 -0600
parents 21a69c63fee8
children
rev   line source
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)