-- | Look up METAR weather records. -- -- Copyright (c) 2014 Bertram Felgenhauer -- GPL version 2 or later (see http://www.gnu.org/copyleft/gpl.html) module Lambdabot.Plugin.Reference.Metar (metarPlugin) where import Lambdabot.Plugin import Lambdabot.Util.Browser (browseLB) import Network.Browser (request) import Network.HTTP (getRequest, rspCode, rspBody) import Data.Char (isAlpha, toUpper) metarPlugin :: Module () metarPlugin = newModule { moduleCmds = return [ (command "metar") { help = say "metar \n\ \Look up METAR weather data for given airport." , process = doMetar } ] } addsUri :: String addsUri = "http://www.aviationweather.gov/adds/dataserver_current/httpparam" addsSrc :: String -> String addsSrc code = addsUri ++ "?dataSource=metars&requestType=retrieve&format=csv&hoursBeforeNow=2\ \&mostRecentForEachStation=true&stationString=" ++ code doMetar :: MonadLB m => String -> Cmd m () doMetar code | length code == 4 && all isAlpha code = do msg <- browseLB $ do let src = addsSrc (map toUpper code) (uri, resp) <- request $ getRequest src case rspCode resp of (2,_,_) -> return $ extractMetar (rspBody resp) _ -> return $ "Request failed." say msg doMetar _ = return () extractMetar :: String -> String extractMetar body = case lines body of ls@("No errors" : _) -> case takeWhile (/= ',') (last ls) of "raw_text" -> "No result." l -> l _ -> "Request failed."