diff options
Diffstat (limited to 'src/executable/haskell/Service/AdListener.hs')
-rw-r--r-- | src/executable/haskell/Service/AdListener.hs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/executable/haskell/Service/AdListener.hs b/src/executable/haskell/Service/AdListener.hs new file mode 100644 index 0000000..f903f94 --- /dev/null +++ b/src/executable/haskell/Service/AdListener.hs @@ -0,0 +1,67 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Service.AdListener + ( start + ) where + +import Control.Concurrent (threadDelay) +import Data.Either (rights) +import qualified Data.Text.IO as T +import Prelude hiding (error) + +import Conf (Conf) +import qualified Conf +import Model.Ad (Ad) +import qualified Model.Ad as Ad +import Model.Mail (Mail (Mail)) +import Model.URL (URL) +import qualified Parser.LeboncoinParser as LeboncoinParser +import qualified Parser.OuestFranceParser as OuestFranceParser +import qualified Service.MailService as MailService +import qualified Utils.HTTP as HTTP +import qualified Utils.Time as TimeUtils +import qualified View.Ad as Ad + +start :: Conf -> IO () +start conf = do + ads <- fetchAds conf + let newURLs = map Ad.url ads + T.putStrLn "Listening to new ads…" + waitListenInterval conf + listenToNewAdsWithViewedURLs conf newURLs + +listenToNewAdsWithViewedURLs :: Conf -> [URL] -> IO () +listenToNewAdsWithViewedURLs conf viewedURLs = do + ads <- fetchAds conf + let (newURLs, newAds) = Ad.getNewAds viewedURLs ads + time <- TimeUtils.getCurrentFormattedTime + if not (null newAds) + then + do + _ <- T.putStrLn (Ad.renderConsoleAds time newAds) + if Conf.devMode conf + then return () + else sendMail conf newAds + else + return () + waitListenInterval conf + listenToNewAdsWithViewedURLs conf (viewedURLs ++ newURLs) + +fetchAds :: Conf -> IO [Ad] +fetchAds conf = do + leboncoinAds <- fmap (concat . map LeboncoinParser.parse . rights) . sequence . map HTTP.get . Conf.leboncoinUrls $ conf + ouestFranceAds <- fmap (concat . map OuestFranceParser.parse . rights) . sequence . map HTTP.get . Conf.ouestFranceUrls $ conf + let results = leboncoinAds ++ ouestFranceAds + if null results + then T.putStrLn "Parsed 0 results!" + else return () + return results + +sendMail :: Conf -> [Ad] -> IO () +sendMail conf ads = + let (title, plainBody) = Ad.renderAds ads + mail = Mail (Conf.mailFrom conf) (Conf.mailTo conf) title plainBody + in MailService.send mail >> return () + +waitListenInterval :: Conf -> IO () +waitListenInterval = threadDelay . (*) 1000000 . round . Conf.listenInterval |