205 lines
7.0 KiB
Lua
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
|