module Service.AdListener ( start ) where import Control.Concurrent (threadDelay) import qualified Data.Text as T import qualified Data.Text.IO as T import Network.Wreq.Session (Session) 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 -> Session -> IO () start conf session = do ads <- fetchAds conf session let newURLs = map Ad.url ads T.putStrLn "Listening to new ads…" waitListenInterval conf listenToNewAdsWithViewedURLs conf session newURLs listenToNewAdsWithViewedURLs :: Conf -> Session -> [URL] -> IO () listenToNewAdsWithViewedURLs conf session viewedURLs = do ads <- fetchAds conf session let (newURLs, newAds) = Ad.getNewAds viewedURLs ads time <- TimeUtils.getCurrentFormattedTime if not (null newAds) then do _ <- T.putStrLn (Ad.renderConsoleAds time newAds) sendMail conf newAds else return () waitListenInterval conf listenToNewAdsWithViewedURLs conf session (viewedURLs ++ newURLs) fetchAds :: Conf -> Session -> IO [Ad] fetchAds conf session = do leboncoinAds <- FetchAd.leboncoin session (Conf.leboncoinUrls conf) ouestFranceAds <- FetchAd.ouestFrance session (Conf.ouestFranceUrls conf) seLogerAds <- FetchAd.seLoger session (Conf.seLogerUrls conf) let results = leboncoinAds ++ ouestFranceAds ++ seLogerAds T.putStrLn . T.concat $ [ "Parsed " , T.pack . show $ length results , " results" ] 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 (Conf.mailMock conf) mail >> return () waitListenInterval :: Conf -> IO () waitListenInterval = threadDelay . (*) 1000000 . round . Conf.listenInterval