{-# LANGUAGE OverloadedStrings, TemplateHaskell #-} module Web.Slack.Types.User where import Control.Applicative import Data.Aeson import Data.Aeson.Types import Data.Maybe (fromMaybe) import Data.Text (Text) import Control.Lens.TH import Web.Slack.Types.Id import Web.Slack.Types.Base import Prelude data User = User { _userId :: UserId , _userName :: Text , _userDeleted :: Bool , _userColor :: Text , _userProfile :: Profile , _userPermission :: Permissions , _userHasFiles :: Bool , _userTimezone :: Timezone } deriving (Show) instance FromJSON User where parseJSON = withObject "User" (\o -> User <$> o .: "id" <*> o .: "name" <*> o .: "deleted" <*> (o .:? "color" .!= "000000") <*> o .: "profile" <*> (parseJSON (Object o) :: Parser Permissions) <*> fmap (fromMaybe False) (o .:? "has_files") <*> ((return $ fromMaybe defaultTimezone (parseMaybe parseJSON (Object o))) :: Parser Timezone)) defaultTimezone :: Timezone defaultTimezone = Timezone Nothing "Pacific Standard Time" (-28800) instance FromJSON Permissions where parseJSON = withObject "Permissions" (\o -> let v x = (o .:? x .!= False) in Permissions <$> v "is_admin" <*> v "is_owner" <*> v "is_primary_owner" <*> v "is_restricted" <*> v "is_ultra_restricted" <*> v "is_bot") data Timezone = Timezone { _timezoneDesc :: Maybe Text , _timezoneLabel :: Text , _timezoneOffset :: Int } deriving Show instance FromJSON Timezone where parseJSON = withObject "timezone" (\o -> Timezone <$> o .:? "tz" <*> o .: "tz_label" <*> o .: "tz_offset") data Permissions = Permissions { _isAdmin :: Bool , _isOwner :: Bool , _isPrimaryOwner :: Bool , _isRestricted :: Bool , _isUltraRestricted :: Bool , _isBot :: Bool } deriving (Show) data Profile = Profile { _profileFirstName :: Maybe Text , _profileLastName :: Maybe Text , _profileRealName :: Maybe Text , _profileRealNameNormalized :: Maybe Text , _profileTitle :: Maybe Text , _progileEmail :: Maybe Text , _profileSkype :: Maybe Text , _profilePhone :: Maybe Text , _profileImage24 :: URL , _profileImage32 :: URL , _profileImage48 :: URL , _profileImage72 :: URL , _profileImage192 :: URL } deriving (Show) makeLenses ''Profile makeLenses ''Permissions makeLenses ''Timezone makeLenses ''User instance FromJSON Profile where parseJSON = withObject "Profile" (\o -> let v = (o .:) vm = (o .:?) in Profile <$> vm "first_name" <*> vm "last_name" <*> vm "real_name" <*> vm "real_name_normalized" <*> vm "title" <*> vm "email" <*> vm "skype" <*> vm "phone" <*> v "image_24" <*> v "image_32" <*> v "image_48" <*> v "image_72" <*> v "image_192") type Username = Text