---
title: "Оновлення наживо: змінюйте повідомлення mssgs після публікації"
description: "Оновлюйте чи видаляйте повідомлення mssgs після публікації через callback URL, показуйте поступ і слухайте відповіді, реакції та натискання в потоці наживо."
canonical: https://mss.gs/uk/docs/live-updates
language: uk
---

# Оновлюйте повідомлення наживо

Повідомлення не мусить залишатися таким, яким його опублікували. Показуйте поступ, поки виконується завдання, замініть індикатор завантаження результатом, приберіть кнопки, щойно хтось ухвалив рішення, або видаліть повідомлення. Усі в каналі бачать зміну одразу.

## Що можна зробити

- **Оновлюйте картку** Змінюйте текст, колір і кнопки на місці.

- **Показуйте поступ** Індикатор завантаження, що проходить кроки, а потім результат.

- **Видаляйте** Приберіть повідомлення, щойно воно стане неактуальним.

- **Слухайте** Відповіді, реакції й натискання кнопок на вашому повідомленні наживо.

У застосунку

Опубліковано з індикатором завантаження

Оновлено: крок 2 з 3

#### Розгортання завершено

Оновлено: готово, з кнопкою

Одне повідомлення, двічі оновлене через його callback URL. Ніхто не бачить трьох повідомлень, лише одне, що змінюється.

- [Швидкий старт](#quick-start)

- [Оновлення](#update)

- [Показ поступу](#progress)

- [Видалення](#delete)

- [Прослуховування](#stream)

## Швидкий старт

### Збережіть callback URL

Кожна публікація через [вебхук](https://mss.gs/uk/docs/webhooks) і кожен запит [команди](https://mss.gs/uk/docs/commands) містить callback_url для цього повідомлення.

```bash
BODY='{"message_container": {"color": "blue", "loader": true, "loader_text": "Deploying…"}}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$MSSGS_WEBHOOK_SECRET" | sed 's/^.* //')

curl -X POST "$MSSGS_WEBHOOK_URL" -H "Content-Type: application/json" \
  -H "X-Mssgs-Signature: sha256=$SIG" -d "$BODY"

# {"success": true, "message_id": "...", "callback_url": "https://mss.gs/api/v1/trigger-callback/8f14e45f-..."}
```

### PUT для оновлення

Надішліть новий стан. Картка зміниться на місці для всіх.

```bash
curl -X PUT "$CALLBACK_URL" -H "Content-Type: application/json" \
  -d '{"message_container": {"color": "green", "title": "Deploy complete", "description": "v2.1 is live."}}'
```

### DELETE для видалення

Тіло не потрібне.

```bash
curl -X DELETE "$CALLBACK_URL"
```

## Оновлення повідомлення

Надішліть JSON методом PUT на callback_url . Передавайте лише те, що хочете змінити.

| Поле | Тип | Що робить |
| --- | --- | --- |
| message_container | object | Нова картка. Див. [картки повідомлень](https://mss.gs/uk/docs/bots). |
| actions | array | Нові кнопки. "actions": [] прибирає їх усі; якщо поле не передати, вони залишаться. |
| content | string | Новий текст. |
| title , description , color , loader , ... | string | Скорочення: поля картки на верхньому рівні автоматично загортаються в картку. |

### Відповіді

| Статус | Код | Значення |
| --- | --- | --- |
| 200 | {"success": true} | Прийнято. Оновлення надійде одразу слідом. |
| 400 | MISSING_FIELDS | У тілі немає що оновлювати. |
| 400 | INVALID_BODY | Тіло не є коректним JSON. |
| 400 | код кнопки | Щось не так із кнопкою, див. [кнопки](https://mss.gs/uk/docs/buttons). |
| 401 | INVALID_TOKEN | URL недійсний. |
| 404 | TOKEN_NOT_FOUND | Строк дії URL минув, або його використали для видалення повідомлення. |
| 502 | PUBLISH_FAILED | Не вдалося доставити оновлення. Спробуйте знову. |

### Скільки він діє

30 хвилин від моменту публікації повідомлення або використання команди. Оновлення не продовжує цей строк. Видалення повідомлення вичерпує URL. Через оновлення не можна додавати файли.

## Показ поступу

Опублікуйте картку з індикатором завантаження, оновлюйте її додатковий рядок у міру виконання завдання й завершіть результатом. Індикатор завантаження це спінер із рядком і меншим рядком під ним ( loader_text , loader_sub_text ).

```javascript
const { callback_url } = await post({
  message_container: { color: 'blue', loader: true, loader_text: 'Deploying…', loader_sub_text: 'Step 1 of 3: building' }
});

const update = (body) => {
  return fetch(callback_url, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
};

await build();
await update({ message_container: { color: 'blue', loader: true, loader_text: 'Deploying…', loader_sub_text: 'Step 2 of 3: running migrations' } });

await migrate();
await update({
  message_container: { color: 'green', title: 'Deploy complete', description: 'v2.1 is live on production.' },
  actions: [{ type: 'url:https://ci.example.com/deploys/218', text: 'View logs', color: 'green' }]
});
```

## Видалення повідомлення

Надішліть DELETE на callback_url , і повідомлення зникне для всіх. Після цього URL використати знову не можна.

## Прослуховування повідомлення

stream_url це потік наживо (Server-Sent Events) того, що відбувається з вашим повідомленням. Відкрийте його, і події надходитимуть у міру того, як усе відбувається, кожна як JSON-рядок data: , чий type каже, що це:

```sse
curl -N "$STREAM_URL"

data: {"type": "reaction", "message_id": "...", "emoji": ":tada:", "action": "add", "member_guid": "...", "member": {...}, "ts": 1790000000000}

data: {"type": "action", "message_id": "...", "action_id": "approve", "action": {"id": "approve", "payload": {"deploy": 218}, ...}, "member_guid": "...", "member": {...}, "ts": 1790000004200}

data: {"type": "reply", "message_id": "...", "content": "Ship it!", "member_guid": "...", "member": {...}, "ts": 1790000009800}

event: expired
data: {}
```

| Подія | Коли | Дані |
| --- | --- | --- |
| action | Натиснуто кнопку. | action_id , а також збережена кнопка в action з її payload |
| reaction | Додано або прибрано реакцію. | emoji , а також action : add, remove або removeall |
| reply | Хтось відповів на повідомлення. | content відповіді |
| expired | Потік закривається. Надсилається як іменована подія. | Немає |

### Прослуховування в JavaScript

```javascript
const events = new EventSource(streamUrl);

// Every event arrives as a plain message; its kind is in "type".
events.onmessage = (e) => {
  const ev = JSON.parse(e.data);
  if ((ev.type === 'action') && (ev.action_id === 'approve')) {
    startDeploy(ev.action.payload.deploy);
  }
};

// The one named event: the stream is closing.
events.addEventListener('expired', () => {
  events.close();
});
```

### Де його отримати

| Звідки береться | Відкритий |
| --- | --- |
| Публікація через вебхук із кнопками | 10 хвилин або година з "sse_event_extended_timeout": true |
| Кожен запит команди | 10 хвилин |

### Помилки

| Статус | Код | Значення |
| --- | --- | --- |
| 401 | INVALID_TOKEN | Токен в URL неправильний. |
| 404 | NOT_FOUND | Строк дії потоку минув, або його ніколи не існувало. |

## Що далі
