{-# LANGUAGE OverloadedStrings #-} module Main ( main ) where import Data.List (intersperse) import qualified Data.Text as T import qualified Data.Text.IO as T import Control.Concurrent (threadDelay) import Ad (getResumes, getAds) import Model.Ad import Model.URL import Model.Resume import View.Ad (renderAds) import Page import Parser.Detail listenURL :: URL listenURL = "http://www.leboncoin.fr/annonces/offres/corse/" main :: IO () main = listenToNewAds [] listenToNewAds :: [Ad] -> IO () listenToNewAds viewedAds = do eitherResumes <- getResumes listenURL case eitherResumes of Left error -> listenError viewedAds error Right resumes -> listenToNewAdsWithResumes viewedAds resumes listenToNewAdsWithResumes :: [Ad] -> [Resume] -> IO () listenToNewAdsWithResumes viewedAds resumes = let viewedURLs = getURLs $ map resume viewedAds newResumes = getNewResumes viewedURLs resumes in do eitherNewAds <- getAds newResumes case eitherNewAds of Left error -> listenError viewedAds error Right newAds -> do if not (null newAds) then T.putStrLn (newAdsMessage newAds) else return () waitOneMinute listenToNewAds (viewedAds ++ newAds) newAdsMessage :: [Ad] -> T.Text newAdsMessage newAds = let newAdsMessage = T.concat [ "Got " , T.pack . show . length $ newAds , " new ads." ] line = T.map (\_ -> '-') newAdsMessage in T.intercalate "\n" [ newAdsMessage , T.concat [line, "\n"] , renderAds newAds ] listenError :: [Ad] -> T.Text -> IO () listenError viewedAds error = do T.putStrLn error waitOneMinute listenToNewAds viewedAds waitOneMinute :: IO () waitOneMinute = threadDelay (1000 * 1000 * 60)