{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

-- | Provides actions for Channel API interactions
module Discord.Internal.Rest.Emoji
  ( EmojiRequest (..),
    ModifyGuildEmojiOpts (..),
    parseEmojiImage,
    StickerRequest (..),
    CreateGuildStickerOpts (..),
    EditGuildStickerOpts (..)
  )
where

import Codec.Picture
import Data.Aeson
import qualified Data.ByteString as B
import qualified Data.ByteString.Base64 as B64
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import Discord.Internal.Rest.Prelude
import Discord.Internal.Types
import Network.HTTP.Req ((/:))
import qualified Network.HTTP.Req as R

instance Request (EmojiRequest a) where
  majorRoute :: EmojiRequest a -> String
majorRoute = EmojiRequest a -> String
forall a. EmojiRequest a -> String
emojiMajorRoute
  jsonRequest :: EmojiRequest a -> JsonRequest
jsonRequest = EmojiRequest a -> JsonRequest
forall a. EmojiRequest a -> JsonRequest
emojiJsonRequest

-- | Data constructor for requests. See <https://discord.com/developers/docs/resources/ API>
data EmojiRequest a where
  -- | List of emoji objects for the given guild. Requires MANAGE_EMOJIS permission.
  ListGuildEmojis :: GuildId -> EmojiRequest [Emoji]
  -- | Emoji object for the given guild and emoji ID
  GetGuildEmoji :: GuildId -> EmojiId -> EmojiRequest Emoji
  -- | Create a new guild emoji (static&animated). Requires MANAGE_EMOJIS permission.
  CreateGuildEmoji :: GuildId -> T.Text -> EmojiImageParsed -> EmojiRequest Emoji
  -- | Requires MANAGE_EMOJIS permission
  ModifyGuildEmoji :: GuildId -> EmojiId -> ModifyGuildEmojiOpts -> EmojiRequest Emoji
  -- | Requires MANAGE_EMOJIS permission
  DeleteGuildEmoji :: GuildId -> EmojiId -> EmojiRequest ()

data ModifyGuildEmojiOpts = ModifyGuildEmojiOpts
  { ModifyGuildEmojiOpts -> Text
modifyGuildEmojiName :: T.Text,
    ModifyGuildEmojiOpts -> [RoleId]
modifyGuildEmojiRoles :: [RoleId]
  }
  deriving (Int -> ModifyGuildEmojiOpts -> ShowS
[ModifyGuildEmojiOpts] -> ShowS
ModifyGuildEmojiOpts -> String
(Int -> ModifyGuildEmojiOpts -> ShowS)
-> (ModifyGuildEmojiOpts -> String)
-> ([ModifyGuildEmojiOpts] -> ShowS)
-> Show ModifyGuildEmojiOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModifyGuildEmojiOpts] -> ShowS
$cshowList :: [ModifyGuildEmojiOpts] -> ShowS
show :: ModifyGuildEmojiOpts -> String
$cshow :: ModifyGuildEmojiOpts -> String
showsPrec :: Int -> ModifyGuildEmojiOpts -> ShowS
$cshowsPrec :: Int -> ModifyGuildEmojiOpts -> ShowS
Show, ReadPrec [ModifyGuildEmojiOpts]
ReadPrec ModifyGuildEmojiOpts
Int -> ReadS ModifyGuildEmojiOpts
ReadS [ModifyGuildEmojiOpts]
(Int -> ReadS ModifyGuildEmojiOpts)
-> ReadS [ModifyGuildEmojiOpts]
-> ReadPrec ModifyGuildEmojiOpts
-> ReadPrec [ModifyGuildEmojiOpts]
-> Read ModifyGuildEmojiOpts
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [ModifyGuildEmojiOpts]
$creadListPrec :: ReadPrec [ModifyGuildEmojiOpts]
readPrec :: ReadPrec ModifyGuildEmojiOpts
$creadPrec :: ReadPrec ModifyGuildEmojiOpts
readList :: ReadS [ModifyGuildEmojiOpts]
$creadList :: ReadS [ModifyGuildEmojiOpts]
readsPrec :: Int -> ReadS ModifyGuildEmojiOpts
$creadsPrec :: Int -> ReadS ModifyGuildEmojiOpts
Read, ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
(ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool)
-> (ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool)
-> Eq ModifyGuildEmojiOpts
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
$c/= :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
== :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
$c== :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
Eq, Eq ModifyGuildEmojiOpts
Eq ModifyGuildEmojiOpts
-> (ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Ordering)
-> (ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool)
-> (ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool)
-> (ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool)
-> (ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool)
-> (ModifyGuildEmojiOpts
    -> ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts)
-> (ModifyGuildEmojiOpts
    -> ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts)
-> Ord ModifyGuildEmojiOpts
ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Ordering
ModifyGuildEmojiOpts
-> ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ModifyGuildEmojiOpts
-> ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts
$cmin :: ModifyGuildEmojiOpts
-> ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts
max :: ModifyGuildEmojiOpts
-> ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts
$cmax :: ModifyGuildEmojiOpts
-> ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts
>= :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
$c>= :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
> :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
$c> :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
<= :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
$c<= :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
< :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
$c< :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Bool
compare :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Ordering
$ccompare :: ModifyGuildEmojiOpts -> ModifyGuildEmojiOpts -> Ordering
$cp1Ord :: Eq ModifyGuildEmojiOpts
Ord)

