{-# 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