{-# LANGUAGE TemplateHaskell #-}

-- | Guild endpoints
module Calamity.HTTP.Guild (
  GuildRequest (..),
  CreateGuildData (..),
  ModifyGuildData (..),
  ChannelCreateData (..),
  ChannelPosition (..),
  ListMembersOptions (..),
  AddGuildMemberData (..),
  ModifyGuildMemberData,
  modifyGuildMemberNick,
  modifyGuildMemberRoles,
  modifyGuildMemberMute,
  modifyGuildMemberDeaf,
  modifyGuildMemberChannelID,
  CreateGuildBanData (..),
  ModifyGuildRoleData,
  modifyGuildRoleName,
  modifyGuildRolePermissions,
  modifyGuildRoleColour,
  modifyGuildRoleHoist,
  modifyGuildRoleMentionable,
  ModifyGuildRolePositionsData (..),
) where

import Calamity.HTTP.Internal.Request
import Calamity.HTTP.Internal.Route
import Calamity.Internal.IntColour
import Calamity.Internal.Utils (CalamityToJSON (..), CalamityToJSON' (..), (.=), (.?=))
import Calamity.Types.Model.Channel
import Calamity.Types.Model.Guild
import Calamity.Types.Model.User
import Calamity.Types.Model.Voice
import Calamity.Types.Snowflake
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.KeyMap as K
import Data.Colour (Colour)
import Data.Default.Class
import Data.Text (Text)
import Network.HTTP.Req
import Optics

data CreateGuildData = CreateGuildData
  { CreateGuildData -> Text
name :: Text
  , CreateGuildData -> Text
region :: Text
  , CreateGuildData -> Text
icon :: Text
  , CreateGuildData -> Integer
verificationLevel :: Integer -- TODO: enums for these
  , CreateGuildData -> Integer
defaultMessageNotifications :: Integer
  , CreateGuildData -> Integer
explicitContentFilter :: Integer
  , CreateGuildData -> [Role]
roles :: [Role]
  , CreateGuildData -> [Partial Channel]
channels :: [Partial Channel]
  }
  deriving (Int -> CreateGuildData -> ShowS
[CreateGuildData] -> ShowS
CreateGuildData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateGuildData] -> ShowS
$cshowList :: [CreateGuildData] -> ShowS
show :: CreateGuildData -> String
$cshow :: CreateGuildData -> String
showsPrec :: Int -> CreateGuildData -> ShowS
$cshowsPrec :: Int -> CreateGuildData -> ShowS
Show)
  deriving ([CreateGuildData] -> Encoding
[CreateGuildData] -> Value
CreateGuildData -> Encoding
CreateGuildData -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [CreateGuildData] -> Encoding
$ctoEncodingList :: [CreateGuildData] -> Encoding
toJSONList :: [CreateGuildData] -> Value
$ctoJSONList :: [CreateGuildData] -> Value
toEncoding :: CreateGuildData -> Encoding
$ctoEncoding :: CreateGuildData -> Encoding
toJSON :: CreateGuildData -> Value
$ctoJSON :: CreateGuildData -> Value
Aeson.ToJSON) via CalamityToJSON CreateGuildData

instance CalamityToJSON' CreateGuildData where
  toPairs :: forall kv. KeyValue kv => CreateGuildData -> [Maybe kv]
toPairs CreateGuildData {Integer
[Partial Channel]
[Role]
Text
channels :: [Partial Channel]
roles :: [Role]
explicitContentFilter :: Integer
defaultMessageNotifications :: Integer
verificationLevel :: Integer
icon :: Text
region :: Text
name :: Text
$sel:channels:CreateGuildData :: CreateGuildData -> [Partial Channel]
$sel:roles:CreateGuildData :: CreateGuildData -> [Role]
$sel:explicitContentFilter:CreateGuildData :: CreateGuildData -> Integer
$sel:defaultMessageNotifications:CreateGuildData :: CreateGuildData -> Integer
$sel:verificationLevel:CreateGuildData :: CreateGuildData -> Integer
$sel:icon:CreateGuildData :: CreateGuildData -> Text
$sel:region:CreateGuildData :: CreateGuildData -> Text
$sel:name:CreateGuildData :: CreateGuildData -> Text
..} =
    [ Key
"name" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Text
name
    , Key
"region" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Text
region
    , Key
"icon" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Text
icon
    , Key
"verification_level" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Integer
verificationLevel
    , Key
"default_message_notifications" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Integer
defaultMessageNotifications
    , Key
"explicit_content_filter" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Integer
explicitContentFilter
    , Key
"roles" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= [Role]
roles
    , Key
"channels" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= [Partial Channel]
channels
    ]

data ModifyGuildData = ModifyGuildData
  { ModifyGuildData -> Maybe Text
name :: Maybe Text
  , ModifyGuildData -> Maybe Text
region :: Maybe Text
  , ModifyGuildData -> Maybe Text
icon :: Maybe Text
  , ModifyGuildData -> Maybe Integer
verificationLevel :: Maybe Integer -- TODO: enums for these
  , ModifyGuildData -> Maybe Integer
defaultMessageNotifications :: Maybe Integer
  , ModifyGuildData -> Maybe Integer
explicitContentFilter :: Maybe Integer
  , ModifyGuildData -> Maybe (Snowflake GuildChannel)
afkChannelID :: Maybe (Snowflake GuildChannel)
  , ModifyGuildData -> Maybe Integer
afkTimeout :: Maybe Integer
  , ModifyGuildData -> Maybe (Snowflake User)
ownerID :: Maybe (Snowflake User)
  , ModifyGuildData -> Maybe Text
splash :: Maybe Text
  , ModifyGuildData -> Maybe Text
banner :: Maybe Text
  , ModifyGuildData -> Maybe (Snowflake GuildChannel)
systemChannelID :: Maybe (Snowflake GuildChannel)
  }
  deriving (Int -> ModifyGuildData -> ShowS
[ModifyGuildData] -> ShowS
ModifyGuildData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModifyGuildData] -> ShowS
$cshowList :: [ModifyGuildData] -> ShowS
show :: ModifyGuildData -> String
$cshow :: ModifyGuildData -> String
showsPrec :: Int -> ModifyGuildData -> ShowS
$cshowsPrec :: Int -> ModifyGuildData -> ShowS
Show)
  deriving ([ModifyGuildData] -> Encoding
[ModifyGuildData] -> Value
ModifyGuildData -> Encoding
ModifyGuildData -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ModifyGuildData] -> Encoding
$ctoEncodingList :: [ModifyGuildData] -> Encoding
toJSONList :: [ModifyGuildData] -> Value
$ctoJSONList :: [ModifyGuildData] -> Value
toEncoding :: ModifyGuildData -> Encoding
$ctoEncoding :: ModifyGuildData -> Encoding
toJSON :: ModifyGuildData -> Value
$ctoJSON :: ModifyGuildData -> Value
Aeson.ToJSON) via CalamityToJSON ModifyGuildData

