103 lines
3.7 KiB
Lua
103 lines
3.7 KiB
Lua
|
|
-- "напомни мне через 5 минут выключить кофеварку"
|
|||
|
|
local phrase = (jarvis.context.phrase or ""):lower()
|
|||
|
|
|
|||
|
|
-- Strip the trigger
|
|||
|
|
local body = jarvis.text.strip_trigger(phrase, {
|
|||
|
|
"напомни мне через",
|
|||
|
|
"напомни через",
|
|||
|
|
"поставь напоминалку через",
|
|||
|
|
"поставь напоминание через",
|
|||
|
|
"разбуди через",
|
|||
|
|
"remind me in",
|
|||
|
|
"set a reminder in",
|
|||
|
|
"нагадай через",
|
|||
|
|
"постав нагадування через",
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
body = body:gsub("^[%s,:%.]+", ""):gsub("%s+$", "")
|
|||
|
|
|
|||
|
|
if body == "" then
|
|||
|
|
jarvis.speak("Через сколько и про что напомнить?")
|
|||
|
|
jarvis.audio.play_error()
|
|||
|
|
return { chain = false }
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- Parse "<N> <unit> <text>"
|
|||
|
|
-- N can be digit or word (один, два, ...) — for v1 only digits
|
|||
|
|
local n_str, unit, rest = body:match("^(%d+)%s+(%S+)%s*(.*)$")
|
|||
|
|
if not n_str then
|
|||
|
|
-- maybe "час" / "минуту" (singular)
|
|||
|
|
local single_unit, rest2 = body:match("^([%a]+)%s*(.*)$")
|
|||
|
|
if single_unit then
|
|||
|
|
local map = {
|
|||
|
|
["час"] = "1 hours",
|
|||
|
|
["минуту"] = "1 minutes",
|
|||
|
|
["секунду"] = "1 seconds",
|
|||
|
|
}
|
|||
|
|
if map[single_unit] then
|
|||
|
|
local schedule = "in " .. map[single_unit]
|
|||
|
|
local text_body = rest2:gsub("^[%s,:%.]+", ""):gsub("%s+$", "")
|
|||
|
|
if text_body == "" then text_body = "Напоминание." end
|
|||
|
|
local ok, err = pcall(function()
|
|||
|
|
jarvis.scheduler.add({
|
|||
|
|
name = "Reminder",
|
|||
|
|
schedule = schedule,
|
|||
|
|
action = { type = "speak", text = text_body }
|
|||
|
|
})
|
|||
|
|
end)
|
|||
|
|
if not ok then
|
|||
|
|
jarvis.log("warn", "scheduler.add: " .. tostring(err))
|
|||
|
|
jarvis.speak("Не получилось.")
|
|||
|
|
jarvis.audio.play_error()
|
|||
|
|
return { chain = false }
|
|||
|
|
end
|
|||
|
|
jarvis.speak("Напомню через " .. single_unit .. ".")
|
|||
|
|
jarvis.audio.play_ok()
|
|||
|
|
return { chain = false }
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
jarvis.speak("Не понял через сколько. Скажите например: через 5 минут.")
|
|||
|
|
jarvis.audio.play_error()
|
|||
|
|
return { chain = false }
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local n = tonumber(n_str)
|
|||
|
|
local unit_norm
|
|||
|
|
local sample
|
|||
|
|
if unit:match("^минут") or unit == "минуты" or unit == "минуту" or unit:match("^minute") then
|
|||
|
|
unit_norm = "minutes"
|
|||
|
|
sample = n .. " минут"
|
|||
|
|
elseif unit:match("^час") or unit:match("^hour") then
|
|||
|
|
unit_norm = "hours"
|
|||
|
|
sample = n .. " час" .. (n == 1 and "" or (n < 5 and "а" or "ов"))
|
|||
|
|
elseif unit:match("^секунд") or unit:match("^second") then
|
|||
|
|
unit_norm = "seconds"
|
|||
|
|
sample = n .. " секунд"
|
|||
|
|
else
|
|||
|
|
jarvis.speak("Не понял единицу. Минуты или часы.")
|
|||
|
|
jarvis.audio.play_error()
|
|||
|
|
return { chain = false }
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local schedule = string.format("in %d %s", n, unit_norm)
|
|||
|
|
local text_body = rest:gsub("^[%s,:%.]+", ""):gsub("%s+$", "")
|
|||
|
|
if text_body == "" then text_body = "Напоминание." end
|
|||
|
|
|
|||
|
|
local ok, err = pcall(function()
|
|||
|
|
jarvis.scheduler.add({
|
|||
|
|
name = "Reminder",
|
|||
|
|
schedule = schedule,
|
|||
|
|
action = { type = "speak", text = text_body }
|
|||
|
|
})
|
|||
|
|
end)
|
|||
|
|
if not ok then
|
|||
|
|
jarvis.log("warn", "scheduler.add: " .. tostring(err))
|
|||
|
|
jarvis.speak("Не получилось добавить напоминание.")
|
|||
|
|
jarvis.audio.play_error()
|
|||
|
|
return { chain = false }
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
jarvis.speak("Напомню через " .. sample .. ".")
|
|||
|
|
jarvis.audio.play_ok()
|
|||
|
|
return { chain = false }
|