instance ToJSON ModifyGuildEmojiOpts where
  toJSON :: ModifyGuildEmojiOpts -> Value
toJSON (ModifyGuildEmojiOpts Text
name [RoleId]
roles) =
    [Pair] -> Value
object [Key
"name" Key -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Text
name, Key
"roles" Key -> [RoleId] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [RoleId]
roles]

newtype EmojiImageParsed = EmojiImageParsed T.Text
  deriving (Int -> EmojiImageParsed -> ShowS
[EmojiImageParsed] -> ShowS
EmojiImageParsed -> String
(Int -> EmojiImageParsed -> ShowS)
-> (EmojiImageParsed -> String)
-> ([EmojiImageParsed] -> ShowS)
-> Show EmojiImageParsed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EmojiImageParsed] -> ShowS
$cshowList :: [EmojiImageParsed] -> ShowS
show :: EmojiImageParsed -> String
$cshow :: EmojiImageParsed -> String
showsPrec :: Int -> EmojiImageParsed -> ShowS
$cshowsPrec :: Int -> EmojiImageParsed -> ShowS
Show, ReadPrec [EmojiImageParsed]
ReadPrec EmojiImageParsed
Int -> ReadS EmojiImageParsed
ReadS [EmojiImageParsed]
(Int -> ReadS EmojiImageParsed)
-> ReadS [EmojiImageParsed]
-> ReadPrec EmojiImageParsed
-> ReadPrec [EmojiImageParsed]
-> Read EmojiImageParsed
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [EmojiImageParsed]
$creadListPrec :: ReadPrec [EmojiImageParsed]
readPrec :: ReadPrec EmojiImageParsed
$creadPrec :: ReadPrec EmojiImageParsed
readList :: ReadS [EmojiImageParsed]
$creadList :: ReadS [EmojiImageParsed]
readsPrec :: Int -> ReadS EmojiImageParsed
$creadsPrec :: Int -> ReadS EmojiImageParsed
Read, EmojiImageParsed -> EmojiImageParsed -> Bool
(EmojiImageParsed -> EmojiImageParsed -> Bool)
-> (EmojiImageParsed -> EmojiImageParsed -> Bool)
-> Eq EmojiImageParsed
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EmojiImageParsed -> EmojiImageParsed -> Bool
$c/= :: EmojiImageParsed -> EmojiImageParsed -> Bool
== :: EmojiImageParsed -> EmojiImageParsed -> Bool
$c== :: EmojiImageParsed -> EmojiImageParsed -> Bool
Eq, Eq EmojiImageParsed
Eq EmojiImageParsed
-> (EmojiImageParsed -> EmojiImageParsed -> Ordering)
-> (EmojiImageParsed -> EmojiImageParsed -> Bool)
-> (EmojiImageParsed -> EmojiImageParsed -> Bool)
-> (EmojiImageParsed -> EmojiImageParsed -> Bool)
-> (EmojiImageParsed -> EmojiImageParsed -> Bool)
-> (EmojiImageParsed -> EmojiImageParsed -> EmojiImageParsed)
-> (EmojiImageParsed -> EmojiImageParsed -> EmojiImageParsed)
-> Ord EmojiImageParsed
EmojiImageParsed -> EmojiImageParsed -> Bool
EmojiImageParsed -> EmojiImageParsed -> Ordering
EmojiImageParsed -> EmojiImageParsed -> EmojiImageParsed
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EmojiImageParsed -> EmojiImageParsed -> EmojiImageParsed
$cmin :: EmojiImageParsed -> EmojiImageParsed -> EmojiImageParsed
max :: EmojiImageParsed -> EmojiImageParsed -> EmojiImageParsed
$cmax :: EmojiImageParsed -> EmojiImageParsed -> EmojiImageParsed
>= :: EmojiImageParsed -> EmojiImageParsed -> Bool
$c>= :: EmojiImageParsed -> EmojiImageParsed -> Bool
> :: EmojiImageParsed -> EmojiImageParsed -> Bool
$c> :: EmojiImageParsed -> EmojiImageParsed -> Bool
<= :: EmojiImageParsed -> EmojiImageParsed -> Bool
$c<= :: EmojiImageParsed -> EmojiImageParsed -> Bool
< :: EmojiImageParsed -> EmojiImageParsed -> Bool
$c< :: EmojiImageParsed -> EmojiImageParsed -> Bool
compare :: EmojiImageParsed -> EmojiImageParsed -> Ordering
$ccompare :: EmojiImageParsed -> EmojiImageParsed -> Ordering
$cp1Ord :: Eq EmojiImageParsed
Ord)