instance Default ModifyGuildData where
  def :: ModifyGuildData
def =
    Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Integer
-> Maybe Integer
-> Maybe Integer
-> Maybe (Snowflake GuildChannel)
-> Maybe Integer
-> Maybe (Snowflake User)
-> Maybe Text
-> Maybe Text
-> Maybe (Snowflake GuildChannel)
-> ModifyGuildData
ModifyGuildData
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing
      forall a. Maybe a
Nothing

-- TODO: Make this work properly, a la modifyguildmember
instance CalamityToJSON' ModifyGuildData where
  toPairs :: forall kv. KeyValue kv => ModifyGuildData -> [Maybe kv]
toPairs ModifyGuildData {Maybe Integer
Maybe Text
Maybe (Snowflake User)
Maybe (Snowflake GuildChannel)
systemChannelID :: Maybe (Snowflake GuildChannel)
banner :: Maybe Text
splash :: Maybe Text
ownerID :: Maybe (Snowflake User)
afkTimeout :: Maybe Integer
afkChannelID :: Maybe (Snowflake GuildChannel)
explicitContentFilter :: Maybe Integer
defaultMessageNotifications :: Maybe Integer
verificationLevel :: Maybe Integer
icon :: Maybe Text
region :: Maybe Text
name :: Maybe Text
$sel:systemChannelID:ModifyGuildData :: ModifyGuildData -> Maybe (Snowflake GuildChannel)
$sel:banner:ModifyGuildData :: ModifyGuildData -> Maybe Text
$sel:splash:ModifyGuildData :: ModifyGuildData -> Maybe Text
$sel:ownerID:ModifyGuildData :: ModifyGuildData -> Maybe (Snowflake User)
$sel:afkTimeout:ModifyGuildData :: ModifyGuildData -> Maybe Integer
$sel:afkChannelID:ModifyGuildData :: ModifyGuildData -> Maybe (Snowflake GuildChannel)
$sel:explicitContentFilter:ModifyGuildData :: ModifyGuildData -> Maybe Integer
$sel:defaultMessageNotifications:ModifyGuildData :: ModifyGuildData -> Maybe Integer
$sel:verificationLevel:ModifyGuildData :: ModifyGuildData -> Maybe Integer
$sel:icon:ModifyGuildData :: ModifyGuildData -> Maybe Text
$sel:region:ModifyGuildData :: ModifyGuildData -> Maybe Text
$sel:name:ModifyGuildData :: ModifyGuildData -> Maybe Text
..} =
    [ Key
"name" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Text
name
    , Key
"region" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Text
region
    , Key
"icon" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Text
icon
    , Key
"verification_level" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
verificationLevel
    , Key
"default_message_notifications" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
defaultMessageNotifications
    , Key
"explicit_content_filter" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
explicitContentFilter
    , Key
"afk_timeout" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
afkTimeout
    , Key
"owner_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe (Snowflake User)
ownerID
    , Key
"splash" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Text
splash
    , Key
"banner" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Text
banner
    , Key
"system_channel_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe (Snowflake GuildChannel)
systemChannelID
    ]

data ChannelCreateData = ChannelCreateData
  { ChannelCreateData -> Text
name :: Text
  , ChannelCreateData -> Maybe ChannelType
type_ :: Maybe ChannelType
  , ChannelCreateData -> Maybe Text
topic :: Maybe Text
  , ChannelCreateData -> Maybe Integer
bitrate :: Maybe Integer
  , ChannelCreateData -> Maybe Integer
userLimit :: Maybe Integer
  , ChannelCreateData -> Maybe Integer
rateLimitPerUser :: Maybe Integer
  , ChannelCreateData -> Maybe Integer
position :: Maybe Integer
  , ChannelCreateData -> Maybe [Overwrite]
permissionOverwrites :: Maybe [Overwrite]
  , ChannelCreateData -> Maybe (Snowflake Category)
parentID :: Maybe (Snowflake Category)
  , ChannelCreateData -> Maybe Bool
nsfw :: Maybe Bool
  }
  deriving (Int -> ChannelCreateData -> ShowS
[ChannelCreateData] -> ShowS
ChannelCreateData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ChannelCreateData] -> ShowS
$cshowList :: [ChannelCreateData] -> ShowS
show :: ChannelCreateData -> String
$cshow :: ChannelCreateData -> String
showsPrec :: Int -> ChannelCreateData -> ShowS
$cshowsPrec :: Int -> ChannelCreateData -> ShowS
Show)
  deriving ([ChannelCreateData] -> Encoding
[ChannelCreateData] -> Value
ChannelCreateData -> Encoding
ChannelCreateData -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ChannelCreateData] -> Encoding
$ctoEncodingList :: [ChannelCreateData] -> Encoding
toJSONList :: [ChannelCreateData] -> Value
$ctoJSONList :: [ChannelCreateData] -> Value
toEncoding :: ChannelCreateData -> Encoding
$ctoEncoding :: ChannelCreateData -> Encoding
toJSON :: ChannelCreateData -> Value
$ctoJSON :: ChannelCreateData -> Value
Aeson.ToJSON) via CalamityToJSON ChannelCreateData

instance CalamityToJSON' ChannelCreateData where
  toPairs :: forall kv. KeyValue kv => ChannelCreateData -> [Maybe kv]
toPairs ChannelCreateData {Maybe Bool
Maybe Integer
Maybe [Overwrite]
Maybe Text
Maybe ChannelType
Maybe (Snowflake Category)
Text
nsfw :: Maybe Bool
parentID :: Maybe (Snowflake Category)
permissionOverwrites :: Maybe [Overwrite]
position :: Maybe Integer
rateLimitPerUser :: Maybe Integer
userLimit :: Maybe Integer
bitrate :: Maybe Integer
topic :: Maybe Text
type_ :: Maybe ChannelType
name :: Text
$sel:nsfw:ChannelCreateData :: ChannelCreateData -> Maybe Bool
$sel:parentID:ChannelCreateData :: ChannelCreateData -> Maybe (Snowflake Category)
$sel:permissionOverwrites:ChannelCreateData :: ChannelCreateData -> Maybe [Overwrite]
$sel:position:ChannelCreateData :: ChannelCreateData -> Maybe Integer
$sel:rateLimitPerUser:ChannelCreateData :: ChannelCreateData -> Maybe Integer
$sel:userLimit:ChannelCreateData :: ChannelCreateData -> Maybe Integer
$sel:bitrate:ChannelCreateData :: ChannelCreateData -> Maybe Integer
$sel:topic:ChannelCreateData :: ChannelCreateData -> Maybe Text
$sel:type_:ChannelCreateData :: ChannelCreateData -> Maybe ChannelType
$sel:name:ChannelCreateData :: ChannelCreateData -> Text
..} =
    [ Key
"name" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Text
name
    , Key
"type" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe ChannelType
type_
    , Key
"topic" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Text
topic
    , Key
"bitrate" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
bitrate
    , Key
"user_limit" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
userLimit
    , Key
"rate_limit_per_user" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
rateLimitPerUser
    , Key
"position" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
position
    , Key
"permission_overwrites" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe [Overwrite]
permissionOverwrites
    , Key
"parent_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe (Snowflake Category)
parentID
    , Key
"nsfw" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Bool
nsfw
    ]

