calamity-0.7.0.0: Calamity/Types/Model/Guild/Role.hs
{-# LANGUAGE TemplateHaskell #-}
-- | Guild roles
module Calamity.Types.Model.Guild.Role (
Role (..),
RoleIcon (..),
) where
import Calamity.Internal.IntColour
import Calamity.Internal.Utils
import Calamity.Types.CDNAsset (CDNAsset (..))
import {-# SOURCE #-} Calamity.Types.Model.Guild.Emoji
import Calamity.Types.Model.Guild.Permissions
import Calamity.Types.Snowflake
import Calamity.Utils.CDNUrl (assetHashFile, cdnURL)
import Data.Aeson ((.:), (.:?))
import qualified Data.Aeson as Aeson
import Data.Colour
import Data.Text (Text)
import qualified Data.Text as T
import Network.HTTP.Req ((/:), (/~))
import Optics.TH
import qualified TextShow
data RoleIcon = RoleIcon
{ roleID :: Snowflake Role
, hash :: T.Text
}
deriving (Show, Eq)
instance CDNAsset RoleIcon where
assetURL RoleIcon {hash, roleID} =
cdnURL /: "icons" /~ roleID /: assetHashFile hash
data Role = Role
{ id :: Snowflake Role
, name :: Text
, color :: Colour Double
, hoist :: Bool
, icon :: Maybe RoleIcon
, emoji :: Maybe RawEmoji
, position :: Int
, permissions :: Permissions
, managed :: Bool
, mentionable :: Bool
}
deriving (Eq, Show)
deriving (TextShow.TextShow) via TextShow.FromStringShow Role
deriving (HasID Role) via HasIDField "id" Role
deriving (Aeson.ToJSON) via CalamityToJSON Role
instance CalamityToJSON' Role where
toPairs Role {..} =
[ "id" .= id
, "name" .= name
, "color" .= IntColour color
, "position" .= position
, "permissions" .= permissions
, "managed" .= managed
, "mentionable" .= mentionable
]
instance Aeson.FromJSON Role where
parseJSON = Aeson.withObject "Role" $ \v -> do
id <- v .: "id"
icon <- (RoleIcon id <$>) <$> v .: "icon"
Role
<$> pure id
<*> v .: "name"
<*> (fromIntColour <$> v .: "color")
<*> v .: "hoist"
<*> pure icon
<*> v .:? "unicode_emoji"
<*> v .: "position"
<*> v .: "permissions"
<*> v .: "managed"
<*> v .: "mentionable"
$(makeFieldLabelsNoPrefix ''Role)