275 lines
8.0 KiB
Lua
275 lines
8.0 KiB
Lua
local E, L, V, P, G = unpack(select(2, ...)) --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
|
|
local DT = E:GetModule("DataTexts")
|
|
|
|
--Lua functions
|
|
local _G = _G
|
|
local date = date
|
|
local next = next
|
|
local select = select
|
|
local time = time
|
|
local tonumber = tonumber
|
|
local find, format, gsub, join, utf8sub = string.find, string.format, string.gsub, string.join, string.utf8sub
|
|
local tinsert, wipe = table.insert, table.wipe
|
|
--WoW API / Variables
|
|
local GetGameTime = GetGameTime
|
|
local GetNumSavedInstances = GetNumSavedInstances
|
|
local GetSavedInstanceInfo = GetSavedInstanceInfo
|
|
local GetWintergraspWaitTime = GetWintergraspWaitTime
|
|
local IsInInstance = IsInInstance
|
|
local RequestRaidInfo = RequestRaidInfo
|
|
local SecondsToTime = SecondsToTime
|
|
|
|
local QUEUE_TIME_UNAVAILABLE = QUEUE_TIME_UNAVAILABLE
|
|
local TIMEMANAGER_AM = TIMEMANAGER_AM
|
|
local TIMEMANAGER_PM = TIMEMANAGER_PM
|
|
local TIMEMANAGER_TOOLTIP_LOCALTIME = TIMEMANAGER_TOOLTIP_LOCALTIME
|
|
local TIMEMANAGER_TOOLTIP_REALMTIME = TIMEMANAGER_TOOLTIP_REALMTIME
|
|
local WINTERGRASP_IN_PROGRESS = WINTERGRASP_IN_PROGRESS
|
|
|
|
local timeDisplayFormat = ""
|
|
local dateDisplayFormat = ""
|
|
local lockoutInfoFormat = "%s%s %s |cffaaaaaa(%s)"
|
|
local lockoutColorExtended, lockoutColorNormal = {r = 0.3, g = 1, b = 0.3}, {r = .8, g = .8, b = .8}
|
|
local lockedInstances = {raids = {}, dungeons = {}}
|
|
local timeFormat, realmDiffSeconds, showAMPM, showSecs
|
|
local enteredFrame, fullUpdate
|
|
local instanceIconByName
|
|
local numSavedInstances = 0
|
|
|
|
local locale = GetLocale()
|
|
local krcntw = locale == "koKR" or locale == "zhCN" or locale == "zhTW"
|
|
local difficultyTag = { -- Normal, Normal, Heroic, Heroic
|
|
(krcntw and PLAYER_DIFFICULTY1) or utf8sub(PLAYER_DIFFICULTY1, 1, 1), -- N
|
|
(krcntw and PLAYER_DIFFICULTY1) or utf8sub(PLAYER_DIFFICULTY1, 1, 1), -- N
|
|
(krcntw and PLAYER_DIFFICULTY2) or utf8sub(PLAYER_DIFFICULTY2, 1, 1), -- H
|
|
(krcntw and PLAYER_DIFFICULTY2) or utf8sub(PLAYER_DIFFICULTY2, 1, 1), -- H
|
|
}
|
|
|
|
local function getRealmTimeDiff()
|
|
local hours, minutes = GetGameTime()
|
|
local localTime = date("*t")
|
|
|
|
local diffHours = localTime.hour - hours
|
|
local diffMinutes = localTime.min - minutes
|
|
|
|
return (diffHours * 60 + diffMinutes) * 60
|
|
end
|
|
|
|
local function GetCurrentDate(formatString, forceLocalTime, forceRealmTime)
|
|
if timeFormat ~= E.db.datatexts.timeFormat then
|
|
timeFormat = E.db.datatexts.timeFormat
|
|
showAMPM = find(E.db.datatexts.timeFormat, "%%p") ~= nil
|
|
showSecs = find(E.db.datatexts.timeFormat, "%%S") ~= nil
|
|
end
|
|
|
|
if showAMPM then
|
|
local localizedAMPM = tonumber(date("%H")) >= 12 and TIMEMANAGER_PM or TIMEMANAGER_AM
|
|
|
|
formatString = gsub(formatString, "^%%p", localizedAMPM)
|
|
formatString = gsub(formatString, "([^%%])%%p", "%1"..localizedAMPM)
|
|
end
|
|
|
|
if realmDiffSeconds ~= 0 and (E.db.datatexts.realmTime or forceRealmTime) and not forceLocalTime then
|
|
return date(formatString, time() - realmDiffSeconds)
|
|
else
|
|
return date(formatString)
|
|
end
|
|
end
|
|
|
|
local function GetInstanceImages(...)
|
|
local numTextures = select("#", ...) / 4
|
|
|
|
local argn, title, texture = 1
|
|
for i = 1, numTextures do
|
|
title, texture = select(argn, ...)
|
|
if texture ~= "" then
|
|
instanceIconByName[title] = texture
|
|
end
|
|
argn = argn + 4
|
|
end
|
|
end
|
|
|
|
local function OnEvent(self, event)
|
|
if event == "UPDATE_INSTANCE_INFO" then
|
|
local num = GetNumSavedInstances()
|
|
|
|
if num ~= numSavedInstances then
|
|
numSavedInstances = num or 0
|
|
|
|
if enteredFrame then
|
|
fullUpdate = true
|
|
end
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
if not realmDiffSeconds then
|
|
realmDiffSeconds = getRealmTimeDiff()
|
|
|
|
if realmDiffSeconds < 900 then
|
|
realmDiffSeconds = 0
|
|
end
|
|
end
|
|
end
|
|
|
|
local function OnClick(_, btn)
|
|
if btn == "RightButton" then
|
|
if not IsAddOnLoaded("Blizzard_TimeManager") then
|
|
LoadAddOn("Blizzard_TimeManager")
|
|
end
|
|
TimeManagerClockButton_OnClick(TimeManagerClockButton)
|
|
else
|
|
GameTimeFrame:Click()
|
|
end
|
|
end
|
|
|
|
local function OnEnter(self, skipRequest)
|
|
DT:SetupTooltip(self)
|
|
|
|
if not skipRequest then
|
|
RequestRaidInfo()
|
|
end
|
|
|
|
if not instanceIconByName then
|
|
instanceIconByName = {}
|
|
GetInstanceImages(CalendarEventGetTextures(1))
|
|
GetInstanceImages(CalendarEventGetTextures(2))
|
|
end
|
|
|
|
local wgtime = GetWintergraspWaitTime()
|
|
local _, instanceType = IsInInstance()
|
|
if instanceType ~= "none" then
|
|
wgtime = QUEUE_TIME_UNAVAILABLE
|
|
elseif wgtime == nil then
|
|
wgtime = WINTERGRASP_IN_PROGRESS
|
|
else
|
|
wgtime = SecondsToTime(wgtime, false, nil, 3)
|
|
end
|
|
|
|
DT.tooltip:AddDoubleLine(L["Wintergrasp"], wgtime, 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
|
|
|
|
if numSavedInstances > 0 then
|
|
wipe(lockedInstances.raids)
|
|
wipe(lockedInstances.dungeons)
|
|
|
|
local name, reset, difficulty, locked, extended, isRaid, maxPlayers, difficultyLetter, buttonImg
|
|
|
|
for i = 1, numSavedInstances do
|
|
name, _, reset, difficulty, locked, extended, _, isRaid, maxPlayers = GetSavedInstanceInfo(i)
|
|
|
|
if name and (locked or extended) then
|
|
difficultyLetter = difficultyTag[not isRaid and (difficulty == 2 and 3 or 1) or difficulty]
|
|
buttonImg = format("|T%s%s:22:22:0:0:96:96:0:64:0:64|t ", "Interface\\LFGFrame\\LFGIcon-", instanceIconByName[name] or "Raid")
|
|
|
|
if isRaid then
|
|
tinsert(lockedInstances.raids, {name, reset, extended, maxPlayers, difficultyLetter, buttonImg})
|
|
elseif difficulty == 2 then
|
|
tinsert(lockedInstances.dungeons, {name, reset, extended, maxPlayers, difficultyLetter, buttonImg})
|
|
end
|
|
end
|
|
end
|
|
|
|
local lockoutColor, info
|
|
|
|
if next(lockedInstances.raids) then
|
|
DT.tooltip:AddLine(" ")
|
|
DT.tooltip:AddLine(L["Saved Raid(s)"])
|
|
|
|
for i = 1, #lockedInstances.raids do
|
|
info = lockedInstances.raids[i]
|
|
|
|
lockoutColor = info[3] and lockoutColorExtended or lockoutColorNormal
|
|
|
|
DT.tooltip:AddDoubleLine(
|
|
format(lockoutInfoFormat, info[6], info[4], info[5], info[1]),
|
|
SecondsToTime(info[2], false, nil, 3),
|
|
1, 1, 1,
|
|
lockoutColor.r, lockoutColor.g, lockoutColor.b
|
|
)
|
|
end
|
|
end
|
|
|
|
if next(lockedInstances.dungeons) then
|
|
DT.tooltip:AddLine(" ")
|
|
DT.tooltip:AddLine(L["Saved Dungeon(s)"])
|
|
|
|
for i = 1, #lockedInstances.dungeons do
|
|
info = lockedInstances.dungeons[i]
|
|
|
|
lockoutColor = info[3] and lockoutColorExtended or lockoutColorNormal
|
|
|
|
DT.tooltip:AddDoubleLine(
|
|
format(lockoutInfoFormat, info[6], info[4], info[5], info[1]),
|
|
SecondsToTime(info[2], false, nil, 3),
|
|
1, 1, 1,
|
|
lockoutColor.r, lockoutColor.g, lockoutColor.b
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
DT.tooltip:AddLine(" ")
|
|
|
|
if E.db.datatexts.realmTime then
|
|
DT.tooltip:AddDoubleLine(TIMEMANAGER_TOOLTIP_LOCALTIME, GetCurrentDate(E.db.datatexts.timeFormat, true), 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
|
|
else
|
|
DT.tooltip:AddDoubleLine(TIMEMANAGER_TOOLTIP_REALMTIME, GetCurrentDate(E.db.datatexts.timeFormat, nil, true), 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
|
|
end
|
|
|
|
DT.tooltip:Show()
|
|
enteredFrame = true
|
|
end
|
|
|
|
local function OnLeave()
|
|
enteredFrame = nil
|
|
DT.tooltip:Hide()
|
|
end
|
|
|
|
local function updateTooltipTime()
|
|
if E.db.datatexts.realmTime then
|
|
_G["DatatextTooltipTextRight" .. DT.tooltip:NumLines()]:SetText(GetCurrentDate(E.db.datatexts.timeFormat, true))
|
|
else
|
|
_G["DatatextTooltipTextRight" .. DT.tooltip:NumLines()]:SetText(GetCurrentDate(E.db.datatexts.timeFormat, nil, true))
|
|
end
|
|
end
|
|
|
|
local lastPanel
|
|
local int = 5
|
|
local function OnUpdate(self, elapsed)
|
|
int = int - elapsed
|
|
|
|
if int > 0 then return end
|
|
|
|
int = 1
|
|
lastPanel = self
|
|
|
|
if GameTimeFrame.flashInvite then
|
|
E:Flash(self, 0.53)
|
|
else
|
|
E:StopFlash(self)
|
|
end
|
|
|
|
self.text:SetText(gsub(gsub(GetCurrentDate(E.db.datatexts.timeFormat.." "..E.db.datatexts.dateFormat), ":", timeDisplayFormat), "%s", dateDisplayFormat))
|
|
|
|
if enteredFrame then
|
|
if fullUpdate then
|
|
fullUpdate = nil
|
|
OnEnter(self, true)
|
|
elseif showSecs then
|
|
updateTooltipTime()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function ValueColorUpdate(hex)
|
|
timeDisplayFormat = join("", hex, ":|r")
|
|
dateDisplayFormat = join("", hex, " ")
|
|
|
|
if lastPanel ~= nil then
|
|
OnUpdate(lastPanel, 20000)
|
|
end
|
|
end
|
|
E.valueColorUpdateFuncs[ValueColorUpdate] = true
|
|
|
|
DT:RegisterDatatext("Time", {"UPDATE_INSTANCE_INFO"}, OnEvent, OnUpdate, OnClick, OnEnter, OnLeave) |