parseEmojiImage :: B.ByteString -> Either T.Text EmojiImageParsed
parseEmojiImage :: ByteString -> Either Text EmojiImageParsed
parseEmojiImage ByteString
bs =
  if ByteString -> Int
B.length ByteString
bs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
256000
    then Text -> Either Text EmojiImageParsed
forall a b. a -> Either a b
Left Text
"Cannot create emoji - File is larger than 256kb"
    else case (ByteString -> Either String [DynamicImage]
decodeGifImages ByteString
bs, ByteString -> Either String DynamicImage
decodeImage ByteString
bs) of
      (Left String
e1, Left String
e2) ->
        Text -> Either Text EmojiImageParsed
forall a b. a -> Either a b
Left
          ( Text
"Could not parse image or gif: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack String
e1
              Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" and "
              Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack String
e2
          )
      (Right [DynamicImage]
ims, Either String DynamicImage
_) ->
        if (DynamicImage -> Bool) -> [DynamicImage] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all DynamicImage -> Bool
is128 [DynamicImage]
ims
          then
            EmojiImageParsed -> Either Text EmojiImageParsed
forall a b. b -> Either a b
Right
              ( Text -> EmojiImageParsed
EmojiImageParsed
                  ( Text
"data:text/plain;"
                      Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"base64,"
                      Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ByteString -> Text
TE.decodeUtf8 (ByteString -> ByteString
B64.encode ByteString
bs)
                  )
              )
          else Text -> Either Text EmojiImageParsed
forall a b. a -> Either a b
Left Text
"The frames are not all 128x128"
      (Either String [DynamicImage]
_, Right DynamicImage
im) ->
        if DynamicImage -> Bool
is128 DynamicImage
im
          then
            EmojiImageParsed -> Either Text EmojiImageParsed
forall a b. b -> Either a b
Right
              ( Text -> EmojiImageParsed
EmojiImageParsed
                  ( Text
"data:text/plain;"
                      Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"base64,"
                      Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ByteString -> Text
TE.decodeUtf8 (ByteString -> ByteString
B64.encode ByteString
bs)
                  )
              )
          else Text -> Either Text EmojiImageParsed
forall a b. a -> Either a b
Left Text
"Image is not 128x128"
  where
    is128 :: DynamicImage -> Bool
is128 DynamicImage
im =
      let i :: Image PixelRGB8
i = DynamicImage -> Image PixelRGB8
convertRGB8 DynamicImage
im
       in Image PixelRGB8 -> Int
forall a. Image a -> Int
imageWidth Image PixelRGB8
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
128 Bool -> Bool -> Bool
&& Image PixelRGB8 -> Int
forall a. Image a -> Int
imageHeight Image PixelRGB8
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
128

emojiMajorRoute :: EmojiRequest a -> String
emojiMajorRoute :: EmojiRequest a -> String
emojiMajorRoute EmojiRequest a
c = case EmojiRequest a
c of
  (ListGuildEmojis RoleId
g) -> String
"emoji " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
g
  (GetGuildEmoji RoleId
g RoleId
_) -> String
"emoji " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
g
  (CreateGuildEmoji RoleId
g Text
_ EmojiImageParsed
_) -> String
"emoji " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
g
  (ModifyGuildEmoji RoleId
g RoleId
_ ModifyGuildEmojiOpts
_) -> String
"emoji " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
g
  (DeleteGuildEmoji RoleId
g RoleId
_) -> String
"emoji " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
g

guilds :: R.Url 'R.Https
guilds :: Url 'Https
guilds = Url 'Https
baseUrl Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"guilds"

