initial commit
This commit is contained in:
319
Modules/DataTexts/Time.lua
Normal file
319
Modules/DataTexts/Time.lua
Normal file
@@ -0,0 +1,319 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user