module Skype.LogAggregator (
aggregateLogs
) where
import Skype.LogParser
import Skype.Entry
import Data.Map as DM
import Data.List as DL
import Data.Word
import Data.ByteString as S
import Data.Attoparsec as DA
type ChatsMap = DM.Map S.ByteString [SkypeEntry]
chatsMap :: ChatsMap
chatsMap = DM.empty
aggregateLogs :: [[SkypeEntry]] -> [SkypeChat]
aggregateLogs = extractChats . DL.foldr allocateEntry chatsMap . DL.concat
where
allocateEntry :: SkypeEntry -> ChatsMap -> ChatsMap
allocateEntry entry = DM.alter ( updMap entry ) ( sessionId entry )
updMap entry Nothing = Just [entry]
updMap entry (Just entries) = Just $ entry : entries
extractChats :: ChatsMap -> [SkypeChat]
extractChats = DM.foldWithKey go []
go key value arr = let ( userA, userB ) = extractResult $ DA.parse parseChatSession key
in SChat userA userB value : arr
extractResult (Done _ r) = r
extractResult _ = ( S.empty, S.empty )
parseChatSession :: Parser (S.ByteString, S.ByteString)
parseChatSession = do
word8 0x23
userA <- DA.takeWhile ( /= 0x2f )
word8 0x2f
word8 0x24
userB <- DA.takeWhile ( /= 0x3b )
return (userA, userB)