data ChannelPosition = ChannelPosition
  { ChannelPosition -> Snowflake GuildChannel
id :: Snowflake GuildChannel
  , ChannelPosition -> Maybe Integer
position :: Maybe Integer
  , ChannelPosition -> Maybe Bool
lockPermissions :: Maybe Bool
  , ChannelPosition -> Snowflake GuildChannel
parentID :: Snowflake GuildChannel
  }
  deriving (Int -> ChannelPosition -> ShowS
[ChannelPosition] -> ShowS
ChannelPosition -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ChannelPosition] -> ShowS
$cshowList :: [ChannelPosition] -> ShowS
show :: ChannelPosition -> String
$cshow :: ChannelPosition -> String
showsPrec :: Int -> ChannelPosition -> ShowS
$cshowsPrec :: Int -> ChannelPosition -> ShowS
Show)
  deriving ([ChannelPosition] -> Encoding
[ChannelPosition] -> Value
ChannelPosition -> Encoding
ChannelPosition -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ChannelPosition] -> Encoding
$ctoEncodingList :: [ChannelPosition] -> Encoding
toJSONList :: [ChannelPosition] -> Value
$ctoJSONList :: [ChannelPosition] -> Value
toEncoding :: ChannelPosition -> Encoding
$ctoEncoding :: ChannelPosition -> Encoding
toJSON :: ChannelPosition -> Value
$ctoJSON :: ChannelPosition -> Value
Aeson.ToJSON) via CalamityToJSON ChannelPosition

instance CalamityToJSON' ChannelPosition where
  toPairs :: forall kv. KeyValue kv => ChannelPosition -> [Maybe kv]
toPairs ChannelPosition {Maybe Bool
Maybe Integer
Snowflake GuildChannel
parentID :: Snowflake GuildChannel
lockPermissions :: Maybe Bool
position :: Maybe Integer
id :: Snowflake GuildChannel
$sel:parentID:ChannelPosition :: ChannelPosition -> Snowflake GuildChannel
$sel:lockPermissions:ChannelPosition :: ChannelPosition -> Maybe Bool
$sel:position:ChannelPosition :: ChannelPosition -> Maybe Integer
$sel:id:ChannelPosition :: ChannelPosition -> Snowflake GuildChannel
..} =
    [ Key
"id" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Snowflake GuildChannel
id
    , Key
"position" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Maybe Integer
position
    , Key
"lock_permissions" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Maybe Bool
lockPermissions
    , Key
"parent_id" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Snowflake GuildChannel
parentID
    ]

data ListMembersOptions = ListMembersOptions
  { ListMembersOptions -> Maybe Integer
limit :: Maybe Integer
  , ListMembersOptions -> Maybe (Snowflake User)
after :: Maybe (Snowflake User)
  }
  deriving (Int -> ListMembersOptions -> ShowS
[ListMembersOptions] -> ShowS
ListMembersOptions -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ListMembersOptions] -> ShowS
$cshowList :: [ListMembersOptions] -> ShowS
show :: ListMembersOptions -> String
$cshow :: ListMembersOptions -> String
showsPrec :: Int -> ListMembersOptions -> ShowS
$cshowsPrec :: Int -> ListMembersOptions -> ShowS
Show)
  deriving ([ListMembersOptions] -> Encoding
[ListMembersOptions] -> Value
ListMembersOptions -> Encoding
ListMembersOptions -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ListMembersOptions] -> Encoding
$ctoEncodingList :: [ListMembersOptions] -> Encoding
toJSONList :: [ListMembersOptions] -> Value
$ctoJSONList :: [ListMembersOptions] -> Value
toEncoding :: ListMembersOptions -> Encoding
$ctoEncoding :: ListMembersOptions -> Encoding
toJSON :: ListMembersOptions -> Value
$ctoJSON :: ListMembersOptions -> Value
Aeson.ToJSON) via CalamityToJSON ListMembersOptions

instance Default ListMembersOptions where
  def :: ListMembersOptions
def = Maybe Integer -> Maybe (Snowflake User) -> ListMembersOptions
ListMembersOptions forall a. Maybe a
Nothing forall a. Maybe a
Nothing

instance CalamityToJSON' ListMembersOptions where
  toPairs :: forall kv. KeyValue kv => ListMembersOptions -> [Maybe kv]
toPairs ListMembersOptions {Maybe Integer
Maybe (Snowflake User)
after :: Maybe (Snowflake User)
limit :: Maybe Integer
$sel:after:ListMembersOptions :: ListMembersOptions -> Maybe (Snowflake User)
$sel:limit:ListMembersOptions :: ListMembersOptions -> Maybe Integer
..} =
    [ Key
"limit" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
limit
    , Key
"after" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe (Snowflake User)
after
    ]

data SearchMembersOptions = SearchMembersOptions
  { SearchMembersOptions -> Maybe Integer
limit :: Maybe Integer
  , SearchMembersOptions -> Text
query :: Text
  }
  deriving (Int -> SearchMembersOptions -> ShowS
[SearchMembersOptions] -> ShowS
SearchMembersOptions -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SearchMembersOptions] -> ShowS
$cshowList :: [SearchMembersOptions] -> ShowS
show :: SearchMembersOptions -> String
$cshow :: SearchMembersOptions -> String
showsPrec :: Int -> SearchMembersOptions -> ShowS
$cshowsPrec :: Int -> SearchMembersOptions -> ShowS
Show)
  deriving ([SearchMembersOptions] -> Encoding
[SearchMembersOptions] -> Value
SearchMembersOptions -> Encoding
SearchMembersOptions -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [SearchMembersOptions] -> Encoding
$ctoEncodingList :: [SearchMembersOptions] -> Encoding
toJSONList :: [SearchMembersOptions] -> Value
$ctoJSONList :: [SearchMembersOptions] -> Value
toEncoding :: SearchMembersOptions -> Encoding
$ctoEncoding :: SearchMembersOptions -> Encoding
toJSON :: SearchMembersOptions -> Value
$ctoJSON :: SearchMembersOptions -> Value
Aeson.ToJSON) via CalamityToJSON SearchMembersOptions

