packages feed

skypelogexport-0.1: Skype/LogAggregator.hs

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)