module Imm.Mail where
import Imm.Types
import Imm.Util
import Control.Monad
import Control.Monad.Reader
import Data.Default
import qualified Data.Text.Lazy as T
import Data.Time
import Data.Time.RFC2822
import Text.Feed.Query as F
import Text.Feed.Types
instance Default Mail where
def = Mail {
mCharset = "utf-8",
mBody = T.pack "",
mContentDisposition = "inline",
mDate = Nothing,
mFrom = "imm",
mMIME = "text/html",
mSubject = T.pack "Untitled",
mReturnPath = "<imm@noreply>"}
toText :: Mail -> T.Text
toText mail = T.unlines [
T.pack $ "Return-Path: " ++ mReturnPath mail,
T.pack $ maybe "" (("Date: " ++) . showRFC2822) . mDate $ mail,
T.pack $ "From: " ++ mFrom mail,
T.concat [T.pack "Subject: ", mSubject mail],
T.pack $ "Content-Type: " ++ mMIME mail ++ "; charset=" ++ mCharset mail,
T.pack $ "Content-Disposition: " ++ mContentDisposition mail,
T.pack "",
mBody mail]
build :: MonadReader Settings m => TimeZone -> (Item, Feed) -> m Mail
build timeZone (item, feed) = do
from <- buildFrom (item, feed)
subject <- buildSubject (item, feed)
body <- buildBody (item, feed)
return def {mDate = date, mFrom = from, mSubject = subject, mBody = body}
where
date = maybe Nothing (Just . utcToZonedTime timeZone) . parseDate <=< F.getItemDate $ item
buildFrom :: MonadReader Settings m => (Item, Feed) -> m String
buildFrom (item, feed) = do
builder <- asks mFromBuilder
return $ builder (item, feed)
buildSubject :: MonadReader Settings m => (Item, Feed) -> m T.Text
buildSubject (item, feed) = do
builder <- asks mSubjectBuilder
return $ builder (item, feed)
buildBody :: MonadReader Settings m => (Item, Feed) -> m T.Text
buildBody (item, feed) = do
builder <- asks mBodyBuilder
return $ builder (item, feed)