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

module Discord.Internal.Rest.AutoModeration 
  ( AutoModerationRequest(..)
  , MakeAutoModerationRule(..)
  ) where

import Data.Aeson
import Discord.Internal.Types
import Discord.Internal.Rest.Prelude
import           Network.HTTP.Req ((/:), (/~))
import qualified Network.HTTP.Req as R

instance Request (AutoModerationRequest a) where
  majorRoute :: AutoModerationRequest a -> String
majorRoute  = AutoModerationRequest a -> String
forall a. AutoModerationRequest a -> String
autoModerationMajorRoute
  jsonRequest :: AutoModerationRequest a -> JsonRequest
jsonRequest = AutoModerationRequest a -> JsonRequest
forall a. AutoModerationRequest a -> JsonRequest
autoModerationJsonRequest

data AutoModerationRequest a where
  -- | Returns all audo moderation rules in a guild

  ListAutoModerationRules  :: GuildId -> AutoModerationRequest [AutoModerationRule]
  -- | Returns an auto moderation rule from its id

  GetAutoModerationRule    :: GuildId -> AutoModerationRuleId -> AutoModerationRequest AutoModerationRule
  -- | Creates an auto moderation rule in a guild

  CreateAutoModerationRule :: GuildId -> MakeAutoModerationRule -> AutoModerationRequest ()
  -- | Modifies (Replaces) an auto moderation rule in a guild

  ModifyAutoModerationRule :: GuildId -> AutoModerationRuleId -> MakeAutoModerationRule -> AutoModerationRequest AutoModerationRule
  -- | Deletes an auto moderation rule from its id

  DeleteAutoModerationRule :: GuildId -> AutoModerationRuleId -> AutoModerationRequest ()


data MakeAutoModerationRule = MakeAutoModerationRule
  { MakeAutoModerationRule -> String
makeAutoModerationRuleName            :: String
  , MakeAutoModerationRule -> AutoModerationRuleEventType
makeAutoModerationRuleEventType       :: AutoModerationRuleEventType
  , MakeAutoModerationRule -> AutoModerationRuleTriggerType
makeAutoModerationRuleTriggerType     :: AutoModerationRuleTriggerType
  , MakeAutoModerationRule -> Maybe AutoModerationRuleTriggerMetadata
makeAutoModerationRuleTriggerMetadata :: Maybe AutoModerationRuleTriggerMetadata
  , MakeAutoModerationRule -> [AutoModerationRuleAction]
makeAutoModerationRuleActions         :: [AutoModerationRuleAction]
  , MakeAutoModerationRule -> Bool
makeAutoModerationRuleEnabled         :: Bool
  , MakeAutoModerationRule -> [RoleId]
makeAutoModerationRuleExemptRoles     :: [RoleId]
  , MakeAutoModerationRule -> [ChannelId]
makeAutoModerationRuleExemptChannels  :: [ChannelId]
  } deriving ( Int -> MakeAutoModerationRule -> ShowS
[MakeAutoModerationRule] -> ShowS
MakeAutoModerationRule -> String
(Int -> MakeAutoModerationRule -> ShowS)
-> (MakeAutoModerationRule -> String)
-> ([MakeAutoModerationRule] -> ShowS)
-> Show MakeAutoModerationRule
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MakeAutoModerationRule -> ShowS
showsPrec :: Int -> MakeAutoModerationRule -> ShowS
$cshow :: MakeAutoModerationRule -> String
show :: MakeAutoModerationRule -> String
$cshowList :: [MakeAutoModerationRule] -> ShowS
showList :: [MakeAutoModerationRule] -> ShowS
Show, ReadPrec [MakeAutoModerationRule]
ReadPrec MakeAutoModerationRule
Int -> ReadS MakeAutoModerationRule
ReadS [MakeAutoModerationRule]
(Int -> ReadS MakeAutoModerationRule)
-> ReadS [MakeAutoModerationRule]
-> ReadPrec MakeAutoModerationRule
-> ReadPrec [MakeAutoModerationRule]
-> Read MakeAutoModerationRule
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS MakeAutoModerationRule
readsPrec :: Int -> ReadS MakeAutoModerationRule
$creadList :: ReadS [MakeAutoModerationRule]
readList :: ReadS [MakeAutoModerationRule]
$creadPrec :: ReadPrec MakeAutoModerationRule
readPrec :: ReadPrec MakeAutoModerationRule
$creadListPrec :: ReadPrec [MakeAutoModerationRule]
readListPrec :: ReadPrec [MakeAutoModerationRule]
Read )

