module HackMail.Control.DaemonMode where
import Control.Applicative
import Control.Concurrent
import Control.Monad
import Data.IORef
import Data.List hiding (sort)
import Data.Maybe (fromJust)
import System.Directory
import System.Time
import HackMail.Data.MainTypes
runDaemon opts conf = do
modFlag <- getModificationTime (fromJust $ incomingMailLoc opts) >>= newIORef
poll_and_sort modFlag opts conf
poll_and_sort flag opts conf = do
b <- poll flag (fromJust $ incomingMailLoc opts)
if b then (do {threadDelay (30 * 10^6); poll_and_sort flag opts conf})
else sort opts conf
current_modTime <- getModificationTime (fromJust $ incomingMailLoc opts)
prevTime <- readIORef flag
writeIORef flag current_modTime
poll_and_sort flag opts conf
poll flag path = do
modTime <- getModificationTime path
flagTime <- readIORef flag
return (flagTime == modTime)
sort opts conf = do
dirContents <- filter (isSuffixOf ".eml") <$> getDirectoryContents (fromJust $ incomingMailLoc opts)
dirContents' <- mapM parseEmailFromFile dirContents
let dirC = map unpack dirContents'
mapM fMain dirC
mapM_ removeFile dirContents
where fMain x = (runFilter (filterMain conf) (conf, x))
unpack (Left err) = error $ "Couldn't Sort, parse error\n" ++ (show err)
unpack (Right em) = em