packages feed

replicant-0.1.0.0: src/Replicant/Adapters/Slack/Types.hs

module Replicant.Adapters.Slack.Types
  ( Channel(..)
  , ChannelId
  , Credentials(..)
  , Event(..)
  , Message(..)
  , Token
  , User(..)
  , UserId
  ) where

import           Data.Aeson
import           Data.Aeson.Types            (Parser)
import           Data.ByteString.Lazy        as LBS
import           Data.Text                   (Text)

type ChannelId = Text
type UserId    = Text
type Token     = Text

data Message = Message
  { messageBody    :: !Text
  , messageChannel :: !ChannelId
  , messageUser    :: !(Maybe Text)
  } deriving Show

data Channel = Channel
  { channelId   :: !ChannelId
  , channelName :: !Text
  } deriving Show

data User = User
  { userId   :: !UserId
  , userName :: !Text
  }

data Event = MessageEvent Message
           | MessageResponse
           | MessageError
           | UnknownEvent Text LBS.ByteString
           deriving Show

data Credentials = Credentials
  { appClientId     :: !Text
  , appClientSecret :: !Text
  } deriving (Show, Eq)

instance FromJSON Message where
  parseJSON = withObject "message" $ \v -> do
    messageBody      <- v .: "text"
    messageChannel   <- v .: "channel"
    messageUser      <- v .:? "user"
    return Message{..}

instance FromJSON Event where
  parseJSON = withObject "event" $ \v -> do
    typ <- v .:? "type"
    case typ of
      Just t  -> parseEvent t $ Object v
      Nothing -> do
        ok <- v .: "ok"
        if ok
          then return MessageResponse -- <$> v .: "reply_to" <*> v .: "ts" <*> v .: "text"
          else return MessageError -- <$> v .: "reply_to" <*> v .: "error"

parseEvent :: Text -> Value -> Parser Event
parseEvent t = withObject "event" $ \v ->
  case t of
    "message" -> do
      m <- parseJSON $ Object v
      return $ MessageEvent m
    _ -> return $ UnknownEvent t (encode v)