local lang = jarvis.context.language local cmd_id = jarvis.context.command_id local function speak(text) local sapi = text:gsub("'", "''"):gsub("\r?\n", " ") local ps = string.format( [[Add-Type -AssemblyName System.Speech; $s = New-Object System.Speech.Synthesis.SpeechSynthesizer; foreach ($v in $s.GetInstalledVoices()) { if ($v.VoiceInfo.Culture.TwoLetterISOLanguageName -eq 'ru') { try { $s.SelectVoice($v.VoiceInfo.Name); break } catch {} } } $s.Speak('%s')]], sapi ) jarvis.system.exec(string.format('powershell -NoProfile -Command "%s"', ps:gsub('"', '\\"'))) end local function format_elapsed(sec) sec = math.floor(sec) if sec < 60 then return sec .. (lang == "ru" and " секунд" or " seconds") end if sec < 3600 then local m = math.floor(sec / 60); local s = sec % 60 return string.format(lang == "ru" and "%d мин %d сек" or "%d min %d sec", m, s) end local h = math.floor(sec / 3600); local m = math.floor((sec % 3600) / 60); local s = sec % 60 return string.format(lang == "ru" and "%d ч %d мин %d сек" or "%d h %d m %d s", h, m, s) end if cmd_id == "stopwatch_start" then jarvis.state.set("stopwatch_start_ts", jarvis.context.time.timestamp) jarvis.system.notify("Stopwatch", lang == "ru" and "Старт" or "Started") speak(lang == "ru" and "Секундомер запущен" or "Stopwatch started") jarvis.audio.play_ok() return { chain = false } end local started = jarvis.state.get("stopwatch_start_ts") if not started then jarvis.system.notify("Stopwatch", lang == "ru" and "Не запущен" or "Not running") speak(lang == "ru" and "Секундомер не запущен" or "Stopwatch is not running") jarvis.audio.play_not_found() return { chain = false } end local elapsed = jarvis.context.time.timestamp - started local human = format_elapsed(elapsed) if cmd_id == "stopwatch_stop" then jarvis.state.set("stopwatch_start_ts", nil) jarvis.system.notify("Stopwatch", (lang == "ru" and "Прошло: " or "Elapsed: ") .. human) speak((lang == "ru" and "Прошло " or "Elapsed ") .. human) else jarvis.system.notify("Stopwatch", (lang == "ru" and "Прошло: " or "Elapsed: ") .. human) speak((lang == "ru" and "Прошло " or "Elapsed ") .. human) end jarvis.audio.play_ok() return { chain = false }