Add invite sending

pull/1/head
Bram van den Heuvel 2023-03-07 14:10:47 +01:00
parent dc39036162
commit bd73b97e93
7 changed files with 185 additions and 4 deletions

View File

@ -2,6 +2,7 @@ module Internal.Api.All exposing (..)
import Hash import Hash
import Internal.Api.GetEvent.Main as GetEvent import Internal.Api.GetEvent.Main as GetEvent
import Internal.Api.Invite.Main as Invite
import Internal.Api.JoinedMembers.Main as JoinedMembers import Internal.Api.JoinedMembers.Main as JoinedMembers
import Internal.Api.PreApi.Main as PreApi import Internal.Api.PreApi.Main as PreApi
import Internal.Api.PreApi.Objects.Versions as V import Internal.Api.PreApi.Objects.Versions as V
@ -21,6 +22,7 @@ type CredUpdate
= MultipleUpdates (List CredUpdate) = MultipleUpdates (List CredUpdate)
-- Updates as a result of API calls -- Updates as a result of API calls
| GetEvent GetEvent.EventInput GetEvent.EventOutput | GetEvent GetEvent.EventInput GetEvent.EventOutput
| InviteSent Invite.InviteInput Invite.InviteOutput
| JoinedMembersToRoom JoinedMembers.JoinedMembersInput JoinedMembers.JoinedMembersOutput | JoinedMembersToRoom JoinedMembers.JoinedMembersInput JoinedMembers.JoinedMembersOutput
| MessageEventSent SendMessageEvent.SendMessageEventInput SendMessageEvent.SendMessageEventOutput | MessageEventSent SendMessageEvent.SendMessageEventInput SendMessageEvent.SendMessageEventOutput
| RedactedEvent Redact.RedactInput Redact.RedactOutput | RedactedEvent Redact.RedactInput Redact.RedactOutput
@ -72,6 +74,44 @@ getEvent data =
(PreApi.accessToken data.baseUrl data.accessToken) (PreApi.accessToken data.baseUrl data.accessToken)
(PreApi.versions data.baseUrl data.versions) (PreApi.versions data.baseUrl data.versions)
type alias InviteInput =
{ accessToken : AccessToken
, baseUrl : String
, reason : Maybe String
, roomId : String
, userId : String
, versions : Maybe V.Versions
}
{-| Send an invite to join a room.
-}
invite : InviteInput -> Future CredUpdate
invite data =
VG.withInfo2
(\accessToken versions ->
let
input : Invite.InviteInput
input =
{ accessToken = accessToken
, baseUrl = data.baseUrl
, reason = data.reason
, roomId = data.roomId
, userId = data.userId
}
in
Invite.invite versions.versions input
|> Task.map
(\output ->
MultipleUpdates
[ InviteSent input output
, UpdateAccessToken accessToken
, UpdateVersions versions
]
)
)
(PreApi.accessToken data.baseUrl data.accessToken)
(PreApi.versions data.baseUrl data.versions)
type alias JoinedMembersInput = type alias JoinedMembersInput =
{ accessToken : AccessToken { accessToken : AccessToken

View File

@ -0,0 +1,60 @@
module Internal.Api.Invite.Api exposing (..)
import Internal.Api.Request as R
import Internal.Tools.Exceptions as X
import Json.Decode as D
import Task exposing (Task)
type alias InviteInputV1 =
{ accessToken : String
, baseUrl : String
, roomId : String
, userId : String
}
type alias InviteInputV2 =
{ accessToken : String
, baseUrl : String
, reason : Maybe String
, roomId : String
, userId : String
}
type alias InviteOutputV1 = ()
inviteV1 : InviteInputV1 -> Task X.Error InviteOutputV1
inviteV1 data =
R.rawApiCall
{ headers = R.WithAccessToken data.accessToken
, method = "POST"
, baseUrl = data.baseUrl
, path = "/_matrix/client/r0/rooms/{roomId}/invite"
, pathParams =
[ ( "roomId", data.roomId )
]
, queryParams = []
, bodyParams =
[ R.RequiredString "user_id" data.userId
]
, timeout = Nothing
, decoder = always (D.map (always ()) D.value)
}
inviteV2 : InviteInputV2 -> Task X.Error InviteOutputV1
inviteV2 data =
R.rawApiCall
{ headers = R.WithAccessToken data.accessToken
, method = "POST"
, baseUrl = data.baseUrl
, path = "/_matrix/client/r0/rooms/{roomId}/invite"
, pathParams =
[ ( "roomId", data.roomId )
]
, queryParams = []
, bodyParams =
[ R.RequiredString "user_id" data.userId
, R.OptionalString "reason" data.reason
]
, timeout = Nothing
, decoder = always (D.map (always ()) D.value)
}

View File

@ -0,0 +1,47 @@
module Internal.Api.Invite.Main exposing (..)
import Internal.Api.Invite.Api as Api
import Internal.Tools.Exceptions as X
import Internal.Tools.VersionControl as VC
import Task exposing (Task)
invite : List String -> InviteInput -> Task X.Error InviteOutput
invite versions =
VC.withBottomLayer
{ current = Api.inviteV1
, 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 ->
{ accessToken = data.accessToken
, baseUrl = data.baseUrl
, roomId = data.roomId
, userId = data.userId
}
)
, current = Api.inviteV2
, upcast = identity
, version = "v1.1"
}
|> VC.sameForVersion "v1.2"
|> VC.sameForVersion "v1.3"
|> VC.sameForVersion "v1.4"
|> VC.sameForVersion "v1.5"
|> VC.mostRecentFromVersionList versions
|> Maybe.withDefault (always <| Task.fail X.UnsupportedSpecVersion)
type alias InviteInput =
Api.InviteInputV2
type alias InviteOutput =
Api.InviteOutputV1

View File

@ -36,9 +36,29 @@ Note that **under development** doesn't always mean that it _will be_ supported.
| r0.0.1 || ❌ | ✔️ | | r0.0.1 || ❌ | ✔️ |
| r0.0.0 || ❌ | ✔️ | | r0.0.0 || ❌ | ✔️ |
## Changing room member status
| **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 || ✔️ | ⚠️ |
## Getting events for a room ## Getting events for a room
| **Spec version** | | Event | Joined members | Members | Curren state | State event | Event at timestamp | | **Spec version** | | Event | Joined members | Members | Current state | State event | Event at timestamp |
| ---------------- | - | ----- | -------------- | ------- | ------------ | ----------- | ------------------ | | ---------------- | - | ----- | -------------- | ------- | ------------ | ----------- | ------------------ |
| v1.6 || ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | | v1.6 || ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ | ⚠️ |
| v1.5 || ✔️ | ✔️ | ⚡ | ⚡ | ⚡ | ⛔ | | v1.5 || ✔️ | ✔️ | ⚡ | ⚡ | ⚡ | ⛔ |

View File

@ -106,6 +106,10 @@ updateWith credUpdate ((Credentials ({ cred, context } as data)) as credentials)
Nothing -> Nothing ->
credentials credentials
-- TODO
Api.InviteSent _ _ ->
credentials
Api.JoinedMembersToRoom _ _ -> Api.JoinedMembersToRoom _ _ ->
credentials credentials
@ -113,6 +117,10 @@ updateWith credUpdate ((Credentials ({ cred, context } as data)) as credentials)
Api.MessageEventSent _ _ -> Api.MessageEventSent _ _ ->
credentials credentials
-- TODO
Api.RedactedEvent _ _ ->
credentials
-- TODO -- TODO
Api.StateEventSent _ _ -> Api.StateEventSent _ _ ->
credentials credentials

View File

@ -4,7 +4,7 @@ import Dict exposing (Dict)
import Internal.Tools.Hashdict as Hashdict exposing (Hashdict) import Internal.Tools.Hashdict as Hashdict exposing (Hashdict)
import Internal.Tools.SpecEnums exposing (SessionDescriptionType(..)) import Internal.Tools.SpecEnums exposing (SessionDescriptionType(..))
import Internal.Values.Event exposing (BlindEvent, IEvent) import Internal.Values.Event exposing (BlindEvent, IEvent)
import Internal.Values.StateManager exposing (StateManager) import Internal.Values.StateManager as StateManager exposing (StateManager)
import Internal.Values.Timeline as Timeline exposing (Timeline) import Internal.Values.Timeline as Timeline exposing (Timeline)
import Json.Encode as E import Json.Encode as E
@ -51,6 +51,12 @@ getEventById : String -> IRoom -> Maybe IEvent
getEventById eventId (IRoom room) = getEventById eventId (IRoom room) =
Hashdict.get eventId room.events Hashdict.get eventId room.events
getStateEvent : { eventType : String, stateKey : String } -> IRoom -> Maybe IEvent
getStateEvent data (IRoom room) =
room.timeline
|> Timeline.mostRecentState
|> StateManager.getStateEvent data
{-| Get the room's id. {-| Get the room's id.
-} -}

View File

@ -18,8 +18,8 @@ addEvent event oldManager =
oldManager oldManager
getStateEvent : String -> String -> StateManager -> Maybe IEvent getStateEvent : { eventType : String, stateKey : String } -> StateManager -> Maybe IEvent
getStateEvent eventType stateKey = getStateEvent { eventType, stateKey } =
Dict.get ( eventType, stateKey ) Dict.get ( eventType, stateKey )