-- | Webhook endpoints
module Calamity.HTTP.Webhook
    ( WebhookRequest(..)
    , CreateWebhookData(..)
    , ModifyWebhookData(..)
    , ExecuteWebhookOptions(..) ) where

import           Calamity.HTTP.Internal.Request
import           Calamity.HTTP.Internal.Route
import           Calamity.Internal.AesonThings
import           Calamity.Types.Model.Channel
import           Calamity.Types.Model.Guild
import           Calamity.Types.Snowflake

import           Control.Lens                   hiding ( (.=) )

import           Data.Aeson
import           Data.ByteString.Lazy           ( ByteString )
import           Data.Default.Class
import           Data.Generics.Product.Subtype  ( upcast )
import           Data.Maybe
import           Data.Text                      ( Text )

import           GHC.Generics

import           Network.Wreq ( partLBS )
import           Network.Wreq.Lens
import           Network.Wreq.Session

import           TextShow

data CreateWebhookData = CreateWebhookData
  { CreateWebhookData -> Maybe Text
username :: Maybe Text
    -- | The avatar field should be in discord's image data format: https://discord.com/developers/docs/reference#image-data
  , CreateWebhookData -> Maybe Text
avatar   :: Maybe Text
  }
  deriving ( Int -> CreateWebhookData -> ShowS
[CreateWebhookData] -> ShowS
CreateWebhookData -> String
(Int -> CreateWebhookData -> ShowS)
-> (CreateWebhookData -> String)
-> ([CreateWebhookData] -> ShowS)
-> Show CreateWebhookData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateWebhookData] -> ShowS
$cshowList :: [CreateWebhookData] -> ShowS
show :: CreateWebhookData -> String
$cshow :: CreateWebhookData -> String
showsPrec :: Int -> CreateWebhookData -> ShowS
$cshowsPrec :: Int -> CreateWebhookData -> ShowS
Show, (forall x. CreateWebhookData -> Rep CreateWebhookData x)
-> (forall x. Rep CreateWebhookData x -> CreateWebhookData)
-> Generic CreateWebhookData
forall x. Rep CreateWebhookData x -> CreateWebhookData
forall x. CreateWebhookData -> Rep CreateWebhookData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateWebhookData x -> CreateWebhookData
$cfrom :: forall x. CreateWebhookData -> Rep CreateWebhookData x
Generic, CreateWebhookData
CreateWebhookData -> Default CreateWebhookData
forall a. a -> Default a
def :: CreateWebhookData
$cdef :: CreateWebhookData
Default )
  deriving ( [CreateWebhookData] -> Encoding
[CreateWebhookData] -> Value
CreateWebhookData -> Encoding
CreateWebhookData -> Value
(CreateWebhookData -> Value)
-> (CreateWebhookData -> Encoding)
-> ([CreateWebhookData] -> Value)
-> ([CreateWebhookData] -> Encoding)
-> ToJSON CreateWebhookData
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [CreateWebhookData] -> Encoding
$ctoEncodingList :: [CreateWebhookData] -> Encoding
toJSONList :: [CreateWebhookData] -> Value
$ctoJSONList :: [CreateWebhookData] -> Value
toEncoding :: CreateWebhookData -> Encoding
$ctoEncoding :: CreateWebhookData -> Encoding
toJSON :: CreateWebhookData -> Value
$ctoJSON :: CreateWebhookData -> Value
ToJSON ) via CalamityJSON CreateWebhookData

