{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Main (main) where
--------------------------------------------------------------------------------
import Control.Applicative ((<$>), (<*>), (<**>))
import Control.Concurrent (threadDelay)
import Control.Monad (forever)
import Data.Monoid (mconcat, mempty)
import System.IO.Error (catchIOError)
--------------------------------------------------------------------------------
import qualified Network.AMQP as AMQP
import qualified Network.Mail.Mime as Mail
import qualified Network.Metric as Metrics
import qualified Options.Applicative as Optparse
import qualified Network.Socket as Socket
--------------------------------------------------------------------------------
import qualified Mailer
import qualified MusicBrainz.Email as Email
import qualified MusicBrainz.Messaging as Messaging
import qualified RateLimit
--------------------------------------------------------------------------------
data StatsdConfiguration = Statsd { statsdHost :: String
, statsdPort :: Socket.PortNumber
}
--------------------------------------------------------------------------------
data Options = Options Messaging.RabbitMQConnection StatsdConfiguration
--------------------------------------------------------------------------------
run :: Options -> IO ()
run (Options rabbitMqConf Statsd {..}) = do
rabbitMqConn <- Messaging.connect rabbitMqConf
rabbitMq <- AMQP.openChannel rabbitMqConn
Email.establishRabbitMqConfiguration rabbitMq
statsd <- Metrics.open Metrics.Statsd "musicbrainz" statsdHost statsdPort
sendMail <- let approximateEditorCount = 680000
day = 24 * 60 * 60.0
in RateLimit.rateLimit (approximateEditorCount / day) $
\mail -> do
Mail.renderSendMail mail
Metrics.push statsd (Metrics.Counter "email" "sent" 1)
`catchIOError` (const $ putStrLn "Couldn't write to statsd")
heist <- Mailer.loadTemplates
Mailer.consumeOutbox rabbitMqConn heist sendMail
forever (threadDelay 1000000)
--------------------------------------------------------------------------------
main :: IO ()
main = Optparse.execParser parser >>= run
where
parser =
Optparse.info
(Options <$> Messaging.rabbitOptparse
<*> statsdParser
<**> Optparse.helper)
mempty
statsdParser =
Statsd
<$> Optparse.strOption (mconcat [ Optparse.long "statsd-host"
, Optparse.help "Statsd host"
])
<*> fmap fromInteger
(Optparse.option (mconcat [ Optparse.long "statsd-port"
, Optparse.value 8125
, Optparse.help "Statsd port"
]))