instance FromJSON MakeAutoModerationRule where
  parseJSON :: Value -> Parser MakeAutoModerationRule
parseJSON = String
-> (Object -> Parser MakeAutoModerationRule)
-> Value
-> Parser MakeAutoModerationRule
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"MakeAutoModerationRule" ((Object -> Parser MakeAutoModerationRule)
 -> Value -> Parser MakeAutoModerationRule)
-> (Object -> Parser MakeAutoModerationRule)
-> Value
-> Parser MakeAutoModerationRule
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    String
-> AutoModerationRuleEventType
-> AutoModerationRuleTriggerType
-> Maybe AutoModerationRuleTriggerMetadata
-> [AutoModerationRuleAction]
-> Bool
-> [RoleId]
-> [ChannelId]
-> MakeAutoModerationRule
MakeAutoModerationRule (String
 -> AutoModerationRuleEventType
 -> AutoModerationRuleTriggerType
 -> Maybe AutoModerationRuleTriggerMetadata
 -> [AutoModerationRuleAction]
 -> Bool
 -> [RoleId]
 -> [ChannelId]
 -> MakeAutoModerationRule)
-> Parser String
-> Parser
     (AutoModerationRuleEventType
      -> AutoModerationRuleTriggerType
      -> Maybe AutoModerationRuleTriggerMetadata
      -> [AutoModerationRuleAction]
      -> Bool
      -> [RoleId]
      -> [ChannelId]
      -> MakeAutoModerationRule)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser String
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"name"
                           Parser
  (AutoModerationRuleEventType
   -> AutoModerationRuleTriggerType
   -> Maybe AutoModerationRuleTriggerMetadata
   -> [AutoModerationRuleAction]
   -> Bool
   -> [RoleId]
   -> [ChannelId]
   -> MakeAutoModerationRule)
-> Parser AutoModerationRuleEventType
-> Parser
     (AutoModerationRuleTriggerType
      -> Maybe AutoModerationRuleTriggerMetadata
      -> [AutoModerationRuleAction]
      -> Bool
      -> [RoleId]
      -> [ChannelId]
      -> MakeAutoModerationRule)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser AutoModerationRuleEventType
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"event_type"
                           Parser
  (AutoModerationRuleTriggerType
   -> Maybe AutoModerationRuleTriggerMetadata
   -> [AutoModerationRuleAction]
   -> Bool
   -> [RoleId]
   -> [ChannelId]
   -> MakeAutoModerationRule)
-> Parser AutoModerationRuleTriggerType
-> Parser
     (Maybe AutoModerationRuleTriggerMetadata
      -> [AutoModerationRuleAction]
      -> Bool
      -> [RoleId]
      -> [ChannelId]
      -> MakeAutoModerationRule)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser AutoModerationRuleTriggerType
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"trigger_type"
                           Parser
  (Maybe AutoModerationRuleTriggerMetadata
   -> [AutoModerationRuleAction]
   -> Bool
   -> [RoleId]
   -> [ChannelId]
   -> MakeAutoModerationRule)
-> Parser (Maybe AutoModerationRuleTriggerMetadata)
-> Parser
     ([AutoModerationRuleAction]
      -> Bool -> [RoleId] -> [ChannelId] -> MakeAutoModerationRule)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser (Maybe AutoModerationRuleTriggerMetadata)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"trigger_metadata"
                           Parser
  ([AutoModerationRuleAction]
   -> Bool -> [RoleId] -> [ChannelId] -> MakeAutoModerationRule)
-> Parser [AutoModerationRuleAction]
-> Parser
     (Bool -> [RoleId] -> [ChannelId] -> MakeAutoModerationRule)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [AutoModerationRuleAction]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"actions"
                           Parser (Bool -> [RoleId] -> [ChannelId] -> MakeAutoModerationRule)
-> Parser Bool
-> Parser ([RoleId] -> [ChannelId] -> MakeAutoModerationRule)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"enabled"
                           Parser ([RoleId] -> [ChannelId] -> MakeAutoModerationRule)