instance CalamityToJSON' SearchMembersOptions where
  toPairs :: forall kv. KeyValue kv => SearchMembersOptions -> [Maybe kv]
toPairs SearchMembersOptions {Maybe Integer
Text
query :: Text
limit :: Maybe Integer
$sel:query:SearchMembersOptions :: SearchMembersOptions -> Text
$sel:limit:SearchMembersOptions :: SearchMembersOptions -> Maybe Integer
..} =
    [ Key
"limit" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
limit
    , Key
"query" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Text
query
    ]

data AddGuildMemberData = AddGuildMemberData
  { AddGuildMemberData -> Text
accessToken :: Text
  , AddGuildMemberData -> Maybe Text
nick :: Maybe Text
  , AddGuildMemberData -> Maybe [Snowflake Role]
roles :: Maybe [Snowflake Role]
  , AddGuildMemberData -> Maybe Bool
mute :: Maybe Bool
  , AddGuildMemberData -> Maybe Bool
deaf :: Maybe Bool
  }
  deriving (Int -> AddGuildMemberData -> ShowS
[AddGuildMemberData] -> ShowS
AddGuildMemberData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AddGuildMemberData] -> ShowS
$cshowList :: [AddGuildMemberData] -> ShowS
show :: AddGuildMemberData -> String
$cshow :: AddGuildMemberData -> String
showsPrec :: Int -> AddGuildMemberData -> ShowS
$cshowsPrec :: Int -> AddGuildMemberData -> ShowS
Show)
  deriving ([AddGuildMemberData] -> Encoding
[AddGuildMemberData] -> Value
AddGuildMemberData -> Encoding
AddGuildMemberData -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [AddGuildMemberData] -> Encoding
$ctoEncodingList :: [AddGuildMemberData] -> Encoding
toJSONList :: [AddGuildMemberData] -> Value
$ctoJSONList :: [AddGuildMemberData] -> Value
toEncoding :: AddGuildMemberData -> Encoding
$ctoEncoding :: AddGuildMemberData -> Encoding
toJSON :: AddGuildMemberData -> Value
$ctoJSON :: AddGuildMemberData -> Value
Aeson.ToJSON) via CalamityToJSON AddGuildMemberData

instance CalamityToJSON' AddGuildMemberData where
  toPairs :: forall kv. KeyValue kv => AddGuildMemberData -> [Maybe kv]
toPairs AddGuildMemberData {Maybe Bool
Maybe [Snowflake Role]
Maybe Text
Text
deaf :: Maybe Bool
mute :: Maybe Bool
roles :: Maybe [Snowflake Role]
nick :: Maybe Text
accessToken :: Text
$sel:deaf:AddGuildMemberData :: AddGuildMemberData -> Maybe Bool
$sel:mute:AddGuildMemberData :: AddGuildMemberData -> Maybe Bool
$sel:roles:AddGuildMemberData :: AddGuildMemberData -> Maybe [Snowflake Role]
$sel:nick:AddGuildMemberData :: AddGuildMemberData -> Maybe Text
$sel:accessToken:AddGuildMemberData :: AddGuildMemberData -> Text
..} =
    [ Key
"access_token" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Text
accessToken
    , Key
"nick" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Text
nick
    , Key
"roles" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe [Snowflake Role]
roles
    , Key
"mute" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Bool
mute
    , Key
"deaf" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Bool
deaf
    ]

{- | Parameters to the Modify Guild Member endpoint.

 Use the provided methods (@modifyGuildMemberX@) to create a value with the
 field set, use the Semigroup instance to combine modifications.

 ==== Examples

 >>> encode $ modifyGuildMemberNick (Just "test") <> modifyGuildMemberDeaf Nothing
 "{\"nick\":\"test\",\"deaf\":null}"
-}
newtype ModifyGuildMemberData = ModifyGuildMemberData Aeson.Object
  deriving stock (Int -> ModifyGuildMemberData -> ShowS
[ModifyGuildMemberData] -> ShowS
ModifyGuildMemberData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModifyGuildMemberData] -> ShowS
$cshowList :: [ModifyGuildMemberData] -> ShowS
show :: ModifyGuildMemberData -> String
$cshow :: ModifyGuildMemberData -> String
showsPrec :: Int -> ModifyGuildMemberData -> ShowS
$cshowsPrec :: Int -> ModifyGuildMemberData -> ShowS
Show)
  deriving newtype ([ModifyGuildMemberData] -> Encoding
[ModifyGuildMemberData] -> Value
ModifyGuildMemberData -> Encoding
ModifyGuildMemberData -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ModifyGuildMemberData] -> Encoding
$ctoEncodingList :: [ModifyGuildMemberData] -> Encoding
toJSONList :: [ModifyGuildMemberData] -> Value
$ctoJSONList :: [ModifyGuildMemberData] -> Value
toEncoding :: ModifyGuildMemberData -> Encoding
$ctoEncoding :: ModifyGuildMemberData -> Encoding
toJSON :: ModifyGuildMemberData -> Value
$ctoJSON :: ModifyGuildMemberData -> Value
Aeson.ToJSON, NonEmpty ModifyGuildMemberData -> ModifyGuildMemberData
ModifyGuildMemberData
-> ModifyGuildMemberData -> ModifyGuildMemberData
forall b.
Integral b =>
b -> ModifyGuildMemberData -> ModifyGuildMemberData
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: forall b.
Integral b =>
b -> ModifyGuildMemberData -> ModifyGuildMemberData
$cstimes :: forall b.
Integral b =>
b -> ModifyGuildMemberData -> ModifyGuildMemberData
sconcat :: NonEmpty ModifyGuildMemberData -> ModifyGuildMemberData
$csconcat :: NonEmpty ModifyGuildMemberData -> ModifyGuildMemberData
<> :: ModifyGuildMemberData
-> ModifyGuildMemberData -> ModifyGuildMemberData
$c<> :: ModifyGuildMemberData
-> ModifyGuildMemberData -> ModifyGuildMemberData
Semigroup, Semigroup ModifyGuildMemberData
ModifyGuildMemberData
[ModifyGuildMemberData] -> ModifyGuildMemberData
ModifyGuildMemberData
-> ModifyGuildMemberData -> ModifyGuildMemberData
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [ModifyGuildMemberData] -> ModifyGuildMemberData
$cmconcat :: [ModifyGuildMemberData] -> ModifyGuildMemberData
mappend :: ModifyGuildMemberData
-> ModifyGuildMemberData -> ModifyGuildMemberData
$cmappend :: ModifyGuildMemberData
-> ModifyGuildMemberData -> ModifyGuildMemberData
mempty :: ModifyGuildMemberData
$cmempty :: ModifyGuildMemberData
Monoid)

