|
|
|
@ -58,7 +58,7 @@ itte.config = { |
|
|
|
|
send = { "send" }, |
|
|
|
|
svrs_not_found = { "config", "Error: servers not found." }, |
|
|
|
|
task_added = { "task", "Task `{{name}}` added." }, |
|
|
|
|
task_activated = { "task", "Task `{{name}}` activated at {{ts}}." }, |
|
|
|
|
task_activated = { "task", "Task `{{name}}` activated." }, |
|
|
|
|
}, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -836,7 +836,7 @@ function itte.listen(name, str) |
|
|
|
|
local cxt = itte.contexts[name] |
|
|
|
|
|
|
|
|
|
-- Respond to server ping |
|
|
|
|
if util.is_substr(str, cxt.cmds.ping.check) then |
|
|
|
|
if string.find(str, cxt.cmds.ping.check) == 1 then |
|
|
|
|
cxt.state.ping_time = os.time() |
|
|
|
|
util.debug(itte.config.debugs.listen[1], str, itte.config.debug) |
|
|
|
|
itte.send_command(cxt.con, string.gsub(str, cxt.cmds.ping.check, |
|
|
|
@ -871,6 +871,10 @@ function itte.listen(name, str) |
|
|
|
|
itte.message(cxt, { msg.reply_to }, itte.config.errors.unknown_code) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
-- Output to stdout anyway if debug is enabled |
|
|
|
|
else |
|
|
|
|
util.debug(itte.config.debugs.listen[1], str, itte.config.debug) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
@ -886,13 +890,6 @@ function itte.add_listener(cxt) |
|
|
|
|
if data ~= nil then |
|
|
|
|
itte.listen(cxt.name, data) |
|
|
|
|
|
|
|
|
|
-- Send a pong every 120s in case the ping request was lost, e.g. during high |
|
|
|
|
-- system load. Servers may send a ping request every ~90s. Disconnects from |
|
|
|
|
-- ping timeouts occur at ~2m30s. |
|
|
|
|
elseif (cxt.state.ping_time > 0) and (delta > 120) then |
|
|
|
|
itte.send_command(cxt.con, cxt.cmds.ping.resp) |
|
|
|
|
cxt.state.ping_time = os.time() |
|
|
|
|
|
|
|
|
|
elseif status == "closed" then |
|
|
|
|
itte.disconnect_server(cxt.name) |
|
|
|
|
end |
|
|
|
@ -914,7 +911,6 @@ function itte.add_tasks(cxt) |
|
|
|
|
local ts = os.date("%Y-%m-%d %H:%M:%S", os.time()) |
|
|
|
|
local task_str = string.gsub(itte.config.debugs.task_activated[2], |
|
|
|
|
"{{name}}", name) |
|
|
|
|
task_str = string.gsub(task_str, "{{ts}}", ts) |
|
|
|
|
util.debug(itte.config.debugs.task_activated[1], task_str, |
|
|
|
|
itte.config.debug) |
|
|
|
|
itte.handlers[task.handler](cxt, task) |
|
|
|
@ -947,8 +943,9 @@ function itte.check_tasks(cxt) |
|
|
|
|
|
|
|
|
|
local dt = util.split_str(os.date("%w %Y %m %d %H %M", os.time())) |
|
|
|
|
-- Support preset minute intervals |
|
|
|
|
local interval_min = { 5, 10, 15, 20, 30 } |
|
|
|
|
local interval_min = { 2, 5, 10, 15, 20, 30 } |
|
|
|
|
for name, task in pairs(cxt.tasks) do |
|
|
|
|
if task.time == nil then task.time = "00:00" end |
|
|
|
|
local task_min = string.sub(task.time, string.find(task.time, ":") + 1, |
|
|
|
|
string.find(task.time, ":") + 2) |
|
|
|
|
if (util.has_key(interval_min, tonumber(task.interval:sub(1, -2))) and |
|
|
|
@ -960,10 +957,29 @@ function itte.check_tasks(cxt) |
|
|
|
|
(task.interval == "monthly" and task.day == dt[4] and |
|
|
|
|
task.time == dt[5] .. ":" .. dt[6]) |
|
|
|
|
then |
|
|
|
|
-- Run only once per interval |
|
|
|
|
while not task.done do |
|
|
|
|
|
|
|
|
|
-- Activate task if not already done in the current interval |
|
|
|
|
if not task.done then |
|
|
|
|
coroutine.resume(task.co, name, task) |
|
|
|
|
|
|
|
|
|
elseif (task.done) and (coroutine.status(task.co) == "dead") then |
|
|
|
|
-- Reconstruct the task coroutine after it has been done |
|
|
|
|
local co = function(name, task) |
|
|
|
|
if util.has_key(itte.handlers, task.handler) then |
|
|
|
|
local ts = os.date("%Y-%m-%d %H:%M:%S", os.time()) |
|
|
|
|
local task_str = string.gsub(itte.config.debugs.task_activated[2], |
|
|
|
|
"{{name}}", name) |
|
|
|
|
util.debug(itte.config.debugs.task_activated[1], task_str, |
|
|
|
|
itte.config.debug) |
|
|
|
|
itte.handlers[task.handler](cxt, task) |
|
|
|
|
-- Suspend coroutine to be reactivated later |
|
|
|
|
coroutine.yield(co) |
|
|
|
|
task.done = true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
task.co = coroutine.create(co) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
else |
|
|
|
|
-- Reset the done flag after running task |
|
|
|
|
task.done = false |
|
|
|
|