From 7a4219abe3b4885820bece194c7f125274a711c6 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 5 Feb 2014 02:33:22 -0500 Subject: Find out whether the weather monitor is likely to block Uses the HTTP module to do the work rather than curl. --- src/Plugins/Monitors.hs | 6 +++--- src/Plugins/Monitors/Weather.hs | 19 +++++++++++++++++++ xmobar.cabal | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/Plugins/Monitors.hs b/src/Plugins/Monitors.hs index baeb615..27db417 100644 --- a/src/Plugins/Monitors.hs +++ b/src/Plugins/Monitors.hs @@ -19,7 +19,7 @@ module Plugins.Monitors where import Plugins -import Plugins.Monitors.Common (runM) +import Plugins.Monitors.Common (runM, runMD) import Plugins.Monitors.Weather import Plugins.Monitors.Net import Plugins.Monitors.Mem @@ -40,7 +40,7 @@ import Plugins.Monitors.Wireless #endif #ifdef LIBMPD import Plugins.Monitors.MPD -import Plugins.Monitors.Common (runMD, runMBD) +import Plugins.Monitors.Common (runMBD) #endif #ifdef ALSA import Plugins.Monitors.Volume @@ -136,7 +136,7 @@ instance Exec Monitors where start (MultiCpu a r) = startMultiCpu a r start (TopProc a r) = startTop a r start (TopMem a r) = runM a topMemConfig runTopMem r - start (Weather s a r) = runM (a ++ [s]) weatherConfig runWeather r + start (Weather s a r) = runMD (a ++ [s]) weatherConfig runWeather r weatherReady start (Thermal z a r) = runM (a ++ [z]) thermalConfig runThermal r start (ThermalZone z a r) = runM (a ++ [show z]) thermalZoneConfig runThermalZone r diff --git a/src/Plugins/Monitors/Weather.hs b/src/Plugins/Monitors/Weather.hs index bb3d5da..a008453 100644 --- a/src/Plugins/Monitors/Weather.hs +++ b/src/Plugins/Monitors/Weather.hs @@ -20,6 +20,7 @@ import Control.Monad (when) import System.Process import System.Exit import System.IO +import Network.HTTP import Text.ParserCombinators.Parsec @@ -129,6 +130,9 @@ parseData = defUrl :: String defUrl = "http://weather.noaa.gov/pub/data/observations/metar/decoded/" +stationUrl :: String -> String +stationUrl station = defUrl ++ station ++ ".TXT" + getData :: String -> IO String getData url= do (i,o,e,p) <- runInteractiveCommand ("curl " ++ defUrl ++ url ++ ".TXT") @@ -156,3 +160,18 @@ runWeather str = do d <- io $ getData $ head str i <- io $ runP parseData d formatWeather i + +weatherReady :: [String] -> Monitor Bool +weatherReady str = do + let station = head str + request = headRequest (stationUrl station) + result <- io $ simpleHTTP request + case result of + Left _ -> return False + Right response -> do + case rspCode response of + -- Permission or network errors are failures; anything else is + -- recoverable. + (4, _, _) -> return False + (5, _, _) -> return False + (_, _, _) -> return True diff --git a/xmobar.cabal b/xmobar.cabal index 39aa0dc..9a26c5d 100644 --- a/xmobar.cabal +++ b/xmobar.cabal @@ -108,6 +108,7 @@ executable xmobar X11 >= 1.6.1, mtl >= 2.0 && < 2.2, parsec == 3.1.*, + HTTP >= 4000, stm >= 2.3 && < 2.5 if flag(with_threaded) -- cgit v1.2.3