{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-} module Model.Capabilities (CapabilitiesResponse (..) , BooleanCapability (..) , ProfileFieldsCapability (..) , RoomVersionsCapability (..) ) where import Data.Aeson import GHC.Generics (Generic) import Data.Text (Text) import Data.Map import Util (Normalisable(..)) ---------------------------------------------------------------------------------------------------- data BooleanCapability = BooleanCapability { enabled :: Bool } deriving (Eq, Show, Generic) instance ToJSON BooleanCapability data ProfileFieldsCapability = ProfileFieldsCapability { enabled :: Bool , allowed :: Maybe [Text] , disallowed :: Maybe [Text] } deriving (Eq, Show, Generic) instance ToJSON ProfileFieldsCapability data RoomVersionsCapability = RoomVersionsCapability { default' :: Text , available :: Map Text Text } deriving (Eq, Show, Generic) instance ToJSON RoomVersionsCapability where toJSON = genericToJSON defaultOptions { fieldLabelModifier = normaliseVariant } data CapabilitiesResponse = CapabilitiesResponse { pid_changes :: BooleanCapability , change_password :: BooleanCapability , get_login_token :: BooleanCapability , profile_fields :: ProfileFieldsCapability , room_versions :: RoomVersionsCapability , set_avatar_url :: BooleanCapability , set_display_name :: BooleanCapability } deriving (Eq, Show, Generic) instance ToJSON CapabilitiesResponse where toJSON = genericToJSON defaultOptions { fieldLabelModifier = \name -> case name of "pid_changes" -> "m.3pid_changes" "change_password" -> "m.change_password" "get_login_token" -> "m.get_login_token" "profile_fields" -> "m.profile_fields" "room_versions" -> "m.room_versions" "set_avatar_url" -> "m.set_avatar_url" "set_display_name" -> "m.set_displayname" other -> other }