calamity-0.8.0.0: Calamity/HTTP/Emoji.hs
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -Wno-partial-type-signatures #-}
-- | Emoji endpoints
module Calamity.HTTP.Emoji (
EmojiRequest (..),
CreateGuildEmojiOptions (..),
ModifyGuildEmojiOptions (..),
) where
import Calamity.HTTP.Internal.Request
import Calamity.HTTP.Internal.Route
import Calamity.Internal.Utils (CalamityToJSON (..), CalamityToJSON' (..), (.=))
import Calamity.Types.Model.Guild
import Calamity.Types.Snowflake
import Data.Aeson qualified as Aeson
import Data.Function
import Data.Text (Text)
import Network.HTTP.Req
import Optics.TH
data CreateGuildEmojiOptions = CreateGuildEmojiOptions
{ name :: Text
, image :: Text
, roles :: [Snowflake Role]
}
deriving (Show)
deriving (Aeson.ToJSON) via CalamityToJSON CreateGuildEmojiOptions
instance CalamityToJSON' CreateGuildEmojiOptions where
toPairs CreateGuildEmojiOptions {..} =
[ "name" .= name
, "image" .= image
, "roles" .= roles
]
data ModifyGuildEmojiOptions = ModifyGuildEmojiOptions
{ name :: Text
, roles :: [Snowflake Role]
}
deriving (Show)
deriving (Aeson.ToJSON) via CalamityToJSON ModifyGuildEmojiOptions
instance CalamityToJSON' ModifyGuildEmojiOptions where
toPairs ModifyGuildEmojiOptions {..} =
[ "name" .= name
, "roles" .= roles
]
data EmojiRequest a where
ListGuildEmojis :: (HasID Guild g) => g -> EmojiRequest [Emoji]
GetGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e -> EmojiRequest Emoji
CreateGuildEmoji :: (HasID Guild g) => g -> CreateGuildEmojiOptions -> EmojiRequest Emoji
ModifyGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e -> ModifyGuildEmojiOptions -> EmojiRequest Emoji
DeleteGuildEmoji :: (HasID Guild g, HasID Emoji e) => g -> e -> EmojiRequest ()
baseRoute :: Snowflake Guild -> RouteBuilder _
baseRoute id = mkRouteBuilder // S "guilds" // ID @Guild // S "emojis" & giveID id
instance Request (EmojiRequest a) where
type Result (EmojiRequest a) = a
route (ListGuildEmojis (getID -> gid)) = baseRoute gid & buildRoute
route (GetGuildEmoji (getID -> gid) (getID @Emoji -> eid)) =
baseRoute gid // ID @Emoji
& giveID eid
& buildRoute
route (CreateGuildEmoji (getID -> gid) _) = baseRoute gid & buildRoute
route (ModifyGuildEmoji (getID -> gid) (getID @Emoji -> eid) _) =
baseRoute gid // ID @Emoji
& giveID eid
& buildRoute
route (DeleteGuildEmoji (getID -> gid) (getID @Emoji -> eid)) =
baseRoute gid // ID @Emoji
& giveID eid
& buildRoute
action (ListGuildEmojis _) = getWith
action (GetGuildEmoji _ _) = getWith
action (CreateGuildEmoji _ o) = postWith' (ReqBodyJson o)
action (ModifyGuildEmoji _ _ o) = patchWith' (ReqBodyJson o)
action (DeleteGuildEmoji _ _) = deleteWith
$(makeFieldLabelsNoPrefix ''CreateGuildEmojiOptions)
$(makeFieldLabelsNoPrefix ''ModifyGuildEmojiOptions)