J.A.R.V.I.S-rust/resources/commands/world_clock/time_in.lua

96 lines
3.4 KiB
Lua
Raw Permalink Normal View History

-- "Сколько времени в Токио" — uses worldtimeapi.org public API.
local phrase = (jarvis.context.phrase or "")
local city = jarvis.text.strip_trigger(phrase:lower(), {
"сколько времени в",
"который час в",
"сколько часов в",
"время в",
"time in",
"what time in",
"котра година у",
"скільки часу в",
})
city = city:gsub("^[%s,:%.]+", ""):gsub("%s+$", "")
if city == "" then
return jarvis.cmd.error("В каком городе?")
end
-- Map common Russian city names → timezone slugs.
local TZ_MAP = {
-- Russia
["москва"] = "Europe/Moscow",
["спб"] = "Europe/Moscow",
["петербург"] = "Europe/Moscow",
["санкт-петербург"] = "Europe/Moscow",
["новосибирск"] = "Asia/Novosibirsk",
["екатеринбург"] = "Asia/Yekaterinburg",
["казань"] = "Europe/Moscow",
["владивосток"] = "Asia/Vladivostok",
["хабаровск"] = "Asia/Vladivostok",
["омск"] = "Asia/Omsk",
["красноярск"] = "Asia/Krasnoyarsk",
-- World
["лондон"] = "Europe/London",
["нью-йорк"] = "America/New_York",
["нью йорк"] = "America/New_York",
["сан-франциско"] = "America/Los_Angeles",
["сан франциско"] = "America/Los_Angeles",
["лос-анджелес"] = "America/Los_Angeles",
["лос анджелес"] = "America/Los_Angeles",
["токио"] = "Asia/Tokyo",
["пекин"] = "Asia/Shanghai",
["шанхай"] = "Asia/Shanghai",
["гонконг"] = "Asia/Hong_Kong",
["сингапур"] = "Asia/Singapore",
["сидней"] = "Australia/Sydney",
["дубай"] = "Asia/Dubai",
["париж"] = "Europe/Paris",
["берлин"] = "Europe/Berlin",
["мадрид"] = "Europe/Madrid",
["рим"] = "Europe/Rome",
["амстердам"] = "Europe/Amsterdam",
["варшава"] = "Europe/Warsaw",
["прага"] = "Europe/Prague",
["стамбул"] = "Europe/Istanbul",
["киев"] = "Europe/Kyiv",
["минск"] = "Europe/Minsk",
["ереван"] = "Asia/Yerevan",
["тбилиси"] = "Asia/Tbilisi",
["алматы"] = "Asia/Almaty",
["астана"] = "Asia/Almaty",
["баку"] = "Asia/Baku",
["ташкент"] = "Asia/Tashkent",
["сеул"] = "Asia/Seoul",
["мехико"] = "America/Mexico_City",
["рио"] = "America/Sao_Paulo",
["буэнос-айрес"] = "America/Argentina/Buenos_Aires",
}
local tz = nil
for stem, zone in pairs(TZ_MAP) do
if city:find(stem, 1, true) then
tz = zone
break
end
end
if not tz then
return jarvis.cmd.not_found("Не знаю такого города. Попробуйте Москва, Токио, Лондон.")
end
-- worldtimeapi.org has rate limits but is free with no key.
local url = "https://worldtimeapi.org/api/timezone/" .. tz
local data = jarvis.http.json(url)
if not data or not data.datetime then
return jarvis.cmd.error("Не получилось узнать время.")
end
-- datetime is ISO 8601: "2026-05-15T14:32:11.123456+09:00"
local hh, mm = data.datetime:match("T(%d%d):(%d%d)")
if not hh then
return jarvis.cmd.error("Не понял ответ сервиса.")
end
return jarvis.cmd.ok(string.format("В %s сейчас %s:%s.", city, hh, mm))