data ModifyWebhookData = ModifyWebhookData
  { ModifyWebhookData -> Maybe Text
username  :: Maybe Text
    -- | The avatar field should be in discord's image data format: https://discord.com/developers/docs/reference#image-data
  , ModifyWebhookData -> Maybe Text
avatar    :: Maybe Text
  , ModifyWebhookData -> Maybe (Snowflake Channel)
channelID :: Maybe (Snowflake Channel)
  }
  deriving ( Int -> ModifyWebhookData -> ShowS
[ModifyWebhookData] -> ShowS
ModifyWebhookData -> String
(Int -> ModifyWebhookData -> ShowS)
-> (ModifyWebhookData -> String)
-> ([ModifyWebhookData] -> ShowS)
-> Show ModifyWebhookData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModifyWebhookData] -> ShowS
$cshowList :: [ModifyWebhookData] -> ShowS
show :: ModifyWebhookData -> String
$cshow :: ModifyWebhookData -> String
showsPrec :: Int -> ModifyWebhookData -> ShowS
$cshowsPrec :: Int -> ModifyWebhookData -> ShowS
Show, (forall x. ModifyWebhookData -> Rep ModifyWebhookData x)
-> (forall x. Rep ModifyWebhookData x -> ModifyWebhookData)
-> Generic ModifyWebhookData
forall x. Rep ModifyWebhookData x -> ModifyWebhookData
forall x. ModifyWebhookData -> Rep ModifyWebhookData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ModifyWebhookData x -> ModifyWebhookData
$cfrom :: forall x. ModifyWebhookData -> Rep ModifyWebhookData x
Generic, ModifyWebhookData
ModifyWebhookData -> Default ModifyWebhookData
forall a. a -> Default a
def :: ModifyWebhookData
$cdef :: ModifyWebhookData
Default )
  deriving ( [ModifyWebhookData] -> Encoding
[ModifyWebhookData] -> Value
ModifyWebhookData -> Encoding
ModifyWebhookData -> Value
(ModifyWebhookData -> Value)
-> (ModifyWebhookData -> Encoding)
-> ([ModifyWebhookData] -> Value)
-> ([ModifyWebhookData] -> Encoding)
-> ToJSON ModifyWebhookData
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ModifyWebhookData] -> Encoding
$ctoEncodingList :: [ModifyWebhookData] -> Encoding
toJSONList :: [ModifyWebhookData] -> Value
$ctoJSONList :: [ModifyWebhookData] -> Value
toEncoding :: ModifyWebhookData -> Encoding
$ctoEncoding :: ModifyWebhookData -> Encoding
toJSON :: ModifyWebhookData -> Value
$ctoJSON :: ModifyWebhookData -> Value
ToJSON ) via CalamityJSON ModifyWebhookData

data ExecuteWebhookOptions = ExecuteWebhookOptions
  { ExecuteWebhookOptions -> Maybe Bool
wait      :: Maybe Bool
  , ExecuteWebhookOptions -> Maybe Text
content   :: Maybe Text
  , ExecuteWebhookOptions -> Maybe ByteString
file      :: Maybe ByteString
  , ExecuteWebhookOptions -> Maybe [Embed]
embeds    :: Maybe [Embed]
  , ExecuteWebhookOptions -> Maybe Text
username  :: Maybe Text
  , ExecuteWebhookOptions -> Maybe Text
avatarUrl :: Maybe Text
  , ExecuteWebhookOptions -> Maybe Bool
tts       :: Maybe Bool
  }
  deriving ( Int -> ExecuteWebhookOptions -> ShowS
[ExecuteWebhookOptions] -> ShowS
ExecuteWebhookOptions -> String
(Int -> ExecuteWebhookOptions -> ShowS)
-> (ExecuteWebhookOptions -> String)
-> ([ExecuteWebhookOptions] -> ShowS)
-> Show ExecuteWebhookOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ExecuteWebhookOptions] -> ShowS
$cshowList :: [ExecuteWebhookOptions] -> ShowS
show :: ExecuteWebhookOptions -> String
$cshow :: ExecuteWebhookOptions -> String
showsPrec :: Int -> ExecuteWebhookOptions -> ShowS
$cshowsPrec :: Int -> ExecuteWebhookOptions -> ShowS
Show, (forall x. ExecuteWebhookOptions -> Rep ExecuteWebhookOptions x)
-> (forall x. Rep ExecuteWebhookOptions x -> ExecuteWebhookOptions)
-> Generic ExecuteWebhookOptions
forall x. Rep ExecuteWebhookOptions x -> ExecuteWebhookOptions
forall x. ExecuteWebhookOptions -> Rep ExecuteWebhookOptions x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ExecuteWebhookOptions x -> ExecuteWebhookOptions
$cfrom :: forall x. ExecuteWebhookOptions -> Rep ExecuteWebhookOptions x
Generic, ExecuteWebhookOptions
ExecuteWebhookOptions -> Default ExecuteWebhookOptions
forall a. a -> Default a
def :: ExecuteWebhookOptions
$cdef :: ExecuteWebhookOptions
Default )

