aboutsummaryrefslogtreecommitdiff
path: root/src/Model
diff options
context:
space:
mode:
Diffstat (limited to 'src/Model')
-rw-r--r--src/Model/Capabilities.hs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/Model/Capabilities.hs b/src/Model/Capabilities.hs
new file mode 100644
index 0000000..f6ab372
--- /dev/null
+++ b/src/Model/Capabilities.hs
@@ -0,0 +1,61 @@
+{-# 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
+ }