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.
77 lines
3.1 KiB
77 lines
3.1 KiB
local SI, L = unpack((select(2, ...)))
|
|
|
|
-- Lua functions
|
|
local date, floor, time, tonumber = date, floor, time, tonumber
|
|
|
|
-- WoW API / Variables
|
|
local C_DateAndTime_GetCurrentCalendarTime = C_DateAndTime.GetCurrentCalendarTime
|
|
local C_DateAndTime_GetSecondsUntilWeeklyReset = C_DateAndTime.GetSecondsUntilWeeklyReset
|
|
local C_Calendar_GetMonthInfo = C_Calendar.GetMonthInfo
|
|
local C_Calendar_SetAbsMonth = C_Calendar.SetAbsMonth
|
|
local GetQuestResetTime = GetQuestResetTime
|
|
|
|
do
|
|
local GTToffset = time() - GetTime()
|
|
function SI:GetTimeToTime(val)
|
|
if not val then return end
|
|
return val + GTToffset
|
|
end
|
|
end
|
|
|
|
-- returns how many hours the server time is ahead of local time
|
|
-- convert local time -> server time: add this value
|
|
-- convert server time -> local time: subtract this value
|
|
function SI:GetServerOffset()
|
|
local serverDate = C_DateAndTime_GetCurrentCalendarTime() -- 1-based starts on Sun
|
|
local serverWeekday, serverMinute, serverHour = serverDate.weekday - 1, serverDate.minute, serverDate.hour
|
|
-- #211: date('%w') is 0-based starts on Sun
|
|
local localWeekday = tonumber(date('%w'))
|
|
local localHour, localMinute = tonumber(date('%H')), tonumber(date('%M'))
|
|
if serverWeekday == (localWeekday + 1) % 7 then -- server is a day ahead
|
|
serverHour = serverHour + 24
|
|
elseif localWeekday == (serverWeekday + 1) % 7 then -- local is a day ahead
|
|
localHour = localHour + 24
|
|
end
|
|
local serverT = serverHour + serverMinute / 60
|
|
local localT = localHour + localMinute / 60
|
|
local offset = floor((serverT - localT) * 2 + 0.5) / 2
|
|
return offset
|
|
end
|
|
|
|
function SI:GetNextDailyResetTime()
|
|
local resetTime = GetQuestResetTime()
|
|
if (
|
|
not resetTime or resetTime <= 0 or -- ticket 43: can fail during startup
|
|
-- also right after a daylight savings rollover, when it returns negative values >.<
|
|
resetTime > 24 * 60 * 60 + 30 -- can also be wrong near reset in an instance
|
|
) then
|
|
return
|
|
end
|
|
|
|
return time() + resetTime
|
|
end
|
|
|
|
SI.GetNextDailySkillResetTime = SI.GetNextDailyResetTime
|
|
|
|
function SI:GetNextWeeklyResetTime()
|
|
return time() + C_DateAndTime_GetSecondsUntilWeeklyReset()
|
|
end
|
|
|
|
do
|
|
local darkmoonEnd = {hour=23, min=59}
|
|
function SI:GetNextDarkmoonResetTime()
|
|
-- Darkmoon faire runs from first Sunday of each month to following Saturday
|
|
-- this function returns an approximate time after the end of the current month's faire
|
|
local currentCalendarTime = C_DateAndTime_GetCurrentCalendarTime()
|
|
C_Calendar_SetAbsMonth(currentCalendarTime.month, currentCalendarTime.year)
|
|
local monthInfo = C_Calendar_GetMonthInfo()
|
|
local firstWeekday = monthInfo.firstWeekday
|
|
local firstSunday = ((firstWeekday == 1) and 1) or (9 - firstWeekday)
|
|
darkmoonEnd.year = monthInfo.year
|
|
darkmoonEnd.month = monthInfo.month
|
|
darkmoonEnd.day = firstSunday + 7 -- 1 days of "slop"
|
|
-- Unfortunately, DMF boundary ignores daylight savings, and the time of day varies across regions
|
|
-- Report a reset well past end to make sure we don't drop quests early
|
|
return time(darkmoonEnd) - SI:GetServerOffset() * 3600
|
|
end
|
|
end
|
|
|