data ExecuteWebhookJson = ExecuteWebhookJson
  { ExecuteWebhookJson -> Maybe Text
content   :: Maybe Text
  , ExecuteWebhookJson -> Maybe [Embed]
embeds    :: Maybe [Embed]
  , ExecuteWebhookJson -> Maybe Text
username  :: Maybe Text
  , ExecuteWebhookJson -> Maybe Text
avatarUrl :: Maybe Text
  , ExecuteWebhookJson -> Maybe Bool
tts       :: Maybe Bool
  }
  deriving ( Int -> ExecuteWebhookJson -> ShowS
[ExecuteWebhookJson] -> ShowS
ExecuteWebhookJson -> String
(Int -> ExecuteWebhookJson -> ShowS)
-> (ExecuteWebhookJson -> String)
-> ([ExecuteWebhookJson] -> ShowS)
-> Show ExecuteWebhookJson
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ExecuteWebhookJson] -> ShowS
$cshowList :: [ExecuteWebhookJson] -> ShowS
show :: ExecuteWebhookJson -> String
$cshow :: ExecuteWebhookJson -> String
showsPrec :: Int -> ExecuteWebhookJson -> ShowS
$cshowsPrec :: Int -> ExecuteWebhookJson -> ShowS
Show, (forall x. ExecuteWebhookJson -> Rep ExecuteWebhookJson x)
-> (forall x. Rep ExecuteWebhookJson x -> ExecuteWebhookJson)
-> Generic ExecuteWebhookJson
forall x. Rep ExecuteWebhookJson x -> ExecuteWebhookJson
forall x. ExecuteWebhookJson -> Rep ExecuteWebhookJson x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep ExecuteWebhookJson x -> ExecuteWebhookJson
$cfrom :: forall x. ExecuteWebhookJson -> Rep ExecuteWebhookJson x
Generic )
  deriving ( [ExecuteWebhookJson] -> Encoding
[ExecuteWebhookJson] -> Value
ExecuteWebhookJson -> Encoding
ExecuteWebhookJson -> Value
(ExecuteWebhookJson -> Value)
-> (ExecuteWebhookJson -> Encoding)
-> ([ExecuteWebhookJson] -> Value)
-> ([ExecuteWebhookJson] -> Encoding)
-> ToJSON ExecuteWebhookJson
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ExecuteWebhookJson] -> Encoding
$ctoEncodingList :: [ExecuteWebhookJson] -> Encoding
toJSONList :: [ExecuteWebhookJson] -> Value
$ctoJSONList :: [ExecuteWebhookJson] -> Value
toEncoding :: ExecuteWebhookJson -> Encoding
$ctoEncoding :: ExecuteWebhookJson -> Encoding
toJSON :: ExecuteWebhookJson -> Value
$ctoJSON :: ExecuteWebhookJson -> Value
ToJSON ) via CalamityJSON ExecuteWebhookJson

data WebhookRequest a where
  CreateWebhook      :: HasID Channel c => c -> CreateWebhookData ->                                   WebhookRequest Webhook
  GetChannelWebhooks :: HasID Channel c => c ->                                                        WebhookRequest [Webhook]
  GetGuildWebhooks   :: HasID Guild c => c ->                                                          WebhookRequest [Webhook]
  GetWebhook         :: HasID Webhook w => w ->                                                        WebhookRequest Webhook
  GetWebhookToken    :: HasID Webhook w => w -> Text ->                                                WebhookRequest Webhook
  ModifyWebhook      :: HasID Webhook w => w -> ModifyWebhookData ->                                   WebhookRequest Webhook
  ModifyWebhookToken :: HasID Webhook w => w -> Text -> ModifyWebhookData ->                           WebhookRequest Webhook
  DeleteWebhook      :: HasID Webhook w => w ->                                                        WebhookRequest ()
  DeleteWebhookToken :: HasID Webhook w => w -> Text ->                                                WebhookRequest ()
  ExecuteWebhook     :: HasID Webhook w => w -> Text -> ExecuteWebhookOptions -> WebhookRequest ()


