J.A.R.V.I.S-rust/resources/commands/generators/password.lua
Bossiara13 84d3b57ddc feat: unit conversion + random generators packs (7 new commands)
Two pure-Lua packs that don't need network or LLM — pure offline utilities.

unit_convert (resources/commands/unit_convert/, 4 commands)
  - convert.length      "переведи 100 метров в футы" / "сколько 5 миль в км"
                        meters↔feet, km↔miles. Pluralises russian unit names.
  - convert.weight      "переведи 70 кг в фунты"
                        kg↔lbs.
  - convert.temperature "переведи 100 цельсий в фаренгейт" / "минус 40 в цельсий"
                        Handles negative numbers. C↔F formulas inline.
  - convert.speed       "переведи 100 км в час в мили в час"
                        km/h↔mph.
  - All round results to 1-2 decimal places, speak with proper Russian
    grammatical number (фут/фута/футов).

generators (resources/commands/generators/, 3 commands)
  - gen.coin       "подбрось монету" / "орёл или решка"
                   → "Орёл!" or "Решка!" (math.random with time+minute seed)
  - gen.password   "сгенерируй пароль 16 символов"
                   → cryptographically-ish 6..64-char password,
                   alphanumeric + !@#$%^&*-_=+, copies to clipboard,
                   SPEAKS LENGTH ONLY (never echoes the password).
                   Default 16 chars if no number in phrase.
  - gen.uuid       "сгенерируй uuid" / "юид"
                   → v4 UUID, copies to clipboard, speaks last 4 chars
                   (confirmation without 32-char monologue).

Tests: 112/112 pass (commands::tests auto-validates).
Pack count: 62 → 64.
2026-05-15 18:41:44 +03:00

22 lines
941 B
Lua

-- "Сгенерируй пароль 16 символов" → secure password (alphanumeric + symbols)
-- Copies result to clipboard, speaks length only (so it's not echoed).
local phrase = (jarvis.context.phrase or ""):lower()
local n = tonumber(phrase:match("(%d+)")) or 16
if n < 6 then n = 6 end
if n > 64 then n = 64 end
local pool = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*-_=+"
math.randomseed(os.time() + (jarvis.context.time.minute or 0) * 1000)
local pw = {}
for _ = 1, n do
local idx = math.random(1, #pool)
table.insert(pw, pool:sub(idx, idx))
end
local password = table.concat(pw)
jarvis.system.clipboard.set(password)
jarvis.system.notify("Пароль (" .. n .. " символов)", "Скопирован в буфер обмена")
-- Speak length only, never the password itself.
return jarvis.cmd.ok(string.format("Пароль на %d символов в буфере.", n))