emojiJsonRequest :: EmojiRequest r -> JsonRequest
emojiJsonRequest :: EmojiRequest r -> JsonRequest
emojiJsonRequest EmojiRequest r
c = case EmojiRequest r
c of
  (ListGuildEmojis RoleId
g) -> Url 'Https -> Option 'Https -> JsonRequest
Get (Url 'Https
guilds Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
g Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"emojis") Option 'Https
forall a. Monoid a => a
mempty
  (GetGuildEmoji RoleId
g RoleId
e) -> Url 'Https -> Option 'Https -> JsonRequest
Get (Url 'Https
guilds Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
g Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"emojis" Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
e) Option 'Https
forall a. Monoid a => a
mempty
  (CreateGuildEmoji RoleId
g Text
name (EmojiImageParsed Text
im)) ->
    Url 'Https
-> RestIO (ReqBodyJson Value) -> Option 'Https -> JsonRequest
forall a.
HttpBody a =>
Url 'Https -> RestIO a -> Option 'Https -> JsonRequest
Post
      (Url 'Https
guilds Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
g Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"emojis")
      ( ReqBodyJson Value -> RestIO (ReqBodyJson Value)
forall (f :: * -> *) a. Applicative f => a -> f a
pure
          ( Value -> ReqBodyJson Value
forall a. a -> ReqBodyJson a
R.ReqBodyJson
              ( [Pair] -> Value
object
                  [ Key
"name" Key -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Text
name,
                    Key
"image" Key -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Text
im
                    -- todo , "roles" .= ...
                  ]
              )
          )
      )
      Option 'Https
forall a. Monoid a => a
mempty
  (ModifyGuildEmoji RoleId
g RoleId
e ModifyGuildEmojiOpts
o) ->
    Url 'Https
-> RestIO (ReqBodyJson ModifyGuildEmojiOpts)
-> Option 'Https
-> JsonRequest
forall a.
HttpBody a =>
Url 'Https -> RestIO a -> Option 'Https -> JsonRequest
Patch
      (Url 'Https
guilds Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
g Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"emojis" Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
e)
      (ReqBodyJson ModifyGuildEmojiOpts
-> RestIO (ReqBodyJson ModifyGuildEmojiOpts)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ModifyGuildEmojiOpts -> ReqBodyJson ModifyGuildEmojiOpts
forall a. a -> ReqBodyJson a
R.ReqBodyJson ModifyGuildEmojiOpts
o))
      Option 'Https
forall a. Monoid a => a
mempty
  (DeleteGuildEmoji RoleId
g RoleId
e) -> Url 'Https -> Option 'Https -> JsonRequest
Delete (Url 'Https
guilds Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
g Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"emojis" Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
e) Option 'Https
forall a. Monoid a => a
mempty

data StickerData = StickerDataPNG {StickerData -> ByteString
stickerData :: B.ByteString} | StickerDataAPNG {stickerData :: B.ByteString} | StickerDataLOTTIE {stickerData :: B.ByteString}
  deriving (Int -> StickerData -> ShowS
[StickerData] -> ShowS
StickerData -> String
(Int -> StickerData -> ShowS)
-> (StickerData -> String)
-> ([StickerData] -> ShowS)
-> Show StickerData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StickerData] -> ShowS
$cshowList :: [StickerData] -> ShowS
show :: StickerData -> String
$cshow :: StickerData -> String
showsPrec :: Int -> StickerData -> ShowS
$cshowsPrec :: Int -> StickerData -> ShowS
Show, ReadPrec [StickerData]
ReadPrec StickerData
Int -> ReadS StickerData
ReadS [StickerData]
(Int -> ReadS StickerData)
-> ReadS [StickerData]
-> ReadPrec StickerData
-> ReadPrec [StickerData]
-> Read StickerData
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [StickerData]
$creadListPrec :: ReadPrec [StickerData]
readPrec :: ReadPrec StickerData
$creadPrec :: ReadPrec StickerData
readList :: ReadS [StickerData]
$creadList :: ReadS [StickerData]
readsPrec :: Int -> ReadS StickerData
$creadsPrec :: Int -> ReadS StickerData
Read, StickerData -> StickerData -> Bool
(StickerData -> StickerData -> Bool)
-> (StickerData -> StickerData -> Bool) -> Eq StickerData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: StickerData -> StickerData -> Bool
$c/= :: StickerData -> StickerData -> Bool
== :: StickerData -> StickerData -> Bool
$c== :: StickerData -> StickerData -> Bool
Eq, Eq StickerData
Eq StickerData
-> (StickerData -> StickerData -> Ordering)
-> (StickerData -> StickerData -> Bool)
-> (StickerData -> StickerData -> Bool)
-> (StickerData -> StickerData -> Bool)
-> (StickerData -> StickerData -> Bool)
-> (StickerData -> StickerData -> StickerData)
-> (StickerData -> StickerData -> StickerData)
-> Ord StickerData
StickerData -> StickerData -> Bool
StickerData -> StickerData -> Ordering
StickerData -> StickerData -> StickerData
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: StickerData -> StickerData -> StickerData
$cmin :: StickerData -> StickerData -> StickerData
max :: StickerData -> StickerData -> StickerData
$cmax :: StickerData -> StickerData -> StickerData
>= :: StickerData -> StickerData -> Bool
$c>= :: StickerData -> StickerData -> Bool
> :: StickerData -> StickerData -> Bool
$c> :: StickerData -> StickerData -> Bool
<= :: StickerData -> StickerData -> Bool
$c<= :: StickerData -> StickerData -> Bool
< :: StickerData -> StickerData -> Bool
$c< :: StickerData -> StickerData -> Bool
compare :: StickerData -> StickerData -> Ordering
$ccompare :: StickerData -> StickerData -> Ordering
$cp1Ord :: Eq StickerData
Ord)

