aboutsummaryrefslogtreecommitdiff
path: root/src/executable/haskell/Service/AdListener.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/executable/haskell/Service/AdListener.hs')
-rw-r--r--src/executable/haskell/Service/AdListener.hs67
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