Update Room documentation
parent
e1f12a8ae2
commit
a8d1cb4c4b
|
@ -1,8 +1,10 @@
|
||||||
module Matrix.Room exposing
|
module Matrix.Room exposing
|
||||||
( Room, roomId, mostRecentEvents, findOlderEvents
|
( Room, roomId
|
||||||
, stateEvent, accountData
|
, accountData, setAccountData
|
||||||
|
, name, description
|
||||||
|
, stateEvent
|
||||||
|
, mostRecentEvents, findOlderEvents
|
||||||
, sendMessage, sendMessages, sendOneEvent, sendMultipleEvents
|
, sendMessage, sendMessages, sendOneEvent, sendMultipleEvents
|
||||||
, setAccountData
|
|
||||||
)
|
)
|
||||||
|
|
||||||
{-| This module provides functions for working with Matrix rooms.
|
{-| This module provides functions for working with Matrix rooms.
|
||||||
|
@ -10,38 +12,71 @@ module Matrix.Room exposing
|
||||||
|
|
||||||
# Room
|
# Room
|
||||||
|
|
||||||
A room represents a channel of communication within a Matrix home server.
|
@docs Room, roomId
|
||||||
|
|
||||||
@docs Room, roomId, mostRecentEvents, findOlderEvents
|
Each room has the following data:
|
||||||
|
|
||||||
|
- Account data
|
||||||
|
- Room state
|
||||||
|
- Timeline
|
||||||
|
|
||||||
|
|
||||||
# Exploring a room
|
## Account data
|
||||||
|
|
||||||
@docs stateEvent, accountData
|
Account data is private information that the homeserver shows only to this user:
|
||||||
|
it synchronizes across all devices, but only to this user.
|
||||||
|
Configure private settings, track room data, keep notes, and more.
|
||||||
|
|
||||||
|
Please use the Java package naming convention when picking an appropriate key
|
||||||
|
for storing information, e.g. `org.example.myapp.property`.
|
||||||
|
|
||||||
|
@docs accountData, setAccountData
|
||||||
|
|
||||||
|
|
||||||
# Sending events
|
## Room state
|
||||||
|
|
||||||
|
The room state tells you everything you need to know: for example, rooms often
|
||||||
|
have a name and a room description.
|
||||||
|
|
||||||
|
@docs name, description
|
||||||
|
|
||||||
|
In Matrix, all information in a room state has an event type and a state key.
|
||||||
|
The event type dictates the JSON format of the state event, and the state key
|
||||||
|
makes the state event unique in a room.
|
||||||
|
|
||||||
|
State keys starting with an `@` are reserved for users - they can only change
|
||||||
|
this value themselves.
|
||||||
|
|
||||||
|
@docs stateEvent
|
||||||
|
|
||||||
|
|
||||||
|
## Timeline
|
||||||
|
|
||||||
|
While other information in the room will be overwritten from time to time,
|
||||||
|
the timeline is an endless list of events that you can keep appending events to.
|
||||||
|
|
||||||
|
@docs mostRecentEvents, findOlderEvents
|
||||||
|
|
||||||
|
Not only can you read from the timeline, you can also write to it. If `stateKey`
|
||||||
|
is not `Nothing`, you will also alter the room state. Keep in mind that this is not
|
||||||
|
allowed for every room admin.
|
||||||
|
|
||||||
@docs sendMessage, sendMessages, sendOneEvent, sendMultipleEvents
|
@docs sendMessage, sendMessages, sendOneEvent, sendMultipleEvents
|
||||||
|
|
||||||
|
|
||||||
# Changing a room
|
|
||||||
|
|
||||||
@docs setAccountData
|
|
||||||
|
|
||||||
-}
|
-}
|
||||||
|
|
||||||
import Internal.Api.VaultUpdate exposing (VaultUpdate)
|
import Internal.Api.VaultUpdate exposing (VaultUpdate)
|
||||||
import Internal.Event as Event
|
import Internal.Event as Event
|
||||||
import Internal.Room as Internal
|
import Internal.Room as Internal
|
||||||
import Internal.Tools.Exceptions as X
|
import Internal.Tools.Exceptions as X
|
||||||
import Json.Encode as E
|
import Json.Decode as D
|
||||||
import Task exposing (Task)
|
import Task exposing (Task)
|
||||||
|
|
||||||
|
|
||||||
{-| The `Room` type represents a Matrix Room that the user has joined.
|
{-| A room represents a channel of communication within a Matrix home server.
|
||||||
It contains context information that allows the retrieval of new information from
|
|
||||||
the Matrix API if necessary.
|
Every user has a bunch of rooms that they're in, with which they can share rooms.
|
||||||
|
|
||||||
-}
|
-}
|
||||||
type alias Room =
|
type alias Room =
|
||||||
Internal.Room
|
Internal.Room
|
||||||
|
@ -49,25 +84,74 @@ type alias Room =
|
||||||
|
|
||||||
{-| Get any account data value that the user stores regarding this room.
|
{-| Get any account data value that the user stores regarding this room.
|
||||||
-}
|
-}
|
||||||
accountData : String -> Room -> Maybe E.Value
|
accountData : String -> Room -> Maybe D.Value
|
||||||
accountData =
|
accountData =
|
||||||
Internal.accountData
|
Internal.accountData
|
||||||
|
|
||||||
|
|
||||||
{-| If you want more events as part of the most recent events, you can run this task to get more.
|
{-| Not all Matrix rooms have a description, but this function will get it if it exists.
|
||||||
|
|
||||||
|
This function is also a shorthand for getting the state event `m.room.topic` with
|
||||||
|
an empty state key, and decoding the content.
|
||||||
|
|
||||||
|
-}
|
||||||
|
description : Room -> Maybe String
|
||||||
|
description =
|
||||||
|
stateEvent { eventType = "m.room.topic", stateKey = "" }
|
||||||
|
>> Maybe.map Event.content
|
||||||
|
>> Maybe.andThen (D.decodeValue (D.field "topic" D.string) >> Result.toMaybe)
|
||||||
|
|
||||||
|
|
||||||
|
{-| Starting from the most recent events, look for more events. Effectively,
|
||||||
|
this inserts more events at the start of the `[mostRecentEvents](#mostRecentEvents)` function's output list.
|
||||||
-}
|
-}
|
||||||
findOlderEvents : { limit : Maybe Int, room : Room } -> Task X.Error VaultUpdate
|
findOlderEvents : { limit : Maybe Int, room : Room } -> Task X.Error VaultUpdate
|
||||||
findOlderEvents { limit, room } =
|
findOlderEvents { limit, room } =
|
||||||
Internal.getOlderEvents { limit = limit } room
|
Internal.getOlderEvents { limit = limit } room
|
||||||
|
|
||||||
|
|
||||||
{-| Get the most recent events from this room.
|
{-| This function will always display the most recent events from the Matrix room.
|
||||||
|
The amount of events you'll see, depends on the room activity and how often you synchronize.
|
||||||
|
|
||||||
|
For example, you might get the following event list:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
<--- [E0] --- [E1] --- [E2]
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, after running a sync on your Matrix Vault, you might end up with a gap:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
<--- [E0] --- [E1] --- [E2] [E7] --- [E8] --- [E9]
|
||||||
|
|------|
|
||||||
|
gap
|
||||||
|
```
|
||||||
|
|
||||||
|
Since the `Vault` type doesn't know what's between `[E2]` and `[E7]`, this function
|
||||||
|
will only return `[E7]`, `[E8]` and `[E9]`. The previous events will be remembered,
|
||||||
|
however, in case you fill the gap later on.
|
||||||
|
|
||||||
|
The events will be returned in chronological order.
|
||||||
|
|
||||||
-}
|
-}
|
||||||
mostRecentEvents : Room -> List Event.Event
|
mostRecentEvents : Room -> List Event.Event
|
||||||
mostRecentEvents =
|
mostRecentEvents =
|
||||||
Internal.mostRecentEvents
|
Internal.mostRecentEvents
|
||||||
|
|
||||||
|
|
||||||
|
{-| Not all Matrix rooms have a name, but this function will get it if it exists.
|
||||||
|
|
||||||
|
This function is also a shorthand for getting the state event `m.room.name` with
|
||||||
|
an empty state key, and decoding the content.
|
||||||
|
|
||||||
|
-}
|
||||||
|
name : Room -> Maybe String
|
||||||
|
name =
|
||||||
|
stateEvent { eventType = "m.room.name", stateKey = "" }
|
||||||
|
>> Maybe.map Event.content
|
||||||
|
>> Maybe.andThen (D.decodeValue (D.field "name" D.string) >> Result.toMaybe)
|
||||||
|
|
||||||
|
|
||||||
{-| Get a state event in the room.
|
{-| Get a state event in the room.
|
||||||
-}
|
-}
|
||||||
stateEvent : { eventType : String, stateKey : String } -> Room -> Maybe Event.Event
|
stateEvent : { eventType : String, stateKey : String } -> Room -> Maybe Event.Event
|
||||||
|
@ -75,7 +159,7 @@ stateEvent =
|
||||||
Internal.getStateEvent
|
Internal.getStateEvent
|
||||||
|
|
||||||
|
|
||||||
{-| Get the Matrix room id of a room.
|
{-| Every room has a unique Matrix ID. You can later use this room ID to find the same room back.
|
||||||
-}
|
-}
|
||||||
roomId : Room -> String
|
roomId : Room -> String
|
||||||
roomId =
|
roomId =
|
||||||
|
@ -113,6 +197,7 @@ If you're intending to send the same message multiple times, this function will
|
||||||
-- SAFE
|
-- SAFE
|
||||||
Task.sequence <| sendMessages [ "Hello, world!", "hi mom!" ]
|
Task.sequence <| sendMessages [ "Hello, world!", "hi mom!" ]
|
||||||
|
|
||||||
|
-- SAFE
|
||||||
Task.sequence <| sendMessages [ "Hello, world!", "Hello, world!" ]
|
Task.sequence <| sendMessages [ "Hello, world!", "Hello, world!" ]
|
||||||
|
|
||||||
-}
|
-}
|
||||||
|
@ -138,7 +223,7 @@ Keep in mind that this function is not safe to use if you're sending exactly the
|
||||||
]
|
]
|
||||||
|
|
||||||
-}
|
-}
|
||||||
sendOneEvent : { content : E.Value, eventType : String, stateKey : Maybe String } -> Room -> Task X.Error VaultUpdate
|
sendOneEvent : { content : D.Value, eventType : String, stateKey : Maybe String } -> Room -> Task X.Error VaultUpdate
|
||||||
sendOneEvent =
|
sendOneEvent =
|
||||||
Internal.sendEvent
|
Internal.sendEvent
|
||||||
|
|
||||||
|
@ -164,7 +249,7 @@ Keep in mind that this function doesn't send the events in order, it just makes
|
||||||
|> Task.sequence
|
|> Task.sequence
|
||||||
|
|
||||||
-}
|
-}
|
||||||
sendMultipleEvents : List { content : E.Value, eventType : String, stateKey : Maybe String } -> Room -> List (Task X.Error VaultUpdate)
|
sendMultipleEvents : List { content : D.Value, eventType : String, stateKey : Maybe String } -> Room -> List (Task X.Error VaultUpdate)
|
||||||
sendMultipleEvents =
|
sendMultipleEvents =
|
||||||
Internal.sendEvents
|
Internal.sendEvents
|
||||||
|
|
||||||
|
@ -174,6 +259,6 @@ sendMultipleEvents =
|
||||||
The homeserver will save this information on this room, but it will only be visible to the user who sent it.
|
The homeserver will save this information on this room, but it will only be visible to the user who sent it.
|
||||||
|
|
||||||
-}
|
-}
|
||||||
setAccountData : String -> E.Value -> Room -> Task X.Error VaultUpdate
|
setAccountData : String -> D.Value -> Room -> Task X.Error VaultUpdate
|
||||||
setAccountData =
|
setAccountData =
|
||||||
Internal.setAccountData
|
Internal.setAccountData
|
||||||
|
|
Loading…
Reference in New Issue