Add functionality to join rooms by their id

pull/1/head
Bram van den Heuvel 2023-03-14 23:04:42 +01:00
parent 27b3fc562e
commit 45142509d3
6 changed files with 128 additions and 16 deletions

View File

@ -0,0 +1,40 @@
module Internal.Api.JoinRoomById.Api exposing (..)
import Internal.Api.Request as R
import Internal.Tools.Context exposing (Context, VBA)
import Internal.Tools.Exceptions as X
import Json.Decode as D
import Task exposing (Task)
type alias JoinRoomByIdInputV1 =
{ roomId : String }
type alias JoinRoomByIdInputV2 =
{ roomId : String, reason : Maybe String }
type alias JoinRoomByIdOutputV1 =
{ roomId : String }
joinRoomByIdV1 : JoinRoomByIdInputV1 -> Context (VBA a) -> Task X.Error JoinRoomByIdOutputV1
joinRoomByIdV1 { roomId } =
R.callApi "POST" "/_matrix/client/r0/rooms/{roomId}/join"
>> R.withAttributes
[ R.accessToken
, R.replaceInUrl "roomId" roomId
]
>> R.toTask (D.map (\r -> { roomId = r }) (D.field "room_id" D.string))
joinRoomByIdV2 : JoinRoomByIdInputV2 -> Context (VBA a) -> Task X.Error JoinRoomByIdOutputV1
joinRoomByIdV2 { roomId, reason } =
R.callApi "POST" "/_matrix/client/v3/rooms/{roomId}/join"
>> R.withAttributes
[ R.accessToken
, R.replaceInUrl "roomId" roomId
, R.bodyOpString "reason" reason
]
>> R.toTask (D.map (\r -> { roomId = r }) (D.field "room_id" D.string))

View File

@ -0,0 +1,45 @@
module Internal.Api.JoinRoomById.Main exposing (..)
import Internal.Api.JoinRoomById.Api as Api
import Internal.Tools.Context as Context exposing (Context, VBA)
import Internal.Tools.Exceptions as X
import Internal.Tools.VersionControl as VC
import Task exposing (Task)
joinRoomById : Context (VBA a) -> JoinRoomByIdInput -> Task X.Error JoinRoomByIdOutput
joinRoomById context input =
VC.withBottomLayer
{ current = Api.joinRoomByIdV1
, version = "r0.0.0"
}
|> VC.sameForVersion "r0.0.1"
|> VC.sameForVersion "r0.1.0"
|> VC.sameForVersion "r0.2.0"
|> VC.sameForVersion "r0.3.0"
|> VC.sameForVersion "r0.4.0"
|> VC.sameForVersion "r0.5.0"
|> VC.sameForVersion "r0.6.0"
|> VC.sameForVersion "r0.6.1"
|> VC.addMiddleLayer
{ downcast = \data -> { roomId = data.roomId }
, current = Api.joinRoomByIdV2
, upcast = identity
, version = "v1.1"
}
|> VC.sameForVersion "v1.2"
|> VC.sameForVersion "v1.3"
|> VC.sameForVersion "v1.4"
|> VC.sameForVersion "v1.5"
|> VC.mostRecentFromVersionList (Context.getVersions context)
|> Maybe.withDefault (always <| always <| Task.fail X.UnsupportedSpecVersion)
|> (|>) input
|> (|>) context
type alias JoinRoomByIdInput =
Api.JoinRoomByIdInputV2
type alias JoinRoomByIdOutput =
Api.JoinRoomByIdOutputV1

View File

@ -41,20 +41,20 @@ Note that **under development** doesn't always mean that it _will be_ supported.
| **Spec version** | | Inviting | Joining room id |
| ---------------- | - | -------- | --------------- |
| v1.6 || ⚠️ | ⚠️ |
| v1.5 || ✔️ | |
| v1.4 || ✔️ | |
| v1.3 || ✔️ | |
| v1.2 || ✔️ | |
| v1.1 || ✔️ | |
| r0.6.1 || ✔️ | |
| r0.6.0 || ✔️ | |
| r0.5.0 || ✔️ | |
| r0.4.0 || ✔️ | |
| r0.3.0 || ✔️ | |
| r0.2.0 || ✔️ | |
| r0.1.0 || ✔️ | |
| r0.0.1 || ✔️ | |
| r0.0.0 || ✔️ | |
| v1.5 || ✔️ | |
| v1.4 || ✔️ | |
| v1.3 || ✔️ | |
| v1.2 || ✔️ | |
| v1.1 || ✔️ | |
| r0.6.1 || ✔️ | |
| r0.6.0 || ✔️ | |
| r0.5.0 || ✔️ | |
| r0.4.0 || ✔️ | |
| r0.3.0 || ✔️ | |
| r0.2.0 || ✔️ | |
| r0.1.0 || ✔️ | |
| r0.0.1 || ✔️ | |
| r0.0.0 || ✔️ | |
## Getting events for a room

