diff --git a/src/Internal/Api/Main.elm b/src/Internal/Api/Main.elm index 5999d5b..76baebb 100644 --- a/src/Internal/Api/Main.elm +++ b/src/Internal/Api/Main.elm @@ -1,6 +1,6 @@ module Internal.Api.Main exposing ( Msg - , sendMessageEvent, sendStateEvent, setRoomAccountData, sync + , sendMessageEvent, sendStateEvent, setAccountData, setRoomAccountData, sync ) {-| @@ -18,7 +18,7 @@ This module is used as reference for getting ## Actions -@docs sendMessageEvent, sendStateEvent, setRoomAccountData, sync +@docs sendMessageEvent, sendStateEvent, setAccountData, setRoomAccountData, sync -} @@ -86,6 +86,33 @@ sendStateEvent env data = (Context.apiFormat env.context) +{-| Set global account data. +-} +setAccountData : + E.Envelope a + -> + { content : Json.Value + , eventType : String + , toMsg : Msg -> msg + } + -> Cmd msg +setAccountData env data = + case env.context.user of + Just u -> + ITask.run + data.toMsg + (ITask.setAccountData + { content = data.content + , eventType = data.eventType + , userId = User.toString u + } + ) + (Context.apiFormat env.context) + + Nothing -> + Cmd.none + + {-| Set the account data for a Matrix room. -} setRoomAccountData : diff --git a/src/Internal/Api/SetAccountData/Api.elm b/src/Internal/Api/SetAccountData/Api.elm new file mode 100644 index 0000000..32eabe7 --- /dev/null +++ b/src/Internal/Api/SetAccountData/Api.elm @@ -0,0 +1,108 @@ +module Internal.Api.SetAccountData.Api exposing (Phantom, setAccountData) + +{-| + + +# Set Account Data + +This module allows the developer to set global account data. + +@docs Phantom, setAccountData + +-} + +import Internal.Api.Api as A +import Internal.Api.Invite.Api exposing (Phantom) +import Internal.Api.Request as R +import Internal.Config.Log exposing (log) +import Internal.Config.Text as Text +import Internal.Tools.Json as Json +import Internal.Values.Envelope as E +import Internal.Values.Room as R +import Internal.Values.Vault as V + + +setAccountData : SetAccountDataInput -> A.TaskChain (Phantom a) (Phantom a) +setAccountData = + A.startWithVersion "r0.0.0" setAccountDataV1 + |> A.sameForVersion "r0.0.1" + |> A.sameForVersion "r0.1.0" + |> A.sameForVersion "r0.2.0" + |> A.sameForVersion "r0.3.0" + |> A.sameForVersion "r0.4.0" + |> A.sameForVersion "r0.5.0" + |> A.sameForVersion "r0.6.0" + |> A.sameForVersion "r0.6.1" + |> A.forVersion "v1.1" setAccountDataV2 + |> A.sameForVersion "v1.2" + |> A.sameForVersion "v1.3" + |> A.sameForVersion "v1.4" + |> A.sameForVersion "v1.5" + |> A.sameForVersion "v1.6" + |> A.sameForVersion "v1.7" + |> A.sameForVersion "v1.8" + |> A.sameForVersion "v1.9" + |> A.sameForVersion "v1.10" + |> A.sameForVersion "v1.11" + |> A.versionChain + + +{-| Context needed for setting global account data. +-} +type alias Phantom a = + { a | accessToken : (), baseUrl : (), versions : () } + + +type alias PhantomV1 a = + { a | accessToken : (), baseUrl : () } + + +type alias SetAccountDataInput = + { content : Json.Value, eventType : String, userId : String } + + +type alias SetAccountDataInputV1 a = + { a | content : Json.Value, eventType : String, userId : String } + + +type alias SetAccountDataOutput = + () + + +setAccountDataV1 : SetAccountDataInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a) +setAccountDataV1 { content, eventType, userId } = + A.request + { attributes = [ R.accessToken, R.fullBody content ] + , coder = coderV1 + , contextChange = always identity + , method = "PUT" + , path = [ "_matrix", "client", "r0", "user", userId, "account_data", eventType ] + , toUpdate = + \() -> + ( V.SetAccountData eventType content + |> E.ContentUpdate + , [] + ) + } + + +setAccountDataV2 : SetAccountDataInputV1 i -> A.TaskChain (PhantomV1 a) (PhantomV1 a) +setAccountDataV2 { content, eventType, userId } = + A.request + { attributes = [ R.accessToken, R.fullBody content ] + , coder = coderV1 + , contextChange = always identity + , method = "PUT" + , path = [ "_matrix", "client", "v3", "user", userId, "account_data", eventType ] + , toUpdate = + \() -> + ( V.SetAccountData eventType content + |> E.ContentUpdate + , [] + ) + } + + +coderV1 : Json.Coder SetAccountDataOutput +coderV1 = + Json.unit diff --git a/src/Internal/Api/Task.elm b/src/Internal/Api/Task.elm index 9ecb948..deb1585 100644 --- a/src/Internal/Api/Task.elm +++ b/src/Internal/Api/Task.elm @@ -1,6 +1,6 @@ module Internal.Api.Task exposing ( Task, run, Backpack - , sendMessageEvent, sendStateEvent, setRoomAccountData, sync + , sendMessageEvent, sendStateEvent, setAccountData, setRoomAccountData, sync ) {-| @@ -23,7 +23,7 @@ up-to-date. ## Tasks -@docs sendMessageEvent, sendStateEvent, setRoomAccountData, sync +@docs sendMessageEvent, sendStateEvent, setAccountData, setRoomAccountData, sync -} @@ -34,6 +34,7 @@ import Internal.Api.Now.Api import Internal.Api.Request as Request import Internal.Api.SendMessageEvent.Api import Internal.Api.SendStateEvent.Api +import Internal.Api.SetAccountData.Api import Internal.Api.SetRoomAccountData.Api import Internal.Api.Sync.Api import Internal.Api.Versions.Api @@ -243,6 +244,15 @@ sendStateEvent input = |> finishTask +{-| Set global account data. +-} +setAccountData : { content : Json.Value, eventType : String, userId : String } -> Task +setAccountData input = + makeVBA + |> C.andThen (Internal.Api.SetAccountData.Api.setAccountData input) + |> finishTask + + {-| Set account data for a Matrix room. -} setRoomAccountData : { content : Json.Value, eventType : String, roomId : String, userId : String } -> Task diff --git a/src/Matrix.elm b/src/Matrix.elm index e9dcd89..7ea641a 100644 --- a/src/Matrix.elm +++ b/src/Matrix.elm @@ -2,6 +2,7 @@ module Matrix exposing ( Vault, fromUserId, fromUsername , VaultUpdate, update, sync, logs , rooms, fromRoomId + , getAccountData, setAccountData , addAccessToken, sendMessageEvent ) @@ -33,6 +34,11 @@ support a monolithic public registry. (: @docs rooms, fromRoomId +## Account data + +@docs getAccountData, setAccountData + + ## Debugging @docs addAccessToken, sendMessageEvent @@ -80,6 +86,13 @@ fromRoomId roomId (Vault vault) = |> Maybe.map Types.Room +{-| Get global account data. +-} +getAccountData : String -> Vault -> Maybe E.Value +getAccountData key (Vault vault) = + Envelope.extract (Internal.getAccountData key) vault + + {-| Use a fully-fledged Matrix ID to connect. case Matrix.fromUserId "@alice:example.org" of @@ -199,6 +212,25 @@ sendMessageEvent data = } +{-| Set global account data. +-} +setAccountData : + { content : E.Value + , eventType : String + , room : Vault + , toMsg : Types.VaultUpdate -> msg + } + -> Cmd msg +setAccountData data = + case data.room of + Vault vault -> + Api.setAccountData vault + { content = data.content + , eventType = data.eventType + , toMsg = Types.VaultUpdate >> data.toMsg + } + + {-| Synchronize the Vault with the Matrix API. Effectively, this task asks the Matrix API to provide the latest information,