{-# LANGUAGE OverloadedStrings #-}
module Discord.Internal.Types.Guild where
import Data.Time.Clock
import Data.Aeson
import qualified Data.Text as T
import Discord.Internal.Types.Prelude
import Discord.Internal.Types.Channel (Channel)
import Discord.Internal.Types.User (User)
data GuildMember = GuildMember
{ memberUser :: User
, memberNick :: Maybe T.Text
, memberRoles :: [Snowflake]
, memberJoinedAt :: UTCTime
, memberDeaf :: Bool
, memberMute :: Bool
} deriving (Show, Eq, Ord)
instance FromJSON GuildMember where
parseJSON = withObject "GuildMember" $ \o ->
GuildMember <$> o .: "user"
<*> o .:? "nick"
<*> o .: "roles"
<*> o .: "joined_at"
<*> o .: "deaf"
<*> o .: "mute"
data Guild = Guild
{ guildId :: GuildId
, guildName :: T.Text
, guildIcon :: Maybe T.Text
, guildSplash :: Maybe T.Text
, guildOwnerId :: UserId
, guildPermissions :: Maybe Integer
, guildRegion :: T.Text
, guildAfkId :: Maybe ChannelId
, guildAfkTimeout :: Integer
, guildEmbedEnabled :: Maybe Bool
, guildEmbedChannel :: Maybe ChannelId
, guildVerificationLevel :: Integer
, guildNotification :: Integer
, guildExplicitFilterLevel :: Integer
, guildRoles :: [Role]
, guildEmojis :: [Emoji]
, guildFeatures :: [T.Text]
, guildMultiFactAuth :: !Integer
, guildApplicationId :: Maybe Snowflake
} deriving (Show, Eq, Ord)
instance FromJSON Guild where
parseJSON = withObject "Guild" $ \o ->
Guild <$> o .: "id"
<*> o .: "name"
<*> o .:? "icon"
<*> o .:? "splash"
<*> o .: "owner_id"
<*> o .:? "permissions"
<*> o .: "region"
<*> o .:? "afk_channel_id"
<*> o .: "afk_timeout"
<*> o .:? "embed_enabled"
<*> o .:? "embed_channel_id"
<*> o .: "verification_level"
<*> o .: "default_message_notifications"
<*> o .: "explicit_content_filter"
<*> o .: "roles"
<*> o .: "emojis"
<*> o .: "features"
<*> o .: "mfa_level"
<*> o .:? "application_id"
data GuildUnavailable = GuildUnavailable
{ idOnceAvailable :: GuildId
} deriving (Show, Eq, Ord)
instance FromJSON GuildUnavailable where
parseJSON = withObject "GuildUnavailable" $ \o ->
GuildUnavailable <$> o .: "id"
data GuildInfo = GuildInfo
{ guildJoinedAt :: UTCTime
, guildLarge :: Bool
, guildMemberCount :: Integer
, guildMembers :: [GuildMember]
, guildChannels :: [Channel]
} deriving (Show, Eq, Ord)
instance FromJSON GuildInfo where
parseJSON = withObject "GuildInfo" $ \o ->
GuildInfo <$> o .: "joined_at"
<*> o .: "large"
<*> o .: "member_count"
<*> o .: "members"
<*> o .: "channels"
data PartialGuild = PartialGuild
{ partialGuildId :: GuildId
, partialGuildName :: T.Text
, partialGuildIcon :: Maybe T.Text
, partialGuildOwner :: Bool
, partialGuildPermissions :: Integer
} deriving (Show, Eq, Ord)
instance FromJSON PartialGuild where
parseJSON = withObject "PartialGuild" $ \o ->
PartialGuild <$> o .: "id"
<*> o .: "name"
<*> o .:? "icon"
<*> o .:? "owner" .!= False
<*> o .: "permissions"
data Emoji = Emoji
{ emojiId :: Maybe EmojiId
, emojiName :: T.Text
, emojiRoles :: Maybe [RoleId]
, emojiUser :: Maybe User
, emojiManaged :: Maybe Bool
} deriving (Show, Eq, Ord)
instance FromJSON Emoji where
parseJSON = withObject "Emoji" $ \o ->
Emoji <$> o .: "id"
<*> o .: "name"
<*> o .:? "roles"
<*> o .:? "user"
<*> o .:? "managed"
data Role =
Role {
roleId :: RoleId
, roleName :: T.Text
, roleColor :: Integer
, roleHoist :: Bool
, rolePos :: Integer
, rolePerms :: Integer
, roleManaged :: Bool
, roleMention :: Bool
} deriving (Show, Eq, Ord)
instance FromJSON Role where
parseJSON = withObject "Role" $ \o ->
Role <$> o .: "id"
<*> o .: "name"
<*> o .: "color"
<*> o .: "hoist"
<*> o .: "position"
<*> o .: "permissions"
<*> o .: "managed"
<*> o .: "mentionable"
data VoiceRegion = VoiceRegion
{ voiceRegionId :: T.Text
, voiceRegionName :: T.Text
, voiceRegionVip :: Bool
, voiceRegionOptimal :: Bool
, voiceRegionDeprecated :: Bool
, voiceRegionCustom :: Bool
} deriving (Show, Eq, Ord)
instance FromJSON VoiceRegion where
parseJSON = withObject "VoiceRegion" $ \o ->
VoiceRegion <$> o .: "id"
<*> o .: "name"
<*> o .: "vip"
<*> o .: "optimal"
<*> o .: "deprecated"
<*> o .: "custom"
data GuildBan = GuildBan
{ guildBanReason :: T.Text
, guildBanUser :: User
} deriving (Show, Eq, Ord)
instance FromJSON GuildBan where
parseJSON = withObject "GuildBan" $ \o -> GuildBan <$> o .: "reason" <*> o .: "user"
data Invite = Invite
{ inviteCode :: T.Text
, inviteGuildId :: Maybe GuildId
, inviteChannelId :: ChannelId
} deriving (Show, Eq, Ord)
instance FromJSON Invite where
parseJSON = withObject "Invite" $ \o ->
Invite <$> o .: "code"
<*> (do g <- o .:? "guild"
case g of Just g2 -> g2 .: "id"
Nothing -> pure Nothing)
<*> ((o .: "channel") >>= (.: "id"))
data InviteWithMeta = InviteWithMeta Invite InviteMeta
instance FromJSON InviteWithMeta where
parseJSON ob = InviteWithMeta <$> parseJSON ob <*> parseJSON ob
data InviteMeta = InviteMeta
{ inviteCreator :: User
, inviteUses :: Integer
, inviteMax :: Integer
, inviteAge :: Integer
, inviteTemp :: Bool
, inviteCreated :: UTCTime
, inviteRevoked :: Bool
} deriving (Show, Eq, Ord)
instance FromJSON InviteMeta where
parseJSON = withObject "InviteMeta" $ \o ->
InviteMeta <$> o .: "inviter"
<*> o .: "uses"
<*> o .: "max_uses"
<*> o .: "max_age"
<*> o .: "temporary"
<*> o .: "created_at"
<*> o .: "revoked"
data Integration = Integration
{ integrationId :: !Snowflake
, integrationName :: T.Text
, integrationType :: T.Text
, integrationEnabled :: Bool
, integrationSyncing :: Bool
, integrationRole :: RoleId
, integrationBehavior :: Integer
, integrationGrace :: Integer
, integrationOwner :: User
, integrationAccount :: IntegrationAccount
, integrationSync :: UTCTime
} deriving (Show, Eq, Ord)
instance FromJSON Integration where
parseJSON = withObject "Integration" $ \o ->
Integration <$> o .: "id"
<*> o .: "name"
<*> o .: "type"
<*> o .: "enabled"
<*> o .: "syncing"
<*> o .: "role_id"
<*> o .: "expire_behavior"
<*> o .: "expire_grace_period"
<*> o .: "user"
<*> o .: "account"
<*> o .: "synced_at"
data IntegrationAccount = IntegrationAccount
{ accountId :: T.Text
, accountName :: T.Text
} deriving (Show, Eq, Ord)
instance FromJSON IntegrationAccount where
parseJSON = withObject "IntegrationAccount" $ \o ->
IntegrationAccount <$> o .: "id" <*> o .: "name"
data GuildEmbed = GuildEmbed
{ embedEnabled :: Bool
, embedChannel :: ChannelId
} deriving (Show, Eq, Ord)
instance FromJSON GuildEmbed where
parseJSON = withObject "GuildEmbed" $ \o ->
GuildEmbed <$> o .: "enabled" <*> o .: "snowflake"
instance ToJSON GuildEmbed where
toJSON (GuildEmbed enabled snowflake) = object
[ "enabled" .= enabled
, "snowflake" .= snowflake
]