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

# Обновявайте съобщения на живо

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

## Какво можете да направите

- **Обновете картата** Сменете текста, цвета и бутоните на място.

- **Покажете напредъка** Индикатор за зареждане, който минава през стъпките, а после резултатът.

- **Изтрийте го** Премахнете съобщение, щом вече не е вярно.

- **Слушайте го** Отговори, реакции и натискания на бутони върху вашето съобщение, на живо.

В приложението

Публикувана с индикатор за зареждане

Обновена: стъпка 2 от 3

#### Деплоят е завършен

Обновена: готово, с бутон

Едно съобщение, обновено два пъти чрез своя callback URL. Никой не вижда три съобщения, а само едно, което се променя.

- [Бърз старт](#quick-start)

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

- [Напредък](#progress)

- [Изтриване](#delete)

- [Слушане](#stream)

## Бърз старт

### Запазете callback URL

Всяка публикация от [уебхук](https://docs.mss.gs/bg/webhooks) и всяка заявка от [команда](https://docs.mss.gs/bg/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://docs.mss.gs/bg/bots). |
| actions | array | Нови бутони. "actions": [] маха всички; ако пропуснете полето, те остават. |
| content | string | Нов текст. |
| title , description , color , loader , ... | string | Съкратен запис: полетата на картата на най-горното ниво се опаковат в карта вместо вас. |

### Отговори

| Статус | Код | Значение |
| --- | --- | --- |
| 200 | {"success": true} | Прието. Обновяването следва веднага след това. |
| 400 | MISSING_FIELDS | В тялото няма нищо за обновяване. |
| 400 | INVALID_BODY | Тялото не е валиден JSON. |
| 400 | код на бутон | Нещо не е наред с бутон, вижте [бутони](https://docs.mss.gs/bg/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 | Потокът е изтекъл или никога не е съществувал. |

## Продължете нататък
