{-#LANGUAGE MultiParamTypeClasses #-} {-#LANGUAGE OverloadedStrings #-} {-#LANGUAGE ViewPatterns #-} ------------------------------------------------------------------------------- -- | -- Module : Twilio.Call -- Copyright : (C) 2017- Mark Andrus Roberts -- License : BSD-style (see the file LICENSE) -- Maintainer : Mark Andrus Roberts -- Stability : provisional ------------------------------------------------------------------------------- module Twilio.Call ( -- * Resource Call(..) , CallSID , Twilio.Call.get -- * Types , AnsweredBy(..) , CallDirection(..) , CallStatus(..) ) where import Control.Error.Safe import Control.Monad import Control.Monad.Catch import Data.Aeson import Data.Monoid import Data.Text (Text) import Data.Time.Clock import Network.URI import Control.Monad.Twilio import Twilio.Internal.Parser import Twilio.Internal.Request import Twilio.Internal.Resource as Resource import Twilio.Types {- Resource -} data Call = Call { sid :: !CallSID , parentCallSID :: !(Maybe CallSID) , dateCreated :: !(Maybe UTCTime) -- "date_created" is initially null , dateUpdated :: !(Maybe UTCTime) -- "date_updated" is initially null , accountSID :: !AccountSID , to :: !(Maybe Text) , from :: !Text , phoneNumberSID :: !(Maybe PhoneNumberSID) , status :: !CallStatus , startTime :: !(Maybe UTCTime) -- "start_time" is initially null , endTime :: !(Maybe UTCTime) , duration :: !(Maybe Int) , price :: !(Maybe Double) , priceUnit :: !(Maybe PriceUnit) , direction :: !(Maybe CallDirection) , answeredBy :: !(Maybe AnsweredBy) , forwardedFrom :: !(Maybe Text) , callerName :: !(Maybe Text) , uri :: !URI , apiVersion :: !APIVersion } deriving (Show, Eq) instance FromJSON Call where parseJSON (Object v) = Call <$> v .: "sid" <*> v .: "parent_call_sid" <*> (v .: "date_created" <&> (=<<) parseDateTime) <*> (v .: "date_updated" <&> (=<<) parseDateTime) <*> v .: "account_sid" <*> (v .: "to" <&> filterEmpty) <*> v .: "from" <*> (v .: "phone_number_sid" <&> (=<<) filterEmpty <&> (=<<) parseSID) <*> v .: "status" <*> (v .: "start_time" <&> (=<<) parseDateTime) <*> (v .: "end_time" <&> (=<<) parseDateTime) <*> (v .: "duration" <&> fmap readZ >>= maybeReturn') <*> (v .: "price" <&> fmap readZ >>= maybeReturn') <*> v .: "price_unit" <*> v .: "direction" <*> v .: "answered_by" <*> v .: "forwarded_from" <&> (=<<) filterEmpty <*> v .: "caller_name" <*> (v .: "uri" <&> parseRelativeReference >>= maybeReturn) <*> v .: "api_version" parseJSON _ = mzero instance Get1 CallSID Call where get1 (getSID -> sid) = request parseJSONFromResponse =<< makeTwilioRequest ("/Calls/" <> sid <> ".json") -- | Get a 'Call' by 'CallSID'. get :: MonadThrow m => CallSID -> TwilioT m Call get = Resource.get {- Types -} data AnsweredBy = Human | Machine deriving Eq instance Show AnsweredBy where show Human = "human" show Machine = "machine" instance FromJSON AnsweredBy where parseJSON (String "human") = return Human parseJSON (String "machine") = return Machine parseJSON _ = mzero data CallDirection = Inbound | OutboundAPI | OutboundDial deriving Eq instance Show CallDirection where show Inbound = "inbound" show OutboundAPI = "outbound-api" show OutboundDial = "outbound-dial" instance FromJSON CallDirection where parseJSON (String "inbound") = return Inbound parseJSON (String "outbound-api") = return OutboundAPI parseJSON (String "outbound-dial") = return OutboundDial parseJSON _ = mzero data CallStatus = Queued | Ringing | InProgress | Canceled | Completed | Failed | Busy | NoAnswer deriving (Bounded, Enum, Eq, Ord, Read, Show) instance FromJSON CallStatus where parseJSON (String "queued") = return Queued parseJSON (String "ringing") = return Ringing parseJSON (String "in-progress") = return InProgress parseJSON (String "canceled") = return Canceled parseJSON (String "completed") = return Completed parseJSON (String "failed") = return Failed parseJSON (String "busy") = return Busy parseJSON (String "no-answer") = return NoAnswer parseJSON _ = mzero