-> Parser [RoleId]
-> Parser ([ChannelId] -> MakeAutoModerationRule)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [RoleId]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"exempt_roles"
                           Parser ([ChannelId] -> MakeAutoModerationRule)
-> Parser [ChannelId] -> Parser MakeAutoModerationRule
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser [ChannelId]
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"exempt_channels"

instance ToJSON MakeAutoModerationRule where
  toJSON :: MakeAutoModerationRule -> Value
toJSON MakeAutoModerationRule{Bool
String
[RoleId]
[ChannelId]
[AutoModerationRuleAction]
Maybe AutoModerationRuleTriggerMetadata
AutoModerationRuleTriggerType
AutoModerationRuleEventType
makeAutoModerationRuleName :: MakeAutoModerationRule -> String
makeAutoModerationRuleEventType :: MakeAutoModerationRule -> AutoModerationRuleEventType
makeAutoModerationRuleTriggerType :: MakeAutoModerationRule -> AutoModerationRuleTriggerType
makeAutoModerationRuleTriggerMetadata :: MakeAutoModerationRule -> Maybe AutoModerationRuleTriggerMetadata
makeAutoModerationRuleActions :: MakeAutoModerationRule -> [AutoModerationRuleAction]
makeAutoModerationRuleEnabled :: MakeAutoModerationRule -> Bool
makeAutoModerationRuleExemptRoles :: MakeAutoModerationRule -> [RoleId]
makeAutoModerationRuleExemptChannels :: MakeAutoModerationRule -> [ChannelId]
makeAutoModerationRuleName :: String
makeAutoModerationRuleEventType :: AutoModerationRuleEventType
makeAutoModerationRuleTriggerType :: AutoModerationRuleTriggerType
makeAutoModerationRuleTriggerMetadata :: Maybe AutoModerationRuleTriggerMetadata
makeAutoModerationRuleActions :: [AutoModerationRuleAction]
makeAutoModerationRuleEnabled :: Bool
makeAutoModerationRuleExemptRoles :: [RoleId]
makeAutoModerationRuleExemptChannels :: [ChannelId]
..} = [Maybe Pair] -> Value
objectFromMaybes
    [ Key
"name"              Key -> String -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== String
makeAutoModerationRuleName
    , Key
"event_type"        Key -> AutoModerationRuleEventType -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== AutoModerationRuleEventType
makeAutoModerationRuleEventType
    , Key
"trigger_type"      Key -> AutoModerationRuleTriggerType -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== AutoModerationRuleTriggerType
makeAutoModerationRuleTriggerType
    , Key
"trigger_metadata"  Key -> Maybe AutoModerationRuleTriggerMetadata -> Maybe Pair
forall a. ToJSON a => Key -> Maybe a -> Maybe Pair
.=? Maybe AutoModerationRuleTriggerMetadata
makeAutoModerationRuleTriggerMetadata
    , Key
"actions"           Key -> [AutoModerationRuleAction] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [AutoModerationRuleAction]
makeAutoModerationRuleActions
    , Key
"enabled"           Key -> Bool -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== Bool
makeAutoModerationRuleEnabled
    , Key
"exempt_roles"      Key -> [RoleId] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [RoleId]
makeAutoModerationRuleExemptRoles
    , Key
"exempt_channels"   Key -> [ChannelId] -> Maybe Pair
forall a. ToJSON a => Key -> a -> Maybe Pair
.== [ChannelId]
makeAutoModerationRuleExemptChannels
    ]

autoModerationMajorRoute :: AutoModerationRequest a -> String
autoModerationMajorRoute :: forall a. AutoModerationRequest a -> String
autoModerationMajorRoute AutoModerationRequest a
c = case AutoModerationRequest a
c of
  (ListAutoModerationRules GuildId
g) ->          String
"guild " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> GuildId -> String
forall a. Show a => a -> String
show GuildId
g
  (GetAutoModerationRule GuildId
g AutoModerationRuleId
_) ->          String
"guild " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> GuildId -> String
forall a. Show a => a -> String
show GuildId
g
  (CreateAutoModerationRule GuildId
g MakeAutoModerationRule
_) ->       String
"guild " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> GuildId -> String
forall a. Show a => a -> String
show GuildId
g
  (ModifyAutoModerationRule GuildId
g AutoModerationRuleId
_ MakeAutoModerationRule
_) ->     String
"guild " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> GuildId -> String
forall a. Show a => a -> String
show GuildId
g
  (DeleteAutoModerationRule GuildId
g AutoModerationRuleId
_) ->       String
"guild " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> GuildId -> String
forall a. Show a => a -> String
show GuildId
g