modifyGuildMemberNick :: Maybe Text -> ModifyGuildMemberData
modifyGuildMemberNick :: Maybe Text -> ModifyGuildMemberData
modifyGuildMemberNick Maybe Text
v = Object -> ModifyGuildMemberData
ModifyGuildMemberData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"nick", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe Text
v)]

modifyGuildMemberRoles :: Maybe [Snowflake Role] -> ModifyGuildMemberData
modifyGuildMemberRoles :: Maybe [Snowflake Role] -> ModifyGuildMemberData
modifyGuildMemberRoles Maybe [Snowflake Role]
v = Object -> ModifyGuildMemberData
ModifyGuildMemberData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"roles", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe [Snowflake Role]
v)]

modifyGuildMemberMute :: Maybe Bool -> ModifyGuildMemberData
modifyGuildMemberMute :: Maybe Bool -> ModifyGuildMemberData
modifyGuildMemberMute Maybe Bool
v = Object -> ModifyGuildMemberData
ModifyGuildMemberData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"mute", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe Bool
v)]

modifyGuildMemberDeaf :: Maybe Bool -> ModifyGuildMemberData
modifyGuildMemberDeaf :: Maybe Bool -> ModifyGuildMemberData
modifyGuildMemberDeaf Maybe Bool
v = Object -> ModifyGuildMemberData
ModifyGuildMemberData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"deaf", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe Bool
v)]

modifyGuildMemberChannelID :: Maybe (Snowflake VoiceChannel) -> ModifyGuildMemberData
modifyGuildMemberChannelID :: Maybe (Snowflake VoiceChannel) -> ModifyGuildMemberData
modifyGuildMemberChannelID Maybe (Snowflake VoiceChannel)
v = Object -> ModifyGuildMemberData
ModifyGuildMemberData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"channel_id", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe (Snowflake VoiceChannel)
v)]

data GetGuildBansOptions = GetGuildBansOptions
  { GetGuildBansOptions -> Maybe Int
limit :: Maybe Int
  , GetGuildBansOptions -> Maybe Int
before :: Maybe Int
  , GetGuildBansOptions -> Maybe Int
after :: Maybe Int
  }
  deriving (Int -> GetGuildBansOptions -> ShowS
[GetGuildBansOptions] -> ShowS
GetGuildBansOptions -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetGuildBansOptions] -> ShowS
$cshowList :: [GetGuildBansOptions] -> ShowS
show :: GetGuildBansOptions -> String
$cshow :: GetGuildBansOptions -> String
showsPrec :: Int -> GetGuildBansOptions -> ShowS
$cshowsPrec :: Int -> GetGuildBansOptions -> ShowS
Show)

instance Default GetGuildBansOptions where
  def :: GetGuildBansOptions
def = Maybe Int -> Maybe Int -> Maybe Int -> GetGuildBansOptions
GetGuildBansOptions forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing

data CreateGuildBanData = CreateGuildBanData
  { CreateGuildBanData -> Maybe Integer
deleteMessageDays :: Maybe Integer
  , CreateGuildBanData -> Maybe Text
reason :: Maybe Text
  }
  deriving (Int -> CreateGuildBanData -> ShowS
[CreateGuildBanData] -> ShowS
CreateGuildBanData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateGuildBanData] -> ShowS
$cshowList :: [CreateGuildBanData] -> ShowS
show :: CreateGuildBanData -> String
$cshow :: CreateGuildBanData -> String
showsPrec :: Int -> CreateGuildBanData -> ShowS
$cshowsPrec :: Int -> CreateGuildBanData -> ShowS
Show)

instance Default CreateGuildBanData where
  def :: CreateGuildBanData
def = Maybe Integer -> Maybe Text -> CreateGuildBanData
CreateGuildBanData forall a. Maybe a
Nothing forall a. Maybe a
Nothing

{- | Parameters to the Modify Guild Role endpoint.

 Use the provided methods (@modifyGuildRoleX@) to create a value with the
 field set, use the Semigroup instance to combine parameters.

 ==== Examples

 >>> encode $ modifyGuildRoleName (Just "test") <> modifyGuildRolePermissions Nothing
 "{\"name\":\"test\",\"permissions\":null}"
-}
newtype ModifyGuildRoleData = ModifyGuildRoleData Aeson.Object
  deriving stock (Int -> ModifyGuildRoleData -> ShowS
[ModifyGuildRoleData] -> ShowS
ModifyGuildRoleData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModifyGuildRoleData] -> ShowS
$cshowList :: [ModifyGuildRoleData] -> ShowS
show :: ModifyGuildRoleData -> String
$cshow :: ModifyGuildRoleData -> String
showsPrec :: Int -> ModifyGuildRoleData -> ShowS
$cshowsPrec :: Int -> ModifyGuildRoleData -> ShowS
Show)
  deriving newtype ([ModifyGuildRoleData] -> Encoding
[ModifyGuildRoleData] -> Value
ModifyGuildRoleData -> Encoding
ModifyGuildRoleData -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ModifyGuildRoleData] -> Encoding
$ctoEncodingList :: [ModifyGuildRoleData] -> Encoding
toJSONList :: [ModifyGuildRoleData] -> Value
$ctoJSONList :: [ModifyGuildRoleData] -> Value
toEncoding :: ModifyGuildRoleData -> Encoding
$ctoEncoding :: ModifyGuildRoleData -> Encoding
toJSON :: ModifyGuildRoleData -> Value
$ctoJSON :: ModifyGuildRoleData -> Value
Aeson.ToJSON, NonEmpty ModifyGuildRoleData -> ModifyGuildRoleData
ModifyGuildRoleData -> ModifyGuildRoleData -> ModifyGuildRoleData
forall b.
Integral b =>
b -> ModifyGuildRoleData -> ModifyGuildRoleData
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
stimes :: forall b.
Integral b =>
b -> ModifyGuildRoleData -> ModifyGuildRoleData
$cstimes :: forall b.
Integral b =>
b -> ModifyGuildRoleData -> ModifyGuildRoleData
sconcat :: NonEmpty ModifyGuildRoleData -> ModifyGuildRoleData
$csconcat :: NonEmpty ModifyGuildRoleData -> ModifyGuildRoleData
<> :: ModifyGuildRoleData -> ModifyGuildRoleData -> ModifyGuildRoleData
$c<> :: ModifyGuildRoleData -> ModifyGuildRoleData -> ModifyGuildRoleData
Semigroup, Semigroup ModifyGuildRoleData
ModifyGuildRoleData
[ModifyGuildRoleData] -> ModifyGuildRoleData
ModifyGuildRoleData -> ModifyGuildRoleData -> ModifyGuildRoleData
forall a.
Semigroup a -> a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
mconcat :: [ModifyGuildRoleData] -> ModifyGuildRoleData
$cmconcat :: [ModifyGuildRoleData] -> ModifyGuildRoleData
mappend :: ModifyGuildRoleData -> ModifyGuildRoleData -> ModifyGuildRoleData
$cmappend :: ModifyGuildRoleData -> ModifyGuildRoleData -> ModifyGuildRoleData
mempty :: ModifyGuildRoleData
$cmempty :: ModifyGuildRoleData
Monoid)

