diff options
-rw-r--r-- | src/Plugins/Monitors/Weather.hs | 36 | ||||
-rw-r--r-- | xmobar.cabal | 43 |
2 files changed, 58 insertions, 21 deletions
diff --git a/src/Plugins/Monitors/Weather.hs b/src/Plugins/Monitors/Weather.hs index 5f5fb6f..d458279 100644 --- a/src/Plugins/Monitors/Weather.hs +++ b/src/Plugins/Monitors/Weather.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} ----------------------------------------------------------------------------- -- | -- Module : Plugins.Monitors.Weather @@ -18,12 +19,14 @@ import Plugins.Monitors.Common import qualified Control.Exception as CE +#ifdef HTTP_CONDUIT import Network.HTTP.Conduit import Network.HTTP.Types.Status import Network.HTTP.Types.Method - ---import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy.Char8 as B +#else +import Network.HTTP +#endif import Text.ParserCombinators.Parsec @@ -177,7 +180,8 @@ defUrl = "http://weather.noaa.gov/pub/data/observations/metar/decoded/" stationUrl :: String -> String stationUrl station = defUrl ++ station ++ ".TXT" -getData:: String -> IO String +getData :: String -> IO String +#ifdef HTTP_CONDUIT getData station = CE.catch (do manager <- newManager tlsManagerSettings request <- parseUrl $ stationUrl station @@ -186,6 +190,13 @@ getData station = CE.catch (do ) errHandler where errHandler :: CE.SomeException -> IO String errHandler _ = return "<Could not retrieve data>" +#else +getData station = do + let request = getRequest (stationUrl station) + CE.catch (simpleHTTP request >>= getResponseBody) errHandler + where errHandler :: CE.IOException -> IO String + errHandler _ = return "<Could not retrieve data>" +#endif formatWeather :: [WeatherInfo] -> Monitor String formatWeather [WI st ss y m d h (WindInfo wc wa wm wk) v sk tC tF dC dF r p] = @@ -201,6 +212,7 @@ runWeather str = formatWeather i weatherReady :: [String] -> Monitor Bool +#ifdef HTTP_CONDUIT weatherReady str = do initRequest <- parseUrl $ stationUrl $ head str let request = initRequest{method = methodHead} @@ -214,3 +226,21 @@ weatherReady str = do | statusIsServerError status = False | statusIsClientError status = False | otherwise = True +#else +weatherReady str = do + let station = head str + request = headRequest (stationUrl station) + io $ CE.catch (simpleHTTP request >>= checkResult) errHandler + where errHandler :: CE.IOException -> IO Bool + errHandler _ = return False + checkResult result = + case result of + Left _ -> return False + Right response -> + case rspCode response of + -- Permission or network errors are failures; anything + -- else is recoverable. + (4, _, _) -> return False + (5, _, _) -> return False + (_, _, _) -> return True +#endif diff --git a/xmobar.cabal b/xmobar.cabal index 9be6452..f8e8057 100644 --- a/xmobar.cabal +++ b/xmobar.cabal @@ -78,6 +78,10 @@ flag with_uvmeter description: UVMeter only useful to australians. default: False +flag with_conduit + description: Use http-conduits for getting weather data + default: False + executable xmobar hs-source-dirs: src main-is: Main.hs @@ -105,24 +109,27 @@ executable xmobar extra-libraries: Xrandr Xrender build-depends: - base == 4.*, - containers, - regex-compat, - process, - old-locale, - bytestring, - directory, - unix, - time, - filepath, - transformers, - http-conduit, - http-types, - X11 >= 1.6.1, - mtl >= 2.1 && < 2.3, - parsec == 3.1.*, - HTTP >= 4000.2.4, - stm >= 2.3 && < 2.5 + base == 4.*, + containers, + regex-compat, + process, + old-locale, + bytestring, + directory, + unix, + time, + filepath, + transformers, + X11 >= 1.6.1, + mtl >= 2.1 && < 2.3, + parsec == 3.1.*, + HTTP >= 4000.2.4, + stm >= 2.3 && < 2.5 + + if flag(with_conduit) + -- use http-conduit instead of simple-http + build-depends: http-conduit, http-types + cpp-options: -DHTTP_CONDUIT if flag(with_threaded) -- -threaded is a workaround for 100% CPU busy loop |