---
title: "Živé aktualizace: změň zprávy v mssgs i po odeslání"
description: "Uprav nebo smaž zprávu v mssgs po odeslání přes její callback URL, ukaž průběh loaderem a sleduj odpovědi, reakce a stisky tlačítek živě."
canonical: https://docs.mss.gs/cs/live-updates
language: cs
---

# Aktualizuj zprávy živě

Zpráva nemusí zůstat taková, jakou jsi ji odeslal. Ukaž průběh, dokud úloha běží, vyměň loader za výsledek, odeber tlačítka, jakmile se někdo rozhodl, nebo zprávu smaž. Všichni v kanálu vidí změnu okamžitě.

## Co s tím můžeš dělat

- **Aktualizuj kartu** Změň text, barvu i tlačítka přímo na místě.

- **Ukaž průběh** Loader, který prochází jednotlivými kroky, a pak výsledek.

- **Smaž ji** Odstraň zprávu, jakmile už neplatí.

- **Poslouchej ji** Odpovědi, reakce a stisky tlačítek u tvé zprávy, živě.

V aplikaci

Odesláno s loaderem

Aktualizováno: krok 2 ze 3

#### Nasazení dokončeno

Aktualizováno: hotovo, s tlačítkem

Jedna zpráva, dvakrát aktualizovaná přes svou callback URL. Nikdo nevidí tři zprávy, jen jednu, která se mění.

- [Rychlý start](#quick-start)

- [Aktualizace](#update)

- [Průběh](#progress)

- [Smazání](#delete)

- [Poslech](#stream)

## Rychlý start

### Uschovej si callback URL

Každý příspěvek z [webhooku](https://docs.mss.gs/cs/webhooks) a každý požadavek [příkazu](https://docs.mss.gs/cs/commands) přichází s callback_url pro danou zprávu.

```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 pro aktualizaci

Pošli nový stav. Karta se všem změní přímo na místě.

```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 pro smazání

Tělo požadavku není potřeba.

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

## Aktualizace zprávy

Pošli JSON metodou PUT na callback_url . Posílej jen to, co chceš změnit.

| Pole | Typ | Co dělá |
| --- | --- | --- |
| message_container | object | Nová karta. Viz [karty zpráv](https://docs.mss.gs/cs/bots). |
| actions | array | Nová tlačítka. "actions": [] odebere všechna; když pole vynecháš, zůstanou. |
| content | string | Nový text. |
| title , description , color , loader , ... | string | Zkratka: pole karty na nejvyšší úrovni se za tebe zabalí do karty. |

### Odpovědi

| Stav | Kód | Význam |
| --- | --- | --- |
| 200 | {"success": true} | Přijato. Aktualizace proběhne hned poté. |
| 400 | MISSING_FIELDS | V těle požadavku není nic k aktualizaci. |
| 400 | INVALID_BODY | Tělo požadavku není platný JSON. |
| 400 | kód tlačítka | Něco není v pořádku s tlačítkem, viz [tlačítka](https://docs.mss.gs/cs/buttons). |
| 401 | INVALID_TOKEN | URL není platná. |
| 404 | TOKEN_NOT_FOUND | Platnost URL vypršela nebo už byla použita ke smazání zprávy. |
| 502 | PUBLISH_FAILED | Aktualizaci se nepodařilo doručit. Zkus to znovu. |

### Jak dlouho funguje

30 minut od chvíle, kdy byla zpráva odeslána nebo příkaz použit. Aktualizace tuto dobu neprodlužuje. Smazáním zprávy se URL spotřebuje. Soubory přes aktualizaci přidat nelze.

## Ukázání průběhu

Pošli kartu s loaderem, s postupem úlohy aktualizuj její podtext a skonči výsledkem. Loader je točící se kolečko s řádkem textu a menším řádkem pod ním ( 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' }]
});
```

## Smazání zprávy

Pošli DELETE na callback_url a zpráva všem zmizí. Tu URL pak už nelze znovu použít.

## Poslech zprávy

stream_url je živý stream (Server-Sent Events) toho, co se děje s tvou zprávou. Otevři ho a události přicházejí, jak se dějí, každá jako řádek JSON data: , jehož type říká, o co jde:

```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: {}
```

| Událost | Kdy | Data |
| --- | --- | --- |
| action | Někdo stiskl tlačítko. | action_id a uložené tlačítko v action s jeho payload |
| reaction | Reakce byla přidána nebo odebrána. | emoji a action : add, remove nebo removeall |
| reply | Někdo na zprávu odpověděl. | content odpovědi |
| expired | Stream se zavírá. Posílá se jako pojmenovaná událost. | Žádná |

### Poslech v JavaScriptu

```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();
});
```

### Kde ho získáš

| Odkud pochází | Otevřený po dobu |
| --- | --- |
| Příspěvek z webhooku s tlačítky | 10 minut, nebo hodinu s "sse_event_extended_timeout": true |
| Každý požadavek příkazu | 10 minut |

### Chyby

| Stav | Kód | Význam |
| --- | --- | --- |
| 401 | INVALID_TOKEN | Token v URL je chybný. |
| 404 | NOT_FOUND | Platnost streamu vypršela nebo nikdy neexistoval. |

## Tvoř dál
