hi3status-0.1.1.0: lib-src/Hi3Status/Blocks/Weather.hs
{-|
Module : Hi3Status.Blocks.Weather
License : MIT
Maintainer : Josh Kirklin (jjvk2@cam.ac.uk)
Stability : experimental
-}
module Hi3Status.Blocks.Weather (
WeatherBlock (..)
) where
import Hi3Status.Block
import Hi3Status.Block.Util
import System.Process
import System.Exit
import Data.List
import qualified Data.Text as T
import Control.Monad.IO.Class
data Conditions = ClearDay | ClearNight | Rain | Cloudy
-- | A block to display the weather. Requires @weather@ and @sunwait@.
data WeatherBlock = WeatherBlock {
-- | The weather format.
--
-- *@{icon}@ = An icon specifying conditions.
-- *@{temp}@ = The temperature.
format :: String,
-- | @{icon}@ when it's clear in the day.
clearDayText :: String,
-- | @{icon}@ when it's clear at night.
clearNightText :: String,
-- | @{icon}@ when it's raining.
rainText :: String,
-- | @{icon}@ when it's cloudy.
cloudyText :: String,
-- | True for Celsius, False for Farenheit.
celsius :: Bool,
-- | Location code.
location :: String,
-- | Latitude.
latitude :: String,
-- | Longitude.
longitude :: String
}
weather :: String -> Bool -> String -> String -> IO (Conditions, Int)
weather loc celsius long lat = do
w <- readProcess "weather" (if celsius then ["-m",loc] else [loc]) ""
temp <- readProcess "grep" ["emperature"] w >>= readProcess "awk" ["{print $2}"]
con <- if "cloud" `isInfixOf` w then return Cloudy else if "rain" `isInfixOf` w then return Rain
else do
(daynight,_,_) <- readProcessWithExitCode "sunwait" ["poll", long, lat] ""
case daynight of
ExitFailure 3 -> return ClearNight
otherwise -> return ClearDay
return (con,read temp)
instance Block WeatherBlock where
runBlock b = periodic_ 1000000000 $ do
(c,t) <- liftIO $ weather (location b) (celsius b) (longitude b) (latitude b)
let icon = case c of
ClearDay -> clearDayText b
ClearNight -> clearNightText b
Rain -> rainText b
Cloudy -> cloudyText b
pushBlockDescription $ emptyBlockDescription { full_text = formatText [("icon",icon),("temp", show t)] (format b) }