diff --git a/[core]/cron/server/main.lua b/[core]/cron/server/main.lua index fb47a435..f7b47859 100644 --- a/[core]/cron/server/main.lua +++ b/[core]/cron/server/main.lua @@ -9,39 +9,41 @@ function RunAt(h, m, cb) } end -function GetTime() - local timestamp = os.time() - local d = os.date('*t', timestamp).wday - local h = tonumber(os.date('%H', timestamp)) - local m = tonumber(os.date('%M', timestamp)) - - return { - d = d, - h = h, - m = m - } +function GetUnixTimestamp() + return os.time() end -function OnTime(d, h, m) +function OnTime(h, m) + local currentTimestamp = GetUnixTimestamp() + for i = 1, #Jobs, 1 do - if Jobs[i].h == h and Jobs[i].m == m then - Jobs[i].cb(d, h, m) + local scheduledTimestamp = os.time({ + hour = Jobs[i].h, + minute = Jobs[i].m, + second = 0, -- Assuming tasks run at the start of the minute + day = os.date('%d', currentTimestamp), + month = os.date('%m', currentTimestamp), + year = os.date('%Y', currentTimestamp) + }) + + if currentTimestamp >= scheduledTimestamp and (not LastTime or LastTime < scheduledTimestamp) then + Jobs[i].cb(Jobs[i].h, Jobs[i].m) end end end function Tick() - local time = GetTime() + local time = GetUnixTimestamp() - if time.h ~= LastTime.h or time.m ~= LastTime.m then - OnTime(time.d, time.h, time.m) + if not LastTime or os.date('%M', time) ~= os.date('%M', LastTime) then + OnTime(os.date('%H', time), os.date('%M', time)) LastTime = time end SetTimeout(60000, Tick) end -LastTime = GetTime() +LastTime = GetUnixTimestamp() Tick()