module Network.Skype.Parser.Types where
import Control.Applicative
import Control.Arrow
import Data.Attoparsec.ByteString.Char8 (decimal)
import Data.Attoparsec.ByteString.Lazy
import Data.Char (chr)
import Data.Time.Calendar (fromGregorian)
import Data.Word8
import Network.Skype.Protocol.Types
import qualified Data.ByteString as BS
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
userID :: Parser UserID
userID = takeWhile1 $ uncurry (&&) . ((not . isSpace) &&& (/=) _comma)
userFullName :: Parser UserDisplayName
userFullName = takeText
userDisplayName :: Parser UserDisplayName
userDisplayName = takeText
userBirthday :: Parser (Maybe UserBirthday)
userBirthday = Just <$> (fromGregorian <$> digit 4 <*> digit 2 <*> digit 2)
<|> Nothing <$ (word8 _0 *> endOfInput)
where
digit n = read . map (chr . fromIntegral) <$> count n (satisfy isDigit)
userLanguage :: Parser (Maybe (UserLanguageISOCode, UserLanguage))
userLanguage = Just <$> ((,) <$> (tokens <* spaces) <*> tokens) <|> pure Nothing
where
tokens = T.decodeUtf8 <$> takeWhile1 isAlpha
userCountry :: Parser (Maybe (UserCountryISOCode, UserCountry))
userCountry = Just <$> ((,) <$> (tokens <* spaces) <*> tokens) <|> pure Nothing
where
tokens = T.decodeUtf8 <$> takeWhile1 isAlpha
userProvince :: Parser UserProvince
userProvince = takeText
userCity :: Parser UserCity
userCity = takeText
userPhone :: Parser UserPhone
userPhone = takeText
userAbout :: Parser UserAbout
userAbout = takeText
userHomepage :: Parser UserHomepage
userHomepage = takeText
userSpeedDial :: Parser UserSpeedDial
userSpeedDial = takeText
userAuthRequestMessage :: Parser UserAuthRequestMessage
userAuthRequestMessage = takeText
userMoodText :: Parser UserMoodText
userMoodText = takeText
userRichMoodText :: Parser UserRichMoodText
userRichMoodText = takeText
userTimezoneOffset :: Parser UserTimezoneOffset
userTimezoneOffset = decimal
chatID :: Parser ChatID
chatID = takeWhile1 $ uncurry (&&) . ((not . isSpace) &&& (/=) _comma)
chatTopic :: Parser ChatTopic
chatTopic = takeText
chatWindowTitle :: Parser ChatWindowTitle
chatWindowTitle = takeText
chatPasswordHint :: Parser ChatPasswordHint
chatPasswordHint = takeText
chatGuidelines :: Parser ChatGuidelines
chatGuidelines = takeText
chatDescription :: Parser ChatDescription
chatDescription = takeText
chatBlob :: Parser ChatBlob
chatBlob = takeByteString
chatMemberID :: Parser ChatMemberID
chatMemberID = decimal
chatMessageID :: Parser ChatMessageID
chatMessageID = decimal
chatMessageBody :: Parser ChatMessageBody
chatMessageBody = takeText
boolean :: Parser Bool
boolean = (True <$ string "TRUE") <|> (False <$ string "FALSE")
timestamp :: Parser Timestamp
timestamp = decimal
spaces :: Parser BS.ByteString
spaces = takeWhile1 isSpace
takeText :: Parser T.Text
takeText = T.decodeUtf8 <$> takeByteString