diff options
| author | adambrangenberg <adabran06@gmail.com> | 2025-12-24 05:09:27 +0100 |
|---|---|---|
| committer | adambrangenberg <adabran06@gmail.com> | 2025-12-24 05:11:14 +0100 |
| commit | 3e2060422ed51096fc71148c55c47d5767593846 (patch) | |
| tree | e73102ce5b43938b36941f1ad84807d548fd0b02 /src | |
| parent | 34cba7d0f9faffe7b97692ccc6b3402fced63cbb (diff) | |
Section 5: Capabilities complete
Diffstat (limited to 'src')
| -rw-r--r-- | src/Endpoints/CapabilitiesEndpoint.hs | 31 | ||||
| -rw-r--r-- | src/Model/Capabilities.hs | 61 |
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 + } |