instance ToJSON StickerData where
  toJSON :: StickerData -> Value
toJSON StickerData
sd = Text -> Value
String (Text -> Value) -> Text -> Value
forall a b. (a -> b) -> a -> b
$ Text
"data:image/" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
sdt Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
";base64," Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ByteString -> Text
TE.decodeUtf8 (ByteString -> ByteString
B64.encode (StickerData -> ByteString
stickerData StickerData
sd))
    where
      sdt :: Text
sdt = case StickerData
sd of
        StickerDataPNG ByteString
_ -> Text
"png"
        StickerDataAPNG ByteString
_ -> Text
"apng"
        StickerDataLOTTIE ByteString
_ -> Text
"lottie"

data CreateGuildStickerOpts = CreateGuildStickerOpts
  { CreateGuildStickerOpts -> Text
guildStickerName :: T.Text,
    CreateGuildStickerOpts -> Text
guildStickerDescription :: T.Text,
    CreateGuildStickerOpts -> [Text]
guildStickerTags :: [T.Text],
    CreateGuildStickerOpts -> StickerData
guildStickerFile :: StickerData
  }
  deriving (Int -> CreateGuildStickerOpts -> ShowS
[CreateGuildStickerOpts] -> ShowS
CreateGuildStickerOpts -> String
(Int -> CreateGuildStickerOpts -> ShowS)
-> (CreateGuildStickerOpts -> String)
-> ([CreateGuildStickerOpts] -> ShowS)
-> Show CreateGuildStickerOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateGuildStickerOpts] -> ShowS
$cshowList :: [CreateGuildStickerOpts] -> ShowS
show :: CreateGuildStickerOpts -> String
$cshow :: CreateGuildStickerOpts -> String
showsPrec :: Int -> CreateGuildStickerOpts -> ShowS
$cshowsPrec :: Int -> CreateGuildStickerOpts -> ShowS
Show, ReadPrec [CreateGuildStickerOpts]
ReadPrec CreateGuildStickerOpts
Int -> ReadS CreateGuildStickerOpts
ReadS [CreateGuildStickerOpts]
(Int -> ReadS CreateGuildStickerOpts)
-> ReadS [CreateGuildStickerOpts]
-> ReadPrec CreateGuildStickerOpts
-> ReadPrec [CreateGuildStickerOpts]
-> Read CreateGuildStickerOpts
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateGuildStickerOpts]
$creadListPrec :: ReadPrec [CreateGuildStickerOpts]
readPrec :: ReadPrec CreateGuildStickerOpts
$creadPrec :: ReadPrec CreateGuildStickerOpts
readList :: ReadS [CreateGuildStickerOpts]
$creadList :: ReadS [CreateGuildStickerOpts]
readsPrec :: Int -> ReadS CreateGuildStickerOpts
$creadsPrec :: Int -> ReadS CreateGuildStickerOpts
Read, CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
(CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool)
-> (CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool)
-> Eq CreateGuildStickerOpts
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
$c/= :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
== :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
$c== :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
Eq, Eq CreateGuildStickerOpts
Eq CreateGuildStickerOpts
-> (CreateGuildStickerOpts -> CreateGuildStickerOpts -> Ordering)
-> (CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool)
-> (CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool)
-> (CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool)
-> (CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool)
-> (CreateGuildStickerOpts
    -> CreateGuildStickerOpts -> CreateGuildStickerOpts)
-> (CreateGuildStickerOpts
    -> CreateGuildStickerOpts -> CreateGuildStickerOpts)
