2020-09-05 19:43:04 +00:00
# Basic chats
2020-09-05 19:00:22 +00:00
## 1. Introduction
2020-09-05 19:43:04 +00:00
This extension is intended for organizing chats between some entities.
2020-09-05 19:00:22 +00:00
## 2. Message type identifiers
2020-09-05 19:43:04 +00:00
- `urn:cadmium:chats:message` - regular message
- `urn:cadmium:chats:read` - read message system
- `urn:cadmium:chats:typing` - typing message system
2020-09-05 19:00:22 +00:00
## 3. Errors
- Ratelimit system: disabled
- Authorization: enabled
2020-09-05 19:48:11 +00:00
### 3.1. Error types
- `urn:cadmium:chats:private:banned` - Sending messages to user is prohibited, because he banned the sender of current message
2020-09-05 19:00:22 +00:00
## 4. Chat message types
- `urn:cadmium:chats:message-types:general` - message with text and optional media
- `urn:cadmium:chats:message-types:audio` - audio message
- `urn:cadmium:chats:message-types:geolocation` - message with geolocation (coordinates)
## 5. Use cases
### 5.1. Exchanging messages
1. Sending message:
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:message",
2020-09-05 19:00:22 +00:00
"to": ["@user2@cadmium.org"],
"payload": {
"type": "urn:cadmium:chats:message-types:general",
"content": {
"text": "hello world",
}
}
}
```
**Successful response** :
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:message",
2020-09-05 19:00:22 +00:00
"from": "cadmium.org",
"ok": true,
"payload": {
"messageID": "3b5135a5-aff5-4396-a629-a254f383e82f",
"originServerTimestamp": 1599327584
}
}
```
**Error response** :
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:message",
2020-09-05 19:00:22 +00:00
"from": "cadmium.org",
"ok": false,
"payload": {
2020-09-05 19:48:11 +00:00
"errID": "urn:cadmium:chats:private:banned",
2020-09-05 19:00:22 +00:00
"errText": "The user banned you"
}
}
```
2. Receiving message on other side:
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:message",
2020-09-05 19:00:22 +00:00
"from": "@user1@cadmium.im",
"ok": true,
"payload": {
"messageID": "3b5135a5-aff5-4396-a629-a254f383e82f",
"originServerTimestamp": 1599327584,
"type": "urn:cadmium:chats:message-types:general",
"content": {
"text": "hello world",
}
}
}
```
### 5.2. Exchanging media
1. Upload the media to HTTP Upload service (explanation out of scope of this document)
2. Send message containing the URL of uploaded media:
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:message",
2020-09-05 19:00:22 +00:00
"to": ["@user2@cadmium.org"],
"payload": {
"type": "urn:cadmium:chats:message-types:general",
"content": {
"text": "",
"media": [
{
"url": "https://upload.cadmium.im/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67",
"mimeType": "image/jpeg"
}
]
}
}
}
```
**Response** :
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:message",
2020-09-05 19:00:22 +00:00
"from": "cadmium.org",
"ok": true,
"payload": {
"messageID": "7a1b9a72-1677-4476-9b22-ef7fdbcff52e",
"originServerTimestamp": 1599329232
}
}
```
3. Receive message with media on other side:
```json
{
"id": "defg",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:message",
2020-09-05 19:00:22 +00:00
"from": "@user1@cadmium.im",
"ok": true,
"payload": {
"messageID": "7a1b9a72-1677-4476-9b22-ef7fdbcff52e",
"originServerTimestamp": 1599329232,
"type": "urn:cadmium:chats:message-types:general",
"content": {
"text": "",
"media": [
{
"url": "https://upload.cadmium.im/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67",
"mimeType": "image/jpeg"
}
]
}
}
}
```
### 5.3. Read messages
1. Read message
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:read",
2020-09-05 19:00:22 +00:00
"to": ["@user1@cadmium.org"],
"payload": {
"messageID": "7a1b9a72-1677-4476-9b22-ef7fdbcff52e",
}
}
```
Response:
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:read",
2020-09-05 19:00:22 +00:00
"from": "cadmium.im",
"ok": true,
"payload": {}
}
```
2. Receive notification about message reading on other side:
```json
{
"id": "defg",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:read",
2020-09-05 19:00:22 +00:00
"from": "@user2@cadmium.im",
"ok": true,
"payload": {
"messageID": "7a1b9a72-1677-4476-9b22-ef7fdbcff52e"
}
}
```
2020-09-05 19:40:50 +00:00
### 5.3. Typing message
2020-09-05 19:00:22 +00:00
1. Typing message
```json
{
"id": "abcd",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:typing",
2020-09-05 19:00:22 +00:00
"to": ["@user1@cadmium.org"],
2020-09-05 19:40:50 +00:00
"payload": {}
2020-09-05 19:00:22 +00:00
}
```
2. Receive notification about typing message on other side:
```json
{
"id": "defg",
2020-09-05 19:43:04 +00:00
"type": "urn:cadmium:chats:read",
2020-09-05 19:00:22 +00:00
"from": "@user2@cadmium.im",
"ok": true,
2020-09-05 19:40:50 +00:00
"payload": {}
2020-09-05 19:00:22 +00:00
}
```
## 6. Business Rules
2020-09-05 19:40:50 +00:00
### 6.1. Typing message notification
- Client sends typing notification message every second when he is typing. If there is no notifications about typing more than one second then consider that user is stopped the typing.
2020-09-05 19:00:22 +00:00
## 7. JSON Schema
2020-09-05 19:43:04 +00:00
### Send message (`urn:cadmium:chats:message`)
2020-09-05 19:00:22 +00:00
**Request**:
```typescript
interface SendMessagePayload {
type: string; // the type of message
2020-09-05 19:04:24 +00:00
reply?: string; // message id on which this message is replying
2020-09-05 19:00:22 +00:00
content: Content // the payload of message (depends on type)
}
```
**Response**:
```typescript
interface SendMessageResponsePayload {
messageID: string; // the message id (stored in chat timeline)
originServerTimestamp: number // unix timestamp of sent message on the origin server
}
```
#### Content sections
- `urn:cadmium:chats:message-types:general` :
```typescript
interface GeneralMessageContent {
text: string; // the text (body) of message
media?: Media[]; // media content
}
interface Media {
url: string; // url of media (where it stores)
mimeType: string; // mime type of media
}
```
- `urn:cadmium:chats:message-types:audio` :
```typescript
interface AudioMessageContent {
url: string; // the url of audio message
}
```
- `urn:cadmium:chats:message-types:geolocation` :
```typescript
interface GeolocationMessageContent {
lat: number; // the GPS latitude
lon: number; // the GPS longitude
}
```
2020-09-05 19:43:04 +00:00
### Receive message (`urn:cadmium:chats:message`)
2020-09-05 19:00:22 +00:00
```typescript
interface ReceiveMessagePayload {
messageID: string; // the id of received message
originServerTimestamp: number; // unix timestamp of received message on the origin server
type: string; // the type of message
2020-09-05 19:04:24 +00:00
reply?: string; // message id on which this message is replying
content: Content; // the payload of message (depends on type)
2020-09-05 19:00:22 +00:00
}
```
2020-09-05 19:43:04 +00:00
### Read message (`urn:cadmium:chats:read`)
2020-09-05 19:00:22 +00:00
**Request**:
```typescript
interface ReadMessagePayload {
messageID: string; // the message id of read message
}
```
**Response**:
None.
2020-09-05 19:43:04 +00:00
### Receive read message notification (`urn:cadmium:chats:read`)
2020-09-05 19:00:22 +00:00
```typescript
interface ReceiveReadMessageNotifPayload {
messageID: string; // the message id of read message
}
2020-09-05 19:40:50 +00:00
```