51 lines
1.0 KiB
Lua
51 lines
1.0 KiB
Lua
local Jobs = {}
|
|
local LastTime = nil
|
|
|
|
function RunAt(h, m, cb)
|
|
Jobs[#Jobs + 1] = {
|
|
h = h,
|
|
m = m,
|
|
cb = cb,
|
|
}
|
|
end
|
|
|
|
function GetUnixTimestamp()
|
|
return os.time()
|
|
end
|
|
|
|
function OnTime(time)
|
|
for i = 1, #Jobs, 1 do
|
|
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", time),
|
|
month = os.date("%m", time),
|
|
year = os.date("%Y", time),
|
|
})
|
|
|
|
if time >= scheduledTimestamp and (not LastTime or LastTime < scheduledTimestamp) then
|
|
Jobs[i].cb(Jobs[i].h, Jobs[i].m)
|
|
end
|
|
end
|
|
end
|
|
|
|
function Tick()
|
|
local time = GetUnixTimestamp()
|
|
|
|
if not LastTime or os.date("%M", time) ~= os.date("%M", LastTime) then
|
|
OnTime(time)
|
|
LastTime = time
|
|
end
|
|
|
|
SetTimeout(60000, Tick)
|
|
end
|
|
|
|
LastTime = GetUnixTimestamp()
|
|
|
|
Tick()
|
|
|
|
AddEventHandler("cron:runAt", function(h, m, cb)
|
|
RunAt(h, m, cb)
|
|
end)
|