Веб-сокет API
Time имеет базовую поддержку Веб-сокет API. Подключенный веб-сокет может отправлять запросы, отправляя следующее через соединение:
{
"action": "user_typing",
"seq": 2,
"data": {
"channel_id": "nhze199c4j87ped4wannrjdt9c",
"parent_id": ""
}
}
Это пример запроса user_typing
, цель которого - уведомить сервер о том, что подключенный клиент начал печатать в канале или ветке. Поле action
указывает, что запрашивается, и выполняет аналогичную функцию маршрута в HTTP API. Поле data
используется для добавления любых дополнительных данных вместе с запросом. Сервер также поддерживает бинарные сообщения WebSocket в случае, если у клиента есть такая потребность.
seq
или номер последовательности устанавливается клиентом и должен увеличиваться с каждым использованием. Он используется для различения ответов на запросы, которые приходят через веб-сокет. Например, стандартный ответ на вышеуказанный запрос будет:
{
"status": "OK",
"seq_reply": 2
}
Обратите внимание, что seq_reply
равен 2, совпадая с seq
оригинального запроса. Используя это, клиент может различить, для какого запроса предназначен ответ.
Если была какая-либо информация для ответа, она будет заключена в поле data
.
В случае ошибки ответ будет:
{
"status": "FAIL",
"seq_reply": 2,
"error": {
"id": "some.error.id.here",
"message": "Some error message here"
}
}
Список действий API WebSocket:
- user_typing
- get_statuses_by_ids
- update_presence
Действие update_presence
Устанавливает текущее присутствие пользователя в канале/ветке. Используется для получения событий typing
.
Если поля установлены в пустую строку (""
) - событие typing
не будет получено.
Это действие должно быть отправлено хотя бы один раз, иначе все события typing
будут получены.
Пример:
{
"action": "update_presence",
"seq": 2,
"data": {
"channel_id": "nhze199c4j87ped4wannrjdt9c",
"thread_id": ""
}
}
Событие thread_read_changed
- Отметить все ветки, которые пользователь отслеживает, как прочитанные
PUT /users/{user_id}/teams/{team_id}/threads/read
Пример:
{
"event": "thread_read_changed",
"data": {},
"broadcast": {
"omit_users": null,
"user_id": "87icc7gj8png9raxzz3t3ym7dy",
"channel_id": "",
"team_id": "k1bjiqyu37r7mp76zbnju4dzby",
"contains_sanitized_data": false,
"contains_sensitive_data": false
},
"seq": 2
}
- Отметить ветку как прочитанную до определенного времени
PUT /users/{user_id}/teams/{team_id}/threads/{thread_id}/read/{timestamp}
Данные: - channel_id: - thread_id: - timestamp: то же, что и ThreadMemberships.LastViewed после обновления - unread_mentions: то же, что и ThreadMemberships.UnreadMentions после обновления - unread_replies: вычисляется по ветке после обновления - previous_unread_mentions: то же, что и ThreadMemberships.UnreadMentions до обновления - previous_unread_replies: вычисляется по ветке до обновления - previous_timestamp: то же, что и ThreadMemberships.LastViewed до обновления Пример:
{
"event": "thread_read_changed",
"data": {
"channel_id": "f4hqkj8ifjy5zpqr5nyjrrajsy",
"previous_unread_mentions": 0,
"previous_unread_replies": 5,
"thread_id": "ag1654pt3pdcfpfakxi774co6w",
"timestamp": 1706274237704,
"previous_timestamp": 1706274203704,
"unread_mentions": 0,
"unread_replies": 0
},
"broadcast": {
"omit_users": null,
"user_id": "87icc7gj8png9raxzz3t3ym7dy",
"channel_id": "",
"team_id": "k1bjiqyu37r7mp76zbnju4dzby",
"contains_sanitized_data": false,
"contains_sensitive_data": false
},
"seq": 2
}
- Отметить ветку как непрочитанную с поста
POST (/users/{user_id}/teams/{team_id}/threads/{thread_id}/set_unread/{post_id}
Данные: - channel_id: - thread_id: - timestamp: то же, что и ThreadMemberships.LastViewed после обновления - unread_mentions: то же, что и ThreadMemberships.UnreadMentions после обновления - unread_replies: вычисляется по ветке после обновления - previous_unread_mentions: то же, что и ThreadMemberships.UnreadMentions до обновления - previous_unread_replies: вычисляется по ветке до обновления - previous_timestamp: то же, что и ThreadMemberships.LastViewed до обновления Broadcast: user_id, team_id
Пример:
{
"event": "thread_read_changed",
"data": {
"channel_id": "f4hqkj8ifjy5zpqr5nyjrrajsy",
"previous_unread_mentions": 0,
"previous_unread_replies": 0,
"thread_id": "ag1654pt3pdcfpfakxi774co6w",
"timestamp": 1706268533024,
"previous_timestamp": 1706268502024,
"unread_mentions": 0,
"unread_replies": 6
},
"broadcast": {
"omit_users": null,
"user_id": "87icc7gj8png9raxzz3t3ym7dy",
"channel_id": "",
"team_id": "k1bjiqyu37r7mp76zbnju4dzby",
"contains_sanitized_data": false,
"contains_sensitive_data": false
},
"seq": 3
}