aboutsummaryrefslogtreecommitdiff
path: root/src/executable/haskell/Service/AdListener.hs
blob: 9af92f4bed30fe2c148cc66485e5da357adf7c30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
module Service.AdListener
  ( start
  ) where

import           Control.Concurrent   (threadDelay)
import qualified Data.Text            as T
import qualified Data.Text.IO         as T
import qualified Data.Time.LocalTime  as LocalTime
import           Network.Wreq.Session (Session)

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 ads = []
  let newURLs = map Ad.url ads
  T.putStrLn "Listening to new ads…"
  sleepUntilReady 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 ()
  sleepUntilReady 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 ()

sleepUntilReady :: Conf -> IO ()
sleepUntilReady conf = do
  timeSinceMidnight <-
    (LocalTime.timeOfDayToTime . LocalTime.localTimeOfDay . LocalTime.zonedTimeToLocalTime)
      <$> LocalTime.getZonedTime
  case TimeUtils.asleepDuration (Conf.listenFrom conf) (Conf.listenTo conf) timeSinceMidnight of
    Just d -> do
      sleepSeconds d

    Nothing ->
      -- TODO 04/09/2019: Add noise
      sleepSeconds . Conf.listenInterval $ conf
  where
    sleepSeconds =
      threadDelay . (*) 1000000 . round