discord-haskell-1.12.0: src/Discord/Internal/Rest/Interactions.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Discord.Internal.Rest.Interactions where
import Data.Aeson (encode)
import qualified Data.ByteString.Lazy as BL
import Discord.Internal.Rest.Prelude
import Discord.Internal.Types
import Discord.Internal.Types.Interactions
import Network.HTTP.Client.MultipartFormData (PartM, partBS)
import Network.HTTP.Req as R
data InteractionResponseRequest a where
CreateInteractionResponse :: InteractionId -> InteractionToken -> InteractionResponse -> InteractionResponseRequest ()
GetOriginalInteractionResponse :: ApplicationId -> InteractionToken -> InteractionResponseRequest Message
EditOriginalInteractionResponse :: ApplicationId -> InteractionToken -> InteractionResponseMessage -> InteractionResponseRequest Message
DeleteOriginalInteractionResponse :: ApplicationId -> InteractionToken -> InteractionResponseRequest ()
CreateFollowupInteractionMessage :: ApplicationId -> InteractionToken -> InteractionResponseMessage -> InteractionResponseRequest Message
GetFollowupInteractionMessage :: ApplicationId -> InteractionToken -> MessageId -> InteractionResponseRequest Message
EditFollowupInteractionMessage :: ApplicationId -> InteractionToken -> MessageId -> InteractionResponse -> InteractionResponseRequest Message
DeleteFollowupInteractionMessage :: ApplicationId -> InteractionToken -> MessageId -> InteractionResponseRequest ()
instance Request (InteractionResponseRequest a) where
jsonRequest = interactionResponseJsonRequest
majorRoute = interactionResponseMajorRoute
interactionResponseMajorRoute :: InteractionResponseRequest a -> String
interactionResponseMajorRoute a = case a of
(CreateInteractionResponse iid _ _) -> "intresp " <> show iid
(GetOriginalInteractionResponse aid _) -> "intresp " <> show aid
(EditOriginalInteractionResponse aid _ _) -> "intresp " <> show aid
(DeleteOriginalInteractionResponse aid _) -> "intresp " <> show aid
(CreateFollowupInteractionMessage iid _ _) -> "intrespf " <> show iid
(GetFollowupInteractionMessage aid _ _) -> "intrespf " <> show aid
(EditFollowupInteractionMessage aid _ _ _) -> "intrespf " <> show aid
(DeleteFollowupInteractionMessage aid _ _) -> "intrespf " <> show aid
interaction :: ApplicationId -> InteractionToken -> R.Url 'R.Https
interaction aid it = baseUrl /: "webhooks" // aid /: it /: "messages"
interactionResponseJsonRequest :: InteractionResponseRequest a -> JsonRequest
interactionResponseJsonRequest a = case a of
(CreateInteractionResponse iid it i) ->
Post (baseUrl /: "interactions" // iid /: it /: "callback") (convert i) mempty
(GetOriginalInteractionResponse aid it) ->
Get (interaction aid it /: "@original") mempty
(EditOriginalInteractionResponse aid it i) ->
Patch (interaction aid it /: "@original") (convertIRM i) mempty
(DeleteOriginalInteractionResponse aid it) ->
Delete (interaction aid it /: "@original") mempty
(CreateFollowupInteractionMessage aid it i) ->
Post (baseUrl /: "webhooks" // aid /: it) (convertIRM i) mempty
(GetFollowupInteractionMessage aid it mid) ->
Get (interaction aid it // mid) mempty
(EditFollowupInteractionMessage aid it mid i) ->
Patch (interaction aid it // mid) (convert i) mempty
(DeleteFollowupInteractionMessage aid it mid) ->
Delete (interaction aid it // mid) mempty
where
convert :: InteractionResponse -> RestIO ReqBodyMultipart
convert ir@(InteractionResponseChannelMessage irm) = R.reqBodyMultipart (partBS "payload_json" (BL.toStrict $ encode ir) : convert' irm)
convert ir@(InteractionResponseUpdateMessage irm) = R.reqBodyMultipart (partBS "payload_json" (BL.toStrict $ encode ir) : convert' irm)
convert ir = R.reqBodyMultipart [partBS "payload_json" $ BL.toStrict $ encode ir]
convertIRM :: InteractionResponseMessage -> RestIO ReqBodyMultipart
convertIRM irm = R.reqBodyMultipart (partBS "payload_json" (BL.toStrict $ encode irm) : convert' irm)
convert' :: InteractionResponseMessage -> [PartM IO]
convert' InteractionResponseMessage {..} = case interactionResponseMessageEmbeds of
Nothing -> []
Just f -> (maybeEmbed . Just) =<< f