J.A.R.V.I.S-rust/resources/commands/network/ip.lua

25 lines
1 KiB
Lua
Raw Permalink Normal View History

arch + features: jarvis.text API + brightness/window_switch/spelling/network/summarize (41 packs) Architecture — close the trigger-strip duplication: lua/api/text.rs (new): + jarvis.text.strip_trigger(phrase, triggers) — case-insensitive "longest trigger wins" stripping, returns trimmed remainder. The 11 packs that previously inlined a `for _, t in ipairs(triggers) do string.find ... s == 1 then sub` loop can drop to one call. Demonstrated in spelling/, window_switch/, summarize/. + jarvis.text.contains_any(phrase, needles) — boolean check for any of N substrings, case-insensitive. Useful for keyword routing. 5 new portable Lua packs (sandbox=full). 36 → 41 total. cargo test commands::tests still 3/3. brightness/ — brightness_up / down / max / min. WMI WmiMonitorBrightness (read CurrentBrightness) + WmiMonitorBrightnessMethods.WmiSetBrightness (write). ±20% step for up/down; max=100, min=10. Desktop monitors that don'\''t expose the WMI namespace get a friendly "не поддерживается" toast instead of a silent failure. window_switch/ — switch_to_window. Strip trigger ("переключись на" / "switch to" / etc.), apply the same alias map as process_kill (хром→chrome, телега→telegram, ...), then PowerShell finds processes by name OR window-title substring sorted by StartTime desc and uses (New-Object -ComObject WScript.Shell).AppActivate($pid) on the top match. Speaks the window title that got focus. spelling/ — spell_out. Strips "произнеси по буквам" / "spell out" / etc., iterates `word:gmatch(".")`, joins letters with ". " so SAPI gives each one a natural micro-pause. Uses jarvis.text.strip_trigger + jarvis.speak — 24 lines total. network/ — open_wifi_settings (ms-settings:network-wifi) + open_bluetooth_settings (ms-settings:bluetooth) + my_ip. my_ip pulls the first non-loopback, non-APIPA IPv4 with Get-NetIPAddress and fetches WAN IP from api.ipify.org (5s timeout); speaks "Локальный X. Внешний Y". summarize/ — summarize_selection. Synthesises Ctrl+C through user32! keybd_event (so the focused window copies its selection), waits 220 ms for the clipboard to populate, reads via jarvis.system.clipboard.get(), bails if < 20 chars, truncates at 8000, sends to Groq @ temp 0.3 with a "3-5 sentences, keep names" prompt, drops the summary back into the clipboard and speaks it. Lets you select ANY text in ANY app (browser, PDF, IDE) and say "суммируй" to get a spoken TL;DR. The new packs explicitly use the new jarvis.text + jarvis.llm + jarvis.speak API surface — no inline PS-SAPI boilerplate, no inline Groq plumbing. Code is now intent-first.
2026-05-15 13:11:18 +03:00
local lang = jarvis.context.language
local ps = [[
$lan = (Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue |
Where-Object { $_.PrefixOrigin -eq 'Dhcp' -or $_.PrefixOrigin -eq 'Manual' } |
Where-Object { $_.IPAddress -notmatch '^127\.' -and $_.IPAddress -notmatch '^169\.254\.' } |
Select-Object -First 1).IPAddress
if (-not $lan) { $lan = '(none)' }
$wan = try { (Invoke-RestMethod -Uri 'https://api.ipify.org?format=json' -TimeoutSec 5).ip } catch { 'unavailable' }
Write-Output ('LAN ' + $lan + ' WAN ' + $wan)
]]
local res = jarvis.system.exec(string.format('powershell -NoProfile -Command "%s"', ps:gsub('"', '\\"')))
local out = (res.stdout or ""):gsub("[\r\n]+$", "")
if out == "" then
jarvis.audio.play_error()
return { chain = false }
end
jarvis.system.notify("IP", out)
local say = out:gsub("LAN", lang == "ru" and "Локальный" or "LAN"):gsub("WAN", lang == "ru" and ". Внешний" or ". WAN")
jarvis.speak(say, { lang = lang })
jarvis.audio.play_ok()
return { chain = false }