aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/now.lua
blob: 8fc6843c182a87319ad5821f7059577d696e76bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
-- Now: the current conditions. Replaces the OpenWeatherMap weather card; the
-- daylight arc it carried moved to the sky card.
--
-- One of the forecast cards adapted from the Conky-Mirage theme by
-- alexsson-xexpanderx (see lib/weather.lua).

local card = require 'lib.card'
local data = require 'lib.data'
local weather = require 'lib.weather'

local M = {}

function M.draw(cr, rect, colors)
  local inner = card.card(cr, rect, colors)
  local w = weather.parse(data.slurp(weather.CACHE))
  if not w then
    -- Closed explicitly: this branch reruns every frame until a fetch lands,
    -- so an unclosed handle would accumulate one per draw.
    local envf = io.open((os.getenv('HOME') or '') .. '/.config/udt/weather.env', 'r')
    local hint = 'set ~/.config/udt/weather.env'
    if envf then
      envf:close()
      hint = 'bin/weather-fetch.sh'
    end
    card.notice(cr, inner, colors, 'WEATHER', 'no weather data', hint)
    return
  end

  local c, today, now = w.current, w.days[1] or {}, os.time()
  local rows = {
    { 'FEELS LIKE', weather.deg(c.feels) },
    { 'HIGH / LOW', weather.deg(today.max) .. ' / ' .. weather.deg(today.min) },
    { 'RAIN', weather.num(today.precip, '%') },
    { 'UPDATED', weather.age_str(c.dt, now),
      weather.is_stale(c.dt, now) and colors.warning or nil },
  }
  local y, S = card.standard(cr, inner, colors, {
    icon = weather.icon(c.code, c.is_day), title = 'WEATHER',
    big = weather.deg(c.temp), rows = rows, share = 0.85,
  })

  -- The condition in words, in the prose face, in what the rows left.
  local size = S * 0.36
  if y + size * 1.4 <= inner.y + inner.h then
    card.font(cr, card.FONT_UI, size, false)
    card.rgba(cr, colors.body)
    card.text(cr, inner.x, y + size * 1.4, weather.describe(c.code))
  end
end

return M