Mercurial > wow > askmrrobot
comparison ui/CombatLogTab.lua @ 0:ec731d2fe6ba
Version 1.2.12.0
| author | Adam tegen <adam.tegen@gmail.com> |
|---|---|
| date | Tue, 20 May 2014 21:43:23 -0500 |
| parents | |
| children | ece9167c0d1c |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:ec731d2fe6ba |
|---|---|
| 1 local _, AskMrRobot = ... | |
| 2 | |
| 3 -- initialize the ExportTab class | |
| 4 AskMrRobot.CombatLogTab = AskMrRobot.inheritsFrom(AskMrRobot.Frame) | |
| 5 | |
| 6 -- helper to create text for this tab | |
| 7 local function CreateText(tab, font, relativeTo, xOffset, yOffset, text) | |
| 8 local t = tab:CreateFontString(nil, "ARTWORK", font) | |
| 9 t:SetPoint("TOPLEFT", relativeTo, "BOTTOMLEFT", xOffset, yOffset) | |
| 10 t:SetPoint("RIGHT", tab, "RIGHT", -25, 0) | |
| 11 t:SetWidth(t:GetWidth()) | |
| 12 t:SetJustifyH("LEFT") | |
| 13 t:SetText(text) | |
| 14 | |
| 15 return t | |
| 16 end | |
| 17 | |
| 18 local function newCheckbox(tab, label, tooltipTitle, description, onClick) | |
| 19 local check = CreateFrame("CheckButton", "AmrCheck" .. label, tab, "InterfaceOptionsCheckButtonTemplate") | |
| 20 check:SetScript("OnClick", function(self) | |
| 21 PlaySound(self:GetChecked() and "igMainMenuOptionCheckBoxOn" or "igMainMenuOptionCheckBoxOff") | |
| 22 onClick(self, self:GetChecked() and true or false) | |
| 23 end) | |
| 24 check.label = _G[check:GetName() .. "Text"] | |
| 25 check.label:SetText(label) | |
| 26 check.tooltipText = tooltipTitle | |
| 27 check.tooltipRequirement = description | |
| 28 return check | |
| 29 end | |
| 30 | |
| 31 function AskMrRobot.CombatLogTab:new(parent) | |
| 32 | |
| 33 local tab = AskMrRobot.Frame:new(nil, parent) | |
| 34 setmetatable(tab, { __index = AskMrRobot.CombatLogTab }) | |
| 35 tab:SetPoint("TOPLEFT") | |
| 36 tab:SetPoint("BOTTOMRIGHT") | |
| 37 tab:Hide() | |
| 38 | |
| 39 local text = tab:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge") | |
| 40 text:SetPoint("TOPLEFT", 0, -5) | |
| 41 text:SetText("Combat Logging") | |
| 42 | |
| 43 local manulText = CreateText(tab, "GameFontWhite", text, 0, -15, "Manual:") | |
| 44 manulText:SetJustifyV("MIDDLE") | |
| 45 manulText:SetHeight(30) | |
| 46 | |
| 47 local btn = CreateFrame("Button", "AmrCombatLogStart", tab, "UIPanelButtonTemplate") | |
| 48 btn:SetPoint("TOPLEFT", text, "BOTTOMLEFT", 75, -15) | |
| 49 btn:SetText("Start Logging") | |
| 50 btn:SetWidth(120) | |
| 51 btn:SetHeight(30) | |
| 52 tab.btnStart = btn | |
| 53 | |
| 54 btn:SetScript("OnClick", function() | |
| 55 tab:StartLogging() | |
| 56 end) | |
| 57 | |
| 58 btn = CreateFrame("Button", "AmrCombatLogEnd", tab, "UIPanelButtonTemplate") | |
| 59 btn:SetPoint("TOPLEFT", text, "BOTTOMLEFT", 225, -15) | |
| 60 btn:SetText("Stop Logging") | |
| 61 btn:SetWidth(120) | |
| 62 btn:SetHeight(30) | |
| 63 tab.btnEnd = btn | |
| 64 | |
| 65 btn:SetScript("OnClick", function() | |
| 66 tab:StopLogging() | |
| 67 end) | |
| 68 | |
| 69 local autoText = CreateText(tab, "GameFontWhite", text, 0, -50, "Automatic:") | |
| 70 autoText:SetJustifyV("MIDDLE") | |
| 71 autoText:SetHeight(28) | |
| 72 | |
| 73 local autoChk = newCheckbox(tab, | |
| 74 "Always log Siege of Orgrimmar", | |
| 75 "Auto-Log Siege of Orgrimmar", | |
| 76 "Automatically start logging when you enter SoO and stop when you leave SoO.\n\nNote that you should disable similar features in other addons to avoid conflicts.", | |
| 77 function(self, value) | |
| 78 if value then | |
| 79 AmrLogData._autoLog[AskMrRobot.instanceIds.SiegeOfOrgrimmar] = "enabled" | |
| 80 else | |
| 81 AmrLogData._autoLog[AskMrRobot.instanceIds.SiegeOfOrgrimmar] = "disabled" | |
| 82 end | |
| 83 | |
| 84 AmrLogData._lastZone = nil | |
| 85 AmrLogData._lastDiff = nil | |
| 86 tab:UpdateAutoLogging() | |
| 87 end | |
| 88 ) | |
| 89 autoChk:SetChecked(AmrLogData._autoLog[AskMrRobot.instanceIds.SiegeOfOrgrimmar] == "enabled") | |
| 90 autoChk:SetPoint("TOPLEFT", text, "BOTTOMLEFT", 75, -50) | |
| 91 autoChk:SetHeight(30) | |
| 92 | |
| 93 text = CreateText(tab, "GameFontNormalLarge", text, 0, -100, "Character Data") | |
| 94 | |
| 95 btn = CreateFrame("Button", "AmrCombatLogSaveCharData", tab, "UIPanelButtonTemplate") | |
| 96 btn:SetPoint("TOPLEFT", text, "BOTTOMLEFT", 0, -5) | |
| 97 btn:SetText("Save Character Data") | |
| 98 btn:SetWidth(150) | |
| 99 btn:SetHeight(30) | |
| 100 | |
| 101 btn:SetScript("OnClick", function() | |
| 102 -- reload the UI will save character data to disk | |
| 103 ReloadUI() | |
| 104 end) | |
| 105 | |
| 106 text = CreateText(tab, "GameFontNormalLarge", btn, 0, -30, "INSTRUCTIONS") | |
| 107 text = CreateText(tab, "GameFontWhite", text, 0, -10, "1. Use the Start/Stop buttons or check 'Always log Siege of Orgrimmar'.") | |
| 108 text = CreateText(tab, "GameFontWhite", text, 0, -10, "2. When you are ready to upload, press 'Save Character Data'. *") | |
| 109 text = CreateText(tab, "GameFontWhite", text, 0, -10, "3. Exit World of Warcraft. **") | |
| 110 text = CreateText(tab, "GameFontWhite", text, 0, -10, "4. Launch the Ask Mr. Robot client and follow the instructions. ***") | |
| 111 | |
| 112 text = CreateText(tab, "GameFontNormalSmall", text, 0, -30, "|c00999999* This will reload your UI to ensure that all collected data is saved to disk. This step is not necessary if you log out of the game before uploading.|r") | |
| 113 text = CreateText(tab, "GameFontNormalSmall", text, 0, -10, "|c00999999** Exiting WoW before uploading your combat log is optional, but highly recommended. This prevents your log file from getting ridiculously large and slowing down your uploads.|r") | |
| 114 text = CreateText(tab, "GameFontNormalSmall", text, 0, -10, "|c00999999*** You can download the client program at|r |c003333ffhttp://www.askmrrobot.com/wow/combatlog/upload|r|c00999999.|r") | |
| 115 | |
| 116 --[[ | |
| 117 btn = CreateFrame("Button", "AmrCombatLogTest", tab, "UIPanelButtonTemplate") | |
| 118 btn:SetPoint("TOPLEFT", text, "BOTTOMLEFT", 0, -15) | |
| 119 btn:SetText("Test") | |
| 120 btn:SetWidth(120) | |
| 121 btn:SetHeight(30) | |
| 122 | |
| 123 btn:SetScript("OnClick", function() | |
| 124 AskMrRobot.ExportToAddonChat(time()) | |
| 125 end) | |
| 126 ]] | |
| 127 | |
| 128 -- when we start up, ensure that logging is still enabled if it was enabled when they last used the addon | |
| 129 if (tab:IsLogging()) then | |
| 130 SetCVar("advancedCombatLogging", 1) | |
| 131 LoggingCombat(true) | |
| 132 end | |
| 133 | |
| 134 -- if auto-logging is enabled, do a check when the addon is loaded to make sure that state is set correctly | |
| 135 if AmrLogData._autoLog[AskMrRobot.instanceIds.SiegeOfOrgrimmar] == "enabled" then | |
| 136 tab:UpdateAutoLogging() | |
| 137 end | |
| 138 | |
| 139 tab:SetScript("OnShow", function() | |
| 140 tab:Update() | |
| 141 end) | |
| 142 | |
| 143 return tab | |
| 144 end | |
| 145 | |
| 146 function AskMrRobot.CombatLogTab:IsLogging() | |
| 147 return AmrLogData._logging == true | |
| 148 end | |
| 149 | |
| 150 function AskMrRobot.CombatLogTab:StartLogging() | |
| 151 | |
| 152 -- archive the current logging session so that users don't accidentally blow away data before uploading it | |
| 153 if AmrLogData._current2 ~= nil then | |
| 154 if not AmrLogData._history2 then AmrLogData._history2 = {} end | |
| 155 | |
| 156 -- add new entries | |
| 157 for name, timeList in AskMrRobot.spairs(AmrLogData._current2) do | |
| 158 if not AmrLogData._history2[name] then AmrLogData._history2[name] = {} end | |
| 159 for timestamp, dataString in AskMrRobot.spairs(timeList) do | |
| 160 AmrLogData._history2[name][timestamp] = dataString | |
| 161 end | |
| 162 end | |
| 163 | |
| 164 -- delete entries that are more than 10 days old | |
| 165 local now = time() | |
| 166 local interval = 60 * 60 * 24 * 10 | |
| 167 for name, timeList in AskMrRobot.spairs(AmrLogData._history2) do | |
| 168 for timestamp, dataString in AskMrRobot.spairs(timeList) do | |
| 169 if difftime(now, tonumber(timestamp)) > interval then | |
| 170 timeList[timestamp] = nil | |
| 171 end | |
| 172 end | |
| 173 | |
| 174 local count = 0 | |
| 175 for timestamp, dataString in pairs(timeList) do | |
| 176 count = count + 1 | |
| 177 end | |
| 178 if count == 0 then | |
| 179 AmrLogData._history2[name] = nil | |
| 180 end | |
| 181 end | |
| 182 end | |
| 183 | |
| 184 -- clean up old-style logging data from previous versions of the addon | |
| 185 for k, v in AskMrRobot.spairs(AmrLogData) do | |
| 186 if k ~= "_logging" and k ~= "_autoLog" and k ~= "_lastZone" and k ~= "_lastDiff" and k ~= "_current2" and k ~= "_history2" then | |
| 187 AmrLogData[k] = nil | |
| 188 end | |
| 189 end | |
| 190 | |
| 191 -- start a new logging session | |
| 192 AmrLogData._current2 = {} | |
| 193 AmrLogData._logging = true | |
| 194 | |
| 195 -- always enable advanced combat logging via our addon, gathers more detailed data for better analysis | |
| 196 SetCVar("advancedCombatLogging", 1) | |
| 197 | |
| 198 LoggingCombat(true) | |
| 199 self:Update() | |
| 200 | |
| 201 print("You are now logging combat, and Mr. Robot is logging character data for your raid.") | |
| 202 end | |
| 203 | |
| 204 function AskMrRobot.CombatLogTab:StopLogging() | |
| 205 LoggingCombat(false) | |
| 206 AmrLogData._logging = false | |
| 207 self:Update() | |
| 208 | |
| 209 print("Combat logging has been stopped.") | |
| 210 end | |
| 211 | |
| 212 -- update the panel and state | |
| 213 function AskMrRobot.CombatLogTab:Update() | |
| 214 local isLogging = self:IsLogging() | |
| 215 | |
| 216 if isLogging then | |
| 217 self.btnStart:Disable() | |
| 218 self.btnEnd:Enable() | |
| 219 else | |
| 220 self.btnStart:Enable() | |
| 221 self.btnEnd:Disable() | |
| 222 end | |
| 223 end | |
| 224 | |
| 225 -- called to update logging state when auto-logging is enabled | |
| 226 function AskMrRobot.CombatLogTab:UpdateAutoLogging() | |
| 227 | |
| 228 -- get the info about the instance | |
| 229 --local zone, zonetype, difficultyIndex, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID = GetInstanceInfo() | |
| 230 local zone, _, difficultyIndex, _, _, _, _, instanceMapID = GetInstanceInfo() | |
| 231 --local difficulty = difficultyIndex | |
| 232 -- Unless Blizzard fixes scenarios to not return nil, let's hardcode this into returning "scenario" -Znuff | |
| 233 --if zonetype == nil and difficultyIndex == 1 then | |
| 234 --zonetype = "scenario" | |
| 235 --end | |
| 236 | |
| 237 if zone == AmrLogData._lastZone and difficultyIndex == AmrLogData._lastDiff then | |
| 238 -- do nothing if the zone hasn't actually changed, otherwise we may override the user's manual enable/disable | |
| 239 return | |
| 240 end | |
| 241 | |
| 242 AmrLogData._lastZone = zone | |
| 243 AmrLogData._lastDiff = difficultyIndex | |
| 244 | |
| 245 if AmrLogData._autoLog[AskMrRobot.instanceIds.SiegeOfOrgrimmar] == "enabled" then | |
| 246 if tonumber(instanceMapID) == AskMrRobot.instanceIds.SiegeOfOrgrimmar then | |
| 247 -- if in SoO, make sure logging is on | |
| 248 if not self:IsLogging() then | |
| 249 self:StartLogging() | |
| 250 end | |
| 251 else | |
| 252 -- not in SoO, turn logging off | |
| 253 if self:IsLogging() then | |
| 254 self:StopLogging() | |
| 255 end | |
| 256 end | |
| 257 end | |
| 258 | |
| 259 end | |
| 260 | |
| 261 -- read a message sent to the addon channel with a player's info at the time an encounter started | |
| 262 function AskMrRobot.CombatLogTab:ReadAddonMessage(message) | |
| 263 | |
| 264 -- message will be of format: timestamp\nrealm\nname\n[stuff] | |
| 265 local parts = {} | |
| 266 for part in string.gmatch(message, "([^\n]+)") do | |
| 267 tinsert(parts, part) | |
| 268 end | |
| 269 | |
| 270 local timestamp = parts[1] | |
| 271 local name = parts[2] .. ":" .. parts[3] | |
| 272 local data = parts[4] | |
| 273 | |
| 274 if (data == "done") then | |
| 275 -- we have finished receiving this message; now process it to reduce the amount of duplicate data | |
| 276 local setup = AmrLogData._current2[name][timestamp] | |
| 277 | |
| 278 if (AmrLogData._previousSetup == nil) then | |
| 279 AmrLogData._previousSetup = {} | |
| 280 end | |
| 281 | |
| 282 local previousSetup = AmrLogData._previousSetup[name] | |
| 283 | |
| 284 if (previousSetup == setup) then | |
| 285 -- if the last-seen setup for this player is the same as the current one, we don't need this entry | |
| 286 AmrLogData._current2[name][timestamp] = nil | |
| 287 else | |
| 288 -- record the last-seen setup | |
| 289 AmrLogData._previousSetup[name] = setup | |
| 290 end | |
| 291 else | |
| 292 -- concatenate messages with the same timestamp+name | |
| 293 if (AmrLogData._current2[name] == nil) then | |
| 294 AmrLogData._current2[name] = {} | |
| 295 end | |
| 296 | |
| 297 if (AmrLogData._current2[name][timestamp] == nil) then | |
| 298 AmrLogData._current2[name][timestamp] = data | |
| 299 else | |
| 300 AmrLogData._current2[name][timestamp] = AmrLogData._current2[name][timestamp] .. data | |
| 301 end | |
| 302 end | |
| 303 end |