-> Ord CreateGuildStickerOpts
CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
CreateGuildStickerOpts -> CreateGuildStickerOpts -> Ordering
CreateGuildStickerOpts
-> CreateGuildStickerOpts -> CreateGuildStickerOpts
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CreateGuildStickerOpts
-> CreateGuildStickerOpts -> CreateGuildStickerOpts
$cmin :: CreateGuildStickerOpts
-> CreateGuildStickerOpts -> CreateGuildStickerOpts
max :: CreateGuildStickerOpts
-> CreateGuildStickerOpts -> CreateGuildStickerOpts
$cmax :: CreateGuildStickerOpts
-> CreateGuildStickerOpts -> CreateGuildStickerOpts
>= :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
$c>= :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
> :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
$c> :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
<= :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
$c<= :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
< :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
$c< :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Bool
compare :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Ordering
$ccompare :: CreateGuildStickerOpts -> CreateGuildStickerOpts -> Ordering
$cp1Ord :: Eq CreateGuildStickerOpts
Ord)

instance ToJSON CreateGuildStickerOpts where
  toJSON :: CreateGuildStickerOpts -> Value
toJSON CreateGuildStickerOpts {[Text]
Text
StickerData
guildStickerFile :: StickerData
guildStickerTags :: [Text]
guildStickerDescription :: Text
guildStickerName :: Text
guildStickerFile :: CreateGuildStickerOpts -> StickerData
guildStickerTags :: CreateGuildStickerOpts -> [Text]
guildStickerDescription :: CreateGuildStickerOpts -> Text
guildStickerName :: CreateGuildStickerOpts -> Text
..} =
    [Pair] -> Value
object
      [ (Key
"name", Text -> Value
forall a. ToJSON a => a -> Value
toJSON Text
guildStickerName),
        (Key
"description", Text -> Value
forall a. ToJSON a => a -> Value
toJSON Text
guildStickerDescription),
        (Key
"tags", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> ([Text] -> Text) -> [Text] -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> Text
T.intercalate Text
"," ([Text] -> Value) -> [Text] -> Value
forall a b. (a -> b) -> a -> b
$ [Text]
guildStickerTags),
        (Key
"file", StickerData -> Value
forall a. ToJSON a => a -> Value
toJSON StickerData
guildStickerFile)
      ]

data EditGuildStickerOpts = EditGuildStickerOpts
  { EditGuildStickerOpts -> Maybe Text
editGuildStickerName :: Maybe T.Text,
    EditGuildStickerOpts -> Maybe Text
editGuildStickerDescription :: Maybe T.Text,
    EditGuildStickerOpts -> Maybe [Text]
editGuildStickerTags :: Maybe [T.Text]
  }
  deriving (Int -> EditGuildStickerOpts -> ShowS
[EditGuildStickerOpts] -> ShowS
EditGuildStickerOpts -> String
(Int -> EditGuildStickerOpts -> ShowS)
-> (EditGuildStickerOpts -> String)
-> ([EditGuildStickerOpts] -> ShowS)
-> Show EditGuildStickerOpts
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [EditGuildStickerOpts] -> ShowS
$cshowList :: [EditGuildStickerOpts] -> ShowS
show :: EditGuildStickerOpts -> String
$cshow :: EditGuildStickerOpts -> String
showsPrec :: Int -> EditGuildStickerOpts -> ShowS
$cshowsPrec :: Int -> EditGuildStickerOpts -> ShowS
Show, ReadPrec [EditGuildStickerOpts]
ReadPrec EditGuildStickerOpts
Int -> ReadS EditGuildStickerOpts
ReadS [EditGuildStickerOpts]
(Int -> ReadS EditGuildStickerOpts)
-> ReadS [EditGuildStickerOpts]
-> ReadPrec EditGuildStickerOpts
-> ReadPrec [EditGuildStickerOpts]
-> Read EditGuildStickerOpts
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [EditGuildStickerOpts]
$creadListPrec :: ReadPrec [EditGuildStickerOpts]
readPrec :: ReadPrec EditGuildStickerOpts
$creadPrec :: ReadPrec EditGuildStickerOpts
readList :: ReadS [EditGuildStickerOpts]
$creadList :: ReadS [EditGuildStickerOpts]
readsPrec :: Int -> ReadS EditGuildStickerOpts
$creadsPrec :: Int -> ReadS EditGuildStickerOpts
Read, EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
(EditGuildStickerOpts -> EditGuildStickerOpts -> Bool)
-> (EditGuildStickerOpts -> EditGuildStickerOpts -> Bool)
-> Eq EditGuildStickerOpts
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
$c/= :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
== :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
$c== :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
Eq, Eq EditGuildStickerOpts
Eq EditGuildStickerOpts
-> (EditGuildStickerOpts -> EditGuildStickerOpts -> Ordering)
-> (EditGuildStickerOpts -> EditGuildStickerOpts -> Bool)
-> (EditGuildStickerOpts -> EditGuildStickerOpts -> Bool)
-> (EditGuildStickerOpts -> EditGuildStickerOpts -> Bool)
-> (EditGuildStickerOpts -> EditGuildStickerOpts -> Bool)
-> (EditGuildStickerOpts
    -> EditGuildStickerOpts -> EditGuildStickerOpts)
-> (EditGuildStickerOpts
    -> EditGuildStickerOpts -> EditGuildStickerOpts)
-> Ord EditGuildStickerOpts
EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
EditGuildStickerOpts -> EditGuildStickerOpts -> Ordering
EditGuildStickerOpts
-> EditGuildStickerOpts -> EditGuildStickerOpts
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EditGuildStickerOpts
-> EditGuildStickerOpts -> EditGuildStickerOpts
$cmin :: EditGuildStickerOpts
-> EditGuildStickerOpts -> EditGuildStickerOpts
max :: EditGuildStickerOpts
-> EditGuildStickerOpts -> EditGuildStickerOpts
$cmax :: EditGuildStickerOpts
-> EditGuildStickerOpts -> EditGuildStickerOpts
>= :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
$c>= :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
> :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
$c> :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
<= :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
$c<= :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
< :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
$c< :: EditGuildStickerOpts -> EditGuildStickerOpts -> Bool
compare :: EditGuildStickerOpts -> EditGuildStickerOpts -> Ordering
$ccompare :: EditGuildStickerOpts -> EditGuildStickerOpts -> Ordering
$cp1Ord :: Eq EditGuildStickerOpts
Ord)

