module Twilio.Call
(
Call(..)
, CallSID
, Twilio.Call.get
, 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
data Call = Call
{ sid :: !CallSID
, parentCallSID :: !(Maybe CallSID)
, dateCreated :: !(Maybe UTCTime)
, dateUpdated :: !(Maybe UTCTime)
, accountSID :: !AccountSID
, to :: !(Maybe Text)
, from :: !Text
, phoneNumberSID :: !(Maybe PhoneNumberSID)
, status :: !CallStatus
, startTime :: !(Maybe UTCTime)
, 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 :: MonadThrow m => CallSID -> TwilioT m Call
get = Resource.get
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