module Network.Discord.Types.Guild where
import Data.Time.Clock
import Data.Aeson
import Control.Applicative ((<|>))
import Control.Monad (mzero)
import Network.Discord.Types.Channel
import Network.Discord.Types.Prelude
data Member = GuildMember !Snowflake User
| MemberShort User (Maybe String) ![Snowflake]
deriving Show
instance FromJSON Member where
parseJSON (Object o) =
GuildMember <$> o .: "guild_id" <*> o .: "user"
parseJSON _ = mzero
data Guild
= Guild
{ guildId :: !Snowflake
, guildName :: String
, guildIcon :: String
, guildSplash :: String
, guildOwner :: !Snowflake
, guildRegion :: String
, guildAfkId :: !Snowflake
, guildAfkTimeout :: !Integer
, guildEmbedEnabled :: !Bool
, guildEmbedChannel :: !Snowflake
, guildVerification :: !Integer
, guildNotification :: !Integer
, guildRoles :: [Role]
, guildEmojis :: [Emoji]
}
| Unavailable
{ guildId :: !Snowflake
} deriving Show
instance FromJSON Guild where
parseJSON (Object o) = do
short <- o .:? "unavailable" .!= False
if short
then Unavailable <$> o .: "id"
else
Guild <$> o .: "id"
<*> o .: "name"
<*> o .:? "icon" .!= ""
<*> o .:? "hash" .!= ""
<*> o .: "owner_id"
<*> o .: "region"
<*> o .:? "afk_channel_id" .!= 0
<*> o .:? "afk_timeout" .!= 0
<*> o .:? "embed_enabled" .!= False
<*> o .:? "embed_channel_id" .!= 0
<*> o .: "verification_level"
<*> o .: "default_message_notifications"
<*> o .: "roles"
<*> o .: "emojis"
parseJSON _ = mzero
data Emoji = Emoji
{ emojiId :: !Snowflake
, emojiName :: String
, emojiRoles :: ![Snowflake]
, emojiManaged :: !Bool
} deriving (Show)
instance FromJSON Emoji where
parseJSON (Object o) =
Emoji <$> o .: "id"
<*> o .: "name"
<*> o .: "roles"
<*> o .: "managed"
parseJSON _ = mzero
data Role =
Role {
roleID :: !Snowflake
, roleName :: String
, roleColor :: Integer
, roleHoist :: Bool
, rolePos :: Integer
, rolePerms :: Integer
, roleManaged :: Bool
, roleMention :: Bool
} deriving (Show, Eq)
instance FromJSON Role where
parseJSON (Object o) = Role
<$> o .: "id"
<*> o .: "name"
<*> o .: "color"
<*> o .: "hoist"
<*> o .: "position"
<*> o .: "permissions"
<*> o .: "managed"
<*> o .: "mentionable"
parseJSON _ = mzero
data VoiceRegion =
VoiceRegion
{ regionId :: !Snowflake
, regionName :: String
, regionHostname :: String
, regionPort :: Int
, regionVip :: Bool
, regionOptimal :: Bool
, regionDepreciated :: Bool
, regionCustom :: Bool
} deriving (Show)
instance FromJSON VoiceRegion where
parseJSON (Object o) = VoiceRegion
<$> o .: "id"
<*> o .: "name"
<*> o .: "sample_hostname"
<*> o .: "sample_port"
<*> o .: "vip"
<*> o .: "optimal"
<*> o .: "deprecated"
<*> o .: "custom"
parseJSON _ = mzero
data Invite =
Invite {
inviteCode :: String
, inviteGuild :: !Snowflake
, inviteChan :: !Snowflake
}
| InviteLong Invite InviteMeta
instance FromJSON Invite where
parseJSON ob@(Object o) =
InviteLong <$> parseJSON ob <*> parseJSON ob
<|> Invite
<$> o .: "code"
<*> ((o .: "guild") >>= (.: "id"))
<*> ((o .: "channel") >>= (.: "id"))
parseJSON _ = mzero
data InviteMeta =
InviteMeta {
inviteCreator :: User
, inviteUses :: Integer
, inviteMax :: Integer
, inviteAge :: Integer
, inviteTemp :: Bool
, inviteCreated :: UTCTime
, inviteRevoked :: Bool
}
instance FromJSON InviteMeta where
parseJSON (Object o) = InviteMeta
<$> o .: "inviter"
<*> o .: "uses"
<*> o .: "max_uses"
<*> o .: "max_age"
<*> o .: "temporary"
<*> o .: "created_at"
<*> o .: "revoked"
parseJSON _ = mzero
data Integration =
Integration
{ integrationId :: !Snowflake
, integrationName :: String
, integrationType :: String
, integrationEnabled :: Bool
, integrationSyncing :: Bool
, integrationRole :: Snowflake
, integrationBehavior :: Integer
, integrationGrace :: Integer
, integrationOwner :: User
, integrationAccount :: IntegrationAccount
, integrationSync :: UTCTime
} deriving (Show)
instance FromJSON Integration where
parseJSON (Object 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"
parseJSON _ = mzero
data IntegrationAccount =
Account
{ accountId :: String
, accountName :: String
} deriving (Show)
instance FromJSON IntegrationAccount where
parseJSON (Object o) = Account
<$> o .: "id"
<*> o .: "name"
parseJSON _ = mzero
data GuildEmbed =
GuildEmbed
{ embedEnabled :: !Bool
, embedChannel :: !Snowflake
}
instance FromJSON GuildEmbed where
parseJSON (Object o) = GuildEmbed
<$> o .: "enabled"
<*> o .: "snowflake"
parseJSON _ = mzero
instance ToJSON GuildEmbed where
toJSON (GuildEmbed enabled snowflake) = object
[ "enabled" .= enabled
, "snowflake" .= snowflake
]