Files
crylia-theme/awesome/src/modules/notification-center/widgets/weather.lua
2023-04-20 01:04:06 +02:00

205 lines
7.0 KiB
Lua

--------------------------------
-- This is the weather widget --
--------------------------------
-- Awesome Libs
local beautiful = require('beautiful')
local dpi = require('beautiful').xresources.apply_dpi
local wibox = require('wibox')
local gfilesystem = require('gears.filesystem')
local gtimer = require('gears.timer')
local aspawn = require('awful.spawn')
local gcolor = require('gears.color')
local json_lua = require('src.lib.json-lua.json-lua')
-- Icon directory path
local icondir = gfilesystem.get_configuration_dir() .. 'src/assets/icons/weather/'
local instance = nil
local icon_table = {
['01d'] = 'weather-sunny',
['01n'] = 'weather-clear-night',
['02d'] = 'weather-partly-cloudy',
['02n'] = 'weather-night-partly-cloudy',
['03d'] = 'weather-cloudy',
['03n'] = 'weather-clouds-night',
['04d'] = 'weather-cloudy',
['04n'] = 'weather-cloudy',
['09d'] = 'weather-rainy',
['09n'] = 'weather-rainy',
['10d'] = 'weather-partly-rainy',
['10n'] = 'weather-partly-rainy',
['11d'] = 'weather-pouring',
['11n'] = 'weather-pouring',
['13d'] = 'weather-snowy',
['13n'] = 'weather-snowy',
['50d'] = 'weather-fog',
['50n'] = 'weather-fog',
}
if not instance then
instance = setmetatable({}, { __call = function()
local w = wibox.widget {
{
{
{
{
{
{
{ -- Icon
valign = 'center',
halign = 'center',
widget = wibox.widget.imagebox,
id = 'icon',
},
widget = wibox.container.constraint,
width = dpi(64),
height = dpi(64),
strategy = 'exact',
},
{ -- Temperature
text = 'NaN°C',
valign = 'center',
halign = 'center',
widget = wibox.widget.textbox,
font = 'JetBrains Mono Bold 24',
id = 'temp',
},
{ -- City, Country
text = 'City, Country',
valign = 'center',
halign = 'center',
widget = wibox.widget.textbox,
id = 'city_country',
},
{
{ -- Description
text = 'NaN',
valign = 'center',
halign = 'center',
widget = wibox.widget.textbox,
id = 'description',
},
fg = beautiful.colorscheme.bg_blue,
widget = wibox.container.background,
},
{ -- line
{
bg = beautiful.colorscheme.bg1,
widget = wibox.container.background,
},
widget = wibox.container.constraint,
height = dpi(2),
width = dpi(10),
strategy = 'exact',
},
{
{ -- Speed
{
image = gcolor.recolor_image(icondir .. 'weather-windy.svg',
beautiful.colorscheme.bg_red),
valign = 'center',
halign = 'center',
widget = wibox.widget.imagebox,
},
widget = wibox.container.constraint,
width = dpi(24),
height = dpi(24),
strategy = 'exact',
},
{
text = 'NaN m/s',
valign = 'center',
halign = 'center',
widget = wibox.widget.textbox,
id = 'speed',
},
spacing = dpi(10),
layout = wibox.layout.fixed.horizontal,
},
{
{ -- Humidity
{
{
widget = wibox.widget.imagebox,
valign = 'center',
halign = 'center',
image = gcolor.recolor_image(icondir .. 'humidity.svg',
beautiful.colorscheme.bg_red),
},
widget = wibox.container.constraint,
width = dpi(24),
height = dpi(24),
strategy = 'exact',
},
{
text = 'NaN%',
valign = 'center',
halign = 'center',
widget = wibox.widget.textbox,
id = 'humidity',
},
spacing = dpi(10),
layout = wibox.layout.fixed.horizontal,
},
widget = wibox.container.place,
},
spacing = dpi(10),
layout = wibox.layout.fixed.vertical,
},
margins = dpi(20),
widget = wibox.container.margin,
},
widget = wibox.container.place,
},
border_color = beautiful.colorscheme.border_color,
border_width = dpi(2),
shape = beautiful.shape[12],
widget = wibox.container.background,
},
top = dpi(20),
left = dpi(20),
right = dpi(10),
bottom = dpi(10),
widget = wibox.container.margin,
},
widget = wibox.container.constraint,
width = dpi(250),
strategy = 'exact',
}
gtimer {
timeout = 900,
autostart = true,
call_now = true,
callback = function()
aspawn.easy_async_with_shell("curl -sf 'http://api.openweathermap.org/data/2.5/weather?id=" ..
beautiful.user_config.weather_secrets.city_id .. '&units=' .. beautiful.user_config.weather_secrets.unit .. '&appid=' .. beautiful.user_config.weather_secrets.key .. "'",
function(stdout)
if not stdout:match('error') then
local weather_metadata = json_lua:decode(stdout)
if weather_metadata then
w:get_children_by_id('icon')[1].image = icondir .. icon_table[weather_metadata.weather[1].icon] .. '.svg'
w:get_children_by_id('temp')[1].text = math.floor(weather_metadata.main.temp + 0.5) .. '°C'
w:get_children_by_id('city_country')[1].text = weather_metadata.name .. ', ' .. weather_metadata.sys.country
w:get_children_by_id('description')[1].text = weather_metadata.weather[1].description:sub(1, 1):upper() ..
weather_metadata.weather[1].description:sub(2)
w:get_children_by_id('speed')[1].text = weather_metadata.wind.speed .. ' m/s'
w:get_children_by_id('humidity')[1].text = weather_metadata.main.humidity .. '%'
end
end
end
)
end,
}
return w
end, })
end
return instance