mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-28 17:01:14 +00:00
fix(cron): build the scheduled time from the day the job belongs to
OnTime always built scheduledTimestamp from the date of the current tick, so a tick that skipped the 23:59 minute compared it against 23:59 of the next day. The run was dropped without a trace. Fall back to the previous day when the scheduled time lands in the future.
This commit is contained in:
@@ -26,17 +26,25 @@ end
|
||||
|
||||
---@param timestamp number
|
||||
function OnTime(timestamp)
|
||||
for i = 1, #cronJobs, 1 do
|
||||
local scheduledTimestamp = os.time({
|
||||
hour = cronJobs[i].h,
|
||||
min = cronJobs[i].m,
|
||||
local function scheduledAt(job, dayOffset)
|
||||
return os.time({
|
||||
hour = job.h,
|
||||
min = job.m,
|
||||
sec = 0, -- Assuming tasks run at the start of the minute
|
||||
day = os.date("%d", timestamp),
|
||||
day = os.date("%d", timestamp) + dayOffset,
|
||||
month = os.date("%m", timestamp),
|
||||
year = os.date("%Y", timestamp),
|
||||
})
|
||||
end
|
||||
|
||||
if timestamp >= scheduledTimestamp and (not lastTimestamp or lastTimestamp < scheduledTimestamp) then
|
||||
for i = 1, #cronJobs, 1 do
|
||||
local scheduledTimestamp = scheduledAt(cronJobs[i], 0)
|
||||
|
||||
if scheduledTimestamp > timestamp then
|
||||
scheduledTimestamp = scheduledAt(cronJobs[i], -1)
|
||||
end
|
||||
|
||||
if not lastTimestamp or lastTimestamp < scheduledTimestamp then
|
||||
local d = os.date('*t', scheduledTimestamp).wday
|
||||
cronJobs[i].cb(d, cronJobs[i].h, cronJobs[i].m)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user