{-# LANGUAGE RecordWildCards     #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Web.TwitchAPI.Helix.ChannelPoints where

import Prelude

import qualified Data.ByteString.Char8 as BS
import qualified Data.Time             as Time
import qualified Data.Time.RFC3339     as Time ( parseTimeRFC3339 )
import qualified Data.Text             as Text
import qualified Network.HTTP.Client   as HTTP

import Data.Maybe ( fromMaybe )
import Data.Aeson ( FromJSON(..), (.:), withObject
                  , ToJSON(..), (.=), object, encode
                  , Object
                  )

import qualified Web.TwitchAPI.Helix.Request as Req

class RewardDetails a where
    broadcasterId :: a -> Integer
    prompt :: a -> Maybe String
    backgroundColor :: a -> String
    maxPerStream :: a -> Maybe Integer
    maxPerUser :: a -> Maybe Integer
    autoFulfilled :: a -> Bool

data Create = Create { Create -> Integer
forBroadcasterId :: Integer
                     , Create -> String
title :: String
                     , Create -> Maybe String
setPrompt :: Maybe String
                     , Create -> Integer
cost :: Integer
                     , Create -> Maybe Bool
enabled :: Maybe Bool
                     , Create -> Maybe String
setBackgroundColor :: Maybe String
                     , Create -> Maybe Integer
setMaxPerStream :: Maybe Integer
                     , Create -> Maybe Integer
setMaxPerUser :: Maybe Integer
                     , Create -> Maybe Integer
cooldownSeconds :: Maybe Integer
                     , Create -> Maybe Bool
setAutoFulfilled :: Maybe Bool
                     } deriving ( Int -> Create -> ShowS
[Create] -> ShowS
Create -> String
(Int -> Create -> ShowS)
-> (Create -> String) -> ([Create] -> ShowS) -> Show Create
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Create -> ShowS
showsPrec :: Int -> Create -> ShowS
$cshow :: Create -> String
show :: Create -> String
$cshowList :: [Create] -> ShowS
showList :: [Create] -> ShowS
Show, Create -> Create -> Bool
(Create -> Create -> Bool)
-> (Create -> Create -> Bool) -> Eq Create
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Create -> Create -> Bool
== :: Create -> Create -> Bool
$c/= :: Create -> Create -> Bool
/= :: Create -> Create -> Bool
Eq )

instance ToJSON Create where
    toJSON :: Create -> Value
toJSON Create{Integer
String
Maybe Bool
Maybe Integer
Maybe String
forBroadcasterId :: Create -> Integer
title :: Create -> String
setPrompt :: Create -> Maybe String
cost :: Create -> Integer
enabled :: Create -> Maybe Bool
setBackgroundColor :: Create -> Maybe String
setMaxPerStream :: Create -> Maybe Integer
setMaxPerUser :: Create -> Maybe Integer
cooldownSeconds :: Create -> Maybe Integer
setAutoFulfilled :: Create -> Maybe Bool
forBroadcasterId :: Integer
title :: String
setPrompt :: Maybe String
cost :: Integer
enabled :: Maybe Bool
setBackgroundColor :: Maybe String
setMaxPerStream :: Maybe Integer
setMaxPerUser :: Maybe Integer
cooldownSeconds :: Maybe Integer
setAutoFulfilled :: Maybe Bool
..} =
        [Pair] -> Value
object [ Key
"title"      Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= String -> Text
Text.pack String
title
               , Key
"prompt"     Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (String -> Text
Text.pack (String -> Text) -> Maybe String -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe String
setPrompt)
               , Key
"cost"       Key -> Integer -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Integer
cost
               , Key
"is_enabled" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Bool -> Maybe Bool -> Bool
forall a. a -> Maybe a -> a
fromMaybe Bool
True Maybe Bool
enabled
               , Key
"background_color" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (String -> Text
Text.pack (String -> Text) -> Maybe String -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe String
setBackgroundColor)
               , Key
"is_user_input_required" Key -> Maybe Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (String -> Bool) -> Maybe String -> Maybe Bool
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> String -> Bool
forall a b. a -> b -> a
const Bool
True) Maybe String
setPrompt
               , Key
"is_max_per_stream_enabled" Key -> Maybe Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Integer -> Bool) -> Maybe Integer -> Maybe Bool
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> Integer -> Bool
forall a b. a -> b -> a
const Bool
True) Maybe Integer
setMaxPerStream
               , Key
"max_per_stream" Key -> Maybe Integer -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Integer
setMaxPerStream
               , Key
