yes, I'm very commit lazy
This commit is contained in:
203
awesome/src/modules/notification-center/widgets/weather.lua
Normal file
203
awesome/src/modules/notification-center/widgets/weather.lua
Normal file
@@ -0,0 +1,203 @@
|
||||
--------------------------------
|
||||
-- This is the weather widget --
|
||||
--------------------------------
|
||||
|
||||
-- Awesome Libs
|
||||
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 = Theme_config.notification_center.weather.description_fg,
|
||||
widget = wibox.container.background,
|
||||
},
|
||||
{ -- line
|
||||
{
|
||||
bg = Theme_config.notification_center.weather.line_color,
|
||||
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',
|
||||
Theme_config.notification_center.weather.speed_icon_color),
|
||||
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',
|
||||
Theme_config.notification_center.weather.humidity_icon_color),
|
||||
},
|
||||
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 = Theme_config.notification_center.weather.border_color,
|
||||
border_width = Theme_config.notification_center.weather.border_width,
|
||||
shape = Theme_config.notification_center.weather.shape,
|
||||
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=" ..
|
||||
User_config.weather_secrets.city_id .. '&units=' .. User_config.weather_secrets.unit .. '&appid=' .. 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
|
||||
Reference in New Issue
Block a user