{-# LANGUAGE DuplicateRecordFields #-} {-# 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 data Create = Create { Create -> Integer broadcasterId :: Integer , Create -> String title :: String , Create -> Maybe String prompt :: Maybe String , Create -> Integer cost :: Integer , Create -> Maybe Bool enabled :: Maybe Bool , Create -> Maybe String backgroundColor :: Maybe String , Create -> Maybe Integer maxPerStream :: Maybe Integer , Create -> Maybe Integer maxPerUser :: Maybe Integer , Create -> Maybe Integer cooldownSeconds :: Maybe Integer , Create -> Maybe Bool autoFulfilled :: Maybe Bool } deriving ( Int -> Create -> ShowS [Create] -> ShowS Create -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Create] -> ShowS $cshowList :: [Create] -> ShowS show :: Create -> String $cshow :: Create -> String showsPrec :: Int -> Create -> ShowS $cshowsPrec :: Int -> Create -> ShowS Show, Create -> Create -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Create -> Create -> Bool $c/= :: Create -> Create -> Bool == :: Create -> Create -> Bool $c== :: Create -> Create -> Bool Eq ) instance ToJSON Create where toJSON :: Create -> Value toJSON Create{Integer String Maybe Bool Maybe Integer Maybe String autoFulfilled :: Maybe Bool cooldownSeconds :: Maybe Integer maxPerUser :: Maybe Integer maxPerStream :: Maybe Integer backgroundColor :: Maybe String enabled :: Maybe Bool cost :: Integer prompt :: Maybe String title :: String broadcasterId :: Integer $sel:autoFulfilled:Create :: Create -> Maybe Bool $sel:cooldownSeconds:Create :: Create -> Maybe Integer $sel:maxPerUser:Create :: Create -> Maybe Integer $sel:maxPerStream:Create :: Create -> Maybe Integer $sel:backgroundColor:Create :: Create -> Maybe String $sel:enabled:Create :: Create -> Maybe Bool $sel:cost:Create :: Create -> Integer $sel:prompt:Create :: Create -> Maybe String $sel:title:Create :: Create -> String $sel:broadcasterId:Create :: Create -> Integer ..} = [Pair] -> Value object [ Key "title" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= (String -> Text Text.pack String title) , Key "prompt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= (String -> Text Text.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Maybe String prompt) , Key "cost" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= Integer cost , Key "is_enabled" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= (forall a. a -> Maybe a -> a fromMaybe Bool True Maybe Bool enabled) , Key "background_color" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= (String -> Text Text.pack forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Maybe String backgroundColor) , Key "is_user_input_required" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (forall a b. a -> b -> a const Bool True) Maybe String prompt) , Key "is_max_per_stream_enabled" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (forall a b. a -> b -> a const Bool True) Maybe Integer maxPerStream) , Key "max_per_stream" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= Maybe Integer maxPerStream , Key "is_max_per_user_per_stream_enabled" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (forall a b. a -> b -> a const Bool True) Maybe Integer maxPerUser) , Key "max_per_user_per_stream" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= Maybe Integer maxPerUser , Key "is_global_cooldown_enabled" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (forall a b. a -> b -> a const Bool True) Maybe Integer cooldownSeconds) , Key "global_cooldown_seconds" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= Maybe Integer cooldownSeconds , Key "should_redemptions_skip_request_queue" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv .= Maybe Bool autoFulfilled ] 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", forall a. a -> Maybe a Just forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> ByteString BS.pack forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. Show a => a -> String show forall a b. (a -> b) -> a -> b $ (Create -> Integer broadcasterId :: Create -> Integer) Create create)] setBody :: Request -> Request setBody Request r = Request r{ requestBody :: RequestBody HTTP.requestBody = ByteString -> RequestBody HTTP.RequestBodyLBS forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. ToJSON a => a -> ByteString encode forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. ToJSON a => a -> Value toJSON forall a b. (a -> b) -> a -> b $ Create create } in Request -> Request setBody forall b c a. (b -> c) -> (a -> b) -> a -> c . Request -> Request setQuery 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{} = forall a. a -> Maybe a Just String "channel:manage:redemptions" 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 forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [RewardImages] -> ShowS $cshowList :: [RewardImages] -> ShowS show :: RewardImages -> String $cshow :: RewardImages -> String showsPrec :: Int -> RewardImages -> ShowS $cshowsPrec :: Int -> RewardImages -> ShowS Show, RewardImages -> RewardImages -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: RewardImages -> RewardImages -> Bool $c/= :: RewardImages -> RewardImages -> Bool == :: RewardImages -> RewardImages -> Bool $c== :: RewardImages -> RewardImages -> Bool Eq ) instance FromJSON RewardImages where parseJSON :: Value -> Parser RewardImages parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a withObject String "RewardImages" forall a b. (a -> b) -> a -> b $ \Object o -> do Maybe String tiny <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "url_1x" Maybe String large <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "url_2x" Maybe String huge <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "url_4x" forall (m :: * -> *) a. Monad m => a -> m a return RewardImages{Maybe String huge :: Maybe String large :: Maybe String tiny :: Maybe String $sel:huge:RewardImages :: Maybe String $sel:large:RewardImages :: Maybe String $sel:tiny:RewardImages :: Maybe String ..} data CreateResponse = CreateResponse { CreateResponse -> Integer broadcasterId :: Integer , CreateResponse -> String broadcasterLogin :: String , CreateResponse -> String broadcasterName :: String , CreateResponse -> String rewardId :: String , CreateResponse -> String rewardTitle :: String , CreateResponse -> Maybe String prompt :: Maybe String , CreateResponse -> Integer rewardCost :: Integer , CreateResponse -> Maybe RewardImages rewardImage :: Maybe RewardImages , CreateResponse -> RewardImages defaultImage :: RewardImages , CreateResponse -> String backgroundColor :: String , CreateResponse -> Maybe Integer maxPerStream :: Maybe Integer , CreateResponse -> Maybe Integer maxPerUser :: Maybe Integer , CreateResponse -> Maybe Integer cooldownSeconds :: Maybe Integer , CreateResponse -> Bool paused :: Bool , CreateResponse -> Bool inStock :: Bool , CreateResponse -> Bool autoFulfilled :: Bool , CreateResponse -> Integer redemptionCount :: Integer , CreateResponse -> Maybe UTCTime cooldownExpires :: Maybe Time.UTCTime } deriving ( Int -> CreateResponse -> ShowS [CreateResponse] -> ShowS CreateResponse -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [CreateResponse] -> ShowS $cshowList :: [CreateResponse] -> ShowS show :: CreateResponse -> String $cshow :: CreateResponse -> String showsPrec :: Int -> CreateResponse -> ShowS $cshowsPrec :: Int -> CreateResponse -> ShowS Show, CreateResponse -> CreateResponse -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: CreateResponse -> CreateResponse -> Bool $c/= :: CreateResponse -> CreateResponse -> Bool == :: CreateResponse -> CreateResponse -> Bool $c== :: CreateResponse -> CreateResponse -> Bool Eq ) instance FromJSON CreateResponse where parseJSON :: Value -> Parser CreateResponse parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a withObject String "CreateResponse" forall a b. (a -> b) -> a -> b $ \Object o -> do String bid <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "broadcaster_id" let broadcasterId :: Integer broadcasterId = forall a. Read a => String -> a read String bid :: Integer String broadcasterLogin <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "broadcaster_login" String broadcasterName <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "broadcaster_name" String rewardId <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "id" String rewardTitle <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "title" String promptText <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "prompt" Bool promptEnabled :: Bool <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "is_user_input_required" let prompt :: Maybe String prompt = if Bool promptEnabled then forall a. a -> Maybe a Just String promptText else forall a. Maybe a Nothing Integer rewardCost <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "cost" Maybe RewardImages rewardImage <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "image" RewardImages defaultImage <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "default_image" String backgroundColor <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "background_color" Object maxObject :: Object <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "max_per_stream_setting" Bool maxEnabled <- Object maxObject forall a. FromJSON a => Object -> Key -> Parser a .: Key "is_enabled" Integer streamMax <- Object maxObject forall a. FromJSON a => Object -> Key -> Parser a .: Key "max_per_stream" let maxPerStream :: Maybe Integer maxPerStream = if Bool maxEnabled then forall a. a -> Maybe a Just Integer streamMax else forall a. Maybe a Nothing Object userMaxObject :: Object <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "max_per_user_per_stream_setting" Bool userMaxEnabled <- Object userMaxObject forall a. FromJSON a => Object -> Key -> Parser a .: Key "is_enabled" Integer userMax <- Object userMaxObject forall a. FromJSON a => Object -> Key -> Parser a .: Key "max_per_user_per_stream" let maxPerUser :: Maybe Integer maxPerUser = if Bool userMaxEnabled then forall a. a -> Maybe a Just Integer userMax else forall a. Maybe a Nothing Object cooldownObject :: Object <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "global_cooldown_setting" Bool cooldownEnabled <- Object cooldownObject forall a. FromJSON a => Object -> Key -> Parser a .: Key "is_enabled" Integer cooldown <- Object cooldownObject forall a. FromJSON a => Object -> Key -> Parser a .: Key "global_cooldown_seconds" let cooldownSeconds :: Maybe Integer cooldownSeconds = if Bool cooldownEnabled then forall a. a -> Maybe a Just Integer cooldown else forall a. Maybe a Nothing Bool paused <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "is_paused" Bool inStock <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "is_in_stock" Bool autoFulfilled <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "should_redemptions_skip_request_queue" Integer redemptionCount <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "redemptions_redeemed_current_stream" Maybe String cooldownExpiry :: Maybe String <- Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "cooldown_expires_at" let cooldownExpires :: Maybe UTCTime cooldownExpires = ZonedTime -> UTCTime Time.zonedTimeToUTC forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> (forall t. TextualMonoid t => t -> Maybe ZonedTime Time.parseTimeRFC3339 forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< Maybe String cooldownExpiry) forall (m :: * -> *) a. Monad m => a -> m a return CreateResponse{Bool Integer String Maybe Integer Maybe String Maybe UTCTime Maybe RewardImages RewardImages cooldownExpires :: Maybe UTCTime redemptionCount :: Integer autoFulfilled :: Bool inStock :: Bool paused :: Bool cooldownSeconds :: Maybe Integer maxPerUser :: Maybe Integer maxPerStream :: Maybe Integer backgroundColor :: String defaultImage :: RewardImages rewardImage :: Maybe RewardImages rewardCost :: Integer prompt :: Maybe String rewardTitle :: String rewardId :: String broadcasterName :: String broadcasterLogin :: String broadcasterId :: Integer $sel:cooldownExpires:CreateResponse :: Maybe UTCTime $sel:redemptionCount:CreateResponse :: Integer $sel:autoFulfilled:CreateResponse :: Bool $sel:inStock:CreateResponse :: Bool $sel:paused:CreateResponse :: Bool $sel:cooldownSeconds:CreateResponse :: Maybe Integer $sel:maxPerUser:CreateResponse :: Maybe Integer $sel:maxPerStream:CreateResponse :: Maybe Integer $sel:backgroundColor:CreateResponse :: String $sel:defaultImage:CreateResponse :: RewardImages $sel:rewardImage:CreateResponse :: Maybe RewardImages $sel:rewardCost:CreateResponse :: Integer $sel:prompt:CreateResponse :: Maybe String $sel:rewardTitle:CreateResponse :: String $sel:rewardId:CreateResponse :: String $sel:broadcasterName:CreateResponse :: String $sel:broadcasterLogin:CreateResponse :: String $sel:broadcasterId:CreateResponse :: Integer ..}