From 4ddd6d1f6df2bab75d42b6d45b816e92e7173529 Mon Sep 17 00:00:00 2001 From: Joris Guyonvarch Date: Sat, 11 Apr 2015 19:20:04 +0200 Subject: Fixing parsing errors, and use Text from now --- src/Main.hs | 95 ++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 39 deletions(-) (limited to 'src/Main.hs') diff --git a/src/Main.hs b/src/Main.hs index f9cd7f0..6208953 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -1,64 +1,81 @@ +{-# 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) +import Ad (getResumes, getAds) import Model.Ad import Model.URL -import Model.Resume (getURLs, getNewResumes) +import Model.Resume -import View.Ad (renderResume) +import View.Ad (renderAds) import Page import Parser.Detail -url :: URL -url = "http://www.leboncoin.fr/annonces/offres/corse/" +listenURL :: URL +listenURL = "http://www.leboncoin.fr/annonces/offres/corse/" main :: IO () -main = initListenToNewResumes +main = listenToNewAds [] -initListenToNewResumes :: IO () -initListenToNewResumes = do - eitherResumes <- getResumes url +listenToNewAds :: [Ad] -> IO () +listenToNewAds viewedAds = do + eitherResumes <- getResumes listenURL case eitherResumes of - Left error -> do - putStrLn error - waitOneMinute - initListenToNewResumes + Left error -> + listenError viewedAds error Right resumes -> - let viewedURLs = getURLs resumes - in do - putStrLn "Initialization complete" - waitOneMinute - listenToNewResumes viewedURLs + listenToNewAdsWithResumes viewedAds resumes -listenToNewResumes :: [URL] -> IO () -listenToNewResumes viewedURLs = do - eitherResumes <- getResumes url - case eitherResumes of - Left error -> do - putStrLn error - waitOneMinute - listenToNewResumes viewedURLs - Right resumes -> - let (newViewdURLs, newResumes) = getNewResumes viewedURLs resumes - newAdsCount = length newResumes - in do - if newAdsCount > 0 - then - do - putStrLn ("Got " ++ (show newAdsCount) ++ " new ads.\n") - putStrLn (concat . intersperse "\n\n" . map renderResume $ newResumes) - else - return () - waitOneMinute - listenToNewResumes newViewdURLs +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) -- cgit v1.2.3