"is_max_per_user_per_stream_enabled" Key -> Maybe Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Integer -> Bool) -> Maybe Integer -> Maybe Bool
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> Integer -> Bool
forall a b. a -> b -> a
const Bool
True) Maybe Integer
setMaxPerUser
               , Key
"max_per_user_per_stream" Key -> Maybe Integer -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Integer
setMaxPerUser
               , Key
"is_global_cooldown_enabled" Key -> Maybe Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Integer -> Bool) -> Maybe Integer -> Maybe Bool
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool -> Integer -> Bool
forall a b. a -> b -> a
const Bool
True) Maybe Integer
cooldownSeconds
               , Key
"global_cooldown_seconds" Key -> Maybe Integer -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Integer
cooldownSeconds
               , Key
"should_redemptions_skip_request_queue" Key -> Maybe Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe Bool
setAutoFulfilled
               ]

instance Req.HelixRequest Create where
    toRequest :: Create -> Request
toRequest Create
create =
        let setQuery :: Request -> Request
setQuery  = [(ByteString, Maybe ByteString)] -> Request -> Request
HTTP.setQueryString [(ByteString
"broadcaster_id", ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString)
-> (Integer -> ByteString) -> Integer -> Maybe ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
BS.pack (String -> ByteString)
-> (Integer -> String) -> Integer -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> String
forall a. Show a => a -> String
show (Integer -> Maybe ByteString) -> Integer -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ (Create -> Integer
forall a. RewardDetails a => a -> Integer
broadcasterId :: Create -> Integer) Create
create)]
            setBody :: Request -> Request
setBody Request
r = Request
r{ HTTP.requestBody = HTTP.RequestBodyLBS . encode . toJSON $ create }
        in Request -> Request
