Add rooms to Credentials
parent
205263f5cd
commit
f88c9604dc
|
@ -1,32 +1,52 @@
|
||||||
module Internal.Credentials exposing (..)
|
module Internal.Credentials exposing (..)
|
||||||
|
|
||||||
{-| The Credentials type is the keychain that stores all tokens, values,
|
{-| The Credentials type is the keychain that stores all tokens, values,
|
||||||
numbers and other types that need to be remembered.
|
numbers and other types that need to be remembered.
|
||||||
|
|
||||||
This file combines the internal functions with the API endpoints to create a fully functional Credentials keychain.
|
This file combines the internal functions with the API endpoints to create a fully functional Credentials keychain.
|
||||||
|
|
||||||
-}
|
-}
|
||||||
|
|
||||||
|
import Internal.Room as Room
|
||||||
import Internal.Values.Credentials as Internal
|
import Internal.Values.Credentials as Internal
|
||||||
|
|
||||||
{-|
|
|
||||||
You can consider the `Credentials` type as a large ring of keys,
|
{-| You can consider the `Credentials` type as a large ring of keys,
|
||||||
and Elm will figure out which key to use.
|
and Elm will figure out which key to use.
|
||||||
If you pass the `Credentials` into any function, then the library will look for
|
If you pass the `Credentials` into any function, then the library will look for
|
||||||
the right keys and tokens to get the right information.
|
the right keys and tokens to get the right information.
|
||||||
-}
|
-}
|
||||||
type alias Credentials = Internal.Credentials
|
type alias Credentials =
|
||||||
|
Internal.Credentials
|
||||||
|
|
||||||
|
|
||||||
{-| Get a Credentials type based on an unknown access token.
|
{-| Get a Credentials type based on an unknown access token.
|
||||||
|
|
||||||
This is an easier way to connect to a Matrix homeserver, but your access may end
|
This is an easier way to connect to a Matrix homeserver, but your access may end
|
||||||
when the access token expires, is revoked or something else happens.
|
when the access token expires, is revoked or something else happens.
|
||||||
|
|
||||||
-}
|
-}
|
||||||
fromAccessToken : { homeserver : String, accessToken : String } -> Credentials
|
fromAccessToken : { homeserver : String, accessToken : String } -> Credentials
|
||||||
fromAccessToken =
|
fromAccessToken =
|
||||||
Internal.fromAccessToken
|
Internal.fromAccessToken
|
||||||
|
|
||||||
{-| Get a Credentials type using a username and password. -}
|
|
||||||
|
{-| Get a Credentials type using a username and password.
|
||||||
|
-}
|
||||||
fromLoginCredentials : { username : String, password : String, homeserver : String } -> Credentials
|
fromLoginCredentials : { username : String, password : String, homeserver : String } -> Credentials
|
||||||
fromLoginCredentials =
|
fromLoginCredentials =
|
||||||
Internal.fromLoginCredentials
|
Internal.fromLoginCredentials
|
||||||
|
|
||||||
|
|
||||||
|
{-| Get a room based on its id.
|
||||||
|
-}
|
||||||
|
getRoomById : String -> Credentials -> Maybe Room.Room
|
||||||
|
getRoomById roomId credentials =
|
||||||
|
Internal.getRoomById roomId credentials
|
||||||
|
|> Maybe.map
|
||||||
|
(Room.init
|
||||||
|
{ accessToken = Internal.getAccessTokenType credentials
|
||||||
|
, baseUrl = Internal.getBaseUrl credentials
|
||||||
|
, versions = Internal.getVersions credentials
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
module Internal.Room exposing (..)
|
||||||
|
|
||||||
|
{-| The `Room` type represents a Matrix Room. In here, you will find utilities to ask information about a room.
|
||||||
|
-}
|
||||||
|
|
||||||
|
import Internal.Api.All as Api
|
||||||
|
import Internal.Api.PreApi.Objects.Versions as V
|
||||||
|
import Internal.Tools.Exceptions as X
|
||||||
|
import Internal.Tools.LoginValues exposing (AccessToken)
|
||||||
|
import Internal.Values.Room as Internal
|
||||||
|
import Json.Encode as E
|
||||||
|
import Task exposing (Task)
|
||||||
|
|
||||||
|
|
||||||
|
{-| The Room type.
|
||||||
|
-}
|
||||||
|
type Room
|
||||||
|
= Room
|
||||||
|
{ room : Internal.Room
|
||||||
|
, accessToken : AccessToken
|
||||||
|
, baseUrl : String
|
||||||
|
, versions : Maybe V.Versions
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
init : { accessToken : AccessToken, baseUrl : String, versions : Maybe V.Versions } -> Internal.Room -> Room
|
||||||
|
init { accessToken, baseUrl, versions } room =
|
||||||
|
Room
|
||||||
|
{ accessToken = accessToken
|
||||||
|
, baseUrl = baseUrl
|
||||||
|
, room = room
|
||||||
|
, versions = versions
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
{-| Get the room's id.
|
||||||
|
-}
|
||||||
|
roomId : Room -> String
|
||||||
|
roomId (Room { room }) =
|
||||||
|
Internal.roomId room
|
||||||
|
|
||||||
|
|
||||||
|
sendEvent : Room -> { eventType : String, content : E.Value } -> Task X.Error Api.CredUpdate
|
||||||
|
sendEvent (Room { room, accessToken, baseUrl, versions }) { eventType, content } =
|
||||||
|
Api.sendMessageEvent
|
||||||
|
{ accessToken = accessToken
|
||||||
|
, baseUrl = baseUrl
|
||||||
|
, content = content
|
||||||
|
, eventType = eventType
|
||||||
|
, roomId = Internal.roomId room
|
||||||
|
, versions = versions
|
||||||
|
, extraTransactionNoise = "content-value:<object>"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sendMessage : Room -> String -> Task X.Error Api.CredUpdate
|
||||||
|
sendMessage (Room { room, accessToken, baseUrl, versions }) text =
|
||||||
|
Api.sendMessageEvent
|
||||||
|
{ accessToken = accessToken
|
||||||
|
, baseUrl = baseUrl
|
||||||
|
, content =
|
||||||
|
E.object
|
||||||
|
[ ( "msgtype", E.string "m.text" )
|
||||||
|
, ( "body", E.string text )
|
||||||
|
]
|
||||||
|
, eventType = "m.room.message"
|
||||||
|
, roomId = Internal.roomId room
|
||||||
|
, versions = versions
|
||||||
|
, extraTransactionNoise = "literal-message:" ++ text
|
||||||
|
}
|
|
@ -4,33 +4,42 @@ module Internal.Values.Credentials exposing (..)
|
||||||
It handles all communication with the homeserver.
|
It handles all communication with the homeserver.
|
||||||
-}
|
-}
|
||||||
|
|
||||||
|
import Internal.Api.PreApi.Objects.Versions as V
|
||||||
import Internal.Tools.Hashdict as Hashdict exposing (Hashdict)
|
import Internal.Tools.Hashdict as Hashdict exposing (Hashdict)
|
||||||
|
import Internal.Tools.LoginValues as Login exposing (AccessToken(..))
|
||||||
import Internal.Values.Room as Room exposing (Room)
|
import Internal.Values.Room as Room exposing (Room)
|
||||||
|
|
||||||
|
|
||||||
type Credentials
|
type Credentials
|
||||||
= Credentials { access : AccessToken, homeserver : String, rooms : Hashdict Room }
|
= Credentials { access : AccessToken, baseUrl : String, rooms : Hashdict Room, versions : Maybe V.Versions }
|
||||||
|
|
||||||
|
|
||||||
type AccessToken
|
{-| Get the stringed access token the Credentials type is using, if any.
|
||||||
= AccessToken String
|
|
||||||
| NoAccess
|
|
||||||
| UsernameAndPassword { username : String, password : String, accessToken : Maybe String }
|
|
||||||
|
|
||||||
|
|
||||||
{-| Get the access token the Credentials type is using, if any.
|
|
||||||
-}
|
-}
|
||||||
getAccessToken : Credentials -> Maybe String
|
getAccessToken : Credentials -> Maybe String
|
||||||
getAccessToken (Credentials { access }) =
|
getAccessToken =
|
||||||
case access of
|
getAccessTokenType >> Login.getToken
|
||||||
AccessToken s ->
|
|
||||||
Just s
|
|
||||||
|
|
||||||
NoAccess ->
|
|
||||||
Nothing
|
|
||||||
|
|
||||||
UsernameAndPassword { accessToken } ->
|
{-| Get the access token type that stores the Credentials's ways of getting access.
|
||||||
accessToken
|
-}
|
||||||
|
getAccessTokenType : Credentials -> AccessToken
|
||||||
|
getAccessTokenType (Credentials { access }) =
|
||||||
|
access
|
||||||
|
|
||||||
|
|
||||||
|
{-| Get the baseUrl that the credentials accesses.
|
||||||
|
-}
|
||||||
|
getBaseUrl : Credentials -> String
|
||||||
|
getBaseUrl (Credentials { baseUrl }) =
|
||||||
|
baseUrl
|
||||||
|
|
||||||
|
|
||||||
|
{-| Get the versions that the homeserver supports.
|
||||||
|
-}
|
||||||
|
getVersions : Credentials -> Maybe V.Versions
|
||||||
|
getVersions (Credentials { versions }) =
|
||||||
|
versions
|
||||||
|
|
||||||
|
|
||||||
{-| Internal value to be used as a "default" for credentials settings.
|
{-| Internal value to be used as a "default" for credentials settings.
|
||||||
|
@ -39,8 +48,9 @@ defaultCredentials : String -> Credentials
|
||||||
defaultCredentials homeserver =
|
defaultCredentials homeserver =
|
||||||
Credentials
|
Credentials
|
||||||
{ access = NoAccess
|
{ access = NoAccess
|
||||||
, homeserver = homeserver
|
, baseUrl = homeserver
|
||||||
, rooms = Hashdict.empty Room.roomId
|
, rooms = Hashdict.empty Room.roomId
|
||||||
|
, versions = Nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,7 +69,7 @@ fromLoginCredentials : { username : String, password : String, homeserver : Stri
|
||||||
fromLoginCredentials { username, password, homeserver } =
|
fromLoginCredentials { username, password, homeserver } =
|
||||||
case defaultCredentials homeserver of
|
case defaultCredentials homeserver of
|
||||||
Credentials c ->
|
Credentials c ->
|
||||||
Credentials { c | access = UsernameAndPassword { username = username, password = password, accessToken = Nothing } }
|
Credentials { c | access = UsernameAndPassword { username = username, password = password, token = Nothing } }
|
||||||
|
|
||||||
|
|
||||||
{-| Get a room from the Credentials type by the room's id.
|
{-| Get a room from the Credentials type by the room's id.
|
||||||
|
|
Loading…
Reference in New Issue