# Работа c сообщениями
На каждый уведомление (запрос) сервера клиент должен ответить так:
{
    "type": 2,
    "id": 123456
}
После отправки ответа сообщение от пользователя будет считаться прочитанным ботом и будет отмечено соответствующей галочкой в клиентском приложении TrueConf.
# Форматирование сообщений
API чат-ботов поддерживает три типа оформления сообщений:
text– текст без форматирования. Будут сохранены и отображены все символы;markdown- поддерживается базовая разметка Markdown. Специальные символы преобразуются в форматированный текст (жирный, курсив, ссылки и т.д.);html- HTML-теги будут интерпретированы и отобразятся как форматированный текст.
# Markdown
Поддерживаемый синтаксис языка разметки Markdown:
| Стиль | Синтаксис | Пример | Отображаемый текст | 
|---|---|---|---|
| Жирный | ** или __ |  **жирный текст** |  жирный текст | 
| Курсив | * или _ |  _курсивный текст_ |  курсивный текст | 
| Зачеркнутый | ~~ |  ~~зачеркнутый текст~~ |  |
| Ссылка | [Текст](https://url) |  [Сайт](https://example.com) |  Сайт | 
# HTML
Поддерживаемый синтаксис языка разметки HTML:
| Тег | Пример HTML | Отображаемый текст | 
|---|---|---|
<b> |  <b>жирный текст</b> |  жирный текст | 
<i> |  <i>курсивный текст</i> |  курсивный текст | 
<s> |  <s>зачеркнутый текст</s> |  |
<u> |  <u>подчеркнутый текст</u> |  подчеркнутый текст | 
<a> |  <a href="https://example.com">Сайт</a> |  Сайт | 
Все дополнительные атрибуты тегов будут удалены. Например, HTML-код:
<i style="position: fixed; top:0">Hacked!</i>
будет преобразован к:
<i>Hacked!</i>
# Запросы клиента
# Отправить сообщение
Запрос:
{
  "type": 1,
  "id": 1,
  "method": "sendMessage",
  "payload": {
    "chatId": "c8c3eee8-9ad0-4638-9692-ad16391a4256",
    "content": {
      "text": "Hello, world!",
      "parseMode": "text"
    }
  }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST | 
| id | uint32 | Да | Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут | 
| method | string | Да | Команда sendMessage | 
| chatId | string | Да | Идентификатор чата | 
| replyMessageId | string | Нет | В случае если мы отвечаем на сообщение, поле должно содержать идентификатор этого сообщения (см. ниже пример) | 
| text | string | Да | Текст сообщения | 
| parseMode | string | Да | Режим форматирования (см. выше) | 
Ответ:
{
  "type": 2,
  "id": 1,
  "payload": {
    "chatId": "c8c3eee8-9ad0-4638-9692-ad16391a4256",
    "messageId": "8fe61d87-6db0-4792-8f5e-e5960c7d5a06",
    "timestamp": 1735314170572
  }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | 
        Тип сообщения (по умолчанию 2). Соответствует
        MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа | 
| chatId | string | Да | Идентификатор чата, в который отправилось сообщение | 
| messageId | string | Да | Идентификатор сообщения. Можно использовать данный идентификатор в дальнейшем, для изменения, пересылки или удаления сообщения | 
| timestamp | uint64 | Да | Временная метка отправки сообщения в формате UNIX timestamp с точностью до миллисекунд | 
В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.
# Ответить на сообщение
Для ответа на существующее сообщение необходимо заполнить поле replyMessageId идентификатором сообщения, на которое мы отвечаем:
{
  "type": 1,
  "id": 1,
  "method": "sendMessage",
  "payload": {
    "chatId": "c8c3eee8-9ad0-4638-9692-ad16391a4256",
    "replyMessageId": "3d968a21-543c-4fb2-9d8e-e31e3fbb35eb",
    "content": {
      "text": "Hello, world!",
      "parseMode": "text"
    }
  }
}
# Изменить сообщение
Запрос:
{
  "type": 1,
  "id": 1,
  "method": "editMessage",
  "payload": {
    "messageId": "8fe61d87-6db0-4792-8f5e-e5960c7d5a06",
    "content": {
      "text": "Hello, world (edited)!",
      "parseMode": "text"
    }
  }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST | 
| id | uint32 | Да | Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут | 
| method | string | Да | Команда editMessage | 
| messageId | string | Да | Идентификатор текстового сообщения | 
| text | string | Да | Текст сообщения | 
| parseMode | string | Да | Режим форматирования (см. выше) | 
Ответ:
{
    "type": 2,
    "id": 1,
    "payload": {
        "messageId": "8fe61d87-6db0-4792-8f5e-e5960c7d5a06",
        "timestamp": 1735314170572
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа | 
| timestamp | uint64 | Да | Временная метка редактирования сообщения в формате UNIX timestamp с точностью до миллисекунд | 
| messageId | string | Да | Идентификатор отредактированного сообщения | 
В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.
# Переслать сообщение
Запрос:
{
    "type": 1,
    "id": 1,
    "method": "forwardMessage",
    "payload": {
        "chatId": "4a1f88f1070d2f43d385cde9ff61964bc6b74477",
        "messageId": "8fe61d87-6db0-4792-8f5e-e5960c7d5a06"
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | 
        Тип сообщения (по умолчанию 1). Соответствует 
        MESSAGE_TYPE.REQUEST | 
| id | uint32 | Да | Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут | 
| method | string | Да | Команда forwardMessage | 
| chatId | string | Да | Идентификатор чата, в который вы будете пересылать сообщение | 
| messageId | string | Да | Идентификатор пересылаемого сообщения | 
Ответ:
{
    "type": 2,
    "id": 1,
    "payload": {
        "chatId": "4a1f88f1070d2f43d385cde9ff61964bc6b74477",
        "messageId": "3e168850-d9ea-45ec-a0f7-21c43e8ba2a8",
        "timestamp": 1735314170572
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | 
        Тип сообщения (по умолчанию 2). Соответствует 
        MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа | 
| chatId | string | Да | Уникальный идентификатор чата, в который мы переслали сообщение | 
| messageId | string | Да | Уникальный идентификатор нового сообщения, содержащего ваше пересланное сообщение | 
| timestamp | uint64 | Да | Временная метка пересылки сообщения в формате UNIX timestamp с точностью до миллисекунд | 
В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.
# Удалить сообщение
Запрос:
{
    "type": 1,
    "id": 1,
    "method": "removeMessage",
    "payload": {
        "messageId": "8fe61d87-6db0-4792-8f5e-e5960c7d5a06",
        "forAll": true
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST | 
| id | uint32 | Да | Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут | 
| method | string | Да | Команда removeMessage | 
| messageId | string | Да | Идентификатор удаляемого сообщения | 
| forAll | boolean | Да | Если true — то сообщение будет удалено у всех | 
Ответ:
{
  "type": 2,
  "id": 1,
  "payload": {}
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа | 
| payload | object | Да | В случае успеха вы получите пустой объект | 
В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.
# Получить сообщение по ID
Запрос:
{
    "type": 1,
    "id": 1,
    "method": "getMessageById",
    "payload": {
        "messageId": "8fe61d87-6db0-4792-8f5e-e5960c7d5a06"
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | 
        Тип сообщения (по умолчанию 1). Соответствует
        MESSAGE_TYPE.REQUEST | 
| id | uint32 | Да | Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут | 
| method | string | Да | Команда getMessageById | 
| messageId | string | Да | Идентификатор запрашиваемого сообщения | 
Ответ:
{
    "type": 2,
    "id": 1,
    "payload": {
        "chatId": "2b896a6ef210d6b2dcaebc2186c9a7974d616054",
        "messageId": "8fe61d87-6db0-4792-8f5e-e5960c7d5a06",
        "timestamp": 1234567890,
        "author": {
            "id": "user@video.example.com",
            "type": 1
        },
        "replyMessageId": null,
        "isEdited": true,
        "box": {
            "id": 123456,
            "position": "0"
        },
        "type": 0,
        "content": {
            "text": "Hello, chat bot!",
            "parseMode": "html"
        }
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа | 
| chatId | string | Да | Уникальный идентификатор чата, в котором находится сообщение | 
| messageId | string | Да | Уникальный идентификатор сообщения | 
| timestamp | uint64 | Да | Временная метка отправки сообщения в формате UNIX timestamp с точностью до миллисекунд | 
| replyMessageId | string | Нет | Если это ответ на сообщение — содержит идентификатор этого сообщения | 
| isEdited | boolean | Да | Было ли сообщение когда-либо отредактировано | 
| payload.type | uint32 | Да | Тип вложенного сообщения. Подробнее см. EnvelopeTypeEnum | 
| author.id | string | Да | Уникальный идентификатор автора сообщения. Это либо TrueConf ID пользователя, либо имя сервера, с которого пришло сообщение. Тип идентификатора зависит от поля type | 
| author.type | uint32 | Да | Тип автора сообщения. Подробнее см. EnvelopeAuthorTypeEnum | 
| box.id | number | Да | Порядковый номер "коробки", в которой находится сообщение. Подробнее — в соответствующем разделе | 
| box.position | string | Да | Порядковый номер сообщения в "коробке". Подробнее — в соответствующем разделе | 
В зависимости от значения payload.type, объект payload.content может содержать данные одного из следующих форматов:
# Текстовое сообщение
Используется, если сообщение содержит только текстовую информацию.
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| text | string | Да | Текст сообщения | 
| parseMode | string | Да | Режим форматирования (см. выше) | 
# Вложение (файл)
Используется, если сообщение содержит файл (документ, изображение и т.д.).
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| name | string | Да | Имя файла | 
| size | number | Да | Размер файла | 
| mimeType | string | Да | MIME-тип файла | 
| fileId | string | Да | Идентификатор файла на сервере | 
# Пересланное сообщение
Представляет собой вложенное сообщение, содержащее одну из описанных выше структур (text, attachment и т.д.) и дополнительные поля с метаинформацией. По структуре аналогично обычному сообщению: включает author, timestamp, content и другие поля.
В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.
# Получить историю чата
Запрос:
{
    "type": 1,
    "id": 1,
    "method": "getChatHistory",
    "payload": {
        "chatId": "4a1f88f1070d2f43d385cde9ff61964bc6b74477",
        "count": 9999,
        "fromMessageId": "e37cfc52-592f-453f-a3dd-275170b2018d"
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 1). Соответствует MESSAGE_TYPE.REQUEST | 
| id | uint32 | Да | Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут | 
| method | string | Да | Команда getChatHistory | 
| chatId | string | Да | Идентификатор чата, для которого запрашивается история сообщений | 
| count | uint32 | Да | Количество возвращаемых в ответе сообщений | 
| fromMessageId | string | Нет | Идентификатор сообщения чата, с которого будет возвращена история | 
Ответ:
{
    "type": 2,
    "id": 1,
    "payload": {
        "chatId": "4a1f88f1070d2f43d385cde9ff61964bc6b74477",
        "count": 1,
        "messages": [
            {
                "messageId": "8fe61d87-6db0-4792-8f5e-e5960c7d5a06",
                "timestamp": 1234567890,
                "author": {
                    "id": "user@video.example.com",
                    "type": 1
                },
                "replyMessageId": null,
                "isEdited": true,
                "box": {
                    "id": 123456,
                    "position": ""
                },
                "type": 0,
                "content": {
                    "text": "Hello, chat bot!",
                    "parseMode": "html"
                }
            }
        ]
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор, совпадающий с числом, отправленным в исходном запросе, используемый для связывания запроса и ответа | 
| chatId | string | Да | Идентификатор чата, для которого запрашивалась история сообщений | 
| count | uint32 | Да | Количество полученных сообщений | 
| messages | Array<Envelope> | Нет | Массив объектов Envelope, каждый из которых представляет одно сообщение. Описание параметров смотрите выше | 
В случае возникновения ошибки возвращается сообщение, содержащее параметр errorCode. Список возможных значений доступен в соответствующем разделе документации.
# Уведомления сервера
# Новое сообщение
Сообщение от сервера:
{
    "method": "sendMessage",
    "type": 1,
    "id": 11,
    "payload": {
        "chatId": "bd05af54347e04a1c44e70033d35834d4428bb5d",
        "messageId": "d66254de-9d89-4130-8027-c5378f042800",
        "timestamp": 1746029007569,
        "author": {
            "id": "brown@video.example.com",
            "type": 1
        },
        "isEdited": false,
        "box": {
            "id": 4,
            "position": "0"
        },
        "type": 200,
        "content": {
            "text": "Текст",
            "parseMode": "html"
        }
    }
}
Уведомление о новом сообщении содержит поля, соответствующие объекту Envelope. Подробное описание этих полей вы найдёте в разделе посвящённом работе с сообщениями.
Ответ от клиента:
{
    "type": 2,
    "id": 123456
}
| Поле | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор сообщения, на которое дается ответ (см. подробнее) | 
# Сообщение было изменено
Сообщение от сервера:
{
    "method": "editMessage",
    "type": 1,
    "id": 12,
    "payload": {
        "messageId": "d4d20b4f-e4a4-4abc-8e66-ff2e17f483b7",
        "timestamp": 1746029430000,
        "content": {
            "text": "🤝",
            "parseMode": "text"
        }
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| method | string | Да | Команда editMessage | 
| type | uint32 | Да | 
        Тип сообщения (по умолчанию 1). Соответствует
        MESSAGE_TYPE.REQUEST | 
| id | uint32 | Да | Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут | 
| messageId | string | Да | Идентификатор измененного сообщения. Можно использовать данный идентификатор в дальнейшем для копирования, пересылки или удаления сообщения | 
| timestamp | uint64 | Да | Временная метка изменения сообщения в формате UNIX timestamp с точностью до миллисекунд | 
| text | string | Да | Текст измененного сообщения | 
| parseMode | string | Да | Режим форматирования (см. подробнее) | 
Ответ от клиента:
{
    "type": 2,
    "id": 123456
}
| Поле | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор сообщения, на которое дается ответ (см. подробнее) | 
# Сообщение было удалено
Сообщение от сервера:
{
    "method": "removeMessage",
    "type": 1,
    "id": 12,
    "payload": {
        "chatId": "bd05af54347e04a1c44e70033d35834d4428bb5d",
        "messageId": "d4d20b4f-e4a4-4abc-8e66-ff2e17f483b7",
        "removedBy": {
            "id": "brown@video.example.com",
            "type": 1
        }
    }
}
| Параметр | Тип | Обяз. | Описание | 
|---|---|---|---|
| method | string | Да | Команда removeMessage | 
| type | uint32 | Да | 
        Тип сообщения (по умолчанию 1). Соответствует
        MESSAGE_TYPE.REQUEST | 
| id | uint32 | Да | Уникальный идентификатор запроса. Инкрементируемое значение, назначаемое отправляющей стороной, обязательное в каждом запросе для последующего связывания с ответом. Подробнее читайте тут | 
| chatId | string | Да | Идентификатор чата, где было удалено сообщение | 
| messageId | string | Да | Идентификатор удаленного сообщения. Можно использовать данный идентификатор в дальнейшем для копирования, пересылки или удаления сообщения | 
| removedBy.id | string | Да | 
        Уникальный идентификатор пользователя, удалившего сообщение. Это либо TrueConf ID, либо имя сервера, с которого пришло сообщение.
        Тип идентификатора зависит от поля removedBy.type | 
| removedBy.type | uint32 | Да | Тип пользователя, который удалил сообщение. Подробнее см. EnvelopeAuthorTypeEnum | 
Ответ от клиента:
{
    "type": 2,
    "id": 123456
}
| Поле | Тип | Обяз. | Описание | 
|---|---|---|---|
| type | uint32 | Да | Тип сообщения (по умолчанию 2). Соответствует MESSAGE_TYPE.RESPONSE | 
| id | uint32 | Да | Идентификатор сообщения, на которое дается ответ (см. подробнее) |