# Websocket Command API.
## Send Text Message
Send a message event to a room.
Implement: `PUT /_matrix/client/r0/rooms/{roomId}/send/{eventType}/{txnId}` [Ref](https://matrix.org/docs/spec/client_server/latest#put-matrix-client-r0-rooms-roomid-send-eventtype-txnid)
Flow :
1. Client send a websocket request.
2. Websocket call Matrix API to store to the DB.
3. Websocket gets all related users.
4. If users connected to the Websocket, send sync/stream for all related users.
**Websocket request**
`websockets.sendJON()`
Client request:
```json
{
"module": "room",
"method": "send_text",
"params": {
"room_id": "!d41d8cd:lalepass.lale.im",
"event_type": "m.room.message",
"content": {
"msgtype": "m.text",
"body": "hello"
}
}
}
```
Server response:
Simillar to `sync` response.
```json
{
"ws_type": "update",
"rooms" : {
"join" : {
"!d41d8cd:lalepass.lale.im" : {
"timeline" :{
"events" : [
{
"origin_server_ts": 1629783173336,
"sender": "@li3845742:lalepass.lale.im",
"content": {
"body": "hi",
"msgtype": "m.text"
},
"type": "m.room.message"
}
]
}
}
}
}
}
```
## Join a Room
Implement join a room in Websockets. Reference in matrix :
https://matrix.org/docs/spec/r0.0.1/client_server#post-matrix-client-r0-rooms-roomid-join
Steps:
1. client send payload to join a room
2. websocket send request to join a room
3. websocket update the room membership in Redis.
4. notify all the room members, a new member has joined the room
`websockets.sendJON()`
Client request:
```json
{
"module": "room",
"method": "join_room",
"params": {
"room_id": "!d41d8cd:lalepass.lale.im"
}
}
```
Notify Response
```json
{
"ws_type": "status",
"rooms": {
"join": {
"!aDLKTvuyaxrpHTkQQs:laledev6.flowring.com": {
"timeline": {
"events": [
{
"origin_server_ts": 1634720701141,
"sender": "@jefftest:laledev6.flowring.com",
"event_id": "$16347207011342tUMbb:laledev6.flowring.com",
"unsigned": {
"replaces_state": "$16347206261340zmglJ:laledev6.flowring.com",
"age_ts": 1634720701141
},
"state_key": "@jefftest:laledev6.flowring.com",
"content": {
"membership": "join",
"avatar_url": "mxc://laledev6.flowring.com/bOprZdbhJwpsaagnvIFeImbV",
"displayname": "Jeff test Laledev6"
},
"membership": "join",
"type": "m.room.member"
}
]
}
}
}
}
}
```
## Leave a room
Flow :
1. Client send payload to websocket
2. send request to message broker
3. notify all room member
4. update redis
Client request
```json
{
"module": "room",
"method": "leave_room",
"params": {
"room_id": "!d41d8cd:lalepass.lale.im"
}
}
```
Websocket Response
```json
{
"ws_type": "status",
"rooms": {
"join": {
"!aDLKTvuyaxrpHTkQQs:laledev6.flowring.com": {
"timeline": {
"events": [
{
"origin_server_ts": 1634798552128,
"sender": "@jantest2:laledev6.flowring.com",
"event_id": "$16347985521407VUcfS:laledev6.flowring.com",
"unsigned": {
"replaces_state": "$16347985381406mlSqr:laledev6.flowring.com",
"age_ts": 1634798552128
},
"state_key": "@jantest2:laledev6.flowring.com",
"content": {
"membership": "leave"
},
"membership": "leave",
"type": "m.room.member"
}
]
}
}
}
}
}
```