211 lines
5.5 KiB
Elm
211 lines
5.5 KiB
Elm
module Matrix.Room exposing
|
||
( Room, mostRecentEvents, roomId
|
||
, getAccountData, setAccountData
|
||
, sendMessageEvent, sendStateEvent
|
||
, invite, kick, ban
|
||
)
|
||
|
||
{-|
|
||
|
||
|
||
# Room
|
||
|
||
What is usually called a chat, a channel, a conversation or a group chat on
|
||
other platforms, the term used in Matrix is a "room". A room is a conversation
|
||
where a group of users talk to each other.
|
||
|
||
@docs Room, mostRecentEvents, roomId
|
||
|
||
This module exposes various functions that help you inspect various aspects of
|
||
a room.
|
||
|
||
|
||
## Account data
|
||
|
||
Account data is personal information that the user stores about this Matrix
|
||
room. This may include information like:
|
||
|
||
- What type of room this is
|
||
- A list of members in the room to ignore
|
||
- A list of currently ongoing chess matches in the room
|
||
- Personal notes the user may be taking
|
||
|
||
You may consider the account data as a `Dict String Json.Value` type. Account
|
||
data is linked to the user account: other logged in devices can see the account
|
||
data too, as the server synchronizes it, but the server shouldn´t show it to
|
||
other users.
|
||
|
||
@docs getAccountData, setAccountData
|
||
|
||
|
||
## Sending events
|
||
|
||
Besides reading the latest events, one can also send new events to the Matrix
|
||
room. These events are JSON objects that can be shaped in any way or form that
|
||
you like. To help other users with decoding your JSON objects, you pass an
|
||
`eventType` string which helps them figure out the nature of your JSON object.
|
||
|
||
@docs inviteUser, sendMessageEvent, sendStateEvent
|
||
|
||
## Moderating users
|
||
|
||
@docs invite, kick, ban
|
||
|
||
-}
|
||
|
||
import Internal.Api.Main as Api
|
||
import Internal.Values.Envelope as Envelope
|
||
import Internal.Values.Room as Internal
|
||
import Json.Encode as E
|
||
import Types exposing (Room(..))
|
||
|
||
|
||
{-| The Matrix Room type representing a room that the Matrix user has joined.
|
||
-}
|
||
type alias Room =
|
||
Types.Room
|
||
|
||
{-| Ban a user from a room.
|
||
-}
|
||
ban :
|
||
{ reason : Maybe String
|
||
, room : Room
|
||
, toMsg : Types.VaultUpdate -> msg
|
||
, user : Types.User
|
||
}
|
||
-> Cmd msg
|
||
ban data =
|
||
case ( data.room, data.user ) of
|
||
( Room room, Types.User user ) ->
|
||
Api.kickUser room
|
||
{ reason = data.reason
|
||
, roomId = roomId data.room
|
||
, toMsg = Types.VaultUpdate >> data.toMsg
|
||
, user = Envelope.getContent user
|
||
}
|
||
|
||
{-| Get a piece of account data linked to a certain string key.
|
||
-}
|
||
getAccountData : String -> Room -> Maybe E.Value
|
||
getAccountData key (Room room) =
|
||
Envelope.extract (Internal.getAccountData key) room
|
||
|
||
|
||
{-| Invite a user to a room.
|
||
-}
|
||
invite :
|
||
{ reason : Maybe String
|
||
, room : Room
|
||
, toMsg : Types.VaultUpdate -> msg
|
||
, user : Types.User
|
||
}
|
||
-> Cmd msg
|
||
invite data =
|
||
case ( data.room, data.user ) of
|
||
( Room room, Types.User user ) ->
|
||
Api.inviteUser room
|
||
{ reason = data.reason
|
||
, roomId = roomId data.room
|
||
, toMsg = Types.VaultUpdate >> data.toMsg
|
||
, user = Envelope.getContent user
|
||
}
|
||
|
||
{-| Kick a user from a room.
|
||
-}
|
||
kick :
|
||
{ reason : Maybe String
|
||
, room : Room
|
||
, toMsg : Types.VaultUpdate -> msg
|
||
, user : Types.User
|
||
}
|
||
-> Cmd msg
|
||
kick data =
|
||
case ( data.room, data.user ) of
|
||
( Room room, Types.User user ) ->
|
||
Api.kickUser room
|
||
{ reason = data.reason
|
||
, roomId = roomId data.room
|
||
, toMsg = Types.VaultUpdate >> data.toMsg
|
||
, user = Envelope.getContent user
|
||
}
|
||
|
||
|
||
{-| Get a room's room id. This is an opaque string that distinguishes rooms from
|
||
each other.
|
||
-}
|
||
roomId : Room -> String
|
||
roomId (Room room) =
|
||
Envelope.extract .roomId room
|
||
|
||
|
||
{-| Get a list of the most recent events sent in the room.
|
||
-}
|
||
mostRecentEvents : Room -> List Types.Event
|
||
mostRecentEvents (Room room) =
|
||
Envelope.mapList Internal.mostRecentEvents room
|
||
|> List.map Types.Event
|
||
|
||
|
||
{-| Send a message event to a given room.
|
||
-}
|
||
sendMessageEvent :
|
||
{ content : E.Value
|
||
, eventType : String
|
||
, room : Room
|
||
, toMsg : Types.VaultUpdate -> msg
|
||
, transactionId : String
|
||
}
|
||
-> Cmd msg
|
||
sendMessageEvent data =
|
||
case data.room of
|
||
Room room ->
|
||
Api.sendMessageEvent room
|
||
{ content = data.content
|
||
, eventType = data.eventType
|
||
, roomId = roomId data.room
|
||
, toMsg = Types.VaultUpdate >> data.toMsg
|
||
, transactionId = data.transactionId
|
||
}
|
||
|
||
|
||
{-| Send a state event to a given room.
|
||
-}
|
||
sendStateEvent :
|
||
{ content : E.Value
|
||
, eventType : String
|
||
, room : Room
|
||
, stateKey : String
|
||
, toMsg : Types.VaultUpdate -> msg
|
||
}
|
||
-> Cmd msg
|
||
sendStateEvent data =
|
||
case data.room of
|
||
Room room ->
|
||
Api.sendStateEvent room
|
||
{ content = data.content
|
||
, eventType = data.eventType
|
||
, roomId = roomId data.room
|
||
, stateKey = data.stateKey
|
||
, toMsg = Types.VaultUpdate >> data.toMsg
|
||
}
|
||
|
||
|
||
{-| Set account data to a Matrix room.
|
||
-}
|
||
setAccountData :
|
||
{ content : E.Value
|
||
, eventType : String
|
||
, room : Room
|
||
, toMsg : Types.VaultUpdate -> msg
|
||
}
|
||
-> Cmd msg
|
||
setAccountData data =
|
||
case data.room of
|
||
Room room ->
|
||
Api.setRoomAccountData room
|
||
{ content = data.content
|
||
, eventType = data.eventType
|
||
, roomId = roomId data.room
|
||
, toMsg = Types.VaultUpdate >> data.toMsg
|
||
}
|