packages feed

calamity-0.1.24.0: src/Calamity/HTTP/Emoji.hs

-- | Emoji endpoints
module Calamity.HTTP.Emoji (
  EmojiRequest (..),
  CreateGuildEmojiOptions (..),
  ModifyGuildEmojiOptions (..),
) where

import Calamity.HTTP.Internal.Request
import Calamity.HTTP.Internal.Route
import Calamity.Internal.AesonThings
import Calamity.Internal.Utils ()
import Calamity.Types.Model.Guild
import Calamity.Types.Snowflake

import Data.Aeson
import Data.Function
import Data.Text (Text)

import GHC.Generics

import Network.HTTP.Req

data CreateGuildEmojiOptions = CreateGuildEmojiOptions
  { name :: Text
  , image :: Text
  , roles :: [Snowflake Role]
  }
  deriving (Show, Generic)
  deriving (ToJSON) via CalamityJSON CreateGuildEmojiOptions

data ModifyGuildEmojiOptions = ModifyGuildEmojiOptions
  { name :: Text
  , roles :: [Snowflake Role]
  }
  deriving (Show, Generic)
  deriving (ToJSON) via CalamityJSON ModifyGuildEmojiOptions

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