corebot-bliki-0.2: src/Yesod/CoreBot/Bliki/DB.hs
module Yesod.CoreBot.Bliki.DB where
import Yesod.CoreBot.Bliki.Prelude
import Control.Monad.Reader
import Control.Monad.State.Strict
import Data.FileStore ( Revision(..)
, TimeRange(..)
, Resource
, RevisionId
)
import qualified Data.FileStore as FileStore
import Data.Map ( Map )
import qualified Data.Map as Map
import Data.Time.Clock
data DataUpdate
= Tweet
{ update_rev_ID :: RevisionId
, tweet_text :: String
}
| BlogAdded
{ update_rev_ID :: RevisionId
, blog_text :: String
}
| EntryAdded
{ update_rev_ID :: RevisionId
, update_entry_path :: FilePath
}
| EntryChanged
{ update_rev_ID :: RevisionId
, update_entry_path :: FilePath
}
| Wibble
{ update_rev_ID :: RevisionId
}
deriving ( Show, Eq )
data Bloggable = WikiBloggable
{ blog_entry :: String
, view_rev :: RevisionId
, prev_bloggable :: Maybe Bloggable
} | UpdateBloggable
{ blog_str :: String
, source_rev :: RevisionId
, prev_bloggable :: Maybe Bloggable
}
-- XXX The order is always assumed to be from newest to oldest in the lists. This should be
-- checked/enforced.
-- XXX Use a database store like SQLite
data DB = DB
{ raw_history :: [ Revision ]
, update_log :: [ DataUpdate ]
, latest_revisions :: Map FilePath RevisionId
, bloggables :: [ Bloggable ]
}
history_to_updates :: [ Revision ] -> [ DataUpdate ]
history_to_updates (r : rs) = revision_to_updates r ++ history_to_updates rs
revision_to_updates :: Revision -> [ DataUpdate ]
revision_to_updates r =
let txt = FileStore.revDescription r
rev_ID = FileStore.revId r
in map ( classify_change rev_ID ) ( FileStore.revChanges r )
++ case length txt of
txt_len | txt_len > 200 -> [ BlogAdded rev_ID txt ]
| txt_len > 8 -> [ Tweet rev_ID txt ]
| otherwise -> [ Wibble rev_ID ]
classify_change rev_ID (FileStore.Added page_path) =
case head page_path of
'.' -> Wibble rev_ID
_ -> EntryAdded rev_ID page_path
classify_change rev_ID (FileStore.Deleted page_path) = Wibble rev_ID
classify_change rev_ID (FileStore.Modified page_path) =
case head page_path of
'.' -> Wibble rev_ID
_ -> EntryChanged rev_ID page_path
head_time :: IORef DB -> IO UTCTime
head_time db_ref = do
db <- readIORef db_ref
return $ FileStore.revDateTime $ head $ raw_history db