aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoradambrangenberg <adabran06@gmail.com>2025-12-24 05:09:27 +0100
committeradambrangenberg <adabran06@gmail.com>2025-12-24 05:11:14 +0100
commit3e2060422ed51096fc71148c55c47d5767593846 (patch)
treee73102ce5b43938b36941f1ad84807d548fd0b02 /src
parent34cba7d0f9faffe7b97692ccc6b3402fced63cbb (diff)
Section 5: Capabilities complete
Diffstat (limited to 'src')
-rw-r--r--src/Endpoints/CapabilitiesEndpoint.hs31
-rw-r--r--src/Model/Capabilities.hs61
2 files changed, 92 insertions, 0 deletions
diff --git a/src/Endpoints/CapabilitiesEndpoint.hs b/src/Endpoints/CapabilitiesEndpoint.hs
new file mode 100644
index 0000000..92fefba
--- /dev/null
+++ b/src/Endpoints/CapabilitiesEndpoint.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module Endpoints.CapabilitiesEndpoint (CapabilitiesAPI, capabilitiesServer) where
+
+import Servant
+import qualified Data.Map as Map
+
+import Model.Capabilities
+
+----------------------------------------------------------------------------------------------------
+type CapabilitiesAPI = GetCapabilities
+
+capabilitiesServer :: Server CapabilitiesAPI
+capabilitiesServer = handleCapabilitiesGet
+
+--- GET /_matrix/client/v3/capabilities ------------------------------------------------------------
+type GetCapabilities = "_matrix" :> "client" :> "v3" :> "capabilities"
+ :> Get '[JSON] CapabilitiesResponse
+
+handleCapabilitiesGet :: Handler CapabilitiesResponse
+handleCapabilitiesGet = return $ CapabilitiesResponse
+ { pid_changes = BooleanCapability False
+ , change_password = BooleanCapability False
+ , get_login_token = BooleanCapability False
+ , profile_fields = ProfileFieldsCapability False Nothing Nothing
+ , room_versions = RoomVersionsCapability "12" $ Map.singleton "12" "stable"
+ , set_avatar_url = BooleanCapability False
+ , set_display_name = BooleanCapability False
+ }
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
+ }