instance ToJSON EditGuildStickerOpts where
  toJSON :: EditGuildStickerOpts -> Value
toJSON EditGuildStickerOpts {Maybe [Text]
Maybe Text
editGuildStickerTags :: Maybe [Text]
editGuildStickerDescription :: Maybe Text
editGuildStickerName :: Maybe Text
editGuildStickerTags :: EditGuildStickerOpts -> Maybe [Text]
editGuildStickerDescription :: EditGuildStickerOpts -> Maybe Text
editGuildStickerName :: EditGuildStickerOpts -> Maybe Text
..} =
    [Pair] -> Value
object
      [ (Key
name, Value
value)
        | (Key
name, Just Value
value) <-
            [ (Key
"name", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Text
editGuildStickerName),
              (Key
"description", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> Maybe Text -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Text
editGuildStickerDescription),
              (Key
"tags", Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> ([Text] -> Text) -> [Text] -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text] -> Text
T.intercalate Text
"," ([Text] -> Value) -> Maybe [Text] -> Maybe Value
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe [Text]
editGuildStickerTags)
            ]
      ]

instance Request (StickerRequest a) where
  majorRoute :: StickerRequest a -> String
majorRoute = StickerRequest a -> String
forall a. StickerRequest a -> String
stickerMajorRoute
  jsonRequest :: StickerRequest a -> JsonRequest
jsonRequest = StickerRequest a -> JsonRequest
forall a. StickerRequest a -> JsonRequest
stickerJsonRequest

-- | Data constructor for requests. See <https://discord.com/developers/docs/resources/ API>
--
-- Be warned that these are untested due to not having a spare server with 
-- boosts. Functionality is at your own risk.
data StickerRequest a where
  -- | Returns a sticker object for the given sticker ID.
  GetSticker :: StickerId -> StickerRequest Sticker
  -- | Returns the list of sticker packs available to Nitro subscribers.
  ListNitroStickerPacks :: StickerRequest [StickerPack]
  -- | Returns an array of sticker objects for the given guild.
  ListGuildStickers :: GuildId -> StickerRequest [Sticker]
  -- | Returns a sticker object for the given guild and sticker ID.
  GetGuildSticker :: GuildId -> StickerId -> StickerRequest Sticker
  -- | Create a new sticker for the guild.
  CreateGuildSticker :: GuildId -> CreateGuildStickerOpts -> StickerRequest Sticker
  -- | Modify a sticker for a guild.
  ModifyGuildSticker :: GuildId -> StickerId -> EditGuildStickerOpts -> StickerRequest Sticker
  -- | Delete a guild sticker
  DeleteGuildSticker :: GuildId -> StickerId -> StickerRequest ()

stickerMajorRoute :: StickerRequest a -> String
stickerMajorRoute :: StickerRequest a -> String
stickerMajorRoute = \case
  GetSticker RoleId
gid -> String
"sticker " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
gid
  StickerRequest a
ListNitroStickerPacks -> String
"sticker"
  ListGuildStickers RoleId
gid -> String
"sticker " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
gid
  GetGuildSticker RoleId
