You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
7.3 KiB
172 lines
7.3 KiB
local SLE, T, E, L, V, P, G = unpack(select(2, ...))
|
|
local DT = E.DataTexts
|
|
|
|
--GLOBALS: ElvDB
|
|
local format = format
|
|
local GetTime = GetTime
|
|
local UnitLevel = UnitLevel
|
|
local IsAddOnLoaded = IsAddOnLoaded
|
|
|
|
local ChatFrame_TimeBreakDown = ChatFrame_TimeBreakDown
|
|
local PlayedTimeFormatFull = '%d '..L["D"]..' %02d:%02d:%02d'
|
|
local PlayedTimeFormatNoDay = '%02d:%02d:%02d'
|
|
local TotalPlayTime, LevelPlayTime, SessionPlayTime, LevelPlayedOffset, LastLevelTime
|
|
local MyRealm = E.myrealm
|
|
local MyName = E.myname
|
|
local MyClass = E.myclass
|
|
local TIME_PLAYED_MSG = TIME_PLAYED_MSG
|
|
local LEVEL = LEVEL
|
|
local TOTAL = TOTAL
|
|
local MAX_PLAYER_LEVEL = MAX_PLAYER_LEVEL
|
|
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
|
|
local RequestTimePlayed = RequestTimePlayed
|
|
local IsShiftKeyDown = IsShiftKeyDown
|
|
local LevelPlayTimeOffset
|
|
local eventRequesting = false
|
|
|
|
local OnEnter = function(self)
|
|
if not InCombatLockdown() and SessionPlayTime then
|
|
DT.tooltip:ClearLines()
|
|
local SessionDay, SessionHour, SessionMinute, SessionSecond = ChatFrame_TimeBreakDown(GetTime() - SessionPlayTime)
|
|
local TotalDay, TotalHour, TotalMinute, TotalSecond = ChatFrame_TimeBreakDown(TotalPlayTime + (GetTime() - SessionPlayTime))
|
|
local LevelDay, LevelHour, LevelMinute, LevelSecond = ChatFrame_TimeBreakDown(LevelPlayTime + (GetTime() - LevelPlayTimeOffset))
|
|
local LastLevelDay, LastLevelHour, LastLevelMinute, LastLevelSecond = ChatFrame_TimeBreakDown(LastLevelTime)
|
|
DT.tooltip:ClearLines()
|
|
DT.tooltip:AddLine(TIME_PLAYED_MSG, 1, 1, 1)
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddDoubleLine(L["Session:"], SessionDay > 0 and format(PlayedTimeFormatFull, SessionDay, SessionHour, SessionMinute, SessionSecond) or format(PlayedTimeFormatNoDay, SessionHour, SessionMinute, SessionSecond), 1, 1, 1, 1, 1, 1)
|
|
if LastLevelSecond > 0 then
|
|
DT.tooltip:AddDoubleLine(L["Previous Level:"], LastLevelDay > 0 and format(PlayedTimeFormatFull, LastLevelDay, LastLevelHour, LastLevelMinute, LastLevelSecond) or format(PlayedTimeFormatNoDay, LastLevelHour, LastLevelMinute, LastLevelSecond), 1, 1, 1, 1, 1, 1)
|
|
end
|
|
DT.tooltip:AddDoubleLine(LEVEL..':', LevelDay > 0 and format(PlayedTimeFormatFull, LevelDay, LevelHour, LevelMinute, LevelSecond) or format(PlayedTimeFormatNoDay, LevelHour, LevelMinute, LevelSecond), 1, 1, 1, 1, 1, 1)
|
|
DT.tooltip:AddDoubleLine(TOTAL..':', TotalDay > 0 and format(PlayedTimeFormatFull, TotalDay, TotalHour, TotalMinute, TotalSecond) or format(PlayedTimeFormatNoDay, TotalHour, TotalMinute, TotalSecond), 1, 1, 1, 1, 1, 1)
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddLine(L["Account Time Played"], 1, 1, 1)
|
|
DT.tooltip:AddLine(' ')
|
|
local Class, Level, AccountDay, AccountHour, AccountMinute, AccountSecond, TotalAccountTime
|
|
for player, subtable in pairs(ElvDB["sle"]["TimePlayed"][MyRealm]) do
|
|
for k, v in pairs(subtable) do
|
|
if k == 'TotalTime' then
|
|
AccountDay, AccountHour, AccountMinute, AccountSecond = ChatFrame_TimeBreakDown(v)
|
|
TotalAccountTime = (TotalAccountTime or 0) + v
|
|
end
|
|
if k == 'Class' then Class = v end
|
|
if k == 'Level' then Level = v end
|
|
end
|
|
local color = RAID_CLASS_COLORS[Class]
|
|
DT.tooltip:AddDoubleLine(format('%s |cFFFFFFFF- %s %d', player, LEVEL, Level), format(PlayedTimeFormatFull, AccountDay, AccountHour, AccountMinute, AccountSecond), color.r, color.g, color.b, 1, 1, 1)
|
|
end
|
|
DT.tooltip:AddLine(' ')
|
|
local TotalAccountDay, TotalAccountHour, TotalAccountMinute, TotalAccountSecond = ChatFrame_TimeBreakDown(TotalAccountTime)
|
|
DT.tooltip:AddDoubleLine(TOTAL, format(PlayedTimeFormatFull, TotalAccountDay, TotalAccountHour, TotalAccountMinute, TotalAccountSecond), 1, 0, 1, 1, 1, 1)
|
|
DT.tooltip:AddLine(' ')
|
|
DT.tooltip:AddLine(L["Reset Data: Hold Shift + Right Click"])
|
|
DT.tooltip:Show()
|
|
end
|
|
end
|
|
|
|
local ElapsedTimer = 0
|
|
local OnUpdate = function(self, elapsed)
|
|
ElapsedTimer = ElapsedTimer + elapsed
|
|
if (not self.text) then
|
|
local text = self:CreateFontString(nil, 'OVERLAY')
|
|
text:FontTemplate()
|
|
text:SetText(TIME_PLAYED_MSG)
|
|
self.text = text
|
|
end
|
|
|
|
if TotalPlayTime and LevelPlayTime and SessionPlayTime then
|
|
local Day, Hour, Minute, Second
|
|
if UnitLevel('player') ~= MAX_PLAYER_LEVEL then
|
|
Day, Hour, Minute, Second = ChatFrame_TimeBreakDown(LevelPlayTime + (GetTime() - LevelPlayTimeOffset))
|
|
else
|
|
Day, Hour, Minute, Second = ChatFrame_TimeBreakDown(TotalPlayTime + (GetTime() - SessionPlayTime))
|
|
end
|
|
if Day > 0 then
|
|
self.text:SetFormattedText('%d '..L["D"]..' %02d:%02d', Day, Hour, Minute)
|
|
else
|
|
self.text:SetFormattedText('%02d:%02d', Hour, Minute)
|
|
end
|
|
else
|
|
if ElapsedTimer > 2 and not self.Requested and not eventRequesting then
|
|
self.Requested = true
|
|
eventRequesting = true
|
|
RequestTimePlayed()
|
|
end
|
|
end
|
|
end
|
|
|
|
local oldTimePlayedFunction = ChatFrame_DisplayTimePlayed
|
|
ChatFrame_DisplayTimePlayed = function(...)
|
|
if eventRequesting then
|
|
eventRequesting = false
|
|
return
|
|
end
|
|
return oldTimePlayedFunction(...)
|
|
end
|
|
|
|
local OnEvent = function(self, event, ...)
|
|
if not ElvDB["sle"] then ElvDB["sle"] = {} end
|
|
if not ElvDB["sle"]["TimePlayed"] then ElvDB["sle"]["TimePlayed"] = {} end
|
|
if not ElvDB["sle"]["TimePlayed"][MyRealm] then ElvDB["sle"]["TimePlayed"][MyRealm] = {} end
|
|
if not ElvDB["sle"]["TimePlayed"][MyRealm][MyName] then ElvDB["sle"]["TimePlayed"][MyRealm][MyName] = {} end
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Class"] = MyClass
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Level"] = UnitLevel('player')
|
|
LastLevelTime = ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["LastLevelTime"] or 0
|
|
if event == 'TIME_PLAYED_MSG' then
|
|
local TotalTime, LevelTime = ...
|
|
TotalPlayTime = TotalTime
|
|
LevelPlayTime = LevelTime
|
|
if SessionPlayTime == nil then SessionPlayTime = GetTime() end
|
|
LevelPlayTimeOffset = GetTime()
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["TotalTime"] = TotalTime
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["LevelTime"] = LevelTime
|
|
eventRequesting = false
|
|
end
|
|
if event == 'PLAYER_LEVEL_UP' then
|
|
if not LevelPlayTime then
|
|
eventRequesting = true
|
|
RequestTimePlayed()
|
|
else
|
|
LastLevelTime = floor(LevelPlayTime + (GetTime() - (LevelPlayTimeOffset or 0)))
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["LastLevelTime"] = LastLevelTime
|
|
LevelPlayTime = 1
|
|
LevelPlayTimeOffset = GetTime()
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Level"] = UnitLevel('player')
|
|
eventRequesting = false
|
|
end
|
|
end
|
|
if event == 'LOADING_SCREEN_DISABLED' then
|
|
self:UnregisterEvent(event)
|
|
if not IsAddOnLoaded('DataStore_Characters') and not eventRequesting then
|
|
eventRequesting = true
|
|
RequestTimePlayed()
|
|
end
|
|
end
|
|
if event == 'PLAYER_LOGOUT' and not eventRequesting then
|
|
eventRequesting = true
|
|
RequestTimePlayed()
|
|
end
|
|
end
|
|
|
|
local function Reset()
|
|
ElvDB["sle"]["TimePlayed"][MyRealm] = {}
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName] = {}
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Level"] = UnitLevel('player')
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["LastLevelTime"] = LastLevelTime
|
|
ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Class"] = MyClass
|
|
if not eventRequesting then
|
|
eventRequesting = true
|
|
RequestTimePlayed()
|
|
end
|
|
SLE:Print(': Time Played has been reset!', 'info')
|
|
end
|
|
|
|
local OnMouseDown = function(self, button)
|
|
if button == 'RightButton' then
|
|
if IsShiftKeyDown()then
|
|
Reset()
|
|
end
|
|
end
|
|
end
|
|
DT:RegisterDatatext('S&L Time Played', 'S&L', {'TIME_PLAYED_MSG', 'PLAYER_LEVEL_UP', 'LOADING_SCREEN_DISABLED' , 'PLAYER_LOGOUT'}, OnEvent, OnUpdate, OnMouseDown, OnEnter, OnLeave)
|
|
|