feat: Now Playing + World Clock + Daily Quote packs (72 → 75 rust packs)
Three small daily-driver packs mirrored with python (commit 02ab8a4 or similar).
now_playing
- "что играет" / "что за песня" / "какой трек" / "что слушаю"
- Reads Windows.Media.Control.GlobalSystemMediaTransportControlsSessionManager
via PowerShell — works with Spotify/YouTube/Foobar/Winamp/Yandex Music
(anything that exposes Windows SMTC, Win10 1803+).
- Speaks "Сейчас играет: <Artist> — <Title>" or just "<Title>" if no artist.
world_clock
- "сколько времени в Токио" / "время в Лондоне"
- 21+ pre-mapped Russian/world city names → IANA timezones.
- Fetches worldtimeapi.org (free, no key, no rate-limit headers exposed).
- Parses ISO 8601 datetime, speaks "В <city> сейчас HH:MM."
daily_quote
- "цитата дня" / "вдохнови меня"
- zenquotes.io (free, no key) → English quote.
- LLM translates to Russian via active backend (Groq or Ollama).
- Falls back to LLM-generated quote if zenquotes is unreachable.
- Speaks "<translated quote> — <author>."
Tests: 6 commands tests pass (no_duplicate_ids / no_empty_phrases /
all_lua_scripts_exist auto-validate the 3 new packs).
Pack count: 72 → 75.
This commit is contained in:
parent
4efe306b3a
commit
4d3d664abd
6 changed files with 233 additions and 0 deletions
19
resources/commands/daily_quote/command.toml
Normal file
19
resources/commands/daily_quote/command.toml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# Daily quote — random motivational quote.
|
||||
|
||||
[[commands]]
|
||||
id = "daily_quote"
|
||||
type = "lua"
|
||||
script = "quote.lua"
|
||||
sandbox = "full"
|
||||
timeout = 15000
|
||||
|
||||
[commands.phrases]
|
||||
ru = [
|
||||
"цитата дня",
|
||||
"мотивирующая цитата",
|
||||
"скажи цитату",
|
||||
"вдохнови меня",
|
||||
"цитата",
|
||||
]
|
||||
en = ["quote of the day", "motivational quote", "inspire me"]
|
||||
ua = ["цитата дня", "надихни мене"]
|
||||
31
resources/commands/daily_quote/quote.lua
Normal file
31
resources/commands/daily_quote/quote.lua
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
-- "Цитата дня" — random quote.
|
||||
-- Source: zenquotes.io (free, no key, returns JSON array)
|
||||
local data = jarvis.http.json("https://zenquotes.io/api/random")
|
||||
if not data or type(data) ~= "table" or #data == 0 then
|
||||
-- Fallback to LLM if API fails
|
||||
local llm_quote = jarvis.llm({
|
||||
{ role = "system", content = "Выдай одну короткую мотивирующую цитату. По-русски. Без вступлений." },
|
||||
{ role = "user", content = "Цитата дня." }
|
||||
}, { max_tokens = 100, temperature = 0.9 })
|
||||
if llm_quote and llm_quote ~= "" then
|
||||
return jarvis.cmd.ok(llm_quote)
|
||||
end
|
||||
return jarvis.cmd.error("Не получилось получить цитату.")
|
||||
end
|
||||
|
||||
local q = data[1]
|
||||
local quote_en = q.q or ""
|
||||
local author = q.a or "Аноним"
|
||||
if quote_en == "" then
|
||||
return jarvis.cmd.error("Пустая цитата.")
|
||||
end
|
||||
|
||||
-- Translate to Russian via LLM (the API returns English).
|
||||
local translated = jarvis.llm({
|
||||
{ role = "system", content = "Переведи английскую цитату на русский. Без вступлений. Только перевод." },
|
||||
{ role = "user", content = quote_en }
|
||||
}, { max_tokens = 200, temperature = 0.2 })
|
||||
|
||||
local text = (translated and translated ~= "") and translated or quote_en
|
||||
|
||||
return jarvis.cmd.ok(text .. " — " .. author .. ".")
|
||||
Loading…
Add table
Add a link
Reference in a new issue