{-# 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
  { RoleIcon -> Snowflake Role
roleID :: Snowflake Role
  , RoleIcon -> Text
hash :: T.Text
  }
  deriving (Int -> RoleIcon -> ShowS
[RoleIcon] -> ShowS
RoleIcon -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RoleIcon] -> ShowS
$cshowList :: [RoleIcon] -> ShowS
show :: RoleIcon -> String
$cshow :: RoleIcon -> String
showsPrec :: Int -> RoleIcon -> ShowS
$cshowsPrec :: Int -> RoleIcon -> ShowS
Show, RoleIcon -> RoleIcon -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RoleIcon -> RoleIcon -> Bool
$c/= :: RoleIcon -> RoleIcon -> Bool
== :: RoleIcon -> RoleIcon -> Bool
$c== :: RoleIcon -> RoleIcon -> Bool
Eq)

instance CDNAsset RoleIcon where
  assetURL :: RoleIcon -> Url 'Https
assetURL RoleIcon {Text
hash :: Text
$sel:hash:RoleIcon :: RoleIcon -> Text
hash, Snowflake Role
roleID :: Snowflake Role
$sel:roleID:RoleIcon :: RoleIcon -> Snowflake Role
roleID} =
    Url 'Https
cdnURL forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"icons" forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ Snowflake Role
roleID forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text -> Text
assetHashFile Text
hash

data Role = Role
  { Role -> Snowflake Role
id :: Snowflake Role
  , Role -> Text
name :: Text
  , Role -> Colour Double
color :: Colour Double
  , Role -> Bool
hoist :: Bool
  , Role -> Maybe RoleIcon
icon :: Maybe RoleIcon
  , Role -> Maybe RawEmoji
emoji :: Maybe RawEmoji
  , Role -> Int
position :: Int
  , Role -> Permissions
permissions :: Permissions
  , Role -> Bool
managed :: Bool
  , Role -> Bool
mentionable :: Bool
  }
  deriving (Role -> Role -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Role -> Role -> Bool
$c/= :: Role -> Role -> Bool
== :: Role -> Role -> Bool
$c== :: Role -> Role -> Bool
Eq, Int -> Role -> ShowS
[Role] -> ShowS
Role -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Role] -> ShowS
$cshowList :: [Role] -> ShowS
show :: Role -> String
$cshow :: Role -> String
showsPrec :: Int -> Role -> ShowS
$cshowsPrec :: Int -> Role -> ShowS
Show)
  deriving (Int -> Role -> Builder
Int -> Role -> Text
Int -> Role -> Text
[Role] -> Builder
[Role] -> Text
[Role] -> Text
Role -> Builder
Role -> Text
Role -> Text
forall a.
(Int -> a -> Builder)
-> (a -> Builder)
-> ([a] -> Builder)
-> (Int -> a -> Text)
-> (a -> Text)
-> ([a] -> Text)
-> (Int -> a -> Text)
-> (a -> Text)
-> ([a] -> Text)
-> TextShow a
showtlList :: [Role] -> Text
$cshowtlList :: [Role] -> Text
showtl :: Role -> Text
$cshowtl :: Role -> Text
showtlPrec :: Int -> Role -> Text
$cshowtlPrec :: Int -> Role -> Text
showtList :: [Role] -> Text
$cshowtList :: [Role] -> Text
showt :: Role -> Text
$cshowt :: Role -> Text
showtPrec :: Int -> Role -> Text
$cshowtPrec :: Int -> Role -> Text
showbList :: [Role] -> Builder
$cshowbList :: [Role] -> Builder
showb :: Role -> Builder
$cshowb :: Role -> Builder
showbPrec :: Int -> Role -> Builder
$cshowbPrec :: Int -> Role -> Builder
TextShow.TextShow) via TextShow.FromStringShow Role
  deriving (HasID Role) via HasIDField "id" Role
  deriving ([Role] -> Encoding
[Role] -> Value
Role -> Encoding
Role -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Role] -> Encoding
$ctoEncodingList :: [Role] -> Encoding
toJSONList :: [Role] -> Value
$ctoJSONList :: [Role] -> Value
toEncoding :: Role -> Encoding
$ctoEncoding :: Role -> Encoding
toJSON :: Role -> Value
$ctoJSON :: Role -> Value
Aeson.ToJSON) via CalamityToJSON Role

instance CalamityToJSON' Role where
  toPairs :: forall kv. KeyValue kv => Role -> [Maybe kv]
toPairs Role {Bool
Int
Maybe RawEmoji
Maybe RoleIcon
Text
Colour Double
Permissions
Snowflake Role
mentionable :: Bool
managed :: Bool
permissions :: Permissions
position :: Int
emoji :: Maybe RawEmoji
icon :: Maybe RoleIcon
hoist :: Bool
color :: Colour Double
name :: Text
id :: Snowflake Role
$sel:mentionable:Role :: Role -> Bool
$sel:managed:Role :: Role -> Bool
$sel:permissions:Role :: Role -> Permissions
$sel:position:Role :: Role -> Int
$sel:emoji:Role :: Role -> Maybe RawEmoji
$sel:icon:Role :: Role -> Maybe RoleIcon
$sel:hoist:Role :: Role -> Bool
$sel:color:Role :: Role -> Colour Double
$sel:name:Role :: Role -> Text
$sel:id:Role :: Role -> Snowflake Role
..} =
    [ Key
"id" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Snowflake Role
id
    , Key
"name" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Text
name
    , Key
"color" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Colour Double -> IntColour
IntColour Colour Double
color
    , Key
"position" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Int
position
    , Key
"permissions" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Permissions
permissions
    , Key
"managed" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Bool
managed
    , Key
"mentionable" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Bool
mentionable
    ]

instance Aeson.FromJSON Role where
  parseJSON :: Value -> Parser Role
parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"Role" forall a b. (a -> b) -> a -> b
$ \Object
v -> do
    Snowflake Role
id <- Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
    Maybe RoleIcon
icon <- (Snowflake Role -> Text -> RoleIcon
RoleIcon Snowflake Role
id forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"icon"

    Snowflake Role
-> Text
-> Colour Double
-> Bool
-> Maybe RoleIcon
-> Maybe RawEmoji
-> Int
-> Permissions
-> Bool
-> Bool
-> Role
Role
      forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (f :: * -> *) a. Applicative f => a -> f a
pure Snowflake Role
id
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (IntColour -> Colour Double
fromIntColour forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"color")
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"hoist"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe RoleIcon
icon
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"unicode_emoji"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"position"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"permissions"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"managed"
      forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
v forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"mentionable"

$(makeFieldLabelsNoPrefix ''Role)