gid RoleId
_ -> String
"sticker " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
gid
  CreateGuildSticker RoleId
gid CreateGuildStickerOpts
_ -> String
"sticker " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
gid
  ModifyGuildSticker RoleId
gid RoleId
_ EditGuildStickerOpts
_ -> String
"sticker " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
gid
  DeleteGuildSticker RoleId
gid RoleId
_ -> String
"sticker " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> RoleId -> String
forall a. Show a => a -> String
show RoleId
gid

stickerJsonRequest :: StickerRequest a -> JsonRequest
stickerJsonRequest :: StickerRequest a -> JsonRequest
stickerJsonRequest = \case
  GetSticker RoleId
gid -> Url 'Https -> Option 'Https -> JsonRequest
Get (Url 'Https
baseUrl Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"stickers" Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
gid) Option 'Https
forall a. Monoid a => a
mempty
  StickerRequest a
ListNitroStickerPacks -> Url 'Https -> Option 'Https -> JsonRequest
Get (Url 'Https
baseUrl Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"sticker-packs") Option 'Https
forall a. Monoid a => a
mempty
  ListGuildStickers RoleId
gid -> Url 'Https -> Option 'Https -> JsonRequest
Get (RoleId -> Url 'Https
forall a. Show a => a -> Url 'Https
stickersGuild RoleId
gid) Option 'Https
forall a. Monoid a => a
mempty
  GetGuildSticker RoleId
gid RoleId
sid -> Url 'Https -> Option 'Https -> JsonRequest
Get (RoleId -> Url 'Https
forall a. Show a => a -> Url 'Https
stickersGuild RoleId
gid Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
sid) Option 'Https
forall a. Monoid a => a
mempty
  CreateGuildSticker RoleId
gid CreateGuildStickerOpts
cgso -> Url 'Https
-> RestIO (ReqBodyJson Value) -> Option 'Https -> JsonRequest
forall a.
HttpBody a =>
Url 'Https -> RestIO a -> Option 'Https -> JsonRequest
Post (RoleId -> Url 'Https
forall a. Show a => a -> Url 'Https
stickersGuild RoleId
gid) (ReqBodyJson Value -> RestIO (ReqBodyJson Value)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ReqBodyJson Value -> RestIO (ReqBodyJson Value))
-> ReqBodyJson Value -> RestIO (ReqBodyJson Value)
forall a b. (a -> b) -> a -> b
$ Value -> ReqBodyJson Value
forall a. a -> ReqBodyJson a
R.ReqBodyJson (Value -> ReqBodyJson Value) -> Value -> ReqBodyJson Value
forall a b. (a -> b) -> a -> b
$ CreateGuildStickerOpts -> Value
forall a. ToJSON a => a -> Value
toJSON CreateGuildStickerOpts
cgso) Option 'Https
forall a. Monoid a => a
mempty
  ModifyGuildSticker RoleId
gid RoleId
sid EditGuildStickerOpts
egso -> Url 'Https
-> RestIO (ReqBodyJson EditGuildStickerOpts)
-> Option 'Https
-> JsonRequest
forall a.
HttpBody a =>
Url 'Https -> RestIO a -> Option 'Https -> JsonRequest
Patch (RoleId -> Url 'Https
forall a. Show a => a -> Url 'Https
stickersGuild RoleId
gid Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
sid) (ReqBodyJson EditGuildStickerOpts
-> RestIO (ReqBodyJson EditGuildStickerOpts)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ReqBodyJson EditGuildStickerOpts
 -> RestIO (ReqBodyJson EditGuildStickerOpts))
-> ReqBodyJson EditGuildStickerOpts
-> RestIO (ReqBodyJson EditGuildStickerOpts)
forall a b. (a -> b) -> a -> b
$ EditGuildStickerOpts -> ReqBodyJson EditGuildStickerOpts
forall a. a -> ReqBodyJson a
R.ReqBodyJson EditGuildStickerOpts
egso) Option 'Https
forall a. Monoid a => a
mempty
  DeleteGuildSticker RoleId
gid RoleId
sid -> Url 'Https -> Option 'Https -> JsonRequest
Delete (RoleId -> Url 'Https
forall a. Show a => a -> Url 'Https
stickersGuild RoleId
gid Url 'Https -> RoleId -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// RoleId
sid) Option 'Https
forall a. Monoid a => a
mempty
  where
    stickersGuild :: a -> Url 'Https
stickersGuild a
gid = Url 'Https
baseUrl Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"guilds" Url 'Https -> a -> Url 'Https
forall a (scheme :: Scheme).
Show a =>
Url scheme -> a -> Url scheme
// a
gid Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"stickers"