Nomyx-Core-0.6.0: src/Nomyx/Core/Mail.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE NamedFieldPuns #-}
module Nomyx.Core.Mail where
import Prelude hiding (div, (.))
import Language.Haskell.HsColour.Colourise hiding (string)
import qualified Language.Haskell.HsColour.HTML as HSC
import Text.Blaze.Html5 hiding (map, label, br)
import qualified Text.Blaze.Html5 as H
import Text.Blaze.Html.Renderer.String
import Network.Mail.Mime hiding (mailTo)
import Safe
import Data.List
import Data.Text(Text, pack)
import Data.Maybe
import qualified Data.Text.Lazy as B
import Control.Concurrent
import Control.Category
import Control.Applicative ((<$>))
import Control.Monad
import Language.Nomyx
import Nomyx.Core.Profile
import Nomyx.Core.Types
import Nomyx.Core.Utils
import Nomyx.Core.Engine
default (Integer, Double, Data.Text.Text)
sendMail :: String -> String -> String -> String-> IO()
sendMail to object htmlBody textBody = do
putStrLn $ "sending a mail to " ++ to
forkIO $ simpleMail (Address Nothing (pack to))
(Address (Just "Nomyx Game") "kau@nomyx.net")
(pack object)
(B.pack htmlBody)
(B.pack textBody)
[] >>= renderSendMail
putStrLn "done"
newRuleHtmlBody :: PlayerName -> SubmitRule -> PlayerName -> Network -> Html
newRuleHtmlBody playerName (SubmitRule name desc code) prop net = docTypeHtml $ do
(toHtml $ "Dear " ++ playerName ++ ",") >> H.br
(toHtml $ "a new rule has been proposed by player " ++ prop ++ ".") >> H.br
(toHtml $ "Name: " ++ name) >> H.br
(toHtml $ "Description: " ++ desc) >> H.br
(toHtml $ "Code: ") >> H.br >> (preEscapedToHtml $ HSC.hscolour defaultColourPrefs False code) >> H.br >> H.br
(toHtml $ "Please login into Nomyx for actions on this rule:") >> H.br
(toHtml $ nomyxURL net ++ "/Nomyx") >> H.br >> H.br
(toHtml $ "You received this mail because you subscribed to Nomyx. To stop receiving mails, login to Nomyx with the above address, go to Settings and uncheck the corresponding box.") >> H.br
newRuleTextBody :: PlayerName -> SubmitRule -> PlayerName -> Network -> String
newRuleTextBody playerName (SubmitRule name desc code) prop net =
"Dear " ++ playerName ++ ",\n" ++
"a new rule has been proposed by player " ++ prop ++ ".\n" ++
"Name: " ++ name ++ "\n" ++
"Description: " ++ desc ++ "\n" ++
"Code: \n" ++ code ++ "\n\n" ++
"Please login into Nomyx for actions on this rule:\n" ++
nomyxURL net ++ "/Nomyx\n\n" ++
"You received this mail because you subscribed to Nomyx. To stop receiving mails, login to Nomyx with the above address, go to Settings and uncheck the corresponding box.\n"
newRuleObject :: PlayerName -> String
newRuleObject name = "[Nomyx] New rule posted by player " ++ name ++ "!"
sendMailsNewRule :: Session -> SubmitRule -> PlayerNumber -> IO ()
sendMailsNewRule s sr pn = when (_sendMails $ _mSettings $ _multi s) $ do
putStrLn "Sending mails"
gn <- fromJustNote "sendMailsNewRule" <$> getPlayersGame pn s
let sendMailsTo = delete pn (map _playerNumber (_players $ _game $ _loggedGame gn))
proposer <- Nomyx.Core.Profile.getPlayerName pn s
profiles <- mapM (getProfile s) sendMailsTo
mapM_ (send proposer (_net $ _mSettings $ _multi s) sr) (_pPlayerSettings <$> catMaybes profiles)
send :: PlayerName -> Network -> SubmitRule -> PlayerSettings -> IO()
send prop net sr set = when (_mailNewRule set)
$ sendMail (_mail set)
(newRuleObject prop)
(newRuleTextBody (_pPlayerName set) sr prop net)
(renderHtml $ newRuleHtmlBody (_pPlayerName set) sr prop net)
mapMaybeM :: (Monad m) => (a -> m (Maybe b)) -> [a] -> m [b]
mapMaybeM f = liftM catMaybes . mapM f