autoModerationJsonRequest :: AutoModerationRequest r -> JsonRequest
autoModerationJsonRequest :: forall a. AutoModerationRequest a -> JsonRequest
autoModerationJsonRequest AutoModerationRequest r
c = case AutoModerationRequest r
c of
  (ListAutoModerationRules GuildId
guild) ->
      Url 'Https -> Option 'Https -> JsonRequest
Get (Url 'Https
guilds Url 'Https -> GuildId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ GuildId
guild Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"auto-moderation" Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"rules") Option 'Https
forall a. Monoid a => a
mempty
  
  (GetAutoModerationRule GuildId
guild AutoModerationRuleId
amid) ->
      Url 'Https -> Option 'Https -> JsonRequest
Get (Url 'Https
guilds Url 'Https -> GuildId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ GuildId
guild Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"auto-moderation" Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"rules" Url 'Https -> AutoModerationRuleId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ AutoModerationRuleId
amid) Option 'Https
forall a. Monoid a => a
mempty

  (CreateAutoModerationRule GuildId
guild MakeAutoModerationRule
autoModRule) ->
      let body :: RestIO (ReqBodyJson MakeAutoModerationRule)
body = ReqBodyJson MakeAutoModerationRule
-> RestIO (ReqBodyJson MakeAutoModerationRule)
forall a. a -> RestIO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MakeAutoModerationRule -> ReqBodyJson MakeAutoModerationRule
forall a. a -> ReqBodyJson a
R.ReqBodyJson MakeAutoModerationRule
autoModRule)
      in Url 'Https
-> RestIO (ReqBodyJson MakeAutoModerationRule)
-> Option 'Https
-> JsonRequest
forall a.
HttpBody a =>
Url 'Https -> RestIO a -> Option 'Https -> JsonRequest
Post (Url 'Https
guilds Url 'Https -> GuildId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ GuildId
guild Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"auto-moderation" Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"rules") RestIO (ReqBodyJson MakeAutoModerationRule)
body Option 'Https
forall a. Monoid a => a
mempty

  (ModifyAutoModerationRule GuildId
guild AutoModerationRuleId
amid MakeAutoModerationRule
patch) ->
      let body :: RestIO (ReqBodyJson MakeAutoModerationRule)
body = ReqBodyJson MakeAutoModerationRule
-> RestIO (ReqBodyJson MakeAutoModerationRule)
forall a. a -> RestIO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MakeAutoModerationRule -> ReqBodyJson MakeAutoModerationRule
forall a. a -> ReqBodyJson a
R.ReqBodyJson MakeAutoModerationRule
patch)
      in Url 'Https
-> RestIO (ReqBodyJson MakeAutoModerationRule)
-> Option 'Https
-> JsonRequest
forall a.
HttpBody a =>
Url 'Https -> RestIO a -> Option 'Https -> JsonRequest
Patch (Url 'Https
guilds Url 'Https -> GuildId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ GuildId
guild Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"auto-moderation" Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"rules" Url 'Https -> AutoModerationRuleId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ AutoModerationRuleId
amid) RestIO (ReqBodyJson MakeAutoModerationRule)
body Option 'Https
forall a. Monoid a => a
mempty

  (DeleteAutoModerationRule GuildId
guild AutoModerationRuleId
amid) ->
      Url 'Https -> Option 'Https -> JsonRequest
Delete (Url 'Https
guilds Url 'Https -> GuildId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ GuildId
guild Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"auto-moderation" Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"rules" Url 'Https -> AutoModerationRuleId -> Url 'Https
forall a (scheme :: Scheme).
ToHttpApiData a =>
Url scheme -> a -> Url scheme
/~ AutoModerationRuleId
amid) Option 'Https
forall a. Monoid a => a
mempty
  
  where
    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"