baseRoute :: Snowflake Webhook -> RouteBuilder _
baseRoute :: Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
baseRoute id :: Snowflake Webhook
id = RouteBuilder '[]
mkRouteBuilder RouteBuilder '[] -> S -> ConsRes S '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "webhooks" RouteBuilder '[] -> ID Webhook -> ConsRes (ID Webhook) '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// ID Webhook
forall k (a :: k). ID a
ID @Webhook RouteBuilder '[ '(Webhook, 'Required)]
-> (RouteBuilder '[ '(Webhook, 'Required)]
    -> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)])
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
forall a b. a -> (a -> b) -> b
& Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Required)]
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
forall k (ids :: [(*, RouteRequirement)]).
Typeable k =>
Snowflake k
-> RouteBuilder ids -> RouteBuilder ('(k, 'Satisfied) : ids)
giveID Snowflake Webhook
id

instance Request (WebhookRequest a) where
  type Result (WebhookRequest a) = a

  route :: WebhookRequest a -> Route
route (CreateWebhook (forall a. HasID Channel a => a -> Snowflake Channel
forall b a. HasID b a => a -> Snowflake b
getID @Channel -> Snowflake Channel
cid) _) = RouteBuilder '[]
mkRouteBuilder RouteBuilder '[] -> S -> ConsRes S '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "channels" RouteBuilder '[] -> ID Channel -> ConsRes (ID Channel) '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// ID Channel
forall k (a :: k). ID a
ID @Channel RouteBuilder '[ '(Channel, 'Required)]
-> S -> ConsRes S '[ '(Channel, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "webhooks"
    RouteBuilder '[ '(Channel, 'Required)]
-> (RouteBuilder '[ '(Channel, 'Required)]
    -> RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)])
-> RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
forall a b. a -> (a -> b) -> b
& Snowflake Channel
-> RouteBuilder '[ '(Channel, 'Required)]
-> RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
forall k (ids :: [(*, RouteRequirement)]).
Typeable k =>
Snowflake k
-> RouteBuilder ids -> RouteBuilder ('(k, 'Satisfied) : ids)
giveID Snowflake Channel
cid
    RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
-> (RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (GetChannelWebhooks (forall a. HasID Channel a => a -> Snowflake Channel
forall b a. HasID b a => a -> Snowflake b
getID @Channel -> Snowflake Channel
cid)) = RouteBuilder '[]
mkRouteBuilder RouteBuilder '[] -> S -> ConsRes S '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "channels" RouteBuilder '[] -> ID Channel -> ConsRes (ID Channel) '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// ID Channel
forall k (a :: k). ID a
ID @Channel RouteBuilder '[ '(Channel, 'Required)]
-> S -> ConsRes S '[ '(Channel, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "webhooks"
    RouteBuilder '[ '(Channel, 'Required)]
-> (RouteBuilder '[ '(Channel, 'Required)]
    -> RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)])
-> RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
forall a b. a -> (a -> b) -> b
& Snowflake Channel
-> RouteBuilder '[ '(Channel, 'Required)]
-> RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
forall k (ids :: [(*, RouteRequirement)]).
Typeable k =>
Snowflake k
-> RouteBuilder ids -> RouteBuilder ('(k, 'Satisfied) : ids)
giveID Snowflake Channel
cid
    RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
-> (RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Channel, 'Satisfied), '(Channel, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (GetGuildWebhooks (forall a. HasID Guild a => a -> Snowflake Guild
forall b a. HasID b a => a -> Snowflake b
getID @Guild -> Snowflake Guild
gid)) = RouteBuilder '[]
mkRouteBuilder RouteBuilder '[] -> S -> ConsRes S '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "guilds" RouteBuilder '[] -> ID Guild -> ConsRes (ID Guild) '[]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// ID Guild
forall k (a :: k). ID a
ID @Guild RouteBuilder '[ '(Guild, 'Required)]
-> S -> ConsRes S '[ '(Guild, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S "webhooks"
    RouteBuilder '[ '(Guild, 'Required)]
-> (RouteBuilder '[ '(Guild, 'Required)]
    -> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)])
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
forall a b. a -> (a -> b) -> b
& Snowflake Guild
-> RouteBuilder '[ '(Guild, 'Required)]
-> RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
forall k (ids :: [(*, RouteRequirement)]).
Typeable k =>
Snowflake k
-> RouteBuilder ids -> RouteBuilder ('(k, 'Satisfied) : ids)
giveID Snowflake Guild
gid
    RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
-> (RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Guild, 'Satisfied), '(Guild, 'Required)] -> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (GetWebhook (forall a. HasID Webhook a => a -> Snowflake Webhook
forall b a. HasID b a => a -> Snowflake b
getID @Webhook -> Snowflake Webhook
wid)) = Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
baseRoute Snowflake Webhook
wid
    RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> (RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (GetWebhookToken (forall a. HasID Webhook a => a -> Snowflake Webhook
forall b a. HasID b a => a -> Snowflake b
getID @Webhook -> Snowflake Webhook
wid) t :: Text
t) = Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
baseRoute Snowflake Webhook
wid RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> S -> ConsRes S '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S Text
t
    RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> (RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (ModifyWebhook (forall a. HasID Webhook a => a -> Snowflake Webhook
forall b a. HasID b a => a -> Snowflake b
getID @Webhook -> Snowflake Webhook
wid) _) = Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
baseRoute Snowflake Webhook
wid
    RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> (RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (ModifyWebhookToken (forall a. HasID Webhook a => a -> Snowflake Webhook
forall b a. HasID b a => a -> Snowflake b
getID @Webhook -> Snowflake Webhook
wid) t :: Text
t _) = Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
baseRoute Snowflake Webhook
wid RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> S -> ConsRes S '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S Text
t
    RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> (RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (DeleteWebhook (forall a. HasID Webhook a => a -> Snowflake Webhook
forall b a. HasID b a => a -> Snowflake b
getID @Webhook -> Snowflake Webhook
wid)) = Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
baseRoute Snowflake Webhook
wid
    RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> (RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (DeleteWebhookToken (forall a. HasID Webhook a => a -> Snowflake Webhook
forall b a. HasID b a => a -> Snowflake b
getID @Webhook -> Snowflake Webhook
wid) t :: Text
t) = Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
baseRoute Snowflake Webhook
wid RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> S -> ConsRes S '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S Text
t
    RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> (RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute
  route (ExecuteWebhook (forall a. HasID Webhook a => a -> Snowflake Webhook
forall b a. HasID b a => a -> Snowflake b
getID @Webhook -> Snowflake Webhook
wid) t :: Text
t _) = Snowflake Webhook
-> RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
baseRoute Snowflake Webhook
wid RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> S -> ConsRes S '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
forall a (ids :: [(*, RouteRequirement)]).
RouteFragmentable a ids =>
RouteBuilder ids -> a -> ConsRes a ids
// Text -> S
S Text
t
    RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> (RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
    -> Route)
-> Route
forall a b. a -> (a -> b) -> b
& RouteBuilder '[ '(Webhook, 'Satisfied), '(Webhook, 'Required)]
-> Route
forall (ids :: [(*, RouteRequirement)]).
EnsureFulfilled ids =>
RouteBuilder ids -> Route
buildRoute

  action :: WebhookRequest a
-> Options -> Session -> String -> IO (Response ByteString)
action (CreateWebhook _ o :: CreateWebhookData
o) = Value -> Options -> Session -> String -> IO (Response ByteString)
forall a.
Postable a =>
a -> Options -> Session -> String -> IO (Response ByteString)
postWith' (CreateWebhookData -> Value
forall a. ToJSON a => a -> Value
toJSON CreateWebhookData
o)
  action (GetChannelWebhooks _) = Options -> Session -> String -> IO (Response ByteString)
getWith
  action (GetGuildWebhooks _) = Options -> Session -> String -> IO (Response ByteString)
getWith
  action (GetWebhook _) = Options -> Session -> String -> IO (Response ByteString)
getWith
  action (GetWebhookToken _ _) = Options -> Session -> String -> IO (Response ByteString)
getWith
  action (ModifyWebhook _ o :: ModifyWebhookData
o) = Value -> Options -> Session -> String -> IO (Response ByteString)
forall a.
Postable a =>
a -> Options -> Session -> String -> IO (Response ByteString)
patchWith' (ModifyWebhookData -> Value
forall a. ToJSON a => a -> Value
toJSON ModifyWebhookData
o)
  action (ModifyWebhookToken _ _ o :: ModifyWebhookData
o) = Value -> Options -> Session -> String -> IO (Response ByteString)
forall a.
Postable a =>
a -> Options -> Session -> String -> IO (Response ByteString)
patchWith' (ModifyWebhookData -> Value
forall a. ToJSON a => a -> Value
toJSON ModifyWebhookData
o)
  action (DeleteWebhook _) = Options -> Session -> String -> IO (Response ByteString)
deleteWith
  action (DeleteWebhookToken _ _) = Options -> Session -> String -> IO (Response ByteString)
deleteWith
  action (ExecuteWebhook _ _ o :: ExecuteWebhookOptions
o@ExecuteWebhookOptions { $sel:file:ExecuteWebhookOptions :: ExecuteWebhookOptions -> Maybe ByteString
file = Maybe ByteString
Nothing }) = Value
-> (Options -> Options)
-> Options
-> Session
-> String
-> IO (Response ByteString)
forall a.
Postable a =>
a
-> (Options -> Options)
-> Options
-> Session
-> String
-> IO (Response ByteString)
postWithP'
    (ExecuteWebhookJson -> Value
forall a. ToJSON a => a -> Value
toJSON (ExecuteWebhookJson -> Value)
-> (ExecuteWebhookOptions -> ExecuteWebhookJson)
-> ExecuteWebhookOptions
-> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall sub.
Subtype ExecuteWebhookJson sub =>
sub -> ExecuteWebhookJson
forall sup sub. Subtype sup sub => sub -> sup
upcast @ExecuteWebhookJson (ExecuteWebhookOptions -> Value) -> ExecuteWebhookOptions -> Value
forall a b. (a -> b) -> a -> b
$ ExecuteWebhookOptions
o) (Text -> Lens' Options [Text]
param "wait" (([Text] -> Identity [Text]) -> Options -> Identity Options)
-> [Text] -> Options -> Options
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe Text -> [Text]
forall a. Maybe a -> [a]
maybeToList (Bool -> Text
forall a. TextShow a => a -> Text
showt (Bool -> Text) -> Maybe Bool -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ExecuteWebhookOptions
o ExecuteWebhookOptions
-> Getting (Maybe Bool) ExecuteWebhookOptions (Maybe Bool)
-> Maybe Bool
forall s a. s -> Getting a s a -> a
^. IsLabel
  "wait" (Getting (Maybe Bool) ExecuteWebhookOptions (Maybe Bool))
Getting (Maybe Bool) ExecuteWebhookOptions (Maybe Bool)
#wait))
  action (ExecuteWebhook _ _ o :: ExecuteWebhookOptions
o@ExecuteWebhookOptions { $sel:file:ExecuteWebhookOptions :: ExecuteWebhookOptions -> Maybe ByteString
file = Just f :: ByteString
f }) = [PartM IO]
-> (Options -> Options)
-> Options
-> Session
-> String
-> IO (Response ByteString)
forall a.
Postable a =>
a
-> (Options -> Options)
-> Options
-> Session
-> String
-> IO (Response ByteString)
postWithP'
    [Text -> ByteString -> PartM IO
forall (m :: * -> *).
Applicative m =>
Text -> ByteString -> PartM m
partLBS @IO "file" ByteString
f, Text -> ByteString -> PartM IO
forall (m :: * -> *).
Applicative m =>
Text -> ByteString -> PartM m
partLBS "payload_json" (ExecuteWebhookJson -> ByteString
forall a. ToJSON a => a -> ByteString
encode (ExecuteWebhookJson -> ByteString)
-> (ExecuteWebhookOptions -> ExecuteWebhookJson)
-> ExecuteWebhookOptions
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall sub.
Subtype ExecuteWebhookJson sub =>
sub -> ExecuteWebhookJson
forall sup sub. Subtype sup sub => sub -> sup
upcast @ExecuteWebhookJson (ExecuteWebhookOptions -> ByteString)
-> ExecuteWebhookOptions -> ByteString
forall a b. (a -> b) -> a -> b
$ ExecuteWebhookOptions
o)]
    (Text -> Lens' Options [Text]
param "wait" (([Text] -> Identity [Text]) -> Options -> Identity Options)
-> [Text] -> Options -> Options
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Maybe Text -> [Text]
forall a. Maybe a -> [a]
maybeToList (Bool -> Text
forall a. TextShow a => a -> Text
showt (Bool -> Text) -> Maybe Bool -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ExecuteWebhookOptions
o ExecuteWebhookOptions
-> Getting (Maybe Bool) ExecuteWebhookOptions (Maybe Bool)
-> Maybe Bool
forall s a. s -> Getting a s a -> a
^. IsLabel
  "wait" (Getting (Maybe Bool) ExecuteWebhookOptions (Maybe Bool))
Getting (Maybe Bool) ExecuteWebhookOptions (Maybe Bool)
#wait))