modifyGuildRoleName :: Maybe Text -> ModifyGuildRoleData
modifyGuildRoleName :: Maybe Text -> ModifyGuildRoleData
modifyGuildRoleName Maybe Text
v = Object -> ModifyGuildRoleData
ModifyGuildRoleData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"name", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe Text
v)]

modifyGuildRolePermissions :: Maybe Permissions -> ModifyGuildRoleData
modifyGuildRolePermissions :: Maybe Permissions -> ModifyGuildRoleData
modifyGuildRolePermissions Maybe Permissions
v = Object -> ModifyGuildRoleData
ModifyGuildRoleData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"permissions", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe Permissions
v)]

modifyGuildRoleColour :: Maybe (Colour Double) -> ModifyGuildRoleData
modifyGuildRoleColour :: Maybe (Colour Double) -> ModifyGuildRoleData
modifyGuildRoleColour Maybe (Colour Double)
v = Object -> ModifyGuildRoleData
ModifyGuildRoleData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"colour", forall a. ToJSON a => a -> Value
Aeson.toJSON (Colour Double -> IntColour
IntColour forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (Colour Double)
v))]

modifyGuildRoleHoist :: Maybe Bool -> ModifyGuildRoleData
modifyGuildRoleHoist :: Maybe Bool -> ModifyGuildRoleData
modifyGuildRoleHoist Maybe Bool
v = Object -> ModifyGuildRoleData
ModifyGuildRoleData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"hoist", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe Bool
v)]

modifyGuildRoleMentionable :: Maybe Bool -> ModifyGuildRoleData
modifyGuildRoleMentionable :: Maybe Bool -> ModifyGuildRoleData
modifyGuildRoleMentionable Maybe Bool
v = Object -> ModifyGuildRoleData
ModifyGuildRoleData forall a b. (a -> b) -> a -> b
$ forall v. [(Key, v)] -> KeyMap v
K.fromList [(Key
"mentionable", forall a. ToJSON a => a -> Value
Aeson.toJSON Maybe Bool
v)]

data ModifyGuildRolePositionsData = ModifyGuildRolePositionsData
  { ModifyGuildRolePositionsData -> Snowflake Role
id :: Snowflake Role
  , ModifyGuildRolePositionsData -> Maybe Integer
position :: Maybe Integer
  }
  deriving (Int -> ModifyGuildRolePositionsData -> ShowS
[ModifyGuildRolePositionsData] -> ShowS
ModifyGuildRolePositionsData -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ModifyGuildRolePositionsData] -> ShowS
$cshowList :: [ModifyGuildRolePositionsData] -> ShowS
show :: ModifyGuildRolePositionsData -> String
$cshow :: ModifyGuildRolePositionsData -> String
showsPrec :: Int -> ModifyGuildRolePositionsData -> ShowS
$cshowsPrec :: Int -> ModifyGuildRolePositionsData -> ShowS
Show)
  deriving ([ModifyGuildRolePositionsData] -> Encoding
[ModifyGuildRolePositionsData] -> Value
ModifyGuildRolePositionsData -> Encoding
ModifyGuildRolePositionsData -> Value
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [ModifyGuildRolePositionsData] -> Encoding
$ctoEncodingList :: [ModifyGuildRolePositionsData] -> Encoding
toJSONList :: [ModifyGuildRolePositionsData] -> Value
$ctoJSONList :: [ModifyGuildRolePositionsData] -> Value
toEncoding :: ModifyGuildRolePositionsData -> Encoding
$ctoEncoding :: ModifyGuildRolePositionsData -> Encoding
toJSON :: ModifyGuildRolePositionsData -> Value
$ctoJSON :: ModifyGuildRolePositionsData -> Value
Aeson.ToJSON) via CalamityToJSON ModifyGuildRolePositionsData

instance CalamityToJSON' ModifyGuildRolePositionsData where
  toPairs :: forall kv.
KeyValue kv =>
ModifyGuildRolePositionsData -> [Maybe kv]
toPairs ModifyGuildRolePositionsData {Maybe Integer
Snowflake Role
position :: Maybe Integer
id :: Snowflake Role
$sel:position:ModifyGuildRolePositionsData :: ModifyGuildRolePositionsData -> Maybe Integer
$sel:id:ModifyGuildRolePositionsData :: ModifyGuildRolePositionsData -> Snowflake Role
..} =
    [ Key
"id" forall v kv. (ToJSON v, KeyValue kv) => Key -> v -> Maybe kv
.= Snowflake Role
id
    , Key
"postition" forall v kv. (ToJSON v, KeyValue kv) => Key -> Maybe v -> Maybe kv
.?= Maybe Integer
position
    ]

data GuildRequest a where
  CreateGuild :: CreateGuildData -> GuildRequest Guild
  GetGuild :: HasID Guild g => g -> GuildRequest Guild
  ModifyGuild :: HasID Guild g => g -> ModifyGuildData -> GuildRequest Guild
  DeleteGuild :: HasID Guild g => g -> GuildRequest ()
  GetGuildChannels :: HasID Guild g => g -> GuildRequest [Channel]
  CreateGuildChannel :: HasID Guild g => g -> ChannelCreateData -> GuildRequest Channel
  ModifyGuildChannelPositions :: HasID Guild g => g -> [ChannelPosition] -> GuildRequest ()
  GetGuildMember :: (HasID Guild g, HasID User u) => g -> u -> GuildRequest Member
  ListGuildMembers :: HasID Guild g => g -> ListMembersOptions -> GuildRequest [Member]
  SearchGuildMembers :: HasID Guild g => g -> SearchMembersOptions -> GuildRequest [Member]
  AddGuildMember :: (HasID Guild g, HasID User u) => g -> u -> AddGuildMemberData -> GuildRequest (Maybe Member)
  ModifyGuildMember :: (HasID Guild g, HasID User u) => g -> u -> ModifyGuildMemberData -> GuildRequest ()
  ModifyCurrentUserNick :: HasID Guild g => g -> Maybe Text -> GuildRequest ()
  AddGuildMemberRole :: (HasID Guild g, HasID User u, HasID Role r) => g -> u -> r -> GuildRequest ()
  RemoveGuildMemberRole :: (HasID Guild g, HasID User u, HasID Role r) => g -> u -> r -> GuildRequest ()
  RemoveGuildMember :: (HasID Guild g, HasID User u) => g -> u -> GuildRequest ()
  GetGuildBans :: HasID Guild g => g -> GetGuildBansOptions -> GuildRequest [BanData]
  GetGuildBan :: (HasID Guild g, HasID User u) => g -> u -> GuildRequest BanData
  CreateGuildBan :: (HasID Guild g, HasID User u) => g -> u -> CreateGuildBanData -> GuildRequest ()
  RemoveGuildBan :: (HasID Guild g, HasID User u) => g -> u -> GuildRequest ()
  GetGuildRoles :: HasID Guild g => g -> GuildRequest [Role]
  CreateGuildRole :: HasID Guild g => g -> ModifyGuildRoleData -> GuildRequest Role
  ModifyGuildRolePositions :: HasID Guild g => g -> ModifyGuildRolePositionsData -> GuildRequest [Role]
  ModifyGuildRole :: (HasID Guild g, HasID Role r) => g -> r -> ModifyGuildRoleData -> GuildRequest Role
  DeleteGuildRole :: (HasID Guild g, HasID Role r) => g -> r -> GuildRequest ()
  GetGuildPruneCount :: HasID Guild g => g -> Integer -> GuildRequest Integer
  BeginGuildPrune :: HasID Guild g => g -> Integer -> Bool -> GuildRequest (Maybe Integer)
  GetGuildVoiceRegions :: HasID Guild g => g -> GuildRequest [VoiceRegion]
  GetGuildInvites :: HasID Guild g => g -> GuildRequest [Invite]

