ElvUI/Modules/DataTexts/Time.lua

320 lines
11 KiB
Lua

local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local DT = E:GetModule('DataTexts')
local _G = _G
local next, unpack = next, unpack
local format, strjoin = format, strjoin
local sort, tinsert = sort, tinsert
local date, utf8sub = date, string.utf8sub
local EJ_GetCurrentTier = EJ_GetCurrentTier
local EJ_GetInstanceByIndex = EJ_GetInstanceByIndex
local EJ_GetNumTiers = EJ_GetNumTiers
local EJ_SelectTier = EJ_SelectTier
local GetDifficultyInfo = GetDifficultyInfo
local C_DateAndTime_GetCurrentCalendarTime = C_DateAndTime.GetCurrentCalendarTime
local GetLocale = GetLocale
local GetNumSavedInstances = GetNumSavedInstances
local GetNumSavedWorldBosses = GetNumSavedWorldBosses
local GetNumWorldPVPAreas = GetNumWorldPVPAreas
local GetSavedInstanceInfo = GetSavedInstanceInfo
local GetSavedWorldBossInfo = GetSavedWorldBossInfo
local GetWorldPVPAreaInfo = GetWorldPVPAreaInfo
local RequestRaidInfo = RequestRaidInfo
local SecondsToTime = SecondsToTime
local InCombatLockdown = InCombatLockdown
local C_Map_GetAreaInfo = C_Map.GetAreaInfo
local QUEUE_TIME_UNAVAILABLE = QUEUE_TIME_UNAVAILABLE
local TIMEMANAGER_TOOLTIP_LOCALTIME = TIMEMANAGER_TOOLTIP_LOCALTIME
local TIMEMANAGER_TOOLTIP_REALMTIME = TIMEMANAGER_TOOLTIP_REALMTIME
local VOICE_CHAT_BATTLEGROUND = VOICE_CHAT_BATTLEGROUND
local WINTERGRASP_IN_PROGRESS = WINTERGRASP_IN_PROGRESS
local WORLD_BOSSES_TEXT = RAID_INFO_WORLD_BOSS
local APM = { _G.TIMEMANAGER_PM, _G.TIMEMANAGER_AM }
local ukDisplayFormat, europeDisplayFormat = '', ''
local europeDisplayFormat_nocolor = strjoin('', '%02d', ':|r%02d')
local ukDisplayFormat_nocolor = strjoin('', '', '%d', ':|r%02d', ' %s|r')
local lockoutInfoFormat = '%s%s %s |cffaaaaaa(%s, %s/%s)'
local lockoutInfoFormatNoEnc = '%s%s %s |cffaaaaaa(%s)'
local formatBattleGroundInfo = '%s: '
local lockoutColorExtended, lockoutColorNormal = { r=0.3,g=1,b=0.3 }, { r=.8,g=.8,b=.8 }
local enteredFrame = false
local Update, lastPanel
local function ValueColorUpdate(hex)
europeDisplayFormat = strjoin('', '%02d', hex, ':|r%02d')
ukDisplayFormat = strjoin('', '', '%d', hex, ':|r%02d', hex, ' %s|r')
if lastPanel ~= nil then
Update(lastPanel, 20000)
end
end
E.valueColorUpdateFuncs[ValueColorUpdate] = true
local function ConvertTime(h, m)
local AmPm
if E.global.datatexts.settings.Time.time24 == true then
return h, m, -1
else
if h >= 12 then
if h > 12 then h = h - 12 end
AmPm = 1
else
if h == 0 then h = 12 end
AmPm = 2
end
end
return h, m, AmPm
end
local function CalculateTimeValues(tooltip)
if (tooltip and E.global.datatexts.settings.Time.localTime) or (not tooltip and not E.global.datatexts.settings.Time.localTime) then
local dateTable = C_DateAndTime_GetCurrentCalendarTime()
return ConvertTime(dateTable.hour, dateTable.minute)
else
local dateTable = date('*t')
return ConvertTime(dateTable.hour, dateTable.min)
end
end
local function Click()
if InCombatLockdown() then _G.UIErrorsFrame:AddMessage(E.InfoColor.._G.ERR_NOT_IN_COMBAT) return end
_G.GameTimeFrame:Click()
end
local function OnLeave()
enteredFrame = false
end
local InstanceNameByID = {
-- NOTE: for some reason the instanceID from EJ_GetInstanceByIndex doesn't match,
-- the instanceID from GetInstanceInfo, so use the collectIDs to find the ID to add.
[749] = C_Map_GetAreaInfo(3845) -- 'The Eye' -> 'Tempest Keep'
}
local locale = GetLocale()
if locale == 'deDE' then -- O.O
InstanceNameByID[1023] = 'Belagerung von Boralus' -- 'Die Belagerung von Boralus'
InstanceNameByID[1041] = 'Königsruh' -- 'Die Königsruh'
InstanceNameByID[1021] = 'Kronsteiganwesen' -- 'Das Kronsteiganwesen'
end
local instanceIconByName = {}
local collectIDs, collectedIDs = false -- for testing; mouse over the dt to show the tinspect table
local function GetInstanceImages(index, raid)
local instanceID, name, _, _, buttonImage = EJ_GetInstanceByIndex(index, raid)
while instanceID do
if collectIDs then
if not collectedIDs then
collectedIDs = {}
end
collectedIDs[instanceID] = name
end
instanceIconByName[InstanceNameByID[instanceID] or name] = buttonImage
index = index + 1
instanceID, name, _, _, buttonImage = EJ_GetInstanceByIndex(index, raid)
end
end
local krcntw = locale == 'koKR' or locale == 'zhCN' or locale == 'zhTW'
local difficultyTag = { -- Raid Finder, Normal, Heroic, Mythic
(krcntw and _G.PLAYER_DIFFICULTY3) or utf8sub(_G.PLAYER_DIFFICULTY3, 1, 1), -- R
(krcntw and _G.PLAYER_DIFFICULTY1) or utf8sub(_G.PLAYER_DIFFICULTY1, 1, 1), -- N
(krcntw and _G.PLAYER_DIFFICULTY2) or utf8sub(_G.PLAYER_DIFFICULTY2, 1, 1), -- H
(krcntw and _G.PLAYER_DIFFICULTY6) or utf8sub(_G.PLAYER_DIFFICULTY6, 1, 1) -- M
}
local function sortFunc(a,b) return a[1] < b[1] end
local collectedInstanceImages = false
local function OnEnter()
DT.tooltip:ClearLines()
if not enteredFrame then
enteredFrame = true
RequestRaidInfo()
end
if not collectedInstanceImages then
local numTiers = (EJ_GetNumTiers() or 0)
if numTiers > 0 then
local currentTier = EJ_GetCurrentTier()
-- Loop through the expansions to collect the textures
for i=1, numTiers do
EJ_SelectTier(i)
GetInstanceImages(1, false); -- Populate for dungeon icons
GetInstanceImages(1, true); -- Populate for raid icons
end
if collectIDs then
E:Dump(collectedIDs, true)
end
-- Set it back to the previous tier
if currentTier then
EJ_SelectTier(currentTier)
end
collectedInstanceImages = true
end
end
local addedHeader = false
for i = 1, GetNumWorldPVPAreas() do
local _, localizedName, isActive, _, startTime, canEnter = GetWorldPVPAreaInfo(i)
if isActive then
startTime = WINTERGRASP_IN_PROGRESS
elseif not startTime then
startTime = QUEUE_TIME_UNAVAILABLE
elseif startTime ~= 0 then
startTime = SecondsToTime(startTime, false, nil, 3)
end
if canEnter and startTime ~= 0 then
if not addedHeader then
DT.tooltip:AddLine(VOICE_CHAT_BATTLEGROUND)
addedHeader = true
end
DT.tooltip:AddDoubleLine(format(formatBattleGroundInfo, localizedName), startTime, 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
end
end
local lockedInstances = {raids = {}, dungeons = {}}
for i = 1, GetNumSavedInstances() do
local name, _, _, difficulty, locked, extended, _, isRaid = GetSavedInstanceInfo(i)
if (locked or extended) and name then
local isLFR, isHeroicOrMythicDungeon = (difficulty == 7 or difficulty == 17), (difficulty == 2 or difficulty == 23)
local _, _, isHeroic, _, displayHeroic, displayMythic = GetDifficultyInfo(difficulty)
local sortName = name .. (displayMythic and 4 or (isHeroic or displayHeroic) and 3 or isLFR and 1 or 2)
local difficultyLetter = (displayMythic and difficultyTag[4] or (isHeroic or displayHeroic) and difficultyTag[3] or isLFR and difficultyTag[1] or difficultyTag[2])
local buttonImg = instanceIconByName[name] and format('|T%s:16:16:0:0:96:96:0:64:0:64|t ', instanceIconByName[name]) or ''
if isRaid then
tinsert(lockedInstances.raids, {sortName, difficultyLetter, buttonImg, {GetSavedInstanceInfo(i)}})
elseif isHeroicOrMythicDungeon then
tinsert(lockedInstances.dungeons, {sortName, difficultyLetter, buttonImg, {GetSavedInstanceInfo(i)}})
end
end
end
if next(lockedInstances.raids) then
if DT.tooltip:NumLines() > 0 then
DT.tooltip:AddLine(' ')
end
DT.tooltip:AddLine(L["Saved Raid(s)"])
sort(lockedInstances.raids, sortFunc)
for i = 1, #lockedInstances.raids do
local difficultyLetter = lockedInstances.raids[i][2]
local buttonImg = lockedInstances.raids[i][3]
local name, _, reset, _, _, extended, _, _, maxPlayers, _, numEncounters, encounterProgress = unpack(lockedInstances.raids[i][4])
local lockoutColor = extended and lockoutColorExtended or lockoutColorNormal
if numEncounters and numEncounters > 0 and (encounterProgress and encounterProgress > 0) then
DT.tooltip:AddDoubleLine(format(lockoutInfoFormat, buttonImg, maxPlayers, difficultyLetter, name, encounterProgress, numEncounters), SecondsToTime(reset, false, nil, 3), 1, 1, 1, lockoutColor.r, lockoutColor.g, lockoutColor.b)
else
DT.tooltip:AddDoubleLine(format(lockoutInfoFormatNoEnc, buttonImg, maxPlayers, difficultyLetter, name), SecondsToTime(reset, false, nil, 3), 1, 1, 1, lockoutColor.r, lockoutColor.g, lockoutColor.b)
end
end
end
if next(lockedInstances.dungeons) then
if DT.tooltip:NumLines() > 0 then
DT.tooltip:AddLine(' ')
end
DT.tooltip:AddLine(L["Saved Dungeon(s)"])
sort(lockedInstances.dungeons, sortFunc)
for i = 1,#lockedInstances.dungeons do
local difficultyLetter = lockedInstances.dungeons[i][2]
local buttonImg = lockedInstances.dungeons[i][3]
local name, _, reset, _, _, extended, _, _, maxPlayers, _, numEncounters, encounterProgress = unpack(lockedInstances.dungeons[i][4])
local lockoutColor = extended and lockoutColorExtended or lockoutColorNormal
if numEncounters and numEncounters > 0 and (encounterProgress and encounterProgress > 0) then
DT.tooltip:AddDoubleLine(format(lockoutInfoFormat, buttonImg, maxPlayers, difficultyLetter, name, encounterProgress, numEncounters), SecondsToTime(reset, false, nil, 3), 1, 1, 1, lockoutColor.r, lockoutColor.g, lockoutColor.b)
else
DT.tooltip:AddDoubleLine(format(lockoutInfoFormatNoEnc, buttonImg, maxPlayers, difficultyLetter, name), SecondsToTime(reset, false, nil, 3), 1, 1, 1, lockoutColor.r, lockoutColor.g, lockoutColor.b)
end
end
end
local addedLine = false
local worldbossLockoutList = {}
for i = 1, GetNumSavedWorldBosses() do
local name, _, reset = GetSavedWorldBossInfo(i)
tinsert(worldbossLockoutList, {name, reset})
end
sort(worldbossLockoutList, sortFunc)
for i = 1,#worldbossLockoutList do
local name, reset = unpack(worldbossLockoutList[i])
if reset then
if not addedLine then
if DT.tooltip:NumLines() > 0 then
DT.tooltip:AddLine(' ')
end
DT.tooltip:AddLine(WORLD_BOSSES_TEXT)
addedLine = true
end
DT.tooltip:AddDoubleLine(name, SecondsToTime(reset, true, nil, 3), 1, 1, 1, 0.8, 0.8, 0.8)
end
end
local Hr, Min, AmPm = CalculateTimeValues(true)
if DT.tooltip:NumLines() > 0 then
DT.tooltip:AddLine(' ')
end
if AmPm == -1 then
DT.tooltip:AddDoubleLine(E.global.datatexts.settings.Time.localTime and TIMEMANAGER_TOOLTIP_REALMTIME or TIMEMANAGER_TOOLTIP_LOCALTIME, format(europeDisplayFormat_nocolor, Hr, Min), 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
else
DT.tooltip:AddDoubleLine(E.global.datatexts.settings.Time.localTime and TIMEMANAGER_TOOLTIP_REALMTIME or TIMEMANAGER_TOOLTIP_LOCALTIME, format(ukDisplayFormat_nocolor, Hr, Min, APM[AmPm]), 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
end
DT.tooltip:Show()
end
local function OnEvent(self, event)
if event == 'UPDATE_INSTANCE_INFO' and enteredFrame then
OnEnter(self)
end
end
function Update(self, t)
self.timeElapsed = (self.timeElapsed or 5) - t
if self.timeElapsed > 0 then return end
self.timeElapsed = 5
if _G.GameTimeFrame.flashInvite then
E:Flash(self, 0.53, true)
else
E:StopFlash(self)
end
if enteredFrame then
OnEnter(self)
end
local Hr, Min, AmPm = CalculateTimeValues()
if AmPm == -1 then
self.text:SetFormattedText(europeDisplayFormat, Hr, Min)
else
self.text:SetFormattedText(ukDisplayFormat, Hr, Min, APM[AmPm])
end
lastPanel = self
end
DT:RegisterDatatext('Time', nil, {'UPDATE_INSTANCE_INFO'}, OnEvent, Update, Click, OnEnter, OnLeave, nil, nil, ValueColorUpdate)