feat: 5 new packs + dotenvy + regen icon.ico + shortcuts redo
Iron Man icon regenerated from resources/icons/icon.png at sizes 16/24/32/48/64/128/256 via Pillow (make_ico.py committed alongside); icon.ico is now a clean 83 KB multi-res for sharp display at any scale instead of whatever placeholder Tauri originally emitted. dotenvy added to workspace deps. jarvis-app/main.rs and jarvis-gui/ main.rs both walk up from current_exe() looking for dev.env (up to 5 parent levels), so the Desktop shortcut can launch the exe directly without a wrapper .bat to pre-set GROQ_TOKEN. Falls back to dotenvy::dotenv() (cwd lookup) if nothing found near the binary. 5 new portable Lua command packs. Bumps total from 21 to 26. cargo test -p jarvis-core --lib commands::tests still passes 3/3. reminders/ — set_reminder. Parses "напомни через N (секунд|минут| часов) <body>" or English equivalents; understands one Russian word numerals (один, две, пять, десять, пятнадцать, ...) for the count when speech recognition returns words instead of digits. Defaults to 5 minutes if number/unit missing. Spawns a detached PowerShell that Start-Sleeps then fires: BurntToast if installed, System.Speech SAPI (ru-RU voice preference), and a WScript.Shell.Popup as the guaranteed-visible last resort. date_query/ — today / tomorrow / yesterday. Single answer.lua keyed by command_id, computes the offset via PowerShell Get-Date.AddDays() in ru-RU culture so the weekday/month come out in Russian, then speaks via SAPI. voice_type/ — type_text. Strips the trigger, drops the remainder to clipboard via jarvis.system.clipboard.set, then synthesises Ctrl+V through user32!keybd_event so it lands in whatever window currently has focus. Works in any text field (note app, browser, IDE, Telegram, etc.). dice/ — coin_flip / roll_dice / random_number. Single roll.lua, seeds math.random with os.time + jitter, speaks the result. "1-6" for dice, "1-100" for random. stopwatch/ — start / check / stop. Uses jarvis.state.get/set (persisted via jarvis-core's settings DB) to remember the start timestamp, computes elapsed via jarvis.context.time.timestamp, formats as "X сек" / "X мин Y сек" / "X ч Y мин Z сек". All new packs follow the established patterns (sandbox=full, PS-via- exec helper where needed, USERPROFILE/SystemDrive everywhere, no hardcoded paths).
This commit is contained in:
parent
ae279aeef7
commit
dcee98bddf
18 changed files with 516 additions and 1 deletions
37
resources/commands/dice/command.toml
Normal file
37
resources/commands/dice/command.toml
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[[commands]]
|
||||
id = "coin_flip"
|
||||
type = "lua"
|
||||
script = "roll.lua"
|
||||
sandbox = "full"
|
||||
timeout = 3000
|
||||
|
||||
[commands.phrases]
|
||||
ru = ["подбрось монетку", "брось монетку", "орёл или решка", "орел или решка"]
|
||||
en = ["flip a coin", "toss a coin", "heads or tails"]
|
||||
ua = ["підкинь монетку", "орел чи решка"]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "roll_dice"
|
||||
type = "lua"
|
||||
script = "roll.lua"
|
||||
sandbox = "full"
|
||||
timeout = 3000
|
||||
|
||||
[commands.phrases]
|
||||
ru = ["брось кубик", "подбрось кубик", "кинь кубик"]
|
||||
en = ["roll a dice", "roll the dice"]
|
||||
ua = ["кинь кубик"]
|
||||
|
||||
|
||||
[[commands]]
|
||||
id = "random_number"
|
||||
type = "lua"
|
||||
script = "roll.lua"
|
||||
sandbox = "full"
|
||||
timeout = 3000
|
||||
|
||||
[commands.phrases]
|
||||
ru = ["случайное число", "выбери случайное число", "рандомное число"]
|
||||
en = ["random number", "pick a random number"]
|
||||
ua = ["випадкове число"]
|
||||
35
resources/commands/dice/roll.lua
Normal file
35
resources/commands/dice/roll.lua
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
local lang = jarvis.context.language
|
||||
local cmd_id = jarvis.context.command_id
|
||||
|
||||
math.randomseed(os.time() + math.floor(jarvis.context.time.second * 7919))
|
||||
|
||||
local title, text, say
|
||||
|
||||
if cmd_id == "coin_flip" then
|
||||
local r = math.random(2)
|
||||
text = (r == 1) and (lang == "ru" and "Орёл" or "Heads") or (lang == "ru" and "Решка" or "Tails")
|
||||
title = lang == "ru" and "Монетка" or "Coin"
|
||||
say = text
|
||||
elseif cmd_id == "roll_dice" then
|
||||
local r = math.random(1, 6)
|
||||
text = tostring(r)
|
||||
title = lang == "ru" and "Кубик" or "Dice"
|
||||
say = (lang == "ru" and "Выпало " or "Rolled ") .. r
|
||||
else
|
||||
local r = math.random(1, 100)
|
||||
text = tostring(r)
|
||||
title = lang == "ru" and "Случайное число" or "Random number"
|
||||
say = (lang == "ru" and "Число " or "Number ") .. r
|
||||
end
|
||||
|
||||
jarvis.system.notify(title, text)
|
||||
|
||||
local sapi = say:gsub("'", "''")
|
||||
local sps = 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"', sps:gsub('"', '\\"')))
|
||||
|
||||
jarvis.audio.play_ok()
|
||||
return { chain = false }
|
||||
Loading…
Add table
Add a link
Reference in a new issue