setBody (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Request -> Request
setQuery (Request -> Request) -> Request -> Request
forall a b. (a -> b) -> a -> b
$ String -> Request
HTTP.parseRequest_ String
"POST https://api.twitch.tv/helix/channel_points/custom_rewards"
    scope :: Create -> Maybe String
scope Create{} = String -> Maybe String
forall a. a -> Maybe a
Just String
"channel:manage:redemptions"

instance RewardDetails Create where
    broadcasterId :: Create -> Integer
broadcasterId = Create -> Integer
forBroadcasterId
    prompt :: Create -> Maybe String
prompt = Create -> Maybe String
setPrompt
    backgroundColor :: Create -> String
backgroundColor = String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
"" (Maybe String -> String)
-> (Create -> Maybe String) -> Create -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Create -> Maybe String
setBackgroundColor
    maxPerStream :: Create -> Maybe Integer
maxPerStream = Create -> Maybe Integer
setMaxPerStream
    maxPerUser :: Create -> Maybe Integer
maxPerUser = Create -> Maybe Integer
setMaxPerUser
    autoFulfilled :: Create -> Bool
autoFulfilled = Bool -> Maybe Bool -> Bool
forall a. a -> Maybe a -> a
fromMaybe Bool
False (Maybe Bool -> Bool) -> (Create -> Maybe Bool) -> Create -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Create -> Maybe Bool
setAutoFulfilled

data RewardImages = RewardImages { RewardImages -> Maybe String
tiny :: Maybe String
                                 , RewardImages -> Maybe String
large :: Maybe String
                                 , RewardImages -> Maybe String
huge :: Maybe String
                                 } deriving ( Int -> RewardImages -> ShowS
[RewardImages] -> ShowS
RewardImages -> String
(Int -> RewardImages -> ShowS)
-> (RewardImages -> String)
-> ([RewardImages] -> ShowS)
-> Show RewardImages
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RewardImages -> ShowS
showsPrec :: Int -> RewardImages -> ShowS
$cshow :: RewardImages -> String
show :: RewardImages -> String
$cshowList :: [RewardImages] -> ShowS
showList :: [RewardImages] -> ShowS
Show, RewardImages -> RewardImages -> Bool
(RewardImages -> RewardImages -> Bool)
-> (RewardImages -> RewardImages -> Bool) -> Eq RewardImages
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RewardImages -> RewardImages -> Bool
== :: RewardImages -> RewardImages -> Bool
$c/= :: RewardImages -> RewardImages -> Bool
/= :: RewardImages -> RewardImages -> Bool
Eq )

instance FromJSON RewardImages where
    parseJSON :: Value -> Parser RewardImages
parseJSON = String
-> (Object -> Parser RewardImages) -> Value -> Parser RewardImages
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"RewardImages" ((Object -> Parser RewardImages) -> Value -> Parser RewardImages)
-> (Object -> Parser RewardImages) -> Value -> Parser RewardImages
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
        Maybe String
tiny <- Object
o Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"url_1x"
        Maybe String
large <- Object
o Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"url_2x"
        Maybe String
huge <- Object
o Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"url_4x"
        RewardImages -> Parser RewardImages
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return RewardImages{Maybe String
tiny :: Maybe String
large :: Maybe String
huge :: Maybe String
tiny :: Maybe String
large :: Maybe String
huge :: Maybe String
..}

data CreateResponse = CreateResponse { CreateResponse -> Integer
broadcaster :: Integer
                                     , CreateResponse -> String
broadcasterLogin :: String
                                     , CreateResponse -> String
broadcasterName :: String
                                     , CreateResponse -> String
rewardId :: String
                                     , CreateResponse -> String
rewardTitle :: String
                                     , CreateResponse -> Maybe String
rewardPrompt :: Maybe String
                                     , CreateResponse -> Integer
rewardCost :: Integer
                                     , CreateResponse -> Maybe RewardImages
rewardImage :: Maybe RewardImages
                                     , CreateResponse -> RewardImages
defaultImage :: RewardImages
                                     , CreateResponse -> String
rewardBackgroundColor :: String
                                     , CreateResponse -> Maybe Integer
rewardMaxPerStream :: Maybe Integer
                                     , CreateResponse -> Maybe Integer
rewardMaxPerUser :: Maybe Integer
                                     , CreateResponse -> Maybe Integer
cooldown :: Maybe Integer
                                     , CreateResponse -> Bool
paused :: Bool
                                     , CreateResponse -> Bool
inStock :: Bool
                                     , CreateResponse -> Bool
rewardAutoFulfilled :: Bool
                                     , CreateResponse -> Integer
redemptionCount :: Integer
                                     , CreateResponse -> Maybe UTCTime
cooldownExpires :: Maybe Time.UTCTime
                                     } deriving ( Int -> CreateResponse -> ShowS
[CreateResponse] -> ShowS
CreateResponse -> String
(Int -> CreateResponse -> ShowS)
-> (CreateResponse -> String)
-> ([CreateResponse] -> ShowS)
-> Show CreateResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CreateResponse -> ShowS
showsPrec :: Int -> CreateResponse -> ShowS
$cshow :: CreateResponse -> String
show :: CreateResponse -> String
$cshowList :: [CreateResponse] -> ShowS
showList :: [CreateResponse] -> ShowS
Show, CreateResponse -> CreateResponse -> Bool
(CreateResponse -> CreateResponse -> Bool)
-> (CreateResponse -> CreateResponse -> Bool) -> Eq CreateResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CreateResponse -> CreateResponse -> Bool
== :: CreateResponse -> CreateResponse -> Bool
$c/= :: CreateResponse -> CreateResponse -> Bool
/= :: CreateResponse -> CreateResponse -> Bool
Eq )

instance FromJSON CreateResponse where
    parseJSON :: Value -> Parser CreateResponse
parseJSON = String
-> (Object -> Parser CreateResponse)
-> Value
-> Parser CreateResponse
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"CreateResponse" ((Object -> Parser CreateResponse)
 -> Value -> Parser CreateResponse)
-> (Object -> Parser CreateResponse)
-> Value
-> Parser CreateResponse
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
        String
bid <- Object
o Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"broadcaster_id"
        let broadcaster :: Integer
broadcaster = String -> Integer
forall a. Read a => String -> a
read String
bid :: Integer
        String
broadcasterLogin <- Object
o Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"broadcaster_login"
        String
broadcasterName <- Object
o Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"broadcaster_name"
        String
rewardId <- Object
o Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
        String
rewardTitle <- Object
o Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"title"

        String
promptText <- Object
o Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"prompt"
        Bool
promptEnabled :: Bool <- Object
o Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"is_user_input_required"
        let rewardPrompt :: Maybe String
rewardPrompt = if Bool
promptEnabled then String -> Maybe String
forall a. a -> Maybe a
Just String
promptText else Maybe String
forall a. Maybe a
Nothing

        Integer
rewardCost <- Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"cost"
        Maybe RewardImages
rewardImage <- Object
o Object -> Key -> Parser (Maybe RewardImages)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"image"
        RewardImages
defaultImage <- Object
o Object -> Key -> Parser RewardImages
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"default_image"
        String
rewardBackgroundColor <- Object
o Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"background_color"

        Object
maxObject :: Object <- Object
o Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"max_per_stream_setting"
        Bool
maxEnabled <- Object
maxObject Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"is_enabled"
        Integer
streamMax <- Object
maxObject Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"max_per_stream"
        let rewardMaxPerStream :: Maybe Integer
rewardMaxPerStream = if Bool
maxEnabled then Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
streamMax else Maybe Integer
forall a. Maybe a
Nothing

        Object
userMaxObject :: Object <- Object
o Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"max_per_user_per_stream_setting"
        Bool
userMaxEnabled <- Object
userMaxObject Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"is_enabled"
        Integer
userMax <- Object
userMaxObject Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"max_per_user_per_stream"
        let rewardMaxPerUser :: Maybe Integer
rewardMaxPerUser = if Bool
userMaxEnabled then Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
userMax else Maybe Integer
forall a. Maybe a
Nothing

        Object
cooldownObject :: Object <- Object
o Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"global_cooldown_setting"
        Bool
cooldownEnabled <- Object
cooldownObject Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"is_enabled"
        Integer
cooldownSeconds <- Object
cooldownObject Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"global_cooldown_seconds"
        let cooldown :: Maybe Integer
cooldown = if Bool
cooldownEnabled then Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
cooldownSeconds else Maybe Integer
forall a. Maybe a
Nothing

        Bool
paused <- Object
o Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"is_paused"
        Bool
inStock <- Object
o Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"is_in_stock"
        Bool
rewardAutoFulfilled <- Object
o Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"should_redemptions_skip_request_queue"
        Integer
redemptionCount <- Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"redemptions_redeemed_current_stream"
        Maybe String
cooldownExpiry :: Maybe String <- Object
o Object -> Key -> Parser (Maybe String)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"cooldown_expires_at"
        let cooldownExpires :: Maybe UTCTime
cooldownExpires = ZonedTime -> UTCTime
Time.zonedTimeToUTC (ZonedTime -> UTCTime) -> Maybe ZonedTime -> Maybe UTCTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (String -> Maybe ZonedTime
forall t. TextualMonoid t => t -> Maybe ZonedTime
Time.parseTimeRFC3339 (String -> Maybe ZonedTime) -> Maybe String -> Maybe ZonedTime
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Maybe String
cooldownExpiry)
        CreateResponse -> Parser CreateResponse
forall a. a -> Parser a
forall (m :: * -> *) a. Monad m => a -> m a
return CreateResponse{Bool
Integer
String
Maybe Integer
Maybe String
Maybe UTCTime
Maybe RewardImages
RewardImages
broadcaster :: Integer
broadcasterLogin :: String
broadcasterName :: String
rewardId :: String
rewardTitle :: String
rewardPrompt :: Maybe String
rewardCost :: Integer
rewardImage :: Maybe RewardImages
defaultImage :: RewardImages
rewardBackgroundColor :: String
rewardMaxPerStream :: Maybe Integer
rewardMaxPerUser :: Maybe Integer
cooldown :: Maybe Integer
paused :: Bool
inStock :: Bool
rewardAutoFulfilled :: Bool
redemptionCount :: Integer
cooldownExpires :: Maybe UTCTime
broadcaster :: Integer
broadcasterLogin :: String
broadcasterName :: String
rewardId :: String
rewardTitle :: String
rewardPrompt :: Maybe String
rewardCost :: Integer
rewardImage :: Maybe RewardImages
defaultImage :: RewardImages
rewardBackgroundColor :: String
rewardMaxPerStream :: Maybe Integer
rewardMaxPerUser :: Maybe Integer
cooldown :: Maybe Integer
paused :: Bool
inStock :: Bool
rewardAutoFulfilled :: Bool
redemptionCount :: Integer
cooldownExpires :: Maybe UTCTime
..}

instance RewardDetails CreateResponse where
    broadcasterId :: CreateResponse -> Integer
broadcasterId = CreateResponse -> Integer
broadcaster
    prompt :: CreateResponse -> Maybe String
prompt = CreateResponse -> Maybe String
rewardPrompt
    backgroundColor :: CreateResponse -> String
backgroundColor = CreateResponse -> String
rewardBackgroundColor
    maxPerStream :: CreateResponse -> Maybe Integer
maxPerStream = CreateResponse -> Maybe Integer
rewardMaxPerStream
    maxPerUser :: CreateResponse -> Maybe Integer
maxPerUser = CreateResponse -> Maybe Integer
rewardMaxPerUser
    autoFulfilled :: CreateResponse -> Bool
autoFulfilled = CreateResponse -> Bool
rewardAutoFulfilled