baseRoute :: Snowflake Guild -> RouteBuilder _
baseRoute :: Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild,
           AddRequiredInner (Lookup ('IDRequirement Guild) '[]))]
baseRoute Snowflake Guild
id =
  RouteBuilder '[]
mkRouteBuilder forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"guilds" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @Guild
    forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake Guild
id

instance Request (GuildRequest a) where
  type Result (GuildRequest a) = a

  route :: GuildRequest a -> Route
route (CreateGuild CreateGuildData
_) =
    RouteBuilder '[]
mkRouteBuilder forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"guilds"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuild (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (ModifyGuild (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) ModifyGuildData
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (DeleteGuild (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuildChannels (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"channels"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (CreateGuildChannel (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) ChannelCreateData
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"channels"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (ModifyGuildChannelPositions (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) [ChannelPosition]
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"channels"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuildMember (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (ListGuildMembers (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) ListMembersOptions
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (SearchGuildMembers (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) SearchMembersOptions
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"search"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (AddGuildMember (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid) AddGuildMemberData
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (ModifyGuildMember (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid) ModifyGuildMemberData
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (ModifyCurrentUserNick (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) Maybe Text
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"@me" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"nick"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (AddGuildMemberRole (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid) (forall b a. HasID b a => a -> Snowflake b
getID @Role -> Snowflake Role
rid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"roles" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @Role
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake Role
rid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (RemoveGuildMemberRole (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid) (forall b a. HasID b a => a -> Snowflake b
getID @Role -> Snowflake Role
rid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"roles" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @Role
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake Role
rid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (RemoveGuildMember (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"members" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuildBans (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) GetGuildBansOptions
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"bans"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuildBan (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"bans" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (CreateGuildBan (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid) CreateGuildBanData
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"bans" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (RemoveGuildBan (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @User -> Snowflake User
uid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"bans" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @User
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake User
uid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuildRoles (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"roles"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (CreateGuildRole (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) ModifyGuildRoleData
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"roles"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (ModifyGuildRolePositions (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) ModifyGuildRolePositionsData
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"roles"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (ModifyGuildRole (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @Role -> Snowflake Role
rid) ModifyGuildRoleData
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"roles" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @Role
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake Role
rid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (DeleteGuildRole (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) (forall b a. HasID b a => a -> Snowflake b
getID @Role -> Snowflake Role
rid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"roles" forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// forall {k} (a :: k). ID a
ID @Role
      forall a b. a -> (a -> b) -> b
& forall t (reqs :: [(RequirementType, RouteRequirement)]).
Typeable t =>
Snowflake t
-> RouteBuilder reqs
-> RouteBuilder ('( 'IDRequirement t, 'Satisfied) : reqs)
giveID Snowflake Role
rid
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuildPruneCount (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) Integer
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"prune"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (BeginGuildPrune (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid) Integer
_ Bool
_) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"prune"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuildVoiceRegions (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"regions"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute
  route (GetGuildInvites (forall b a. HasID b a => a -> Snowflake b
getID -> Snowflake Guild
gid)) =
    Snowflake Guild
-> RouteBuilder
     '[ '( 'IDRequirement Guild, 'Satisfied),
        '( 'IDRequirement Guild, 'Required)]
baseRoute Snowflake Guild
gid forall a (reqs :: [(RequirementType, RouteRequirement)]).
RouteFragmentable a reqs =>
RouteBuilder reqs -> a -> ConsRes a reqs
// Text -> S
S Text
"invites"
      forall a b. a -> (a -> b) -> b
& forall (reqs :: [(RequirementType, RouteRequirement)]).
EnsureFulfilled reqs =>
RouteBuilder reqs -> Route
buildRoute

  action :: GuildRequest a -> Url 'Https -> Option 'Https -> Req LbsResponse
action (CreateGuild CreateGuildData
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
postWith' (forall a. a -> ReqBodyJson a
ReqBodyJson CreateGuildData
o)
  action (GetGuild g
_) = Url 'Https -> Option 'Https -> Req LbsResponse
getWith
  action (ModifyGuild g
_ ModifyGuildData
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
patchWith' (forall a. a -> ReqBodyJson a
ReqBodyJson ModifyGuildData
o)
  action (DeleteGuild g
_) = Url 'Https -> Option 'Https -> Req LbsResponse
deleteWith
  action (GetGuildChannels g
_) = Url 'Https -> Option 'Https -> Req LbsResponse
getWith
  action (CreateGuildChannel g
_ ChannelCreateData
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
postWith' (forall a. a -> ReqBodyJson a
ReqBodyJson ChannelCreateData
o)
  action (ModifyGuildChannelPositions g
_ [ChannelPosition]
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
postWith' (forall a. a -> ReqBodyJson a
ReqBodyJson [ChannelPosition]
o)
  action (GetGuildMember g
_ u
_) = Url 'Https -> Option 'Https -> Req LbsResponse
getWith
  action (ListGuildMembers g
_ ListMembersOptions {Maybe Integer
limit :: Maybe Integer
$sel:limit:ListMembersOptions :: ListMembersOptions -> Maybe Integer
limit, Maybe (Snowflake User)
after :: Maybe (Snowflake User)
$sel:after:ListMembersOptions :: ListMembersOptions -> Maybe (Snowflake User)
after}) =
    Option 'Https -> Url 'Https -> Option 'Https -> Req LbsResponse
getWithP
      (Text
"limit" forall a. ToHttpApiData a => Text -> Maybe a -> Option 'Https
=:? Maybe Integer
limit forall a. Semigroup a => a -> a -> a
<> Text
"after" forall a. ToHttpApiData a => Text -> Maybe a -> Option 'Https
=:? (forall t. Snowflake t -> Word64
fromSnowflake forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (Snowflake User)
after))
  action (SearchGuildMembers g
_ SearchMembersOptions {Maybe Integer
limit :: Maybe Integer
$sel:limit:SearchMembersOptions :: SearchMembersOptions -> Maybe Integer
limit, Text
query :: Text
$sel:query:SearchMembersOptions :: SearchMembersOptions -> Text
query}) =
    Option 'Https -> Url 'Https -> Option 'Https -> Req LbsResponse
getWithP
      (Text
"limit" forall a. ToHttpApiData a => Text -> Maybe a -> Option 'Https
=:? Maybe Integer
limit forall a. Semigroup a => a -> a -> a
<> Text
"query" forall param a.
(QueryParam param, ToHttpApiData a) =>
Text -> a -> param
=: Text
query)
  action (AddGuildMember g
_ u
_ AddGuildMemberData
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
putWith' (forall a. a -> ReqBodyJson a
ReqBodyJson AddGuildMemberData
o)
  action (ModifyGuildMember g
_ u
_ ModifyGuildMemberData
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
patchWith' (forall a. a -> ReqBodyJson a
ReqBodyJson ModifyGuildMemberData
o)
  action (ModifyCurrentUserNick g
_ Maybe Text
nick) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
patchWith' (forall a. a -> ReqBodyJson a
ReqBodyJson forall a b. (a -> b) -> a -> b
$ [(Key, Value)] -> Value
Aeson.object [Key
"nick" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Aeson..= Maybe Text
nick])
  action AddGuildMemberRole {} = Url 'Https -> Option 'Https -> Req LbsResponse
putEmpty
  action RemoveGuildMemberRole {} = Url 'Https -> Option 'Https -> Req LbsResponse
deleteWith
  action (RemoveGuildMember g
_ u
_) = Url 'Https -> Option 'Https -> Req LbsResponse
deleteWith
  action (GetGuildBans g
_ GetGuildBansOptions {Maybe Int
limit :: Maybe Int
$sel:limit:GetGuildBansOptions :: GetGuildBansOptions -> Maybe Int
limit, Maybe Int
before :: Maybe Int
$sel:before:GetGuildBansOptions :: GetGuildBansOptions -> Maybe Int
before, Maybe Int
after :: Maybe Int
$sel:after:GetGuildBansOptions :: GetGuildBansOptions -> Maybe Int
after}) =
    Option 'Https -> Url 'Https -> Option 'Https -> Req LbsResponse
getWithP
      (Text
"limit" forall a. ToHttpApiData a => Text -> Maybe a -> Option 'Https
=:? Maybe Int
limit forall a. Semigroup a => a -> a -> a
<> Text
"before" forall a. ToHttpApiData a => Text -> Maybe a -> Option 'Https
=:? Maybe Int
before forall a. Semigroup a => a -> a -> a
<> Text
"after" forall a. ToHttpApiData a => Text -> Maybe a -> Option 'Https
=:? Maybe Int
after)
  action (GetGuildBan g
_ u
_) = Url 'Https -> Option 'Https -> Req LbsResponse
getWith
  action (CreateGuildBan g
_ u
_ CreateGuildBanData {Maybe Integer
deleteMessageDays :: Maybe Integer
$sel:deleteMessageDays:CreateGuildBanData :: CreateGuildBanData -> Maybe Integer
deleteMessageDays}) =
    Option 'Https -> Url 'Https -> Option 'Https -> Req LbsResponse
putEmptyP
      (Text
"delete_message_days" forall a. ToHttpApiData a => Text -> Maybe a -> Option 'Https
=:? Maybe Integer
deleteMessageDays)
  action (RemoveGuildBan g
_ u
_) = Url 'Https -> Option 'Https -> Req LbsResponse
deleteWith
  action (GetGuildRoles g
_) = Url 'Https -> Option 'Https -> Req LbsResponse
getWith
  action (CreateGuildRole g
_ ModifyGuildRoleData
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
postWith' (forall a. a -> ReqBodyJson a
ReqBodyJson ModifyGuildRoleData
o)
  action (ModifyGuildRolePositions g
_ ModifyGuildRolePositionsData
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
patchWith' (forall a. a -> ReqBodyJson a
ReqBodyJson ModifyGuildRolePositionsData
o)
  action (ModifyGuildRole g
_ r
_ ModifyGuildRoleData
o) = forall a.
HttpBody a =>
a -> Url 'Https -> Option 'Https -> Req LbsResponse
patchWith' (forall a. a -> ReqBodyJson a
ReqBodyJson ModifyGuildRoleData
o)
  action (DeleteGuildRole g
_ r
_) = Url 'Https -> Option 'Https -> Req LbsResponse
deleteWith
  action (GetGuildPruneCount g
_ Integer
d) = Option 'Https -> Url 'Https -> Option 'Https -> Req LbsResponse
getWithP (Text
"days" forall param a.
(QueryParam param, ToHttpApiData a) =>
Text -> a -> param
=: Integer
d)
  action (BeginGuildPrune g
_ Integer
d Bool
r) = Option 'Https -> Url 'Https -> Option 'Https -> Req LbsResponse
postEmptyP (Text
"days" forall param a.
(QueryParam param, ToHttpApiData a) =>
Text -> a -> param
=: Integer
d forall a. Semigroup a => a -> a -> a
<> Text
"compute_prune_count" forall param a.
(QueryParam param, ToHttpApiData a) =>
Text -> a -> param
=: Bool
r)
  action (GetGuildVoiceRegions g
_) = Url 'Https -> Option 'Https -> Req LbsResponse
getWith
  action (GetGuildInvites g
_) = Url 'Https -> Option 'Https -> Req LbsResponse
getWith

  -- this is a bit of a hack
  -- TODO: add something to allow for contextual parsing
  modifyResponse :: GuildRequest a -> Value -> Value
modifyResponse GuildRequest a
_ = forall a. a -> a
Prelude.id

$(makeFieldLabelsNoPrefix ''CreateGuildData)
$(makeFieldLabelsNoPrefix ''ModifyGuildData)
$(makeFieldLabelsNoPrefix ''ChannelCreateData)
$(makeFieldLabelsNoPrefix ''ChannelPosition)
$(makeFieldLabelsNoPrefix ''ListMembersOptions)
$(makeFieldLabelsNoPrefix ''AddGuildMemberData)
$(makeFieldLabelsNoPrefix ''ModifyGuildRolePositionsData)
$(makeFieldLabelsNoPrefix ''CreateGuildBanData)