J.A.R.V.I.S-rust/resources/commands/power/act.lua
Bossiara13 41eb47724c feat: lock_workstation + screenshot + net_info packs + modernise power pack
Three handy daily-driver packs + cleanup of the oldest power/act.lua.

power pack — added lock_workstation (resources/commands/power/)
  - New command id: lock_workstation
  - Phrase: "заблокируй компьютер" / "заблокируй пк" / "заблокируй экран"
  - Action: rundll32.exe user32.dll,LockWorkStation
  - Sandbox: full (needs system.exec)
  - act.lua modernised:
    * No more inline PowerShell SAPI escape chain — now uses jarvis.speak
      (TTS backend abstraction respects user's chosen Piper/SAPI/Silero).
    * Returns via jarvis.cmd.ok/error helpers.
    * Logged warning for failing cmds without crashing the pack.
    * Cleaner per-action `warn` flag controls the "say cancel to abort" hint.

screenshot pack (NEW, resources/commands/screenshot/, 2 commands)
  - "сделай скрин" / "сделай скриншот" → screenshot.to_clipboard
    Uses [System.Windows.Forms.Clipboard]::SetImage() with a captured Bitmap.
    No file artifact, no LLM call — pure capture, fastest path.
  - "сохрани скрин" → screenshot.to_file
    Saves to ~/Pictures/Screenshots/jarvis-YYYYMMDD-HHMMSS.png.
    Creates dir if missing. Notifies with full path.
  - Distinct from vision/ pack which captures + describes via LLM.

net_info pack (NEW, resources/commands/net_info/, 3 commands)
  - "какая сеть" / "какой wifi" → net.wifi_ssid
    Parses `netsh wlan show interfaces` for SSID line (RU + EN field names).
  - "мой IP" / "локальный IP" → net.local_ip
    PowerShell Get-NetIPAddress, filters out 127.* and 169.* (link-local).
  - "внешний IP" / "публичный IP" → net.public_ip
    Hits api.ipify.org via jarvis.http.get (no key, plain text).

Tests: 99/99 pass (commands::tests auto-validates new packs).
Build: cargo build --release -p jarvis-app green.

Pack count: 59 → 62 (intro/echo from prior commit + screenshot + net_info; power
already counted — added a command, not a pack).
2026-05-15 18:32:13 +03:00

60 lines
2.6 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Power-management dispatcher: shutdown/restart/sleep/hibernate/logoff/cancel/lock.
-- All commands share this script; behaviour selected by jarvis.context.command_id.
-- Modernised to use jarvis.speak (TTS backend abstraction) + jarvis.cmd helpers.
local cmd_id = jarvis.context.command_id
local lang = jarvis.context.language
local actions = {
shutdown_pc = {
cmd = 'shutdown.exe /s /t 30 /c "J.A.R.V.I.S.: shutdown in 30s. Say cancel to abort."',
label = lang == "ru" and "Выключение через 30 секунд" or "Shutdown in 30 sec",
warn = true,
},
restart_pc = {
cmd = 'shutdown.exe /r /t 30 /c "J.A.R.V.I.S.: restart in 30s. Say cancel to abort."',
label = lang == "ru" and "Перезагрузка через 30 секунд" or "Restart in 30 sec",
warn = true,
},
logoff_user = { cmd = 'shutdown.exe /l',
label = lang == "ru" and "Выход из системы" or "Sign out" },
sleep_pc = { cmd = 'rundll32.exe powrprof.dll,SetSuspendState 0,1,0',
label = lang == "ru" and "Сон" or "Sleep" },
hibernate_pc = { cmd = 'shutdown.exe /h',
label = lang == "ru" and "Гибернация" or "Hibernate" },
cancel_shutdown = { cmd = 'shutdown.exe /a',
label = lang == "ru" and "Выключение отменено" or "Shutdown cancelled" },
lock_workstation = { cmd = 'rundll32.exe user32.dll,LockWorkStation',
label = lang == "ru" and "Компьютер заблокирован" or "PC locked" },
}
local a = actions[cmd_id]
if not a then
return jarvis.cmd.error("Unknown power command.")
end
local res = jarvis.system.exec(a.cmd)
local ok = res.success
-- shutdown /a returns non-zero if there was no pending shutdown — treat as success
-- (idempotent "cancel if any").
if not ok and cmd_id == "cancel_shutdown" then
ok = true
end
if not ok then
jarvis.log("error", "power " .. cmd_id .. " failed: " .. tostring(res.stderr):sub(1, 200))
return jarvis.cmd.error((lang == "ru" and "Не получилось: " or "Failed: ") .. cmd_id)
end
jarvis.system.notify("Power", a.label)
jarvis.log("info", "power: " .. cmd_id .. " -> " .. a.label)
-- For destructive ops with a 30-second window, give the user the abort hint.
local say = a.label
if a.warn then
say = say .. ". " .. (lang == "ru" and "Скажите отмени если передумали."
or "Say cancel to abort.")
end
return jarvis.cmd.ok(say)