J.A.R.V.I.S-rust/resources/commands/apps/screenshot.lua

25 lines
1.1 KiB
Lua
Raw Normal View History

feat(commands): add PC control packs — volume, apps, file_search, output_device All four packs are pure Lua (sandbox=full) and call out to PowerShell helpers where COM / native APIs are needed. No new Rust code, no rebuild required: post_build.py --sync copies them under target/{debug,release}/resources/. volume/ - volume_up / volume_down: 5x VK_VOLUME_UP|DOWN via keybd_event - volume_mute: VK_VOLUME_MUTE - volume_max: 50x VK_VOLUME_UP (system clamps) Helper _volume_helper.ps1 P/Invokes user32!keybd_event. apps/ - open_browser : start "" https://www.google.com (uses system default browser) - open_notepad : notepad.exe - open_calculator: calc.exe - open_explorer : explorer.exe - open_terminal : wt.exe, falls back to powershell.exe - open_settings : ms-settings: protocol - open_task_manager: taskmgr.exe - lock_screen : rundll32 user32.dll,LockWorkStation - screenshot : System.Drawing capture to ~/Pictures/jarvis_screenshot_*.png file_search/ - find file <query> : recursive Get-ChildItem in Desktop/Documents/Downloads (depth 3, top 5 matches). Strips Russian/English/Ukrainian trigger prefixes from the recognized phrase, then opens explorer /select on the first hit and notifies with the total count. output_device/ - list_output_devices : enumerates active render endpoints via IMMDeviceEnumerator and notifies friendly names with indices - next_output_device : cycles the system default render device via the undocumented IPolicyConfig::SetDefaultEndpoint (eConsole/Multimedia/ Communications). Tested locally — listed 7 devices, current correctly identified at index 5.
2026-05-15 00:54:52 +03:00
local ts = jarvis.context.time.year .. jarvis.context.time.month .. jarvis.context.time.day
.. "_" .. jarvis.context.time.hour .. jarvis.context.time.minute .. jarvis.context.time.second
local userprofile = jarvis.system.env("USERPROFILE") or "C:\\Users\\Public"
local target = userprofile .. "\\Pictures\\jarvis_screenshot_" .. ts .. ".png"
local ps = string.format(
[[Add-Type -AssemblyName System.Windows.Forms,System.Drawing; $b=[System.Windows.Forms.Screen]::PrimaryScreen.Bounds; $bmp=New-Object Drawing.Bitmap $b.Width,$b.Height; $g=[Drawing.Graphics]::FromImage($bmp); $g.CopyFromScreen($b.Location,[Drawing.Point]::Empty,$b.Size); $bmp.Save('%s'); $g.Dispose(); $bmp.Dispose()]],
target:gsub("\\", "\\\\")
)
local cmd = string.format('powershell -NoProfile -ExecutionPolicy Bypass -Command "%s"', ps:gsub('"', '\\"'))
local res = jarvis.system.exec(cmd)
if res.success then
jarvis.log("info", "screenshot saved to " .. target)
jarvis.system.notify("Скриншот", target)
jarvis.audio.play_ok()
else
jarvis.log("error", "screenshot failed: " .. tostring(res.stderr))
jarvis.audio.play_error()
end
return { chain = false }