module Service.AdListener ( start ) where import Control.Concurrent (threadDelay) import qualified Data.Text.IO as T import Prelude hiding (error) import Conf (Conf) import qualified Conf import qualified FetchAd import Model.Ad (Ad) import qualified Model.Ad as Ad import Model.Mail (Mail (Mail)) import Model.URL (URL) import qualified Service.MailService as MailService 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 <- FetchAd.leboncoin (Conf.leboncoinUrls conf) ouestFranceAds <- FetchAd.ouestFrance (Conf.ouestFranceUrls conf) seLogerAds <- FetchAd.seLoger (Conf.seLogerUrls conf) let results = leboncoinAds ++ ouestFranceAds ++ seLogerAds 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