View File

@ -8,6 +8,7 @@ import Internal.Api.Chain as Chain
import Internal.Api.Credentials as Cred exposing (Credentials)
import Internal.Api.GetEvent.Main exposing (EventInput)
import Internal.Api.Invite.Main exposing (InviteInput)
import Internal.Api.JoinRoomById.Main exposing (JoinRoomByIdInput)
import Internal.Api.JoinedMembers.Main exposing (JoinedMembersInput)
import Internal.Api.SendStateKey.Main exposing (SendStateKeyInput)
import Internal.Api.Sync.Main exposing (SyncInput)
@ -47,6 +48,13 @@ joinedMembers data cred =
|> C.toTask
joinRoomById : JoinRoomByIdInput -> Credentials -> FutureTask
joinRoomById data cred =
C.makeVBA cred
|> Chain.andThen (C.joinRoomById data)
|> C.toTask
type alias RedactInput =
{ eventId : String
, extraTransactionNoise : String

View File

@ -4,6 +4,7 @@ import Internal.Api.Chain as Chain exposing (IdemChain, TaskChain)
import Internal.Api.Credentials as Credentials exposing (Credentials)
import Internal.Api.GetEvent.Main as GetEvent
import Internal.Api.Invite.Main as Invite
import Internal.Api.JoinRoomById.Main as JoinRoomById
import Internal.Api.JoinedMembers.Main as JoinedMembers
import Internal.Api.LoginWithUsernameAndPassword.Main as LoginWithUsernameAndPassword
import Internal.Api.Redact.Main as Redact
@ -25,6 +26,7 @@ type VaultUpdate
| GetEvent GetEvent.EventInput GetEvent.EventOutput
| InviteSent Invite.InviteInput Invite.InviteOutput
| JoinedMembersToRoom JoinedMembers.JoinedMembersInput JoinedMembers.JoinedMembersOutput
| JoinedRoom JoinRoomById.JoinRoomByIdInput JoinRoomById.JoinRoomByIdOutput
| LoggedInWithUsernameAndPassword LoginWithUsernameAndPassword.LoginWithUsernameAndPasswordInput LoginWithUsernameAndPassword.LoginWithUsernameAndPasswordOutput
| MessageEventSent SendMessageEvent.SendMessageEventInput SendMessageEvent.SendMessageEventOutput
| RedactedEvent Redact.RedactInput Redact.RedactOutput
@ -150,6 +152,19 @@ joinedMembers input =
input
joinRoomById : JoinRoomById.JoinRoomByIdInput -> IdemChain VaultUpdate (VBA a)
joinRoomById input =
toChain
(\output ->
Chain.TaskChainPiece
{ contextChange = identity
, messages = [ JoinedRoom input output ]
}
)
JoinRoomById.joinRoomById
input
loginWithUsernameAndPassword : LoginWithUsernameAndPassword.LoginWithUsernameAndPasswordInput -> TaskChain VaultUpdate (VB a) (VBA a)
loginWithUsernameAndPassword input =
toChain

View File

@ -111,9 +111,14 @@ updateWith vaultUpdate ((Vault ({ cred, context } as data)) as credentials) =
InviteSent _ _ ->
credentials
-- TODO
JoinedMembersToRoom _ _ ->
credentials
-- TODO
JoinedRoom _ _ ->
credentials
-- TODO
MessageEventSent _ _ ->
credentials
@ -126,7 +131,6 @@ updateWith vaultUpdate ((Vault ({ cred, context } as data)) as credentials) =
StateEventSent _ _ ->
credentials
-- TODO
SyncUpdate input output ->
let
jRooms : List IRoom.IRoom
@ -186,7 +190,7 @@ updateWith vaultUpdate ((Vault ({ cred, context } as data)) as credentials) =
UpdateVersions versions ->
Vault { data | context = Credentials.addVersions versions context }
-- TODO: Save all info
-- TODO: Save ALL info
LoggedInWithUsernameAndPassword _ output ->
Vault { data | context = Credentials.addToken output.accessToken context }